vlambda博客
学习文章列表

Ribbon、LoadBalance(负载均衡)、OpenFeign服务--JAVA成长之路

负载均衡LB

Load Balance(负载均衡):简单的说就是将用户的请求平摊的分配到多个服务器上,从而达到系统的HA(高可用)。常见的负载均衡工具有nginx、LVS,硬件上F5等

集中式LB

即在服务的消费方和提供方之间使用独立的LB设施,可以是硬件F5、也可以是软件nginx、LVS等,提供该设施将请求通过某种策略发送给服务提供方

进程内LB

Ribbon

SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端的负载均衡工具,主要功能是提供了客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供了一系列完善的配置项例如连接超时、重试等。Ribbon目前也进入了维护模式

版本选择

SpringCloud版本依赖于SpringBoot的版本,可以从官网查询相关版本依赖关系:spring.io/projects/sp…


  
    
    
  
  1. springboot 2.2.5.RELEASE

  2. springcloud Hoxton.SR3

添加依赖


  
    
    
  
  1. <!--eureka client-->

  2. <dependency>

  3. <groupId>org.springframework.cloud</groupId>

  4. <artifactId>spring-cloud-starter-netflix-ribbon-client</artifactId>

  5. </dependency>

  6. <!--或者直接导入eureka client,该依赖中集成了ribbon、hystrix等Netflix组件-->

  7. <!--eureka client-->

  8. <dependency>

  9. <groupId>org.springframework.cloud</groupId>

  10. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

  11. </dependency>

  12. <dependency>

  13. <groupId>org.springframework.boot</groupId>

  14. <artifactId>spring-boot-starter-web</artifactId>

  15. </dependency>

  16. <dependency>

  17. <groupId>org.springframework.boot</groupId>

  18. <artifactId>spring-boot-starter-actuator</artifactId>

  19. </dependency>

  20. <dependency>

  21. <groupId>org.projectlombok</groupId>

  22. <artifactId>lombok</artifactId>

  23. <optional>true</optional>

  24. </dependency>

  25. <dependency>

  26. <groupId>org.springframework.boot</groupId>

  27. <artifactId>spring-boot-starter-test</artifactId>

  28. </dependency>

  29. <dependency>

  30. <groupId>org.springframework.boot</groupId>

  31. <artifactId>spring-boot-devtools</artifactId>

  32. <scope>runtime</scope>

  33. <optional>true</optional>

  34. </dependency>

Ribbon核心组件Irule

 

IRule:根据特点算法从服务列表中选取一个要访问的服务

替换Ribbon的默认负载均衡算法

Ribbon默认的负载均衡算法是轮询RoundRobinRule

编写配置类

该配置类不能防止在主启动类的子包下,否则该类就会被所有Ribbon客户端共享,达不到定制化目的


  
    
    
  
  1. @Configuration

  2. public class MyLoadBalance {

  3. @Bean

  4. public IRule myRule() {

  5. return new RandomRule();

  6. }

  7. }

  8. 复制代码

主启动类的修改

修改某个微服务的负载均衡配置


  
    
    
  
  1. // 使用@RibbonClient注解,name属性:服务名称,configuration:自定义的Irule实现类

  2. @SpringBootApplication

  3. @EnableEurekaClient

  4. // 自定义某个微服务的负载均衡规则,使用@RibbonClient注解,将configuration属性中的@Configure去掉,不注入到spring容器中

  5. @RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = {MyLoadBalance.class})

  6. public class OrderMain80 {

  7. public static void main(String[] args) {

  8. SpringApplication.run(OrderMain80.class, args);

  9. }

  10. }

Ribbon VS Nginx

Nginx是服务器端的负载均衡,客户端的所有请求都会交给nginx,由nginx分发到各个服务器上。即负载均衡是由服务端实现的 Ribbon是本地的负载均衡,在调用微服务接口的时,会在注册中心上获取注册服务信息列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用的技术

OpenFeign

Feign是一个声明式的WebService客户端。使用Feign可以让编写WebService客户端更加便捷。它的使用方法是定义一个服务接口然后添加相关注解,OpenFeign支持SpringMVC标准注解和HttpMessageConverters。Feign默认结合了Ribbon,支持负载均衡

Feign和OpenFeign的区别

Feign

Feign是Spring Cloud组件中的一个轻量级Restful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端的负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解接口,调用这个接口,就可以调用服务注册中心的服务

OpenFeign

OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理产生实现类,实现类中做负载均衡并调用其他服务

Feign服务的调用

公共模块中添加接口方法


  
    
    
  
  1. // name属性:微服务名

  2. @FeignClient(name = "cloud-payment-service")

  3. public interface PaymentService {

  4. // 服务提供者端的配置

  5. @GetMapping("/payment/get/{id}")

  6. public CommonResult<Payment> getById(@PathVariable("id") Integer id);

  7. @GetMapping("/payment/timeout")

  8. public String timeout();

  9. }

添加依赖


  
    
    
  
  1. <!--公共api依赖,包含feign接口-->

  2. <dependency>

  3. <groupId>com.sun</groupId>

  4. <artifactId>cloud-api-commons</artifactId>

  5. <version>1.0-SNAPSHOT</version>

  6. </dependency>

  7. <dependency>

  8. <groupId>org.springframework.cloud</groupId>

  9. <artifactId>spring-cloud-starter-openfeign</artifactId>

  10. </dependency>

  11. <dependency>

  12. <groupId>org.springframework.cloud</groupId>

  13. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

  14. </dependency>

  15. <dependency>

  16. <groupId>org.springframework.boot</groupId>

  17. <artifactId>spring-boot-starter-web</artifactId>

  18. </dependency>

  19. <dependency>

  20. <groupId>org.springframework.boot</groupId>

  21. <artifactId>spring-boot-starter-actuator</artifactId>

  22. </dependency>

  23. <dependency>

  24. <groupId>org.springframework.boot</groupId>

  25. <artifactId>spring-boot-starter-test</artifactId>

  26. </dependency>

  27. <dependency>

  28. <groupId>org.springframework.boot</groupId>

  29. <artifactId>spring-boot-devtools</artifactId>

  30. <scope>runtime</scope>

  31. <optional>true</optional>

  32. </dependency>

  33. <dependency>

  34. <groupId>org.projectlombok</groupId>

  35. <artifactId>lombok</artifactId>

  36. <optional>true</optional>

  37. </dependency>

修改application.yml

注意:feign接口调用默认你超时时间是1s,如果出现网络延迟等,会导致接口调用失败


  
    
    
  
  1. server:

  2. port: 80

  3. spring:

  4. application:

  5. name: cloud-consumer-feign-order

  6. eureka:

  7. client:

  8. fetch-registry: true

  9. register-with-eureka: false

  10. service-url:

  11. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

  12. #openfeign的超时处理

  13. feign:

  14. client:

  15. config:

  16. default:

  17. # 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间

  18. connectTimeout: 5000

  19. # 指的是建立连接后从服务器读取到可用资源所用的时间

  20. readTimeout: 5000

修改主启动类


  
    
    
  
  1. @SpringBootApplication

  2. @EnableFeignClients

  3. public class OrderOpenFeignMain80 {

  4. public static void main(String[] args) {

  5. SpringApplication.run(OrderOpenFeignMain80.class, args);

  6. }

  7. }

OpenFeign日志信息完善

日志级别

  • NONE: 默认的,不显示任何日志

  • BASIC:仅记录请求方法,URL、响应状态码以及执行时间

  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息

  • FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文以及元数据

配置日志bean


  
    
    
  
  1. @Configuration

  2. public class LogConfig {

  3. @Bean

  4. Logger.Level feignLoggerLevel() {

  5. return Logger.Level.FULL;

  6. }

  7. }

修改application.yml


  
    
    
  
  1. #feign日志打印

  2. logging:

  3. level:

  4. com.sun.cloud.service.PaymentService: debug