Spring Cloud Hystrix(服务容错保护)
熔断的目的:
为了保证服务高可用,不能因为系统中的一个小服务不可用,从而导致整个系统的崩溃。
熔断的原理:
对于使用相关注解的类或者方法,系统会监控其错误,如果多次出现同一错误,而且达到阈值,则打开熔断开关,熔断开关打开后,不在访问远程服务器,而是直接调用预先准备的失败方法。当熔断开关过期后、会尝试访问远程服务,这个时候的熔断开关是半开半闭状态的,有些服务直接失败,有些会继续访问远程服务。
熔断是微服务必须的,可我不用熔断,系统好像也能正常的工作,那为什么说它是必须的呢?
正常工作室没有问题的,那发生异常了呢?某个服务挂了或者网络不通的时候发生什么?
那就是调用它的微服务这个服务抛出异常,一直到最上层,这个每一会HTTp请求都会开启一个新的线程。而下游的服务器挂了或者网络不可达,通常线程会堵塞住直到timeOut,如果并发量多了,这些堵塞的线程就会占用大量的资源,很有可能把自己本身的微服务所在的机器资源耗尽,导致自己也挂掉。
服务降级
服务降级利用fallback实现,例如在fegin中接口实现fallback指定的错误请求方法,使得这次请求不进入正常系统的处理逻辑,而去执行指定的fallback方法,返回error操作,就比如常见的错误友好页面,让它不去卡你的系统
Hystrix有三种状态分别是 关闭、开启和半开
@HystrixCommand(fallbackMethod = "fallbackGet") Object get(String url, Map params, Map header) { def start = System.currentTimeMillis() HttpHeaders headers = handleHeader(header) Map<String, String> p = handleParams(params) url = handUrl(url) Object result = loadBalancedRestTemplate.getForObject(url, new HttpEntity<String>(null, headers), Object.class, p) debug(HttpMethod.GET, url, params, header, result, (System.currentTimeMillis() - start)) return result } Object fallbackGet(String url, Map params, Map header, Throwable e) { return fallback(url, "GET", e) } Object fallback(String url, String method, Throwable e) { logger.info("{}请求[{}]熔断 {}", method, url, e?.message) return ["resCode": CommonConstant.RE_SERVICE_DOWN] }