springcloud - 服务降级

一.降级概念

当访问量剧增,服务出现问题时,需要做一些处理,比如服务降级。
服务降级就是将某些服务停掉或者不进行业务处理,释放资源来维持主要服务的功能。

举例: 某电商网站在搞活动时,活动期间压力太大,如果再进行下去,整个系统有可能挂掉,
这个时候可以释放掉一些资源,将一些不那么重要的服务采取降级措施,
比如登录、注册。登录服务停掉之后就不会有更多的用户抢购,
同时释放了一些资源,登录、注册服务就算停掉了也不影响商品抢购。

二.实现方式

  1. 服务降级有很多种方式,最好的方式就是利用 Docker 来实现。当需要对某个服务进行降级时,
    直接将这个服务所有的容器停掉,需要恢复的时候重新启动就可以了。

  2. 还有就是在 API 网关层进行处理,当某个服务被降级了,前端过来的请求就直接拒绝掉,不往内部服务转发,将流量挡回去。

三. 实现思路

主要逻辑在过滤器的 run 方法中,通过 RequestContext 获取即将路由的服务 ID,
通过配置信息获取降级的服务信息,如果当前路由的服务在其中,就直接拒绝,
返回对应的信息让客户端做对应的处理。

当需要降级的时候,直接在 springcloud config 的后台改一下配置就可以马上生效,
当然也可以做成自动的,比如监控某些指标,流量、负载等,
当达到某些指标后就自动触发降级。

四.代码实现

application.yml

down:
service: jwxt-learner

filter
package com.jwxt.filter;

import com.alibaba.fastjson.JSON;
import com.jwxt.response.Result;
import com.jwxt.response.ResultCode;
import com.jwxt.utils.JSONUtils;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.bouncycastle.asn1.ocsp.ResponseData;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@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 success = RequestContext.getCurrentContext().get("isSuccess");

    return success == null ? true : Boolean.parseBoolean(success.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;
}

}

如果登录的用户需要使用learner服务,则访问不可达

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值