今天来看下Hystrix的熔断与降级。

首先什么是降级?当请求超时、资源不足等情况发生时进行服务降级处理,不调用真实服务逻辑,而是使用快速失败(fallback)方式直接返回一个托底数据,保证服务链条的完整,避免服务雪崩。需要注意的是,服务降级是在客户端层面实现的。接下来通过代码进行一个实践:

首先需要添加Hystrix的依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

application.yml:

server:
port: 10090 spring:
application:
name: spring-cloud-hystrix-test eureka:
client:
service-url:
defaultZone: http://127.0.0.1:9090/eureka
fetch-registry: true
register-with-eureka: true

controller层代码实现:

@RestController
public class TestController { @Autowired
TestService service; @GetMapping("/hystrix/test")
public String helloHystrix() {
return service.test();
}
}

service层代码实现:

@Service
public class TestService { @Autowired
private RestTemplate restTemplate; @Autowired
private DiscoveryClient discoveryClient; @HystrixCommand(fallbackMethod = "myFallback")
public String test() { ServiceInstance instance = discoveryClient.getInstances("spring-cloud-service-provider").get(0);
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/test";
return restTemplate.getForObject(url, String.class);
} public String myFallback() {
return "fallback";
}
}

这里我们指定了myFallback()作为Fallback方法,我们通过浏览器访问一下这个服务试试看:

调用成功,因为现在我们的服务端并没有出现超时等需要进行降级处理的异常。为了验证降级我们对客户端以及服务端的代码进行微调。

客户端上增加了Hystrix属性中timeout的设置,调整为3秒钟未取到服务端的返回,视为超时:

@HystrixCommand(fallbackMethod = "myFallback", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
public String test() {

ServiceInstance instance = discoveryClient.getInstances("spring-cloud-service-provider").get(0);
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/test";
return restTemplate.getForObject(url, String.class);
}

服务端则是增加一个4秒中的sleep:

@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() throws InterruptedException {

Thread.sleep(4000);
return "Hello world!";
}

再次进行验证:

这次可以看到成功触发了降级。

再来看一下什么是熔断。当一定时间内,异常请求比例(请求超时、网络故障、服务异常等)达到阈值时,启动熔断器,熔断器一旦启动,则会停止调用具体服务逻辑,通过fallback快速返回托底数据,保证服务链的完整。看上去和降级差不多?不过熔断是在服务端实现,目的是当服务端的某个服务出现异常后为了不影响其他客户端的请求而做出的及时回应。

关于熔断,我们还有必要了解一下熔断机制的三个状态:关闭,开启和半开。最开始是关闭状态,这个时候所有请求都可以通过;如果错误请求达到一定的阈值,就会变成开启状态,此时所有请求短路,直接返回失败的响应;一段时间后,断路器会变成半开状态,如果下一个请求成功了,就关闭断路器,反之就开启断路器。

来看一下具体的代码实现:

@RestController
public class ServiceController { @RequestMapping(value = "/test", method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = "myFallback",
commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value="1"),
@HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value="5000")
})
public String test() throws Exception { System.out.println("test() called...");
throw new Exception("test exception");
} private String myFallback() {
return "fallback";
}
}

这里设置了熔断的一个阈值,也就是10秒内异常请求数达到1次就进行熔断,同时在5秒钟后恢复请求状态。

启动两个浏览器进行验证:

可以看到由于服务端直接抛出异常,两次调用均调用了托底服务,但是服务端却只记录了一次调用,因为第一次调用抛出异常后已经进入熔断状态:

同时由于设置了5秒后恢复请求,我们在5秒后再次尝试调用,服务端又会重新记录正常调用时的信息:

参考资料:

https://www.cnblogs.com/yb-ken/p/15068392.html

https://www.cnblogs.com/hellxz/p/8889017.html

https://www.cnblogs.com/bamboocloud/articles/10275090.html

https://www.jianshu.com/p/01efebbfc269

https://blog.csdn.net/wangchengming1/article/details/93191815

https://blog.csdn.net/tongtong_use/article/details/78611225

最新文章

  1. Spark读取Hbase的数据
  2. IUS
  3. DES MAC PIN HEX
  4. C语言strchr()函数:查找某字符在字符串中首次出现的位置
  5. &lt;video&gt;和&lt;audio&gt;标签
  6. MySQL的C++简单封装
  7. golang 性能
  8. &lt;php&gt;添加数据注意事项
  9. Android入门2:从GridView控件使用到自定义Adapter
  10. 构建高并发&amp;高可用&amp;安全的IT系统-高并发部分
  11. 2018-2019-2 网络对抗技术 20165305 Exp6 信息搜集与漏洞扫描
  12. beego 实现API自动化文档
  13. InheritParasitic.js
  14. 使用poi读写excel文件
  15. Bioconductor(Bioconductor for Genomic Data Science教程)
  16. maven的传递性依赖
  17. Sublime Text 3技巧:支持GB2312和GBK编码
  18. C#.net随机数函数
  19. September 14th 2017 Week 37th Thursday
  20. JavaScript中的数据属性和访问器属性

热门文章

  1. Golang语言系列-13-常用内置包
  2. AttributeError: module &#39;numpy&#39; has no attribute &#39;num&#39;
  3. IDEA永久使用!!(很全)
  4. Linux UDP服务器编程
  5. SQL 练习1
  6. Linux系统管理命令-systemctl 和 sshd 服务
  7. SoutceTree用户名或者密码输入错误解决方案
  8. mysql基础操作(四):简单多表查询
  9. 回顾games101中的SSAA和MSAA
  10. SpringMVC笔记(3)