java 熔断_Hystrix服务熔断

## 熔断原理

熔断器,页脚断路器,其英文单词为:Circuit Breaker.

熔断机制的原理很简单,像家里的电路熔断器,如果电路发生短路能立刻熔断电路,避免发生火灾.在分布式系统中应用这一模式之后,服务调用方可以自己进行判断某些服务反应慢或者存在大量超时的情况时,能够主动熔断,防止整个系统被拖垮.

不同于电路熔断只能断不能自动重连,Hystrix可以实现弹性容错,当情况好转之后,可以自动重连.这就好比魔术师把鸽子变没了容易,但是真正考验技术的是如何把小时的鸽子再变回来.

通过断路的方式,可以将后续请求直接拒绝掉,一段时间之后允许部分请求通过,如果调用成功则回到电路闭合状态,否则继续断开.

![](https://box.kancloud.cn/666092668a29caa8cb6422f98bbecdfb_827x486.png)

## 状态机三种状态

1. Closed:关闭状态(断路器关闭),所有请求都正常访问.

2. Open:打开状态(断路器打开),所有请求都会被降级.Hystrix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全关闭.默认失败比例的阈值是50%,请求次数最少不低于20次.

3. Half Open:半开状态,Closed状态不是永久的,关闭后会进入休眠时间(默认是5S).随后断路器会自动进入半开状态.此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计划.

## 配置

circuitBreaker.requestVolumeThreshold:触发熔断的最小请求次数,默认20.

circuitBreaker.sleepWindowInMilliseconds:休眠时长,默认是5000毫秒.

circuitBreaker.errorThresholdPercentage:触发熔断的失败请求最小占比,默认50%.

## 代码

~~~

@RestController

@RequestMapping("/user")

@DefaultProperties(defaultFallback = "defaultCallBack")

public class UserController

{

@Autowired

private RestTemplate restTemplate;

@Autowired

private DiscoveryClient discoveryClient;

@GetMapping("/{id}")

@HystrixCommand(commandProperties = {

@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //最近请求的次数

@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠时间

@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60") //错误百分比

})

public String index(@PathVariable("id") Long id)

{

if (id % 2 == 0) {

throw new RuntimeException(""); //模拟请求失败

}

String url = "http://user-server/user/";

return restTemplate.getForObject(url + id, String.class);

}

public String defaultCallBack()

{

return "服务器压力很大";

}

}

~~~

### 快速请求几次,触发熔断器:

![](https://box.kancloud.cn/2d3d3f91ef11b11e11e38999f51d612f_1090x696.png)

### 当我们再次请求正常逻辑之后,会快速失败:

![](https://box.kancloud.cn/f4d1a60f19b692c3b40f8b0fc71272fe_1174x726.png)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
熔断机制是一种容错机制,用于防止分布式系统中的故障扩散。在分布式系统中,如果某个服务或组件出现问题,将会导致整个系统出现瓶颈或者崩溃。为了解决这个问题,熔断机制可以在发现某个服务故障时,快速断开与该服务的连接,避免故障扩散。 Hystrix是Netflix开源的一款熔断框架,主要用于分布式系统中的容错处理。使用Hystrix可以将服务之间的依赖关系抽象为一条线路,当线路中的某个服务出现问题时,Hystrix会自动触发熔断机制,快速切断与该服务的连接,并启用降级策略,保证整个系统的可用性。 下面简单介绍Hystrix的使用: 1.引入Hystrix依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.5.18</version> </dependency> ``` 2.创建HystrixCommand 通过继承HystrixCommand类,可以创建一个Hystrix命令,该命令用于执行远程服务,并处理服务超时或者异常等情况。 ``` public class RemoteServiceCommand extends HystrixCommand<String> { private final String url; public RemoteServiceCommand(String url) { super(HystrixCommandGroupKey.Factory.asKey("RemoteServiceGroup")); this.url = url; } @Override protected String run() throws Exception { //执行远程服务调用 return HttpUtils.get(url); } @Override protected String getFallback() { //降级处理 return "Fallback"; } } ``` 在上面的代码中,我们通过继承HystrixCommand类,创建了一个RemoteServiceCommand命令,该命令用于执行远程服务调用。当服务调用失败时,Hystrix会自动触发降级处理,使用getFallback()方法返回一个默认结果。 3.执行HystrixCommand 通过以下方式执行HystrixCommand命令: ``` RemoteServiceCommand command = new RemoteServiceCommand(url); String result = command.execute(); ``` 在上面的代码中,我们创建了一个RemoteServiceCommand命令,并通过execute()方法执行该命令。当服务调用失败时,Hystrix会自动触发降级处理,返回一个默认结果。 总结: Hystrix是一款强大的熔断框架,可以用于分布式系统中的容错处理。使用Hystrix可以将服务之间的依赖关系抽象为一条线路,当线路中的某个服务出现问题时,Hystrix会自动触发熔断机制,保证整个系统的可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值