SpringCould中的Hystrix-Hystrix-服务熔断-《Java笔记》

admin 2025-10-19 05:49:52 编程 来源:ZONE.CI 全球网 0 阅读模式

Java SpringCloud Hystrix服务熔断 类似现实生活中的“保险丝“,当某个异常条件被触发,直接熔断保险丝来起到保护电路的作用,熔断的触发条件可以依据不同的场景有所不同,比如统计一个时间窗口内失败的调用次数。

断路器状态机

Hystrix-服务熔断 - 图1Closed:熔断器关闭状态(所有请求返回成功)Open:熔断器打开状态(调用次数累计到达阈值或者比例,熔断器打开,服务直接返回错误)Half Open:熔断器半开状态(默认时间过后,进入半熔断状态,允许定量服务请求,如果调用都成功,则认为恢复了,则关闭断路器,反之打开断路器)

断路器原理

(不让客户端“裸调“服务器的rpc接口,而是在客户端包装一层。就在这个包装层里面,实现熔断逻辑)

  1. public class CommandHelloWorld extends HystrixCommand<String> {
  2. private final String name;
  3. public CommandHelloWorld(String name) {
  4. super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
  5. this.name = name;
  6. }
  7. @Override
  8. protected String run() {
  9. //关键点:把一个RPC调用,封装在一个HystrixCommand里面
  10. return "Hello " + name + "!";
  11. }
  12. }

客户端调用:以前是直接调用远端RPC接口,现在是把RPC接口封装到HystrixCommand里面,它内部完成熔断逻辑

  1. String s = new CommandHelloWorld("World").execute()

缺省的,上面的HystrixCommand是被扔到一个线程中执行的,也就是说,缺省是线程隔离策略。还有一种策略就是不搞线程池,直接在调用者线程中执行,也就是信号量的隔离策略。

熔断参数配置

  1. circuitBreaker.requestVolumeThreshold //滑动窗口的大小,默认为20
  2. circuitBreaker.sleepWindowInMilliseconds //过多长时间,熔断器再次检测是否开启,默认为5000,即5s钟
  3. circuitBreaker.errorThresholdPercentage //错误率,默认50%

每当20个请求中,有50%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到5s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开。

案例

  1. @RestController
  2. @DefaultProperties(defaultFallback = "defaultFallback")
  3. public class FeignClientTestController {
  4.   @HystrixCommand(commandProperties = {
  5. @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
  6. @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
  7. @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
  8. @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")
  9.   })
  10.   public String serverMethod() {
  11.     return null;
  12.   }
  13.   public String defaultFallback() {
  14.   return "服务器开小差了";
  15.   }
  16. }

那么服务熔断跟降级到底有什么区别呢?

总结

服务降级:当服务内部出现异常情况,将触发降级,这个降级是每次请求都会去触发,走默认处理方法**defaultFallback**服务熔断:在一定周期内,服务异常次数达到设定的阈值或百分比,则触发熔断,熔断后,后面的请求将都走默认处理方法**defaultFallback**

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  6