集成Hystrix实践

Hystrix能帮助服务在调用外部依赖时限流和降级,可在现有框架条件下按以下步骤集成Hystrix。

引入spring-cloud-starter-hystrix

修改POM,  注意exclude rxjava,否则会和现有slueth依赖冲突。
引入spring-cloud-starter-hystrix
1
2
3
4
5
6
7
8
9
10
11
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-hystrix</artifactId>
     <version> 1.1 . 0 .RELEASE</version>
     <exclusions
         <exclusion>
             <groupId>io.reactivex</groupId>
             <artifactId>rxjava</artifactId>
         </exclusion>
     </exclusions>
</dependency>
 
添加 EnableCircuitBreakerConfiguration注解

 

EnableCircuitBreaker
1
2
3
4
5
6
7
@Configuration
@EnableCircuitBreaker
public  class  Application{
     public  static  void  main(String[] args)  throws  Exception {
         ApplicationStarter.run(Config. class , args);
     }
}

配置文件增加默认配置

hystrix default settings
1
2
3
hystrix.command. default .execution.isolation.strategy=SEMAPHORE
hystrix.command. default .execution.isolation.semaphore.maxConcurrentRequests= 10
hystrix.command. default .execution.isolation.thread.timeoutInMilliseconds= 120000

注意:

  1. 上面execution.isolation.strategy现在必须设为SEMAPHORE,否则会影响调用链追踪、灰度发布的相关功能。
  2. 如果一个Hystrix Command同时最大请求数超过execution.isolation.semaphore.maxConcurrentRequests,后面请求会直接拒绝。可根据实际需要调整,或者按command isntance设置execution.isolation.semaphore.maxConcurrentRequests
  3. isolation.thread.timeoutInMilliseconds也同样应用于semaphore isolation。
    这里默认请求超时时间为120000milliseconds=2minutes,可根据业务方需要调整,或者按环境在application-dev.properties, application-[env].properties. 方便调试诊断问题。
    另外可以按command isntance设置execution.isolation.thread.timeoutInMilliseconds。

 

限流-Fail Fast

把对外部依赖的调用包装到一个方法,添加HystrixCommand注解。

Hystrix Fail Fast
@HystrixCommand
public  User getUserByIdSyncFailfast( int  userId) {
    return  userResource.findUserById(userId);
}

 

降级-Fail Silent or Fail Static

提供fallback方法,提供默认返回。注意fallback方法签名要和Hystrix添加注解的方法一致。

Hystrix Fail Silent
1
2
3
4
5
6
7
8
9
10
11
@HystrixCommand (fallbackMethod= "fallback" )
public  User getUserByIdSync( int  userId) {
     return  userResource.findUserById(userId);
}
  
public  User fallback( int  userId) {
     User user =  new  User();
     user.setId(userId);
     user.setName( "Fallback" );
     return  user;
}

自定义超时

下面的例子Hystrix注解的方法除了提供了fallback方法还调整了超时时间到1s(供demo)。

Hystrix customize Timeout
@HystrixCommand (fallbackMethod= "fallback"
         ,commandProperties = {
             @HystrixProperty (name =  "execution.isolation.thread.timeoutInMilliseconds" , value =  "1000" )
         }
)
public  User getUserByIdTimeout( int  userId) {
     return  userResource.findUserById(userId);
}

异步调用

HystrixCommand注解可应用于Java Future,调用方使用和Future使用一样。

Hystrix aysn call with Java Future
@HystrixCommand (fallbackMethod= "fallback" )
public  Future<User> getUserByIdAsync( int  userId)  throws  IOException{
     return  new  AsyncResult<User>() {
         @Override
         public  User invoke() {
             System.out.println( "Asychrous call back for hystrix" );
             return  userResource.findUserById(userId);
         }
     };
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值