最近手头的项目进行了重构,改动比较大,直接上线的话风险较大,于是我采用了灰度上线的方式来将风险最小化。

我们系统包括自己的门户页面,也作为中台来给各个业务方调用,我们灰度上线的话,要兼容各个业务系统。

业务系统调用我们接口是前缀是特殊的,可以和我们的门户调用区分开,且业务系统调用所有接口都是有签名的,每个接口的参数格式都是一样的,会含有每个业务系统的appId

之前流量是经过nginx直接打到我们的服务商,这次在nginx和我们系统之间添加了网关,作为我们灰度的核心--流量分配

关于zuul网关可以参考https://www.cnblogs.com/jing99/p/11696192.html

核心流量控制代码如下:

import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;import java.net.URL;
import java.util.List;import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import com.kuaishou.is.ea.clm.gateway.model.bo.ESignGrayConfigBO;
import com.kuaishou.is.fastjson.replace.JSON;
import com.kuaishou.is.fastjson.replace.JSONObject;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;@Slf4j
@Component
public class RouteFilter extends ZuulFilter {@Value("${esign.gray}")private String esignGray;//流量配置@Value("${esign.oldUrl}")private String oldUrl;@Value("${esign.newUrl}")private String newUrl;public int filterOrder() {return PRE_DECORATION_FILTER_ORDER + 1;}public String filterType() {return PRE_TYPE;}@Overridepublic boolean shouldFilter() {return true;}@SneakyThrowspublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();String url = ctx.getRequest().getRequestURI();if (!url.contains("/esignature/api/external")) {return null;}if (url.contains("/esignature/api/external/timing/task")) {ctx.setRouteHost(new URL(newUrl));return null;}HttpServletRequest request = ctx.getRequest();boolean matched = false;if (!ctx.isChunkedRequestBody()) {ServletInputStream inp = null;try {inp = ctx.getRequest().getInputStream();String body = null;List<ESignGrayConfigBO> eSignGrayConfigBOList = JSON.parseArray(esignGray, ESignGrayConfigBO.class);if (inp != null) {body = IOUtils.toString(inp);JSONObject jsonObject = JSON.parseObject(body);Integer appId = -1;try {appId = (Integer) jsonObject.get("appId");} catch (Exception e) {log.error("获取appId error,path:{}", request.getRequestURI());}String path = request.getRequestURI();int random = (int) (Math.random() * 100);for (ESignGrayConfigBO eSignGrayConfigBO : eSignGrayConfigBOList) {if (random < eSignGrayConfigBO.getPersent()&& (ObjectUtils.equals(appId, -1) || ObjectUtils.equals(appId, eSignGrayConfigBO.getAppId()))&& (path.endsWith(eSignGrayConfigBO.getPath()) || StringUtils.equals(eSignGrayConfigBO.getPath(), ""))) {matched = true;ctx.setRouteHost(new URL(newUrl));log.info("matched :{}", body);}}}} catch (Exception e) {log.error("route error, e:{}", e.getMessage(), e);ctx.setRouteHost(new URL(oldUrl));}}if (!matched) {ctx.setRouteHost(new URL(oldUrl));}return null;}
}

灰度上线实践之zuul网关流量分配相关推荐

  1. SpringCloud 之 Zuul 网关搭建及配置

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:Anakki blog.csdn.net/qq_29 ...

  2. SpringCloud Zuul 网关搭建及配置

    目录 一.Zuul网关 二.Zuul服务的前期准备 2.1 注册中心EurekaServer的搭建 2.2 EurekaService的搭建 三.Zuul服务搭建 五.Zuul的访问 六.Zuul的更 ...

  3. 基于spring cloud 的灰度发布实践_【收藏】基于spring cloud灰度发版方案

    简介 敏捷开发迭代周期短发布快,每周都可能面临版本发版上线,为最大可能的降低对用户的影响提高服务可用率,大部分团队都需要等到半夜做发布和支持.本文就如何基于spring cloud体系做灰度发版改造提 ...

  4. 认识微服务(七)之 Zuul 网关

    认识微服务(七)之 Zuul 网关 1 简介 2 Zuul 加入后的架构 3 快速入门 3.1 新建工程 3.2 编写启动类 3.3 编写配置 3.4 编写路由规则 3.5 启动测试 4 面向服务的路 ...

  5. SpringCloud Zuul 网关

    目录 网关的概念 搭建zuul网关.实现路由转发 使用zuul过滤请求 使用zuul进行限流 网关的概念 API Gateway 网关,是介于客户端.服务器端之间的中间层,是系统对外的唯一入口,可以统 ...

  6. SpringCloud - Spring Cloud Netflix 之 Zuul网关;路由(十一)

    阅读本文前可先参考 SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 一.API网关 引自百度百科 API网关,软件术语 ...

  7. SpringCloud之Zuul网关服务

    Zuul是spring cloud中的微服务网关.网关: 是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也 ...

  8. Zuul网关使用笔记

    文章目录 Zuul 介绍 Pom 中引入包 启动类中添加@EnableZuulProxy注解启用Zuul的API网关功能 yml文件中配置相关属性信息 路由映射规则 传统路由实现方式 面向服务的路由 ...

  9. 微服务架构: 基于nacos注册中心的Zuul网关实现

    一. 为什么需要网关 在微服务架构设计中,通常会有若干个服务提供者.例如一个券商系统,会有用户系统.开户系统.资讯系统.交易系统等多个服务,而每个服务数量会最着集群部署会变得越来越庞大和复杂.客户端在 ...

最新文章

  1. 生成彩条的MATLAB代码
  2. shell-4.bash的变量:用户自定义变量
  3. 使用Nomad构建弹性基础架构: 容错和中断恢复
  4. c++STL容器的Map和multimap
  5. AJPFX讲解Java 性能优化[4]:关于 finalize 函数
  6. github gists_Eclipse中的Github Gists
  7. 南北非遗传承人齐聚北京 演绎非遗精巧
  8. 关于三体执剑者的一点思考
  9. pytorch学习率衰减
  10. NTP组播模式配置和日志信息发送到Linux日志主机的配置
  11. 【学术杂谈】博士毕业都去哪儿了,谈谈学术的这条路该如何走
  12. 内存模型以及分区,需要详细到每个区放什么
  13. HyperX旋火游戏鼠标推荐——轻量化鼠标设计界的艺术品
  14. 百度深度学习初级认证——已过
  15. 010Editor相关
  16. c语言运行太短怎么毡筒,C语言程序设计 最简单的C程序设计.ppt
  17. 郭天祥的10天学会51单片机_第六节
  18. 华为自动生成html文件夹,华为手机怎么建桌面文件夹
  19. 用 Python 编程,假设一年期定期利率为 3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?
  20. 阿里顶级架构师倾情推荐:国内首本大型分布式架构笔记《凤凰架构》

热门文章

  1. git checkout 参数详解
  2. 自动化编辑器零代码手机RPA脚本开发系列教程四
  3. SQL学习—基础查询
  4. luogu P3674 小清新人渣的本愿
  5. 英语口语理论技巧汇总(持续更新)
  6. Python和机器学习最强资料整理
  7. C语言-模式匹配(KMP算法)
  8. Flutter 新闻客户端 - 17 headless strapi centos 发布部署 + jmeter 压测
  9. 厉害了!Flutter 在鸿蒙系统上跑起来了
  10. 最新web前端面试题大全