eureka与feign实现负载均衡

忘是亡心i 2022-05-16 15:52 230阅读 0赞

上一篇博文,看了ribbon借助于RESTTemplate实现负载均衡

这篇文章,看下feign实现的负载均衡效果

对比与ribbon的区别,可能主要在于feign这边多了个注解 @EnableFeignClients,接下来详细看示例过程

springboot 2.1.0.RELEASE

springcloud Greenwich.M1

pom依赖文件

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.1.0.RELEASE</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  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>Greenwich.M1</spring-cloud.version>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-web</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-starter-openfeign</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>

服务注册部分

与之前代码无异,配置文件部分,修改下端口号即可

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

配置文件

  1. server:
  2. port: 5430 #服务注册中心端口号
  3. eureka:
  4. instance:
  5. hostname: localhost
  6. client:
  7. registerWithEureka: false #是否向服务注册中心注册自己
  8. fetchRegistry: false #是否检索服务
  9. serviceUrl: #服务注册中心的配置内容,指定服务注册中心位置
  10. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

服务提供者

服务提供者,我们提供两个访问实例

  1. @EnableEurekaClient
  2. @RestController
  3. public class HiController {
  4. @Value("${server.port}")
  5. private String port;
  6. @GetMapping("/hi")
  7. public String hello() {
  8. return "feign-provider is server port " + port;
  9. }
  10. }

服务提供者这块,feign与ribbon方式没有区别,这两者做负载均衡的区别主要在于客户端,即服务调用端。

配置文件

  1. spring.application.name=eureka-server
  2. eureka.client.service-url.defaultZone=http://localhost:5430/eureka/
  3. server.port=5431

与之前无异,仅修改服务注册中心地址和端口号即可

同样复制该服务提供者工程,修改配置文件端口号,则多一个服务提供实例

  1. spring.application.name=eureka-server
  2. eureka.client.service-url.defaultZone=http://localhost:5430/eureka/
  3. server.port=5432

服务消费者

这里与之前有区别,需要先将要调用的外部接口定义

  1. @FeignClient("eureka-server")
  2. public interface HelloService {
  3. @GetMapping("/hi")
  4. String hello();
  5. }

定义HelloService接口,使用@FeignClient注解,标注要调用的外部服务。服务里面定义需要访问的外部接口,并标注接口的请求url,请求的url应该与服务提供者的url相同,否则会抛404异常。

定义controller层

  1. @EnableEurekaClient
  2. @EnableFeignClients("com.example.consumer.service")
  3. @RestController
  4. public class HelloController {
  5. @Autowired
  6. private HelloService helloService;
  7. @GetMapping("/hello")
  8. public String hello() {
  9. return helloService.hello();
  10. }
  11. }

这里需要使用@EnableFeignClients来标注远程接口路径,程序启动时,会检查是否有@EnableFeignClients注解,如果有,则开启包扫描,扫描被@FeignClient注解修饰的接口连同接口名和注解的信息一起取出,赋给BeanDefinitionBuilder,然后根据BeanDefinitionBuilder得到BeanDefiniton,最后将BeanDefiniton注入到Ioc容器中。这里如果EnableFeignClients后面的包路径丢失,则无法扫描到要注入的bean,会启动失败。

依次启动各服务后,可以在注册中心观察到,一个客户端和两个服务端均已成功注册到服务中心

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hZ2kxMjAx_size_16_color_FFFFFF_t_70

在地址栏http://localhost:5433/hello测试

可以看到调用到5431和5432两个服务实例

20181031170841753.JPG

至此,一个简单的feign的负载均衡demo就完成了,这里没有过多的原理讲解,只是介绍工程搭建过程。如果其中有不严谨的地方或疏漏之处,欢迎浏览批评指正。谢谢。

发表评论

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

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

相关阅读

    相关 使用Feign负载均衡

    Feign 也是在客户端的负载均衡。其也集成了Ribbon负债均衡,它与Ribbon不同的是通过肺功能只要定义 服务绑定接口且以声明式的方法,优雅而简单的实现了服务的调用。

    相关 Feign实现负载均衡

      Feign是一个声明式WebService客户端,使用方法是定义一个接口并在上面添加注解即可。Feign支持可拔插式的编码器和解码器。   Spring Cloud对

    相关 eurekaribbon负载均衡

    接着上一篇博文,看下ribbon的负载均衡 重点,ribbon的负载均衡功能 改造上一篇博文的内容,服务注册中心的端口号修改为5550 服务提供者,修改端口号为5551,