灰度上线实践之zuul网关流量分配
最近手头的项目进行了重构,改动比较大,直接上线的话风险较大,于是我采用了灰度上线的方式来将风险最小化。
我们系统包括自己的门户页面,也作为中台来给各个业务方调用,我们灰度上线的话,要兼容各个业务系统。
业务系统调用我们接口是前缀是特殊的,可以和我们的门户调用区分开,且业务系统调用所有接口都是有签名的,每个接口的参数格式都是一样的,会含有每个业务系统的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网关流量分配相关推荐
- SpringCloud 之 Zuul 网关搭建及配置
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:Anakki blog.csdn.net/qq_29 ...
- SpringCloud Zuul 网关搭建及配置
目录 一.Zuul网关 二.Zuul服务的前期准备 2.1 注册中心EurekaServer的搭建 2.2 EurekaService的搭建 三.Zuul服务搭建 五.Zuul的访问 六.Zuul的更 ...
- 基于spring cloud 的灰度发布实践_【收藏】基于spring cloud灰度发版方案
简介 敏捷开发迭代周期短发布快,每周都可能面临版本发版上线,为最大可能的降低对用户的影响提高服务可用率,大部分团队都需要等到半夜做发布和支持.本文就如何基于spring cloud体系做灰度发版改造提 ...
- 认识微服务(七)之 Zuul 网关
认识微服务(七)之 Zuul 网关 1 简介 2 Zuul 加入后的架构 3 快速入门 3.1 新建工程 3.2 编写启动类 3.3 编写配置 3.4 编写路由规则 3.5 启动测试 4 面向服务的路 ...
- SpringCloud Zuul 网关
目录 网关的概念 搭建zuul网关.实现路由转发 使用zuul过滤请求 使用zuul进行限流 网关的概念 API Gateway 网关,是介于客户端.服务器端之间的中间层,是系统对外的唯一入口,可以统 ...
- SpringCloud - Spring Cloud Netflix 之 Zuul网关;路由(十一)
阅读本文前可先参考 SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 一.API网关 引自百度百科 API网关,软件术语 ...
- SpringCloud之Zuul网关服务
Zuul是spring cloud中的微服务网关.网关: 是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也 ...
- Zuul网关使用笔记
文章目录 Zuul 介绍 Pom 中引入包 启动类中添加@EnableZuulProxy注解启用Zuul的API网关功能 yml文件中配置相关属性信息 路由映射规则 传统路由实现方式 面向服务的路由 ...
- 微服务架构: 基于nacos注册中心的Zuul网关实现
一. 为什么需要网关 在微服务架构设计中,通常会有若干个服务提供者.例如一个券商系统,会有用户系统.开户系统.资讯系统.交易系统等多个服务,而每个服务数量会最着集群部署会变得越来越庞大和复杂.客户端在 ...
最新文章
- 生成彩条的MATLAB代码
- shell-4.bash的变量:用户自定义变量
- 使用Nomad构建弹性基础架构: 容错和中断恢复
- c++STL容器的Map和multimap
- AJPFX讲解Java 性能优化[4]:关于 finalize 函数
- github gists_Eclipse中的Github Gists
- 南北非遗传承人齐聚北京 演绎非遗精巧
- 关于三体执剑者的一点思考
- pytorch学习率衰减
- NTP组播模式配置和日志信息发送到Linux日志主机的配置
- 【学术杂谈】博士毕业都去哪儿了,谈谈学术的这条路该如何走
- 内存模型以及分区,需要详细到每个区放什么
- HyperX旋火游戏鼠标推荐——轻量化鼠标设计界的艺术品
- 百度深度学习初级认证——已过
- 010Editor相关
- c语言运行太短怎么毡筒,C语言程序设计 最简单的C程序设计.ppt
- 郭天祥的10天学会51单片机_第六节
- 华为自动生成html文件夹,华为手机怎么建桌面文件夹
- 用 Python 编程,假设一年期定期利率为 3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?
- 阿里顶级架构师倾情推荐:国内首本大型分布式架构笔记《凤凰架构》