vlambda博客
学习文章列表

OpenFeign 和 Hystrix 的源码解读(原创)

OpenFeign 和 Hystrix 的源码解读(原创)

Hystrix

目录

OpenFeign 和 Hystrix 的源码解读(原创)Hystrix什么是Hystrix雪崩效应雪崩效应的解决方案请求缓存:支持将一个请求和返回结果做缓存处理请求合并:将相同的请求合并进行批量请求服务隔离:服务间进行分割开来,资源互不影响使用线程池对每个接口进行隔离,保证接口之间互不影响 (适用于99%的场景)a使用信号量隔离,每次请求通过计数信号量来限制的,当信号量大于了最大请求数maxConcurrentRequests时,进行限制,调用fallback快速返回。信号量和线程池隔离的对比服务熔断:牺牲局部服务,保全整体服务的稳定服务降级:服务熔断之后,返回缺省值Hystrix源码解析OpenFeign什么是OpenFeignopenFeign的使用OpenFeign原理和源码解析feign自定义负载均衡(因为我的openFeign版本号是3.0.2,不再支持ribbon,所以使用spring-cloud-starter-loadbalancer里面的类来进行自定义)谈一谈openFeign的具体使用openFeign的版本号区别(重要)可查阅官方文档 https://spring.io/projects/spring-cloud-openfeign/#learn

什么是Hystrix

是由netflix的一个开源组件,目的是为了提高整个系统的稳定性。

雪崩效应

当一个服务被其他服务调用的时候,被调用的服务崩溃之后会引发其他与之直接或间接相关服务的崩溃,简称雪崩效应造成的原因:

  • 服务提供者不可用(硬件故障,程序Bug,缓存击穿,用户大量请求等)

  • 重试加大流量(用户重试,代码逻辑生成)

  • 服务消费者不可用(同步等待造成的资源耗尽)

雪崩效应的解决方案

请求缓存:支持将一个请求和返回结果做缓存处理
 
   
   
 

  
    
    
  

   
     
     
   

    
      
      
    

最后在启动类上面配置 @EnableCaching

请求合并:将相同的请求合并进行批量请求
     
       
       
     

      
        
        
      

服务隔离:服务间进行分割开来,资源互不影响
使用线程池对每个接口进行隔离,保证接口之间互不影响 (适用于99%的场景)a
       
         
         
       

使用信号量隔离,每次请求通过计数信号量来限制的,当信号量大于了最大请求数maxConcurrentRequests时,进行限制,调用fallback快速返回。
        
          
          
        

信号量和线程池隔离的对比
隔离方式 是否支持超时 是否支持熔断 隔离原理 是否是异步调用 资源消耗
线程池隔离 支持 支持 每个服务单独一个线程池 支持异步和同步
信号量隔离 不支持 支持 通过信号量计数器 只支持同步
服务熔断:牺牲局部服务,保全整体服务的稳定
@HystrixCommand(
commandProperties = {
//10s内请求大于10个,就启动熔断。执行fallback的方法
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD , value = "10"),
//请求错误率大于50%就启动熔断器,然后for循环重试,符合熔断条件就出发fallback的方法
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE , value = "50"),
//熔断多少秒后开始重试,默认是5s
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS , value = "5000")
},
fallbackMethod = "selectByUserIdFallBack"
)
public Future<User> selectByUserId(Long id){
return null;
}
服务降级:服务熔断之后,返回缺省值

Hystrix源码解析

@HystrixCommand(hystrix的核心组件,初始化、执行、限流、熔断等都是在这个组件中完成的) 和 @HystrixCollapser 注解,使用 HystrixCommandAspect 进行解析

         
           
           
         

          
            
            
          

现在来讲一下方法执行的核心

           
             
             
           

接下来讲解一下 HystrixCircuitBreaker 这个实现断路器功能的核心接口类
同事,它有两个内部的实现类 HystrixCircuitBreakerImplNoOpCircuitBreaker
HystrixCircuitBreakerImpl 主要是要去查看 HystrixCommand 的状态,决定要不要去执行请求。

            
              
              
            

OpenFeign

什么是OpenFeign

ribbon 是一个基于HTTP和TCP的客户端,提供了负载均衡、失败重试、ping等功能;
feign 是一个声明式的Web服务端,内置有ribbon。与ribbon不同的是,fein只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
openFein 是feign的升级版,支持@RequestMapping这种springMVC的注解

openFeign的使用

             
               
               
             

OpenFeign原理和源码解析

              
                
                
              

总结一下FeignClientsRegistrar的主要作用

  1. 加载@EnableClientFeign的参数配置

  2. 注册缺省feign客户端配置bean定义
    我们所定义的@feignClient会以bean的形式注入到bean容器中,当使用@Autowire注册feign客户端的时候,容器会使用工厂类FeignClientFactoryBean为其生成一个实例。

               
                 
                 
               

Openfeign负载均衡的原理(其实也就是loadBalancer负载均衡的原理,以为你ribbon目前已经没有更新,高版本的OpenFeign默认不支持ribbon)

                
                  
                  
                

feign自定义负载均衡(因为我的openFeign版本号是3.0.2,不再支持ribbon,所以使用spring-cloud-starter-loadbalancer里面的类来进行自定义)

                 
                   
                   
                 

谈一谈openFeign的具体使用

根据不同的feignClient配置不同的参数,可以最后在@EnableFeignClients(defaultConfiguration = xxx)配置,使用于所有没有配置的客户端

                  
                    
                    
                  

比如如下配置

                   
                     
                     
                   

对应 application.yml中的配置

                    
                      
                      
                    

openFeign的版本号区别(重要)可查阅官方文档 https://spring.io/projects/spring-cloud-openfeign/#learn

上述是使用的 org.springframework.cloud:spring-cloud-starter-openfeign:3.0.2 这个版本号,其中不再有 LoadBalancerFeignClient 这个作为feignClient,
而是默认使用 FeignBlockingLoadBalancerClient 这个隶属于 org.springframework.cloud.openfeign.loadbalancer 这个路径下面的客户端实例进行负载均衡;
目前来说有四个版本

版本号 支持spring-cloud-starter-loadbalancer 支持spring-cloud-starter-netflix-ribbon 是否包含hystrix
3.0.2 CURRENT GA 支持 不支持 不包含
3.0.3-SNAPSHOT SNAPSHOT 支持 不支持 不包含
2.2.9.BUILD-SNAPSHOT SNAPSHOT 支持 支持 包含
2.2.8.RELEASE GA 支持 支持 包含

其中支持使用 spring-cloud-starter-netflix-ribbon 作为负载均衡的需要在配置类中使用 spring.cloud.loadbalancer.ribbon.enabled=true 来开启