SpringCloud微服务实战系列:03spring-cloud-gateway业务网关灰度发布

ops/2024/12/20 9:21:57/

目录

gateway%20%E5%92%8Czuul-toc" style="margin-left:0px;">spring-cloud-gateway 和zuul

webflux%20%E5%92%8C%C2%A0%20spring%C2%A0%20mvc%C2%A0-toc" style="margin-left:0px;">spring  webflux 和  spring  mvc 

gateway%20%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%A8%A1%E5%BC%8F-toc" style="margin-left:0px;">spring-cloud-gateway 的两种模式

gateway%20server%20%E6%A8%A1%E5%BC%8F%E4%B8%8B%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E-toc" style="margin-left:0px;">spring-cloud-gateway server 模式下配置说明

grayLb://system-server 灰度发布代码实现


gateway%20%E5%92%8Czuul">spring-cloud-gateway 和zuul

zuul 是spring全家桶的第一代网关组件, 基于同步线程Servlet API,在高并发场景下表现不如Gateway;spring-cloud-gateway  提供了基于WebFlux的非阻塞编程模型(也支持servlet),Gateway可以处理更多的并发请求,具有高性能、高吞吐量和低延迟的优势。

所以老的遗留系统还会有zuul, 新系统一般都会选择 spring-cloud-gatewaywebflux

webflux%20%E5%92%8C%C2%A0%20spring%C2%A0%20mvc%C2%A0">spring  webflux 和  spring  mvc 

spring 提供了两套web方案

spring mvc : 基于servlet 和 web 容器(tomcat) , servlet 又是基于阻塞线程的,可以简单理解为一个请求分配一个线程,这个线程就只负责处理这个请求,tomcat jdbc 、spring 事务等其他核心组件也是基于阻塞线程的,他们可以很好搭配使用 。

webflux

 WebFlux使用非阻塞、事件驱动的模型,这意味着少量线程可以处理大量请求,请求和线程不是一对一的关系。在WebFlux中,由于采用了非阻塞的编程模型,一个业务的不同步骤甚至可能在不同的线程中执行。这就导致了传统JDBC模型中的事务管理在WebFlux环境下会出现问题。其他很多基于线程的组件都不能用,整个生态还不成熟,所以webflux虽然性能好,所以迟迟没有被广泛适用,但可以用在有限的场景下,比如网关。

gateway%20%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%A8%A1%E5%BC%8F">spring-cloud-gateway 的两种模式

server 模式 : 内置了完善的网关需要的核心功能,比如请求转发、过滤拦截、限流等。

Proxy Exchange: 作为一个你的程序中的一个组件,抓发请求到下游服务器,就当成httpClient等工具使用。

这两种模式都有webflux 和 springmvc 这两种实现。

gateway%20server%20%E6%A8%A1%E5%BC%8F%E4%B8%8B%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E">spring-cloud-gateway server 模式下配置说明

  cloud:# Spring Cloud Gateway 配置项,对应 GatewayProperties 类gateway:# 路由配置项,对应 RouteDefinition 数组routes:## system-server 服务- id: system-admin-api # 路由的编号uri: grayLb://system-serverpredicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组- Path=/admin-api/system/**filters:- RewritePath=/admin-api/system/v3/api-docs, /v3/api-docs # 配置,保证转发到 /v3/api-docs

id:  路由位置标识,用于区分各条路由

uri:  下游目标服务的地址 ,grayLb://system-server , 这里可以是常规的schema.  http 和 https,也可以是springcloud内置的lb , 也可以自定义,然后在filter里面实现,这里grayLb就是自定义的灰度发版,具体实现逻辑下一章介绍。

predicates : 配置这条路由的条件,满足这个条件,触发这条路由

filters: 这条路由的过滤器(局部过滤器,springcloud-gateway分全局过滤器和局部过滤器两大类), 上面的例子是路径重写过滤器,就是转发到下游时候将 

/admin-api/system/v3/api-docs 改成  /v3/api-docs 

grayLb://system-server 灰度发布代码实现

gateway ,会将下游服务器配置+用户请求的uri简单拼接,放到属性GATEWAY_REQUEST_URL_ATTR 中, GrayReactiveLoadBalancerClientFilter 第一步拿到schema ,如果发现不是grayLb , 则跳过该过滤器,直接执行其他过滤器 ,过滤器是责任链模式实现的。 

如果是grayLb ,则执行灰度逻辑:将grayLb://system-server 换成某一台具体的机器。

具体灰度逻辑:

这里的灰度逻辑比较简单,就是请求加了一个version的请求头,然后后端服务注册到注册中心时候在注册信息的metadata中写了一个version , 前端请求只会发到与后端version匹配的的server上。 

发散思考:请求头什么时候加进去?

1.前端代码直接加,适用于前端多版本共存的情况,比如前端是andriod apk,那么前端多个版本共存就很常见了。

2.后端直接加,比如前端只有web,那么前端一般都是最新版本,这时候我们要做灰度,就可以直接在GrayLoadBalancer灰度了,实现逻辑不用version header头了,可以加一个配置,灰度比例 ,假设10% 进行灰度,那么选择一个灰度因子,比如请求客户端IP,请求到达时间,用户等级、用户年龄等,然后将该因子的10%转发到灰度版本上。 


http://www.ppmy.cn/ops/143446.html

相关文章

二七(vue2-03)、生命周期四个阶段及八个钩子、工程化开发和脚手架、组件注册、拆分组件

1. 生命周期 1.1 生命周期四个阶段 <!-- Vue生命周期&#xff1a;一个Vue实例从 创建 到 销毁 的整个过程。生命周期四个阶段&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁1.创建阶段&#xff1a;创建响应式数据2.挂载阶段&#xff1a;渲染模板3.更新阶段&#xff1a;修改…

进程栈分析

安装工具 /usr/lib64/python2.7/site-packages/pycurl.so: undefined symbol: CRYPTO num locks env |grep LIB export LD_LIBRARY_PATHyum install psmisc #yum install *pstree* -y yum install -y strace yum install -y gdb yum install *pstack* -y定位 pstree ps…

Buck开关电源闭环控制的仿真研究15V/5V[Matlab/simulink源码+Word文档]

课题设计要求 ⑴输入直流电压(VIN)&#xff1a;15V ⑵输出电压(VO)&#xff1a;5.0V ⑶负载电阻&#xff1a;R2欧 ⑷输出电压纹波峰-峰值 Vpp≤50mV &#xff0c;电感电流脉动&#xff1a;输出电流的10% ⑸开关频率(fs)&#xff1a;100kHz ⑹BUCK主电路二极管的通态压降VD0.5V…

【一本通】线段

【一本通】线段 C语言代码Java代码C代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 数轴上有 n条线段&#xff0c;选取其中 k条线段使得这 k条线段两两没有重合部分&#xff0c;问最大的k为多少? 输入 输入文件segment.in的第一行为…

如何设置Jsoup解析京东商品详情?

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是在电商领域。通过爬虫技术&#xff0c;我们可以从网站中提取有价值的信息&#xff0c;用于市场分析、价格监控等。Java作为一种成熟且功能强大的编程语言&#xff0c;拥有丰富的库支持&#xff0c;使其成为编写爬…

List;Set;Map集合

一、List集合 概念和特点 定义&#xff1a;List是一个有序的集合&#xff0c;它允许存储重复的元素。可以通过索引来访问、插入和删除元素。 示例代码&#xff1a; import java.util.ArrayList; import java.util.List;public class ListExample {public static void main(St…

FreeMarker语法

1. 查找转移 <#function getSubSlot x > <#return (x) ? switch( "1", "L", "2", "R", "" )> </#function> 2. 转换数字 ?number ${mergedMap[placement.sequence].material.subs…

AI前沿分析:ChatGPT搜索上线,Google搜索地位能否守住?

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 引言:AI与搜索领域的激烈博弈一、ChatGPT搜索的优势是什么?1. 实时信息获取:超越传统搜索2. 对话式搜索:重构用户体验3. 个性化推荐:深度挖掘用户需求二、G…