springcloud 降级
降级的概念
就是项目的整体资源不够所以狠心关掉一个服务等服务资源够的时候在开启
比如一个题库系统分为老师段和学生段 老师段可以录入题 发布试卷 等等 学生段只能考试
老师段点击开始考试 这时学生段的流量很大那我们只能很心把老师段的服务停掉
配置application.yml文件
在zuuls(网管)application.yml文件里面加一个这个是你要降级的服务名称项目我们要降级的是student服务
down:
service: jwxt-students
在zuuls项目里面filter文件下创建一个DownFilter类
//降级
@Component
public class DownFilter extends ZuulFilter {
// 无参数构造方法
public DownFilter(){
super();
}
//获取yml里面的dow.service
@Value("${down.service}")
private String BASIC_CONF;
//拦截规则 前置 后置 路由 异常
@Override
public String filterType() {
return FilterConstants.ROUTE_TYPE;
}
//过滤器拦截顺序
@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();
//获取当前接口的id (通过id获取当前服务的名称)
Object serviceId = context.get("serviceId");
if (serviceId !=null && BASIC_CONF !=null){
//yml里面的服务名称进行逗号分隔
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;
}
现在启动前台访问stduent项目里面的接口 发现没有数据这声明已经降级成功