学习 Spring Boot 断路由(Hystrix)小结 - Go语言中文社区

学习 Spring Boot 断路由(Hystrix)小结


前言

ribbon , rest ,feign 让我知道均衡负载的实现。但是如果在这中间,有服务因为各种原因无法正常工作或者关闭了呢?

在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。

我之前没有碰到或者处理过类似这样的问题,不知道程序员口中的雪崩是怎么形成的,但是我知道的是,如果有一个组件出现了问题,那应该捕获这个问题进行处理。今天学习的断路由(Hystrix在我看来,就是一个异常处理机制。本节传送:断路由传送

配置

在我看来,还要手动配置依赖是不明智的,Spring boot 都给你省了这么多配置了,你还自己手敲依赖,那不是违背人家初衷吗? 所以我觉得,干这些事儿,能用工具解决就用工具解决。我用的idea ,在建Spring boot工程的时候一开始就把所有要用到的依赖解决了。
1. 建立模块
新建模块选择这个
2. 选择相应的依赖
这里是断路由的,仪表盘也加上去了

feign 自带断路由(但是默认没开启),当然就不用勾选了,需要用到仪表盘就把仪表盘勾上就行。在配置文件里写上以下就可以开启断路由。

feign:
  hystrix:
    enabled: true

开启后只需要通过注解的方式@FeignClient() 就能完成应用。fallback 指定一个处理者(service-hi 是指定的服务)

@Service
@FeignClient(value = "service-hi",fallback =HystrixHandler.class )
public interface HiInterface {
    @RequestMapping("/hi")
    String sayHi(@RequestParam("name") String name);
}

HystrixHandler 实现 HiInterface的方法

@Component
public class HystrixHandler implements HiInterface{
    @Override
    public String sayHi(String name) {
        System.out.println("不好意思,出错了");
        return "error"+name;
    }
}

也就是当该服务不可用的时候,交给HystrixHandler来响应请求。

发现

在我多次尝试后发现了一个规律,假设 service-hi 有两个实例A,B,第一次访问路由到了A,第二次访问路由到B,当第三次访问应该又回到A,但这时候A挂了。那么HystrixHandler 开始工作,打印

不好意思,出错了

然后它又转而去访问B了。B打印

hisky

所以这次请求还是被响应了。只不过不是A。

然后你第二次访问,它还是会先去访问A,依然打印上面的。直到第四次以后。它好像意识到A已经挂掉了。所以不会再去访问A ,然后你的每次访问都是直接访问B了。不过还没完,它每过一段时间就会去访问一下A,好像是要去判断A是否已经“”过来。如果没有 ,又继续访问B。

END

如果有问题,希望大佬能指出来!
欢迎讨论,互相学习!

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/sky_milong/article/details/80194847
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 11:35:19
  • 阅读 ( 856 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢