Spring Cloud 之 Eureka集群整合Zuul、Feign

素颜马尾好姑娘i 2021-09-23 00:44 405阅读 0赞

微信搜索:“二十同学” 公众号,欢迎关注一条不一样的成长之路

简介
Eureka是Spring Cloud Netflix微服务套件中的一部分,提供了服务治理的功能。Eureka集群中的节点基于REST服务进行通信,如使用HttpClient与RestTemplate,Spring Cloud 套件中的Feign模块提供了更为简洁的服务访问。
Zuul是一个网关,能够将集群的服务隐藏到网关后面,统一对外提供服务,功能上类似Nginx(部分类似),提升了集群的安全性。

集群结构

  1. 本示例共4个项目,分别为eureka-serverservice-providerservice-invokerzuul-server。其中,eureka-server为服务注册中心,端口号为8761service-provider为服务提供者,端口号为9100service-invoker为服务调用者,端口号为9000zuul-server为网关,端口号为8080

1、构建Eureka服务器
创建名为eureka-server的maven项目,或者使用eclipse(idea)的Springboot生成器创建Springboot项目。pom.xml文件如下:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.5.16.RELEASE</version>
  5. <relativePath />
  6. </parent>
  7. <properties>
  8. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  9. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  10. <java.version>1.8</java.version>
  11. <spring-cloud.version>Edgware.SR4</spring-cloud.version>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  17. </dependency>
  18. </dependencies>
  19. <dependencyManagement>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-dependencies</artifactId>
  24. <version>${spring-cloud.version}</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </dependencyManagement>
  30. <build>
  31. <plugins>
  32. <plugin>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-maven-plugin</artifactId>
  35. </plugin>
  36. </plugins>
  37. </build>

接下来,编写一个Springboot的启动类,并加上@EnableEurekaServer即可将此项目声明为Eureka服务器。启动类如下所示:

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

最后修改application.properties文件。

  1. server.port: 8761
  2. # 是否向Eureka服务器注册
  3. eureka.client.register-with-eureka: false
  4. # 是否抓取注册信息
  5. eureka.client.fetch-registry: false

因为本例只有一台eureka服务器(可以是多台),所以register-with-eureka和fetch-registry这两项为false

2、编写服务提供者
创建名为service-provider的maven项目。pom.xml文件如下:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.5.16.RELEASE</version>
  5. <relativePath/>
  6. </parent>
  7. <properties>
  8. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  9. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  10. <java.version>1.8</java.version>
  11. <spring-cloud.version>Edgware.SR4</spring-cloud.version>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-config</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-starter-eureka</artifactId>
  21. </dependency>
  22. </dependencies>
  23. <dependencyManagement>
  24. <dependencies>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-dependencies</artifactId>
  28. <version>${spring-cloud.version}</version>
  29. <type>pom</type>
  30. <scope>import</scope>
  31. </dependency>
  32. </dependencies>
  33. </dependencyManagement>
  34. <build>
  35. <plugins>
  36. <plugin>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-maven-plugin</artifactId>
  39. </plugin>
  40. </plugins>
  41. </build>

编写一个Controller,提供REST服务。代码如下:

  1. @RestController
  2. public class ProviderController {
  3. @RequestMapping("/hello/{name}")
  4. public String hello(@PathVariable("name") String name) {
  5. return "Hello," + name;
  6. }
  7. }

编写Springboot启动器,需要加上@EnableEurekaClient注解声明该项目为eureka的客户端。代码如下:

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

最后修改application.properties文件。

  1. server.port=9100
  2. spring.application.name=servcie-provider
  3. #主机名
  4. eureka.instance.hostname= localhost
  5. #eureka服务器地址
  6. eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka

3、编写服务调用者(使用Feign)
创建名为service-invoker的maven项目。pom.xml文件如下:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.5.16.RELEASE</version>
  5. <relativePath />
  6. </parent>
  7. <properties>
  8. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  9. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  10. <java.version>1.8</java.version>
  11. <spring-cloud.version>Edgware.SR4</spring-cloud.version>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-config</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-starter-eureka</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-starter-ribbon</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-feign</artifactId>
  29. </dependency>
  30. </dependencies>
  31. <dependencyManagement>
  32. <dependencies>
  33. <dependency>
  34. <groupId>org.springframework.cloud</groupId>
  35. <artifactId>spring-cloud-dependencies</artifactId>
  36. <version>${spring-cloud.version}</version>
  37. <type>pom</type>
  38. <scope>import</scope>
  39. </dependency>
  40. </dependencies>
  41. </dependencyManagement>
  42. <build>
  43. <plugins>
  44. <plugin>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-maven-plugin</artifactId>
  47. </plugin>
  48. </plugins>
  49. </build>

首先编写一个HelloService接口,Feign使用该接口完成请求。@FeignClient注解中的值表示调用服务名为service-provider的节点,@RequestMapping注解声明了调用该节点的哪个路由。

  1. @FeignClient("service-provider")
  2. public interface HelloService {
  3. @RequestMapping("/hello/{name}")
  4. String hello(@PathVariable("name") String name);
  5. }

编写一个Controller,对外提供服务,使用HelloService接口(代理对象)完成服务调用。

  1. @RestController
  2. @Configuration
  3. public class InvokerController {
  4. @Autowired
  5. private HelloService helloService;
  6. @RequestMapping("/invoker-hello/{name}")
  7. public String hello(@PathVariable String name) {
  8. return helloService.hello(name);
  9. }
  10. }

编写Springboot启动器,需要加上@EnableDiscoveryClient注解声明有能力发现eureka中的服务,加上@EnableFeignClients打开Feign开关。启动器代码如下:

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

最后修改application.properties文件。

  1. server.port=9000
  2. spring.application.name=server-invoker
  3. #主机名
  4. eureka.instance.hostname= localhost
  5. #eureka服务器地址
  6. eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka

4、构建Zuul网关服务器
创建名为zuul-server的maven项目。pom.xml文件如下:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.5.16.RELEASE</version>
  5. <relativePath/>
  6. </parent>
  7. <properties>
  8. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  9. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  10. <java.version>1.8</java.version>
  11. <spring-cloud.version>Edgware.SR4</spring-cloud.version>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-config</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-starter-eureka</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-starter-zuul</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. <scope>test</scope>
  30. </dependency>
  31. </dependencies>
  32. <dependencyManagement>
  33. <dependencies>
  34. <dependency>
  35. <groupId>org.springframework.cloud</groupId>
  36. <artifactId>spring-cloud-dependencies</artifactId>
  37. <version>${spring-cloud.version}</version>
  38. <type>pom</type>
  39. <scope>import</scope>
  40. </dependency>
  41. </dependencies>
  42. </dependencyManagement>
  43. <build>
  44. <plugins>
  45. <plugin>
  46. <groupId>org.springframework.boot</groupId>
  47. <artifactId>spring-boot-maven-plugin</artifactId>
  48. </plugin>
  49. </plugins>
  50. </build>

编写一个Springboot的启动类,并加上@EnableZuulProxy即可将此项目声明为zuul服务器。启动类如下所示:

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

接下来,最关键的一步是配置zuul服务的application.properties文件,zuul的请求转发在此配置。

  1. server.port=8080
  2. spring.application.name=zuul-server
  3. eureka.instance.hostname: localhost
  4. eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka
  5. zuul.routes.sale.path=/test/**
  6. zuul.routes.sale.service-id=server-invoker

这个配置的含义为将所有/test/**的请求转发到服务名为service-invoker的节点进行处理。

测试
启动服务器eureka-server项目
启动服务提供者service-provider项目
启动服务调用者service-invoker项目
启动服务调用者zuul-server项目
访问eureka提供的、含有集群节点信息的web页面,http://localhost:8761/

访问zuul网关,http://localhost:8080/test/invoker-hello/kangkang
接口返回内容为:hello,kangkang,得到预期结果。
在生产环境中,集群中的其他节点都没有暴露在公网环境下,只有zuul网关有公网IP,用户通过网关访问集群中的服务。

发表评论

表情:
评论列表 (有 0 条评论,405人围观)

还没有评论,来说两句吧...

相关阅读