一.什么是服务降级
降级就是将一些不常用的服务停掉从而释放更多的资源来供应一些主要的服务使用
实现的方式
1.服务降级中有很多的方法,最好的方式就是利用 Docker 来实现,当 需要对某个服务进行降级时可以直接将这个服务的容器停掉,等到需要使用时在把这个服务重启就行。
2.通过API网关的方式进行降级这样我们的就可以将前台的一切请求全部的拒绝掉,这样就释放出来的资源供应主要功能的使用了。
三实现网关降级的思路
主要时在过滤器的软方法中通过RequestContext获取即将路由的服务的ID,通过配置信息获取降级的服务信息,如果当前的路由的服务在其中,就可以直接拒绝返回对应的信息让客户端做出相应的处理
当服务被降级的时候,直接在spirngcloud config的后台修改一下配置就可以马上生效
当然可以做成自动的,比如监控某些指标,流量,负载等。
当达到某些指标后就会自动触发降级
# filter文件中
#application中
down:
service: jwxt-learner
filter 中加入DownFilter文件
@Component
public class DownFilter extends ZuulFilter {
@Value("${down.service}")//获取配置文件中的值
private String BASIC_CONF;
public DownFilter(){
super();
}
@Override
public String filterType() {
return FilterConstants.ROUTE_TYPE; //route
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
Object isSuccess= RequestContext.getCurrentContext().get("isSuccess");
return isSuccess==null ?true :Boolean.parseBoolean(isSuccess.toString());
}
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
Object serviceId=context.get("serviceId");
if (serviceId !=null && BASIC_CONF!=null){
List<String> serviceIds= Arrays.asList(BASIC_CONF.split(","));
if (serviceIds.contains(serviceId.toString())){
context.setSendZuulResponse(false);
context.set("isSuccess",false);
Result result=new Result(ResultCode.SERVICE_IS_DOWN);
context.setResponseBody(JSON.toJSONString(result));
context.getResponse().setContentType("application/json;charset=utf-8");
return null;
}
}
return null;
}
}