ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

(74)java Spring Cloud+Spring boot+mybatis企业快速开发架构之服务降级是什么?Spring Cloud如何实现?

2021-10-12 09:33:44  阅读:161  来源: 互联网

标签:降级 服务 RequestContext Spring ctx return java public Cloud


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

  

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

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

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

在 Zuul 中对服务进行动态降级,结合我们的配置中心来做。

定义 Apollo 配置类,存储需要降级的服务信息见如下代码。

@Data
@Configuration
public class BasicConf {
    // 降级的服务 ID,多个用逗号分隔
    @Value("${downGradeServiceStr:default}")
    private String downGradeServiceStr;
}

  

编写过滤器来执行降级逻辑,见如下代码。

public class DownGradeFilter extends ZuulFilter {
    @Autowired
    private BasicConf basicConf;
    public DownGradeFilter() {
        super();
    }
    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        Object success = ctx.get("isSuccess");
        return success == null ? true : Boolean.parseBoolean(success.toString());
    }
    @Override
    public String filterType() {
        return "route";
    }
    @Override
    public int filterOrder() {
        return 4;
    }
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        Object serviceId = ctx.get("serviceId");
        if (serviceId != null && basicConf != null) {
            List serviceIds = Arrays.asList(basicConf.getDownGradeServiceStr().split(","));
            if (serviceIds.contains(serviceId.toString())) {
                ctx.setSendZuulResponse(false);
                ctx.set("isSuccess", false);
                ResponseData data = ResponseData.fail("服务降级中", ResponseCode.DOWNGRADE.getCode());
                ctx.setResponseBody(JsonUtils.toJson(data));
                ctx.getResponse().setContentType("application/json; charset=utf-8");
                return null;
            }
        }
        return null;
    }
}

  

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

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

 

标签:降级,服务,RequestContext,Spring,ctx,return,java,public,Cloud
来源: https://www.cnblogs.com/Liuzhijuan/p/15396242.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有