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

目录

spring-cloud-gateway 和zuul

spring  webflux 和  spring  mvc 

spring-cloud-gateway 的两种模式

spring-cloud-gateway server 模式下配置说明

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


spring-cloud-gateway 和zuul

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

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

spring  webflux 和  spring  mvc 

spring 提供了两套web方案

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

webflux : 

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

spring-cloud-gateway 的两种模式

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

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

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

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.mzph.cn/web/63209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ActiveMQ 反序列化漏洞CVE-2015-5254复现

文章目录 一、产生原因二、利用条件三、利用过程四、PoC(概念验证)五、poc环境验证使用find搜索vulhub已安装目录打开activeMQ组件查看配置文件端口启动镜像-文件配置好后对于Docker 镜像下载问题及解决办法设置好镜像源地址,进行重启docker查…

vue3监听横向滚动条的位置;鼠标滚轮滑动控制滚动条滚动;监听滚动条到顶端

1.横向取值scrollLeft 竖向取值scrollTop 2.可以监听到最左最右侧 3.鼠标滚轮滑动控制滚动条滚动 效果 <template><div><div class"scrollable" ref"scrollableRef"><!-- 内容 --><div style"width: 2000px; height: 100…

WPF xaml 文件详解

<div id"content_views" class"htmledit_views"><h2><a name"t0"></a>1.总述</h2> 创建好了WPF项目后&#xff0c;最重要的是对 App和MainWindow的理解&#xff0c;在一开始的时候&#xff0c;极容易就直接在Main…

鸿蒙开发-ArkTS 创建自定义组件

在 ArkTS 中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在 ArkTS 中创建和使用自定义组件的详细步骤&#xff1a; 一、定义自定义组件 使用Component注解&#xff1a;为了注册一个组件&#xff0c;使其能够在其他文件中被引用&#xff0c;你需要使用Component…

水表的数字表盘分割数据集labelme格式3023张13类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;3023 标注数量(json文件个数)&#xff1a;3023 标注类别数&#xff1a;13 标注类别名称:["readbox_1","center",&q…

跟着AI 学 AI, 开发一个ChatBot, 集成 Json 数据和查询

按照规律&#xff0c;使用AI生成一个架构图 直接上代码&#xff0c;为了方便学习&#xff0c;直接按照如下方式&#xff0c;复制到你的开发环境即可调试&#xff0c;运行代码。做学习参考。 代码注释多次说明这里&#xff0c;不在赘述。 "type": "carousel&qu…

使用枚举实现单例模式,不会反序列化破坏攻击,不会被反射破坏攻击。(附带枚举单例的简单实现)

原因分析 1.反序列化方法 ① jdk8中的Enum源码中对反序列化方法进行重写&#xff0c;抛出异常。 java.lang.Enum#readObject方法截图如下 ②java.io.ObjectInputStream#readObject 方法中的 readEnum 方法处理了枚举类型的反序列化&#xff0c;从而确保了枚举的单例特性。 …

MongoDB-副本集

一、什么是 MongoDB 副本集&#xff1f; 1.副本集的定义 MongoDB 的副本集&#xff08;Replica Set&#xff09;是一组 MongoDB 服务器实例&#xff0c;它们存储同一数据集的副本&#xff0c;确保数据的高可用性和可靠性。副本集中的每个节点都有相同的数据副本&#xff0c;但…

《数据结构》(408代码题)

2009 单链表&#xff08;双指针&#xff09; 分析&#xff1a;首先呢&#xff0c;给我们的数据结构是一个带有表头结点的单链表&#xff0c;也不允许我们改变链表的结构。链表的长度不是直接给出的啊&#xff0c;所以这个倒数也很棘手。那我们该如何解决这个“k”呢&#xff0c…

6.1 初探MapReduce

MapReduce是一种分布式计算框架&#xff0c;用于处理大规模数据集。其核心思想是“分而治之”&#xff0c;通过Map阶段将任务分解为多个简单任务并行处理&#xff0c;然后在Reduce阶段汇总结果。MapReduce编程模型包括Map和Reduce两个阶段&#xff0c;数据来源和结果存储通常在…

Cad c#.net 一键修改标注dimension中的文本内容

本例为给标注加前缀&#xff0c;也可定制其他形式&#xff0c;效果如下&#xff1a; public class Demo{[CommandMethod("xx")]//public void Dim(){Document doc Application.DocumentManager.MdiActiveDocument;Database db doc.Database;Editor ed doc.Editor;…

旅游系统旅游小程序PHP+Uniapp

旅游门票预订系统&#xff0c;支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统 更新日志 V1.3.0 1、修复富文本标签 2、新增景点入驻【高级版本】3、新增门票核销【高级版】4、新增门票端口【高级版】

MacOS系统 快速安装appium 步骤详解

在macOS系统上&#xff0c;你可以通过使用nvm&#xff08;Node Version Manager&#xff09;来管理Node.js的版本&#xff0c;并基于nvm安装的Node.js环境来快捷地安装Appium。以下是具体步骤&#xff1a; 一、安装nvm 下载nvm 访问nvm的GitHub仓库&#xff08;nvm GitHub&…

技术速递|.NET 9 简介

作者&#xff1a;.NET 团队 排版&#xff1a;Alan Wang 今天&#xff0c;我们非常激动地宣布 .NET 9的发布&#xff0c;这是迄今为止最高效、最现代、最安全、最智能、性能最高的 .NET 版本。这是来自世界各地数千名开发人员又一年努力的成果。这个新版本包括数千项性能、安全和…

Vue项目打包部署到服务器

1. Vue项目打包部署到服务器 1.1. 配置 &#xff08;1&#xff09;修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }&#xff08;2&#xff09;检查router下的index.js文件下配置的mode模式。   检查如果模式改…

NPU是什么?电脑NPU和CPU、GPU区别介绍

随着人工智能技术的飞速发展&#xff0c;计算机硬件架构也在不断演进以适应日益复杂的AI应用场景。其中&#xff0c;NPU&#xff08;Neural Processing Unit&#xff0c;神经网络处理器&#xff09;作为一种专为深度学习和神经网络运算设计的新型处理器&#xff0c;正逐渐崭露头…

使用skywalking,grafana实现从请求跟踪、 指标收集和日志记录的完整信息记录

Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目&#xff0c; 2017年12月SkyWalking成为Apache国内首个个人孵化项目&#xff0c; 2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目&#xff0c; 目前SkyWalking支持Java、 .Net、 Node.js、…

纯CSS实现文本或表格特效(连续滚动与首尾相连)

纯CSS实现文本连续向左滚动首尾相连 1.效果图&#xff1a; 2.实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, init…

【LeetCode刷题之路】622.设计循环队列

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

Node.js基础入门

1.Node.js 简介 Node 是一个让 JavaScript (独立)运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。 发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。 简单的说 Node.js 就是运行在服务端的…