Spring Cloud Gateway 网关的基础使用

1. 什么是网关?网关有什么用?

        在微服务架构中,网关就是一个提供统一访问地址的组件,它解决了内部微服务与外部的交互问题。网关主要负责流量的路由和转发,将外部请求引到对应的微服务实例上。同时提供身份认证、授权、限流、监控以及日志记录等功能。

        从上图就能看出网关的作用了,它就是充当客户端与内部微服务之间的桥梁的。前端虽然可以发送ajax,但是它没有健康检测、没有负载均衡,所以需要使用网关来充当一个统一的入口。当前端的请求来到了网关,网关再去分发,因为网关是用 Java 代码来写的,所以可以在网关这里引入Nacos进行健康检测,引入LoadBalancer进行负载均衡。而且它还有超时重试等高级功能。

🍁网关的主要作用

  1. 提供统一的访问入口点:网关作为唯一的网络流量入口和出口,简化了客户端的访问。
  2. 安全控制:网关能够提供安全检查,例如统一登录和授权。
  3. 协议转换:网关可以在不同网络协议之间转换数据,例如处理HTTPS和HTTP之间的转换。
  4. 网络地址的转换:它允许局域网内的多个设备共享一个公共IP地址与外部网络通信,这样做可以提高安全性,节省IP地址,并使内部网络结构对外部不可见。
  5. 数据的过滤和处理:网关可以对流经的数据进行过滤和必要的处理。

2. Spring Cloud Gateway 的基础使用

2.1 Spring Cloud Gateway 的组成

  1. 路由定义访问的目标地址。
  2. 断言:定义一组规则,让匹配到当前路由的请求去调用某个目标。
  3. 过滤器:对请求进行特殊处理。

2.2 Spring Cloud Gateway 最基础的使用

准备工作:

  1. 创建SpringBoot多模块项目
  2. 创建三个模块:网关、订单、用户

假设订单、用户模块在内网中,不能直接访问,需要通过网关路由到对应的服务上面。

准备相关模块中的 controller:

@RestController
@RequestMapping("/order")
public class OrderController {@RequestMapping("/getcount")public int getCount() {return new Random().nextInt(1000);}
}
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate ServletWebServerApplicationContext context; // 获取动态端口@RequestMapping("/getname")public String getName() {return context.getWebServer().getPort() +"--UserService:name=java-"+new Random().nextInt(100);}
}

以上两个某块只需要添加 Spring Web 依赖即可。

使用网关又分为两步:

  1. 添加依赖
  2. 配置规则

1. 添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

将其添加到网关模块中,不能添加到父模块中,因为 Spring Cloud Gateway 底层是响应式的 Reactor Web。(会冲突)

2. 配置路由规则

spring:cloud:gateway:routes:- id: userserviceuri: http://localhost:9090  # 路由predicates:  # 断言- Path=/user/**     // 满足断言,就会去走对应的路由- id: orderserviceuri: http://localhost:9091predicates:- Path=/order/**server:port: 10086

在实际业务中,路由 uri 这里肯定不能直接写死,但是此处主要演示最基础的使用。

        完成以上两步之后,运行订单服务、用户服务,网关,使用10086端口去访问两个内网中的服务,都能访问的到,这样就实现了统一入口!

2.3 单服务中的多路径配置

        在上述示例中,每个服务只有一个controller,所以在配置网关路由规则的时候,直接写就行了,假如说,单个服务中有多个controller呢?路由规则该如何去写?

在user-service模块中创建日志controller:

@RestController
@RequestMapping("/userlog")
public class UserLogController {@RequestMapping("/getlog")public String getLog() {return "UserLogService:log=java-"+new Random().nextInt(1000);}
}

多路径配置:

spring:cloud:gateway:routes:- id: userserviceuri: http://localhost:9090  # 路由predicates:  # 断言- Path=/user/**,/userlog/getlog  # 单服务多路径配置- id: orderserviceuri: http://localhost:9091predicates:- Path=/order/**server:port: 10086

        如果需要在单服务中完成多路径配置,那么这个时候只需要在Path后面写多个匹配规则,用英文的逗号隔开即可。不能在predicates下面在搞一个Path,因为同一个predicates下面不能出现相同类型的断言。

2.4 更多的断言类型

1.根据时间匹配 (3种类型)

  • After:请求在指定时间之后才匹配。
  • Before:请求在指定时间之前才匹配。
  • Between:请求在指定时间中间才匹配。

2. Cookie:配置请求中的 Cookie 值。

3. Header:配置请求中的 Header 值。

4. Host:配置请求头中的 Host 值。

5. Method:匹配请求头中 Method 的值。

6. Path:匹配请求路径。

7. Query:匹配请求参数。

8. RemoteAddr:匹配请求的 IP 地址,支持 IPV4 和 IPV6.

9. Weight:根据权重来分发请求,权重根据 group 来计算。

10. XForwardedRemoteAddr:根据 X-Forwarded-For 匹配。

参考官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

【示例】演示 Header

spring:cloud:gateway:routes:- id: userserviceuri: http://localhost:9090  # 路由predicates:  # 断言- Path=/user/**,/userlog/getlog  # 单服务多路径配置- Header=X-Header-Flag, \d+  server:port: 10086

使用 postman 构造 header:

① 正常访问

② 异常访问

 

       上述例子中,”X-Header-Flag“ 表示 Header 中的 key,”\d+“ 是一个正则表达式,表示 key 的值,此处表示匹配 1 个或多个数字,才能访问的到。

其他正则表达式:

  1. \w+:匹配一个或多个字母、数字、下划线字符。
  2. \s+:匹配一个或多个空白字符(空格、制表符、换行符)。
  3. .*:匹配任意字符0次或多次。
  4. .+:匹配除了换行符之外的任意字符一次或多次。
  5. [abc]:匹配字符集中的任意一个字符,例如 [abc] 可以匹配 a、b、或 c。
  6. [^abc]:匹配除了字符集中的任意字符之外的任意字符。
  7. ^:匹配字符串的开始位置。
  8. &:匹配字符串的结束位置。
  9. |:用于匹配多个模式中的任意一个。
  10. ():用于分组,,可以将一组字符作为一个整体进行匹配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/213952.html

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

相关文章

在eclipse中安装python插件:PyDev

在eclipse中安装插件PyDev&#xff0c;就可以在eclipse中开发python了。 PyDev的官网&#xff1a;https://www.pydev.org/ 不过可以直接在eclipse中用Marketplace安装&#xff08;备注&#xff1a;有可能一次安装不成功&#xff0c;是因为下载太慢了&#xff0c;多试几次&…

C++中STL的容器vector

文章目录 什么是vectorvector与普通顺序表不同的点 vector的成员函数operatoroperator[]begin与end与iteratorsize()capacityresizeemptyreservepush_backpop_backinserteraseswapclear成员变量 总结 什么是vector vector&#xff1a;是数据结构里面的顺序表&#xff0c;开辟一…

Dockerfile文件

什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Docke…

swing快速入门(二)

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1. ScrollPane对象&#xff08;滚动面板容器&#xff09; 2. 布局管理器的影响 import java.awt.*;public class swing_test_1{public static void main(String[] args){//1.创建一个窗口对象&#xff08;windows容器&am…

VoxPoser:使用语言模型进行机器人操作的可组合 3D 值图

语言是一种压缩媒介&#xff0c;人们通过它来提炼和传达他们对世界的知识和经验。大型语言模型&#xff08;LLMs&#xff09;已成为一种有前景的方法&#xff0c;通过将世界投影到语言空间中来捕捉这种抽象。虽然这些模型被认为在文本形式中内化了可概括的知识&#xff0c;但如…

【calcitonin ; 降钙素 ;降钙素原】

Parathyroid_Hormone -甲状旁腺激素 PTH &#xff1b; 特立帕肽&#xff1b;

Jupyter notebook修改背景主题

打开Anaconda Prompt&#xff0c;输入以下内容 1. pip install --upgrade jupyterthemes 下载对应背景主题包 出现Successfully installed jupyterthemes-0.20.0 lesscpy-0.15.1时&#xff0c;说明已经下载安装完成 2. jt -l 查看背景主题列表 3. jt -t 主题名称&#xff08;…

CSS新手入门笔记整理:CSS浮动布局

文档流概述 正常文档流 “文档流”指元素在页面中出现的先后顺序。正常文档流&#xff0c;又称为“普通文档流”或“普通流”&#xff0c;也就是W3C标准所说的“normal flow”。正常文档流&#xff0c;将一个页面从上到下分为一行一行&#xff0c;其中块元素独占一行&#xf…

冒泡排序和直接选择排序(C/C++实现)

文章目录 冒泡排序(交换排序&#xff09;基本思想特性总结代码实现 直接选择排序基本思想特性总结代码实现&#xff08;优化&#xff0c;每次循环同时选择最小和最大的数&#xff09; 冒泡排序(交换排序&#xff09; 基本思想 基本思想&#xff1a;所谓交换&#xff0c;就是根…

Qt之QGraphicsView —— 笔记1:绘制简单图元(附完整源码)

效果 相关类介绍 QGraphicsView类提供了一个小部件,用于显示QGraphicsScene的内容。QGraphicsView在可滚动视口中可视化。QGraphicsView将滚动其视口,以确保该点在视图中居中。 QGraphicsScene类 提供了一个用于管理大量二维图形项的场景。请注意,QGraphicsScene没有自己的视…

Tomcat部署开源站点JPress

前言 JPress使用Java开发&#xff0c;是我们常见的开源博客系统。JPress是一个开源的WordPress插件&#xff0c;它提供了一个简单而强大的方式来创建企业级站点。该插件包括许多特性&#xff0c;例如主题定制、页面构建器、性能优化、SEO、安全、电子商务和社交媒体整合等。使用…

unity Mesh Simplify 1.10(模型优化工具:查看面数,降低面数灯)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、面板参数详解说明二、使用方法总结 前言 有时候想对模型优化一下&#xff0c;奈何又不会建模方面的。虽然我感觉它的数值不大对&#xff0c;但是不影响我们优化顶点数嘛。 Me…

国产Type-C PD芯片—接口快充取电芯片

常用USB PDTYPE-C受电端&#xff0c;即设备端协议IC芯片&#xff08;PD Sink&#xff0c;也叫PD诱骗芯片&#xff09;&#xff0c;诱导取电芯片。 产品介绍 LDR6328: ◇ 采用 SOP-8 封装 ◇ 兼容 USB PD 3.0 规范&#xff0c;支持 USB PD 2.0 ◇ 兼容 QC 3.0 规范&#x…

Windows11安装使用Oracle21C详细步骤<图文保姆级>新版本

Windows11安装使用Oracle21C详细步骤<图文保姆级>新版本 Database Software Downloads | Oracle 中国 下载完成后解压缩 双击setup.exe 打开安装页面 同意下一步 更改自己的路径点击下一步 输入密码 下一步安装等待即可 等待加载配置时间有点久 完成即可 使用 搜索…

查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息

文章目录 摘要1. 查询CPU使用率命令&#xff1a;top -bn1 | grep \"Cpu(s)\" | awk {split($0,arr,\" \");print 100-arr[8]}2. 查询内存命令&#xff08;单位&#xff1a;G&#xff09;&#xff1a;top -bn1 | grep \"KiB Mem\" | awk {split($…

12.8 作业 C++

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

【Linux】如何对文本文件进行有条件地划分?——cut命令

cut 命令可以根据一个指定的标记&#xff08;默认是 tab&#xff09;来为文本划分列&#xff0c;然后将此列显示。 例如想要显示 passwd 文件的第一列可以使用以下命令&#xff1a;cut –f 1 –d : /etc/passwd cut&#xff1a;用于从文件的每一行中提取部分内容的命令。-f 1&…

【docker 】centOS 安装docker

官网 docker官网 github源码 卸载旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 安装软件包 yum install -y yum-utils \device-mapper-persistent-data…

使用C语言操作kafka ---- librdkafka

1 安装librdkafka git clone https://github.com/edenhill/librdkafka.git cd librdkafka git checkout v1.7.0 ./configure make sudo make install sudo ldconfig 在librdkafka的examples目录下会有示例程序。比如consumer的启动需要下列参数 ./consumer <broker> &…