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

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

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

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

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

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

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

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

  1. public class DownGradeFilter extends ZuulFilter {
  2. @Autowired
  3. private BasicConf basicConf;
  4. public DownGradeFilter() {
  5. super();
  6. }
  7. @Override
  8. public boolean shouldFilter() {
  9. RequestContext ctx = RequestContext.getCurrentContext();
  10. Object success = ctx.get("isSuccess");
  11. return success == null ? true : Boolean.parseBoolean(success.toString());
  12. }
  13. @Override
  14. public String filterType() {
  15. return "route";
  16. }
  17. @Override
  18. public int filterOrder() {
  19. return 4;
  20. }
  21. @Override
  22. public Object run() {
  23. RequestContext ctx = RequestContext.getCurrentContext();
  24. Object serviceId = ctx.get("serviceId");
  25. if (serviceId != null && basicConf != null) {
  26. List<String> serviceIds = Arrays.asList(basicConf.getDownGradeServiceStr().split(","));
  27. if (serviceIds.contains(serviceId.toString())) {
  28. ctx.setSendZuulResponse(false);
  29. ctx.set("isSuccess", false);
  30. ResponseData data = ResponseData.fail("服务降级中", ResponseCode.DOWNGRADE.getCode());
  31. ctx.setResponseBody(JsonUtils.toJson(data));
  32. ctx.getResponse().setContentType("application/json; charset=utf-8");
  33. return null;
  34. }
  35. }
  36. return null;
  37. }
  38. }

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

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

服务降级是什么?Spring Cloud如何实现?相关推荐

  1. java什么是服务治理平台_Java | Spring Cloud 是如何实现服务治理的

    Spring Cloud 是如何实现服务治理的 Table of Contents 建议提前阅读 Spring Cloud Commons 之服务治理浅析 Spring 在设计的时候,通常会考虑方便扩 ...

  2. spring cloud微服务分布式云架构-Spring Cloud简介

    Spring Cloud是一系列框架的有序集合.利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现.注册.配置中心.消息总线.负载均衡.断路器.数据监控等(这里只简单的列了 ...

  3. spring cloud微服务分布式云架构 - Spring Cloud简介

    Spring Cloud是一系列框架的有序集合.利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现.注册.配置中心.消息总线.负载均衡.断路器.数据监控等(这里只简单的列了 ...

  4. 两大微服务框架dubbo和spring cloud对比

    一.基本介绍 dubbo Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案.简单的说,Dubbo 就是个服务框架,说白了就是个远程服务 ...

  5. 使用Nacos实现服务注册与发现(spring cloud 组件教程大全四)

    使用Nacos实现服务注册与发现(spring cloud 组件教程大全四) idea 创建maven父子工程(spring cloud 组件教程大全 一) windows下nacos的安装及Mysq ...

  6. spring cloud微服务分布式云架构 - Spring Cloud简介(一)

    点击上面 免费订阅本账号! 本文作者:it菲菲 原文:https://yq.aliyun.com/articles/672239? 点击阅读全文前往 Spring Cloud是一系列框架的有序集合.利 ...

  7. hystrix 页面_微服务 | 使用Hystrix实现Spring Cloud的熔断机制

    1. 熔断机制介绍 在介绍熔断机制之前,我们需要了解微服务的雪崩效应.在微服务架构中,微服务是完成一个单一的业务功能,这样做的好处是可以做到解耦,每个微服务可以独立演进.但是,一个应用可能会有多个微服 ...

  8. 服务迁移之路 | Spring Cloud向Service Mesh转变 | 技术干货

    戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 作者: 李宁 转自:博云技术社区 Sp ...

  9. spring cloud微服务分布式云架构 - Spring Cloud集成项目简介

    Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的.在学习Spring Clo ...

  10. 公益:开放一台Nacos服务端给各位Spring Cloud爱好者

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 之前开放过一台公益Eureka Server给大家,以方便大家在阅读我博客中教程时候做实验.由于目前在 ...

最新文章

  1. Python 3.3.2 中文版
  2. 2020计算机考研初试考试先后顺序,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
  3. python读取nc文件并转换成csv_python3使用类型转换读取csv文件
  4. 关于回调函数的那点事
  5. 在SqlServer中把多个job生成一个sql脚本
  6. IOS之UIToolBar约束报错
  7. 【转载】通过金矿模型介绍动态规划 (动态规划入门)
  8. 学UI设计好不好找工作?零基础能学UI设计吗?
  9. Spark createDirectStream 维护 Kafka offset(Scala)
  10. panda提取时间戳中的日期_Pandas处理时间序列数据的20个关键知识点
  11. 添加用户到sudoers
  12. Flutter之SafeArea
  13. Mybatis Configuration.xml中properties属性定义
  14. BlackBerry7290上网步骤
  15. Ardunio开发实例-BME280传感器
  16. Openbci升级版使用方法
  17. js中什么是事件气泡,如何阻止事件气泡
  18. Elastic:运用 Elastic Maps 实时跟踪,可视化资产分布及地理围栏告警(一)
  19. 国外问卷调查所需准备
  20. 范式1NF、2NF、3NF和BCNF的区别

热门文章

  1. C++实现OTSU算法(大津法)
  2. emmc/sd驱动总线简析
  3. webservice开发调用
  4. [Windows]批处理变更用户文件夹到其他位置
  5. 常见的软件文件夹命名笔记好
  6. 人工智能及其应用第六版目录
  7. 线阵相机是如何定义的?
  8. 超级玛丽/超级马里奥
  9. 数字图像处理 线性系统、卷积、傅立叶变换
  10. cadence17.4在quick place器件时显示cannot find symbol