Hystrix常用概念、注解及配置

概念:

线程隔离:将不同服务的请求用不同的线程池进行隔离,当某个服务不可用时请求只会耗尽该服务的线程池,但不会耗尽所有服务的线程池

服务降级:当某个服务不可用时,请求一直在等待(阻塞),则超过某个时间,自动返回该请求,告知一个友好提示,直到服务访问可以成功为止

 

一  服务降级方式

注解:

@EnableCircuitBreaker

由于一个标准的springcloud项目必然有
@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication


因此可以使用:
@SpringCloudApplication
替代上述3条注解

在服务调用处添加:

1服务调用方法上添加:

@HystrixCommand(fallbackMethod = "fallBack")

2增加fallBack方法:

public String fallBack(Long id){
return "服务太拥挤了,请稍后再试!";
}

3要求FallBack方法和调用方法的返回值类型,参数列表必须一致

因此更改服务调用方法:

 

@GetMapping("{id}")
@HystrixCommand(fallbackMethod = "fallBack")
public String queryById(@PathVariable("id") Long id){
String url = "http://user-server/user/"+id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
//由于json格式就是字符串类型,因此此处可将User类型改为返回String类

更改后的完整代码:

@RestController
@RequestMapping("consumer")
public class UserController {

@Autowired
private RestTemplate restTemplate;

@GetMapping("{id}")
@HystrixCommand(fallbackMethod = "fallBack")
public String queryById(@PathVariable("id") Long id){
String url = "http://user-server/user/"+id;
String user = restTemplate.getForObject(url, String.class);
return user;
}

public String fallBack(Long id){
return "服务太拥挤了,请稍后再试!";
}
}

由于有默认配置,因此此刻已经可以运行!

为了可以看到效果,在user-service服务提供代码中只要增加线程睡眠,时间设定1500毫秒,即可观察到效果

 

如果此类中有很多服务调用方法,为每个方法写一个FallBack方法不合理,因此可以设置统一的FallBack方法:

在服务调用类上方加入:

@DefaultProperties(defaultFallback = "fallBack")

在方法需要返回错误信息的服务调用方法上直接加入注解即可:

 

@HystrixComman

由于此中方式,FallBack方法属于统一错误处理方法,应当适用所有服务调用发放的错误调用,因此此种方式默认调用空参FallBack方法,所以改FallBack方法的参数列表为空参即可:

    public String fallBack(){
return "服务太拥挤了,请稍后再试!";
}

改造后的完整代码:

@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "fallBack")
public class UserController {

@Autowired
private RestTemplate restTemplate;

@GetMapping("{id}")
@HystrixCommand
public String queryById(@PathVariable("id") Long id){
String url = "http://user-server/user/"+id;
String user = restTemplate.getForObject(url, String.class);
return user;
}

public String fallBack(){
return "服务太拥挤了,请稍后再试!";
}
}

以上,由于使用Hystrix默认超时时长设置(默认超时时长为:1s),实际使用时各个服务的调用可能不同,因此统一设置超时时长不一定适用所有服务调用方法
因此,可以需要手动设置超时时长,有两种方法:

1 在服务调用方法中调整该服务调用方法的默认超时时长:

 

@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})

完整代码:

 

@GetMapping("{id}")
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public String queryById(@PathVariable("id") Long id){
String url = "http://user-server/user/"+id;
String user = restTemplate.getForObject(url, String.class);
return user;
}

这种方法可以针对每个服务调用方法设定超时时长

2 或者在配置文件中设置:

properties:

 

hystrix.commend.default.execution.isolation.thread.timeoutInMilliseconds=3000
hystrix.commend.user-service.execution.isolation.thread.timeoutInMilliseconds=5000
hystrix.commend.queryById.execution.isolation.thread.timeoutInMilliseconds=2000
 

yaml:

 


hystrix:
commend:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
  user-service:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
  queryById:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000

default部分为更改全局的默认超时时长

user-service部分为设置访问user-service服务器的超时时长

queryById部分为设置queryById方法的超时时长

 

二  熔断方式

之前使用服务降级方式,此种方式由于每个请求都要达到超时时间才返回,大大降低服务并发性,因此通常使用熔断方式

熔断:当大量请求无法正常访问时(触发服务降级中的超时时长),Hystrix则认为服务有问题,此时将会关闭服务,所有访问该服务的请求全部直接返回错误,不再等待超时时长

即:触发服务降级达到熔断器的阀值则开启熔断

熔断的3种状态(针对熔断器):

Open、Half Open、Closed

即:

熔断器打开:当所有请求失败的比例到达阀值(默认为50%,请求次数不低于20次),则会出发熔断器打开状态,所有请求直接回复错误

熔断器半开:熔断器打开状态(默认5S),之后进入半开状态,放部分请求通过,测试访问是否成功,如成功则熔断器转入关闭状态,如依旧不成功则熔断器继续进入打开状态并再次进行倒计时

熔断器关闭:所有请求可以正常访问服务

 

circuitBreaker.requestVolumeThreshold=20 //触发熔断的最小请求次数,默认为20
circuitBreaker.sleepWindowInMilliseconds=5000 //休眠时长,默认为5秒
circuitBreaker.errorThresholdPercentage=50 //触发熔断的失败请求最小占比,默认50%

当主类上方使用@EnableCircuitBreaker注解,即熔断器方式生效

 

注:通常只需要修改超时时长即可,因为超时时长默认1秒太短,网络波动都有可能出发超时,其他设置通常不需要额外更改

 

posted @ 2019-10-15 17:55  WaterGe  阅读(2161)  评论(0编辑  收藏  举报