springcloud+nacos+gateway案例
一、先搭建好springcloud+nacos项目
地址:https://javazhong.blog.csdn.net/article/details/128899999

二、spring cloud gateway简述
Spring Cloud Gateway 是Spring Cloud家族中的一款API网关。Gateway 建立在 Spring Webflux上,目标是提供一个简洁、高效的API网关,同时也可以快速的拼装上Spring Cloud全家桶的API网关。
Spring Cloud Gateway的通信框架使用的是Netty。
2.1 spring cloud gateway特征
基于Spring Framework 5, Project Reactor, Spring Boot 2.0构建
能够自由设置任何请求属性的路由
路由可以自由设置断言(Predicates)和过滤器(Filter)
可集成熔断器
流量限速
路径重写(rewrite)
三、spring cloud gateway网关作用
3.1 访问示意图

3.2 解释
增加了API网关以后(gateway),在API网关层可以把后端的多个服务进行整合,然后提供一个唯一的业务接口,客户端只需要调用这个接口就可以完成数据的获取和展示。而且,官网不只是做请求转发和服务整合。有了统一的网关入口以后,它还可以提供统一鉴权、限流、日志、熔断,以及统一错误码处理,针对后端多种不同协议,还可以进行协议转化。
四、spring cloud流程介绍
4.1 spring cloud流程图

4.2 流程介绍
客户端发送请求给gateway
请求首先被HttpWebHandlerAdapter进行提取组装成网关上下文,
然后网关的上下文会传递到DispatcherHandler进行请求处理(DispatcherHandler是所有请求的处理分发器)
DispatcherHandler负责将所有的请求分发给对应的处理器
比如分发给RoutePredicateHandlerMapping(路由断言处理映射器),路由断言映射器主要作用是进行路由查找,以及找到路由以后返回给对应的FilterWebHandler
FilterWebHandler主要负责组装Filter链,并调用Filter执行一系列的Filter操作
然后再把请求转到后端对应的代理服务处理
处理完毕之后将Response返回到Gateway客户端
4.3 核心介绍
4.3.1 Filter过滤器
使用过滤器,可以在请求被路由之前或者之后对请求进行修改
过滤器按照请求和响应可以分为两种:Pre类型和Post类型
Pre类型:在请求转发到微服务之前,对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出、协议转换等操作
Post类型:微服务处理完请求后,返回响应给网关,网关可以再次进行处理,例如可以修改响应内容、响应头、日志输出、流量监控等
按照过滤器Filter作用范围划分
GlobaFilter:全局过滤器,应用在所有路由上的过滤器
GatewayFilter:局部过滤器,应用在单个路由或一组路由上的过滤器
4.3.2 Route(路由)
构建网关的基础模块,由ID,目标URL,过滤器等组成
4.3.3 Predicate(断言)
开发人员可以匹配HTTP请求中的内容(请求头和请求参数),如果请求断言则进行路由
4.4 核心思想
路由转发+执行过滤器链
当用户发送请求达到Gateway之后,会通过一些匹配条件,定位到真正的服务节点,并且在这个过程的转发前后,进行一些细粒度控制,其中Predicate(断言)是我们的匹配条件,Filter是一个拦截器,有了这两点,再加上URL,就可以实现一个具体的路由。
五、源码实现
按照上一篇springcloud+nacos项目,创建一个gateway模块
https://javazhong.blog.csdn.net/article/details/128899999

5.1 pom代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>obwt-cloud</artifactId><groupId>com.obwt</groupId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.gateway</groupId><artifactId>gateway-cloud</artifactId><version>0.0.1-SNAPSHOT</version><name>gateway-cloud</name><description>gateway-cloud</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><!--mysql-connector-java--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--bootstrap 启动器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-core</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- SpringCloud Loadbalancer --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- SpringCloud Alibaba Sentinel Gateway -->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>-->
<!-- </dependency>--></dependencies><build></build></project>
5.2 bootstrap代码
server:port: 8005
spring:main:web-application-type: reactive #用于显示请求特定类型的Web应用程序标志,如果未设置,就会根据路径自行检测application:name: gateway-cloud-serviceprofiles:active: devcloud:nacos:discovery:server-addr: 192.168.139.128:8848group: LOCAL_GROUPservice: ${spring.application.name}config:file-extension: yamlgroup: LOCAL_GROUPserver-addr: 192.168.139.128:8848#网关配置gateway:routes:- id: baiduuri: http://www.baidu.compredicates: #当请求的路径包含url=baidu的时候,指向http://www.baidu.com- Query=url,baidu - id: userInfo #这个id只要保证唯一就好uri: lb://bms-cloud-service #负载均衡 lb 是负载均衡的缩写,在注册中心找叫做bms-cloud-service服务predicates: #设置路由断言- Path=/user/** #设置路由断言,当请求包含了/user开头的接口时进行转发,比如/user/Info的时候,这条路由会生效,会去找bms-cloud-service服务上的/user/info接口- id: copeInfo #这个id只要保证唯一就好uri: http://localhost:8001 #这种方式是直接定死的静态路由,当请求localhost:8005/test的时候会转发给localhost:8001/testpredicates:- Path=/test- id: testBms #这个id只要保证唯一就好uri: lb://bms-cloud-servicepredicates:- Path=/api/test/**filters:#将跳转路径中包含的"api"替换成空,在请求的时候必须带上api,但是在对应的服务(bms-cloud-service)转接口的时候不需要有api- RewritePath=/api/(?<segment>.*),/$\{segment}- id: bms #这个id只要保证唯一就好uri: lb://bms-cloud-servicepredicates:- Path=/bms/**5.3 controller测试代码
bms-cloud-service服务上对应的controller层测试代码
测试的时候要启动gateway-cloud-service模块和bms-cloud-service模块,但是入口就是gateway模块
@RestController
public class TestController {@GetMapping("/api/test")public String test() {return "bms的api的test";}@GetMapping("/api/test/22")public String test22() {return "bms的api的test22";}@GetMapping("/test")public String test1() {return "bms的test1";}@GetMapping("/test/test2")public String testTest() {return "bms的test2";}@GetMapping("/userInfo")public String userInfo() {return "bms的userInfo";}@GetMapping("/userInfo/user")public String userInfoUser() {return "bms的userInfo2";}@GetMapping("/user/userInfo")public String user() {return "bms的userInfo3";}@GetMapping("/user/userInfo2")public String user2() {return "bms的userInfo4";}
}六、配置拓展
- id: bms #这个id只要保证唯一就好uri: lb://bms-cloud-service断言 | 实例 | 说明 |
Path | - Path=/api/bms/** | 请求路径于/api/bms/**匹配时,该请求才能转发到bms-cloud-service服务上,比如localhost:8005/api/bms/user,那么会自动去寻找bms-cloud-service服务上的/api/bms/user接口 |
Before | - Before=2023-01-01T08:29:59.100+08:00[Asia/Shanghai] | 在2023年01月01日08是29分59.100秒之前请求,才会转发到bms-cloud-service服务上 |
After | - After=2023-01-01T08:29:59.100+08:00[Asia/Shanghai] | 在2023年01月01日08是29分59.100秒之后请求,才会转发到bms-cloud-service服务上 |
Between | - Between=2023-01-01T08:29:59.100+08:00[Asia/Shanghai], 2023-02-01T08:29:59.100+08:00[Asia/Shanghai] | 在2023年01月01日08是29分59.100秒至在2023年02月01日08是29分59.100秒之间请求,才会转发到bms-cloud-service服务上 |
Cookie | - Cookie=name,bmsservice.cc | 携带Cookie且Cookie内容为name=bmsservice.cc的请求,才会转发到bms-cloud-service服务上 |
Header | - Header=X-Request-ld,\d+ | 请求头上携带属性X-request-ld,且属性值为整数的请求,才会转发到bms-cloud-service服务上 |
Method | - Method=GET | 只有GET请求才会被转发到bms-cloud-service服务上 |
相关文章:
springcloud+nacos+gateway案例
一、先搭建好springcloudnacos项目地址:https://javazhong.blog.csdn.net/article/details/128899999二、spring cloud gateway简述Spring Cloud Gateway 是Spring Cloud家族中的一款API网关。Gateway 建立在 Spring Webflux上,目标是提供一个简洁、高效的API网关&a…...
实习这么久,你知道Maven是如何从代码仓库中找到需要的依赖吗?
目录 碎碎念 Maven是如何找到代码仓库里需要的依赖的? 如何根据坐标在本地仓库中寻找所需要的依赖? 如何根据坐标在远程仓库中寻找所需要的依赖? Maven 如何使用 HTTP 或 HTTPS 协议从远程仓库中获取依赖项,请详细解释其原理…...
低代码/零代码的快速开发框架
目前国内主流的低代码开发平台有:宜搭、简道云、明道云、云程、氚云、伙伴云、道一云、JEPaaS、华炎魔方、搭搭云、JeecgBoot 、RuoYi等。这些平台各有优劣势,定位也不同,用户可以根据自己需求选择。 一、阿里云宜搭 宜搭是阿里巴巴集团在20…...
C# 中常见的设计模式
设计模式是一套被广泛应用于软件设计的最佳实践,它们可以帮助开发者解决特定的问题,提高代码的可重用性、可读性和可维护性。本文将介绍 C# 中常见的几种设计模式,并提供相应的示例代码。 工厂模式 工厂模式是一种创建型设计模式,…...
promethues/servicemonitor
目录 1.promethues 能保证源源不断地采集/metrics 信息吗?每次都是最新的吗 2.部署servicemonitor 的作用是什么? 3.pod 部署采集数据直接上报promthues ,不通过servicemonitor 可以吗? 4.你说的"此外,如果部署…...
postman使用简介
1、介绍 postman是一款功能强大的网页调试和模拟发送HTTP请求的Chrome插件,支持几乎所有类型的HTTP请求 2、下载及安装 官方文档:https://www.getpostman.com/docs/v6/ chrome插件:chrome浏览器应用商店直接搜索添加即可(需墙&…...
@DS注解在事务中实现数据源的切换@DS在事务中失效【已解决】
在Springboot的application.yml中的配置: spring:datasource:url: jdbc:mysql://localhost:3306/test2?serverTimezoneUTC&useUnicodetrue&characterEncodingutf8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: rootdynamic:primar…...
Java I/O之文件系统
一、全文概览 在学习文件系统之前,需要了解下Java在I/O上的发展史:在Java7之前,打开和读取文件需要编写特别笨拙的代码,涉及到很多的InputStream、OutputStream等组合起来使用,每次在使用时或许都需要查一下文档才能记…...
Mysql元数据获取方法(information_schema绕过方法)
前提:如果waf或其它过滤了information_schema关键字,那我们该如何获取元数据呢?能够代替information_schema的有:sys.schema_auto_increment_columnssys.schema_table_statistics_with_bufferx$schema_table_statistics_with_buff…...
Eclipse快捷键
* 1.补全代码的声明:alt /* 2.快速修复: ctrl 1 * 3.批量导包:ctrl shift o* 4.使用单行注释:ctrl /* 5.使用多行注释: ctrl shift / * 6.取消多行注释:ctrl shift \* 7.复制指定行的代码:ctrl a…...
java ssm自习室选座预约系统开发springmvc
人工管理显然已无法应对时代的变化,而自习室选座预约系统开发能很好地解决这一问题,既能提高人力物力,又能提高预约选座的知名度,取代人工管理是必然趋势。 本自习室选座预约系统开发以SSM作为框架,JSP技术,…...
分享我从功能测试转型到测试开发的真实故事
由于这段时间我面试了很多家公司,也经历了之前公司的不愉快。所以我想写一篇文章来分享一下自己的面试体会。希望能对我在之后的工作或者面试中有一些帮助,也希望能帮助到正在找工作的你。 找工作 我们总是草率地进入一个自己不了解的公司工作…...
TypeScript快速入门———(二)TypeScript常用类型
文章目录概述1 类型注解2 常用基础类型概述3.原始类型4 数组类型5 类型别名6.函数类型7 对象类型8 接口9 元组10 类型推论11 类型断言12 字面量类型13 枚举14 any 类型15 typeof概述 TypeScript 是 JS 的超集,TS 提供了 JS 的所有功能,并且额外的增加了…...
Mac M1 使用Centos8➕VMware Fusion进行静态网络配置
大部分的流程网络上面都有当我们已经下载好mac m1版的Centos8链接: https://pan.baidu.com/s/1UTl4Lo-_c17s-PDj3dA6kA 提取码: 7xh2 和VMware Fusionhttps://www.vmware.com/cn/products/fusion.html之后就可以进行安装了在导入过后 记得将硬盘和内存都设置好了 记得在关机状态…...
RadGraph: Extracting Clinical Entities and Relations from Radiology Reports代码
文章来源:NeurIPS 文章类别:IE(Information Extraction) RadGraph主要基于dygie,主要文件为inference.py。 inference.py: 1、get_file_list(data_path) def get_file_list(path):file_list [item for item in glob.glob(f&q…...
13. OPenGL与QT界面元素交互控制图形渲染
1. 说明: 前面文章中讲到的 OPenGL 渲染都是在页面加载完成即立刻渲染的,如果向控制图形渲染的时间,可以在QT界面中添加一些元素来进行控制。此时需要用到OPenGL当中的makeCurrent(),update(),doneCurrent()函数。 效果展示: ope…...
高通平台开发系列讲解(USB篇)libuvc详解
文章目录 一、什么是UVC二、UVC拓扑结构三、libuvc的预览时序图沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍libuvc。 一、什么是UVC UVC,全称为:USB video(device) class。 UVC是微软与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标…...
ICC2:set_route_opt_target_endpoints
route_opt阶段通过指定endpoint/driver pin list的方式执行incremental优化。 set_route_opt_target_endpoints [-setup_endpoints file] [-setup_endpoints_collection pin_list] [-hold_endpoints file] [-hold_endpoints_collection pin_list] [-ldrc_objects fil…...
5、小程序面试题
1, 小程序页面有哪些生命周期函数onLoad: 页面加载onReady: 页面初次渲染完成onShow: 页面显示onHide: 页面隐藏onUnload: 页面卸载2, 一页小程序页面有哪些文件组成,分别有什么作用.wxml: 使用微信框架设计的一套组件构建页面结构.wxss: 用于设置页面样式, 和css基本一致.js :…...
Java特殊操作流
6 特殊操作流 6.1 标注输入输出流 System类中有两个静态的成员变量: public static final InputStream in:标准输入流,通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源public static final PrintStream out:标准输…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
