社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
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。
如果有问题,希望大佬能指出来!
欢迎讨论,互相学习!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!