当前位置:   article > 正文

SpringCloud Hystrix服务应用熔断服务降级@HystrixCommand fallbackMethod

hystrixcommand fallbackmethod

 

个人博客网:www.lfuping.cn    (你想要这里多有)

 

Hystrix服务熔断服务降级@HystrixCommand fallbackMethod

熔断机制是应对雪崩效应的一种微服务链路保护机制。

当某个服务不可用或者响应时间超时,会进行服务降级,进而熔断该节点的服务调用,快速返回自定义的错误影响页面信息。
一、修改服务生产者项目springcloud-provider-1,springcloud-provider-2(两个项目修改内容都是一样的):

1.pom.xml加下 hystrix支持

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-hystrix</artifactId>
  4. </dependency>

2.在项目的启动类中加下注解支持 @EnableCircuitBreaker
3.在Controller类中新增方法getInfo:

  1. package com.li.spingcloud.provider.controller;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import javax.annotation.Resource;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.web.bind.annotation.GetMapping;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.RequestMethod;
  12. import org.springframework.web.bind.annotation.RestController;
  13. import com.li.spingcloud.provider.service.StudentService;
  14. import com.li.springcloud.common.model.Student;
  15. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  16. @RestController
  17. public class ProviderController {
  18. @Autowired
  19. private StudentService studentService;
  20. /**
  21. * 查询
  22. *
  23. * @return
  24. */
  25. @RequestMapping(value = "/provider/list", produces = "application/json; charset=utf-8", method = {
  26. RequestMethod.POST, RequestMethod.GET })
  27. public List<Student> list() {
  28. System.out.println("ProviderController----我是生产者1");
  29. return studentService.list();
  30. }
  31. /**
  32. * 查询 Hystrix的方式
  33. *
  34. * @return
  35. * @throws InterruptedException
  36. */
  37. // 加上@HystrixCommand注解 以及 fallbackMethod
  38. // 表明这个方法再没有异常以及没有超时(hystrix默认1秒算超时)的情况,才返回正常的业务数据;
  39. @HystrixCommand(fallbackMethod = "getInfoFallback")
  40. @RequestMapping(value = "/provider/listHystrix", produces = "application/json; charset=utf-8", method = {
  41. RequestMethod.POST, RequestMethod.GET })
  42. public List<Student> listHystrix() throws InterruptedException {
  43. Thread.sleep(2000);
  44. System.out.println("ProviderController----我是生产者1");
  45. // 模拟调用服务超时
  46. // 然后采取 Hystrix进行服务降级,进而熔断该节点的服务调用,快速返回自定义的错误影响页面信息。
  47. return studentService.list();
  48. }
  49. /**
  50. * 组成返回错误信息的map
  51. *
  52. * @return
  53. * @throws InterruptedException
  54. */
  55. public List<Student> getInfoFallback() throws InterruptedException {
  56. List<Student> list = new ArrayList<Student>();
  57. Student stu=new Student();
  58. stu.setName("系统繁忙,请稍后重试....");
  59. stu.setId(500);
  60. list.add(stu);
  61. return list;
  62. }
  63. }

正常访问返回的是查询到的业务数据;
Thread.sleep(2000) 模拟超时;
加上@HystrixCommand注解 以及 fallbackMethod
表明这个方法再没有异常以及没有超时(hystrix默认1秒算超时)的情况,才返回正常的业务数据;
否则,进入我们fallback指定的本地方法,500是表示系统出错,稍后重试,有效的解决雪崩效应,以及返回给用户界面很好的报错提示信息;

4、在springcloud-consumer-1消费者项目修改Controller类的调用地址:

  1. package com.li.spingcloud.consumer.controller;
  2. import java.util.List;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RequestMethod;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import org.springframework.web.client.RestTemplate;
  8. import com.li.springcloud.common.model.Student;
  9. @RestController
  10. public class ConsumerController {
  11. @Autowired
  12. private RestTemplate restTemplate;
  13. /**
  14. * 查询数据库
  15. *
  16. * @return
  17. */
  18. @RequestMapping(value = "/consumer/list", produces = "application/json; charset=utf-8", method = {
  19. RequestMethod.POST, RequestMethod.GET })
  20. public List<Student> list() {
  21. return restTemplate.getForObject("http://PROVIDER/provider/listHystrix",
  22. List.class);
  23. }
  24. }

5.测试先启动Erueka集群或者单机,在启动服务生产者项目集群或者单机,在启动pringcloud-consumer-1消费者项目;最后访问页面地址结果如下:

因为 Hystrix默认1秒算超时,所有 sleep了2秒 所以进入自定义fallback方法,防止服务雪崩;返回了错误信息;

6.Hystrix默认1秒算超时这个时间也是可以进行配置的:
在生产者项目application.yml配置文件下:

  1. #hystrix超时时间配置 (如果不配置的话默认是1000毫秒超时)
  2. hystrix:
  3. command:
  4. default:
  5. execution:
  6. isolation:
  7. thread:
  8. timeoutInMilliseconds: 1000

当配置的超时间小于,调用服务的延迟时间就不会触发熔断机制。

  1. 附上源码:https://pan.baidu.com/s/1flBSgjBq_Rua6B77jphYPw
  2. 提取码: r2ua

                                                   

                                                     欢迎关注我的微信公众号:平川大叔

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/843117
推荐阅读
相关标签
  

闽ICP备14008679号