经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
springboot2.0和springcloud Finchley版项目搭建(包含eureka,gateWay,Freign,Hystrix)
来源:jb51  时间:2019/5/29 9:50:24  对本文有异议

前段时间spring boot 2.0发布了,与之对应的spring cloud Finchley版本也随之而来了,两者之间的关系和版本对应详见我这边文章:spring boot和spring cloud对应的版本关系

项目地址:spring-cloud-demo

spring boot 1.x和spring cloud Dalston和Edgware版本搭建的微服务项目现在已经很流行了,现在很多企业都已经在用了,这里就不多说了。

使用版本说明:

  • spring boot 2.0.x
  • spring cloud Finchley.RELEASE
  • jdk 1.8
  • maven 3.9

Eureka 注册中心

spring cloud Finchley在支持spring 2.0时修改了eureka的jar包,把之前netflix系列的jar引入的时候都加上了netflix

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  4. </dependency>
  5.  

新建一个eureka-service注册中心服务,pom.xml 文件内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.sunvalley</groupId>
  6. <artifactId>eureka-service</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>eureka-service</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent>
  12. <groupId>com.sunvalley.springcloud</groupId>
  13. <artifactId>spring-cloud-demo</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. </parent>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. <java.version>1.8</java.version>
  20. <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.cloud</groupId>
  25. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-test</artifactId>
  30. <scope>test</scope>
  31. </dependency>
  32. </dependencies>
  33. <dependencyManagement>
  34. <dependencies>
  35. <dependency>
  36. <groupId>org.springframework.cloud</groupId>
  37. <artifactId>spring-cloud-dependencies</artifactId>
  38. <version>${spring-cloud.version}</version>
  39. <type>pom</type>
  40. <scope>import</scope>
  41. </dependency>
  42. </dependencies>
  43. </dependencyManagement>
  44. <build>
  45. <plugins>
  46. <plugin>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-maven-plugin</artifactId>
  49. </plugin>
  50. </plugins>
  51. </build>
  52. </project>

eureka-service服务的配置文件,application.yml

  1. spring:
  2. application:
  3. name: eureka-service
  4. server:
  5. port: 5000
  6. eureka:
  7. instance:
  8. hostname: localhost
  9. client:
  10. registerWithEureka: false
  11. fetchRegistry: false
  12. serviceUrl:
  13. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

eureka-service服务的配置文件,EurekaServiceApplication

  1. @EnableEurekaServer
  2. @SpringBootApplication
  3. public class EurekaServiceApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(EurekaServiceApplication.class, args);
  6. }
  7. }

使用IDEA启动eureka-service服务,本地访问 http://localhost:5000/ 即可看到注册中心内容。

服务消费者consumer和提供者provider

实际工作中大多数一个服务既是其它服务的消费者又有可能是服务的提供者,所以我们也就不用刻意的取区分开。

新建一个order-service服务,pom.xml文件

注意:除了eureka-client,openfeign等jar包外,记得引入spring-boot-starter-web不然会出现启动报错。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.sunvalley</groupId>
  6. <artifactId>order-service</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>order-service</name>
  10. <description>Demo project for Spring Cloud</description>
  11. <parent>
  12. <groupId>com.sunvalley.springcloud</groupId>
  13. <artifactId>spring-cloud-demo</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. </parent>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. <java.version>1.8</java.version>
  20. <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter</artifactId>
  26. </dependency>
  27. <!-- eureka 里面已经包含 ribbon 了, 所以不用单独添加, ribbon依赖, 点击依赖就去看就知道了 -->
  28. <dependency>
  29. <groupId>org.springframework.cloud</groupId>
  30. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.cloud</groupId>
  34. <artifactId>spring-cloud-starter-openfeign</artifactId>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.cloud</groupId>
  38. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-starter-web</artifactId>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.projectlombok</groupId>
  46. <artifactId>lombok</artifactId>
  47. <optional>true</optional>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-starter-test</artifactId>
  52. <scope>test</scope>
  53. </dependency>
  54. </dependencies>
  55. <dependencyManagement>
  56. <dependencies>
  57. <dependency>
  58. <groupId>org.springframework.cloud</groupId>
  59. <artifactId>spring-cloud-dependencies</artifactId>
  60. <version>${spring-cloud.version}</version>
  61. <type>pom</type>
  62. <scope>import</scope>
  63. </dependency>
  64. </dependencies>
  65. </dependencyManagement>
  66. <build>
  67. <plugins>
  68. <plugin>
  69. <groupId>org.springframework.boot</groupId>
  70. <artifactId>spring-boot-maven-plugin</artifactId>
  71. </plugin>
  72. </plugins>
  73. </build>
  74. <repositories>
  75. <repository>
  76. <id>spring-snapshots</id>
  77. <name>Spring Snapshots</name>
  78. <url>https://repo.spring.io/snapshot</url>
  79. <snapshots>
  80. <enabled>true</enabled>
  81. </snapshots>
  82. </repository>
  83. <repository>
  84. <id>spring-milestones</id>
  85. <name>Spring Milestones</name>
  86. <url>https://repo.spring.io/milestone</url>
  87. <snapshots>
  88. <enabled>false</enabled>
  89. </snapshots>
  90. </repository>
  91. </repositories>
  92. <pluginRepositories>
  93. <pluginRepository>
  94. <id>spring-snapshots</id>
  95. <name>Spring Snapshots</name>
  96. <url>https://repo.spring.io/snapshot</url>
  97. <snapshots>
  98. <enabled>true</enabled>
  99. </snapshots>
  100. </pluginRepository>
  101. <pluginRepository>
  102. <id>spring-milestones</id>
  103. <name>Spring Milestones</name>
  104. <url>https://repo.spring.io/milestone</url>
  105. <snapshots>
  106. <enabled>false</enabled>
  107. </snapshots>
  108. </pluginRepository>
  109. </pluginRepositories>
  110. </project>

order-service服务的配置文件,application.yml

  1. spring:
  2. application:
  3. name: order-service
  4. server:
  5. port: 5100
  6. eureka:
  7. client:
  8. service-url:
  9. defaultZone: http://localhost:5000/eureka/
  10. feign:
  11. hystrix:
  12. enabled: true

order-service服务的启动类,OrderServiceApplication

  1. @EnableCircuitBreaker
  2. @EnableFeignClients
  3. @EnableEurekaClient
  4. @SpringBootApplication
  5. public class OrderServiceApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(OrderServiceApplication.class, args);
  8. }
  9. }

order-service服务的接口,OrderController

  1. @RestController
  2. @RequestMapping("/order")
  3. public class OrderController {
  4. @Value("${server.port}")
  5. private String port;
  6. /**
  7. * 获取服务端口号
  8. * @return
  9. */
  10. @GetMapping("/getOrderPort")
  11. public String getOrderPort() {
  12. return "order-service port:" + port;
  13. }
  14. }

新建一个user-service服务,pom.xml文件跟order-service一样的这里就不列出来了

user-service服务的配置文件,application.yml

  1. spring:
  2. application:
  3. name: user-service
  4. server:
  5. port: 5200
  6. eureka:
  7. client:
  8. service-url:
  9. defaultZone: http://localhost:5000/eureka/
  10. feign:
  11. hystrix:
  12. enabled: true

user-service服务的启动类也跟order-service一样的

在user-service工程目录下新建一个package,再新建一个OrderRemote接口使用feign调用order-service的方法

  1. @FeignClient(value = "order-service", fallback = OrderRemoteHystrix.class)
  2. public interface OrderRemote {
  3. @GetMapping("/order/getOrderPort")
  4. String getOrderPort();
  5. }

熔断机制提示类

  1. @Component
  2. public class OrderRemoteHystrix implements OrderRemote {
  3. @Override
  4. public String getOrderPort() {
  5. return "order service 调用失败!";
  6. }
  7. }

user-service服务的接口,UserController

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Autowired
  5. OrderRemote orderRemote;
  6. @Value("${server.port}")
  7. String port;
  8. /**
  9. * 获取用户服务的端口
  10. * @return
  11. */
  12. @GetMapping("/getUserPort")
  13. public String getUserPort() {
  14. return "user-service port:" + port;
  15. }
  16. /**
  17. * 获取订单服务的端口
  18. * @return
  19. */
  20. @GetMapping("/getOrderPort")
  21. public String getOrderPort() {
  22. return "user-order-service port:" + orderRemote.getOrderPort();
  23. }
  24. }

测试,分别启动eureka-service,order-service,user-service就可以在注册中心看到服务

在浏览器访问 http://localhost:5100/order/getOrderPort 调用order-service的接口

 在浏览器访问 http://localhost:5200/user/getOrderPort 通过user-service使用feign声明式调用order-service的接口

关闭order-service,再次调用就会发现熔断机制起了作用

spring cloud gateway

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

新建一个gateway-service服务,pom.xml文件如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.sunvalley</groupId>
  6. <artifactId>gateway-service</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>gateway-service</name>
  10. <description>Demo project for Spring Cloud</description>
  11. <parent>
  12. <groupId>com.sunvalley.springcloud</groupId>
  13. <artifactId>spring-cloud-demo</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. </parent>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. <java.version>1.8</java.version>
  20. <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-actuator</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.cloud</groupId>
  29. <artifactId>spring-cloud-starter-gateway</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.cloud</groupId>
  33. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.cloud</groupId>
  37. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-devtools</artifactId>
  42. <scope>runtime</scope>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.projectlombok</groupId>
  46. <artifactId>lombok</artifactId>
  47. <optional>true</optional>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-starter-test</artifactId>
  52. <scope>test</scope>
  53. </dependency>
  54. </dependencies>
  55. <dependencyManagement>
  56. <dependencies>
  57. <dependency>
  58. <groupId>org.springframework.cloud</groupId>
  59. <artifactId>spring-cloud-dependencies</artifactId>
  60. <version>${spring-cloud.version}</version>
  61. <type>pom</type>
  62. <scope>import</scope>
  63. </dependency>
  64. </dependencies>
  65. </dependencyManagement>
  66. <build>
  67. <plugins>
  68. <plugin>
  69. <groupId>org.springframework.boot</groupId>
  70. <artifactId>spring-boot-maven-plugin</artifactId>
  71. </plugin>
  72. </plugins>
  73. </build>
  74. </project>

gateway-service的配置文件,application.yml

  1. spring:
  2. application:
  3. name: gateway-service
  4. cloud: # spring cloud gateway 路由配置方式
  5. gateway:
  6. discovery: #是否与服务发现组件进行结合,通过 serviceId(必须设置成大写) 转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能。
  7. locator: #路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,其中微服务应用名默认大写访问。
  8. enabled: true
  9. routes:
  10. - id: 163 #网关路由到网易官网
  11. uri: http://www.163.com/
  12. predicates:
  13. - Path=/163/**
  14. # - id: ORDER-SERVICE #网关路由到订单服务order-service
  15. # uri: lb://ORDER-SERVICE
  16. # predicates:
  17. # - Path=/ORDER-SERVICE/**
  18. # - id: USER-SERVICE #网关路由到用户服务user-service
  19. # uri: lb://USER-SERVICE
  20. # predicates:
  21. # - Pach=/USER-SERVICE/**
  22. server:
  23. port: 5001
  24. logging:
  25. level:
  26. org.springframework.cloud.gateway: trace
  27. org.springframework.http.server.reactive: debug
  28. org.springframework.web.reactive: debug
  29. reactor.ipc.netty: debug
  30. eureka:
  31. client:
  32. service-url:
  33. defaultZone: http://localhost:5000/eureka/
  34. feign:
  35. hystrix:
  36. enabled: true

gateway-service的启动类,Application

  1. package com.sunvalley.demo;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.gateway.route.RouteLocator;
  5. import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
  6. import org.springframework.context.annotation.Bean;
  7. @SpringBootApplication
  8. public class GatewayServiceApplication {
  9. /**
  10. * spring cloud gateway 配置方式之一,启动主程序配置,还有一种是配置文件配置
  11. * @param builder
  12. * @return
  13. */
  14. @Bean
  15. public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
  16. return builder.routes()
  17. .route(r -> r.path("/qq/**")
  18. .and()
  19. .uri("http://www.qq.com/"))
  20. .build();
  21. }
  22. public static void main(String[] args) {
  23. SpringApplication.run(GatewayServiceApplication.class, args);
  24. }
  25. }

通过上面我们可以看到,gateway网关路由配置有两种方式:

1.通过@Bean自定义RouteLocator,在启动主类Application中配置

2.在配置文件yml中配置

这两种方式都可以实现网关路由是等价的,但是通常项目开发中会使用配置文件yml方式。

运行测试:

访问 http://localhost:8080/qq,路由转发到 http://www.qq.com
访问http://localhost:8080/163, 路由转发到 http://www.163.com

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号