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:标准输…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...