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
circuitBreaker.sleepWindowInMilliseconds=5000
circuitBreaker.errorThresholdPercentage=50
当主类上方使用@EnableCircuitBreaker注解,即熔断器方式生效
注:通常只需要修改超时时长即可,因为超时时长默认1秒太短,网络波动都有可能出发超时,其他设置通常不需要额外更改
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」