• Hystrix断路器


    1.消费者添加依赖

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
    4. dependency>

    2.消费者Application上添加注解,驱动Hystrix

    1. @EnableCircuitBreaker
    2. @SpringBootApplication
    3. public class ProductApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(ProductApplication.class, args);
    6. }

    3.在服务提供者添加接口

    模拟服务提供者出现错误

    1. @RestController
    2. public class HystrixController {
    3. private static Long MaxSleepTime = 5000L;
    4. // 超时
    5. @RequestMapping("/timeout")
    6. public ResultMessage TestError() {
    7. try {
    8. Thread.sleep((long) (MaxSleepTime * Math.random()));
    9. } catch (InterruptedException e) {
    10. System.out.println("服务端在延时发生了异常");
    11. e.printStackTrace();
    12. }
    13. return new ResultMessage(true, "延时时间较短,没有触发超时异常,延时时间:" + MaxSleepTime);
    14. }
    15. //模拟发生了异常
    16. @GetMapping("/exp/{msg}")
    17. public ResultMessage exp(@PathVariable("msg") String msg) {
    18. if (msg.equals("hello")) {
    19. return new ResultMessage(true, msg);
    20. } else {
    21. throw new RuntimeException();
    22. }
    23. }
    24. }

    4.消费者增加 远程调用服务

    1. @Service
    2. public class UserService implements UserFacae {
    3. @Autowired
    4. RestTemplate restTemplate;
    5. @HystrixCommand(fallbackMethod = "fallbackTimeOut")
    6. @Override
    7. public ResultMessage timeout() {
    8. return restTemplate.getForObject("http://USER/timeout", ResultMessage.class);
    9. }
    10. @HystrixCommand(fallbackMethod = "fallbackError")
    11. @Override
    12. public ResultMessage accureError(String msg) {
    13. return restTemplate.getForObject("http://USER/exp/"+msg, ResultMessage.class);
    14. }
    15. public ResultMessage fallbackTimeOut() {
    16. return new ResultMessage(false, "该接口延时时间过长,引发了超时异常,启动消费者的异常处理方法");
    17. }
    18. public ResultMessage fallbackError(String msg) {
    19. return new ResultMessage(false, "发生异常,msg参数是:"+msg);
    20. }
    21. }

    和controller和service

    因为是通过resttemple远程调用的服务器的接口,所以这里不写interface,写 Facae

    1. public interface UserFacae {
    2. public ResultMessage timeout();
    3. public ResultMessage accureError(String msg);
    4. }
    1. @RestController
    2. public class UserController {
    3. @Autowired
    4. UserFacae userFacae;
    5. @RequestMapping("timeout")
    6. public ResultMessage timeout() {
    7. return userFacae.timeout();
    8. }
    9. @RequestMapping("/error/{msg}")
    10. public ResultMessage takeError(@PathVariable String msg) {
    11. return userFacae.accureError(msg);
    12. }
    13. }

    访问 localhost:7301/timeout

    会有触发延时,因为时长随机的,所以会随机超时,引发超时异常,由消费端的fallbackTimeOut()方法捕获。

    访问localhost:7301/error/hello123

    如果参数是hello 不引发异常

    如果参数是hello123 会引发异常,由消费端的fallbackError(String msg)方法捕获,注意,因为引发fallbackError(String msg)的accureError(String msg) 方法,有一个string类型的参数,所以异常处理参数也一定要有string类型的参数。

  • 相关阅读:
    我的Vue之旅、02 ES6基础、模块、路径、IO
    【微电网优化】粒子群优化算法的微电网调度(光伏、储能、电动车、电网交互)【含Matlab源码 2190期】
    3-7数据链路层-设备
    【支持向量机】问题梳理
    vue 动态路由实现 后端控制权限时的前端处理
    HTML5+CSS3小实例:网页底部间隔波浪动画特效
    【C++面向对象程序设计】CH5 继承与派生
    Redis为什么快?
    基于typescript+express实现一个简单的接口权限验证
    【00】神经网络之初始化参数
  • 原文地址:https://blog.csdn.net/sharesb/article/details/133071444