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:标准输…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
