什么是服务降级?
服务降级是指 当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理,或换种简单的方式处理,从而释放服务器资源以保证核心业务正常运作或高效运作。说白了,就是尽可能的把系统资源让给优先级高的服务。
由图可得,当某一时间内服务A的访问量暴增,而B和C的访问量较少,为了缓解A服务的压力,这时候需要B和C暂时关闭一些服务功能,去承担A的部分服务,从而为A分担压力,叫做服务降级。
service层@FeignClient(服务名,实现降级处理的fallbackFactory)
@FeignClient(value = "lxtx-im-wallet", fallbackFactory = AirdropFeignFallbackFactory.class)
public interface AirdropFeign {
@PostMapping(value = "/airdrop/list")
BaseResult listPage(FeignAirdropReq feignAirdropReq);
}
需要实现FallbackFactory下的方法create返回的是我们进行降级的服务类,在这里处理服务降级后的一些程序
@Component
public class AirdropFeignFallbackFactory implements FallbackFactory<AirdropFeign> {
@Override
public AirdropFeign create(Throwable throwable) {
AirdropFeignFallback feignFallback = new AirdropFeignFallback();
feignFallback.setCause(throwable);//进行降级
return feignFallback;
}
}
并在配置中开启服务降级
把服务提供者挂了之后,再次访问这个接口即可看出这个服务已经进行降级处理
服务熔断和降级的区别
服务熔断—>服务端:某个服务超时或异常,引起熔断~,类似于保险丝(自我熔断)
服务降级—>客户端:从整体网站请求负载考虑,当某个服务熔断或者关闭之后,服务将不再被调用,此时在客户端,我们可以准备一个 FallBackFactory ,返回一个默认的值(缺省值)。会导致整体的服务下降,但是好歹能用,比直接挂掉强。
触发原因不太一样,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;管理目标的层次不太一样,熔断其实是一个框架级的处理,每个微服务都需要(无层级之分),而降级一般需要对业务有层级之分(比如降级一般是从最外围服务开始)
实现方式不太一样,服务降级具有代码侵入性(由控制器完成/或自动降级),熔断一般称为自我熔断。