SpringCloud之网关组件Gateway学习

SpringCloud之网关组件Gateway学习

GateWay简介

Spring Cloud Gateway是Spring Cloud的⼀个全新项目,目标是取代Netflix Zuul,它基于Spring5.0+SpringBoot2.0+WebFlux(基于高性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul,官方测试,Gateway是Zuul的1.6倍,旨在为微服务架构提供种简单有效的统⼀的API路由管理方式。Spring Cloud Gateway不仅提供统的路由方式(反向代理)并且基于 Filter(定义过滤器对请求过滤,完成⼀些功能) 链的式提供了网关基本的功能,例如:鉴权、
流量控制、熔断、路径重写、日志监控等。

Gateway相关概念

Gateway使用

在项目中引入Gateway的依赖,这里要注意的是Gateway不支持Spring boot web包,所以需要排除掉spring-boot-starter-web

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></exclusion></exclusions></dependency>

在微服务系统中,如果没有引入网关组件,用户的请求是直接请求到具体的服务的,而引入网关后,用户的请求会被网关组件处理,然后由网关组件将请求转发给具体的服务实例进行处理。网关组件也是一种服务,也需要被注册到Nacos等注册中心中。引入网关后的架构图如下所示:

在这里插入图片描述

Gateway服务配置,这一部分配置和其它的服务没有区别,是和Nacos注册中心集成的配置

server:port: 10010 #网关端口
spring:application:name: gatewayservicecloud:nacos:server-addr: localhost:8848discovery:group: testgroup1namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084cluster-name: HZ

GateWay本身的配置如下:

spring:cloud:gateway: #路由匹配是从前往后,依次匹配的routes: #网关路由配置- id: providerservice  #路由id,需要唯一uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件- Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到,P需要大写,不然会报错- id: consumerserviceuri: lb://consumerservicepredicates:- Path=/consumer/**

然后在浏览器输入 http://localhost:10010/consumer/1,就可以访问到consumerservice服务了,这时因为GateWay服务将我们的请求根据配置的路由规则路由到了consumerservice。

路由断言工厂

路由断言工厂的作用是读取用户定义的断言条件,对请求作出判断。
我们上面的配置中的断言规则 Path=/user/** 只是字符串, 这些字符串会被Spring中的org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory处理的,类似的PredicateFactory在GateWay中还有很多。

名称说明
After某个时间之后的请求
Before某个时间之前的请求
Between某两个时间之间的请求
Cookie请求必须包含某些cookie
Header请求必须包含某些Header
Host请求必须是访问某个host(域名)
Method请求必须是指定方式
Path请求路径必须符合指定规则
Query请求参数必须包含指定参数
RemoteAddr请求的ip必须是指定范围
Weight权重处理

上面这些路由断言工厂的具体使用,可以参考官方的路由断言工厂示例

过滤器

GateWay Filter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。
在这里插入图片描述
Spring提供了31种不同的路由过滤器工厂,具体的使用可以参考官方的:

过滤器工厂官方示例

使用过滤器给请求添加一个请求头:

  cloud:gateway: #路由匹配是从前往后,依次匹配的routes: #网关路由配置- id: providerservice  #路由id,需要唯一uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件- Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到- id: consumerserviceuri: lb://consumerservicepredicates:- Path=/consumer/**filters:  #局部过滤器,只对某个服务起作用- AddRequestHeader=truth,This is a headr  #添加请求头

通过@RequestHeader注解来获取请求头的值
在这里插入图片描述
在控制台输出了获取到的请求头
在这里插入图片描述

如果想要过滤器对所有的路由都生效,可以把过滤器工厂写到default下

server:port: 10010 #网关端口
spring:application:name: gatewayservicecloud:nacos:server-addr: localhost:8848discovery:group: testgroup1namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084cluster-name: HZgateway: #路由匹配是从前往后,依次匹配的routes: #网关路由配置- id: providerservice  #路由id,需要唯一uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件- Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到- id: consumerserviceuri: lb://consumerservicepredicates:- Path=/consumer/**filters:- AddRequestHeader=truth,This is a headr  #添加请求头default-filters:- AddRequestHeader=truth,This is a headr1

前面提到的两种过滤器的过滤规则都是固定的,是框架给我们提供的;如果想要自定义过滤规则,则需要用到全局过滤器Global Filter。GateWay提供了GlobalFilter接口,只要我们实现这个接口就可以实现自定义的过滤器。重点是如何让过滤器链继续向下执行或者阻止过滤器链向下执行。下面是一个简单的全局过滤器示例:

/*** @author DELL* @version 1.0* @description* @date 2024/3/13 22:38:05*/
@Order(value = 1)  #指定过滤器的执行顺序,值越小越先执行
public class MyGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//获取请求参数MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();//获取String authorization = params.getFirst("authorization");//校验if ("admin".equals(authorization)) {//放行return chain.filter(exchange);}//拦截exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);return exchange.getResponse().setComplete();}}

上面提到了三种过滤器,某个服务的过滤器(filters)、默认的过滤器(default-filters)、全局过滤器(GlobalFilter),如果三种过滤器都进行了配置,那么它们的执行顺序如下:

在这里插入图片描述

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行

CROS配置

Gateway中进行跨域的配置如下:

spring:application:name: gatewayservicecloud:nacos:server-addr: localhost:8848discovery:group: testgroup1namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084cluster-name: HZgateway: #路由匹配是从前往后,依次匹配的routes: #网关路由配置- id: providerservice  #路由id,需要唯一uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件- Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到- id: consumerserviceuri: lb://consumerservicepredicates:- Path=/consumer/**filters:- AddRequestHeader=truth,This is a headr  #添加请求头default-filters:- AddRequestHeader=truth,This is a headr1globalcors:  #跨域配置cors-configurations:'[/**]':allowedOrigins: "http://localhost:8090"  #允许哪些请求跨域allowedMethods:  #允许的跨域的请求方式- GETallowedHeaders: "*"   允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 36000 #跨域检测有效期

参考

  1. Gateway官方文档

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

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

相关文章

Wireshark TS | DNS 案例分析之外的思考

前言 承接之前一篇《Packet Challenge 之 DNS 案例分析》&#xff0c;在数据包跟踪文件 dnsing.pcapng 中&#xff0c;关于第 4 题&#xff08;What is the largest DNS response time seen in this trace file? &#xff09;的分析过程中曾经碰到一个小问题&#xff0c;主要…

Pycharm小妙招之Anaconda离线配环境

Pycharm小妙招之Anaconda离线配环境———如何给无法联网的电脑配python环境&#xff1f; 1. 预备工作2. 电脑1导出包2.1 环境路径2.2 压缩py38导出至U盘 3. 电脑2导入包4. 验证是否导入成功4.1 conda查看是否导入4.2 pycharm查看能否使用 1. 预备工作 WINDOWS系统电脑1(在线)…

设计模式及其在项目、框架中的应用

设计模式的作用&#xff1a; 1、类之间关系图&#xff0c;明确的角色及其关系、作用&#xff1b; 2、符合开闭原则&#xff0c;职责明确&#xff0c;并且开放的拓展点可以有效应对后期的变化。 &#xff08;一&#xff09;、责任链模式 适用场景&#xff1a; 在一个流程中&…

mysql无法看到3306端口监听

参考:https://blog.csdn.net/shumeigang/article/details/103902459 mysql> show global variables like ‘port’; 是0 原因是我的my.cnf有话&#xff1a; skip-network 或 注释掉&#xff0c;然后重新启动下数据库&#xff0c;运行netstat -an|grep 3306 就可以看到了

如何进行设备的非对称性能测试

非对称性能测试介绍 RFC2544是RFC组织提出的用于评测网络互联设备&#xff08;防火墙、IDS、Switch等&#xff09;的国际标准。主要是对RFC1242中定义的性能评测参数的具体测试方法、结果的提交形式作了较详细的规定。标准中定义了4个重要的参数&#xff1a;吞吐量&#xff08…

思通舆情 是一款开源免费的舆情系统 介绍

思通舆情 是一款开源免费的舆情系统。 支持本地化部署&#xff0c;支持在线体验。 支持对海量舆情数据分析和挖掘。 无论你是使用者还是共同完善的开发者&#xff0c;欢迎 pull request 或者 留言对我们提出建议。 您的支持和参与就是我们坚持开源的动力&#xff01;请 sta…

【Linux】程序地址空间

程序地址空间 初识程序地址空间进程地址空间一些补充虚拟地址转物理地址的工作谁来做&#xff1f;进程地址空间存在的意义回看new/malloc 进程中的写时拷贝一点延申 初识程序地址空间 运行结果如下&#xff1a;   我们发现父进程和子进程打印出来的值和地址都是一样的&#…

花生壳 | ubuntu安装和卸载花生壳

一、到花生壳官网下载linux版本的花生壳 一般下载到Downlaods文件夹 进入文件夹 dpkg -i phddns_5_1_amd64.deb #安装花生壳 dpkg -r phddns #卸载花生壳 登录花生壳管理网站 http://b.oray.com 在Ubuntu中输入命令查看sn码&#xff0c;默认密码为admin phddns status …

01.绝对路径和相对路径(Linux基本概念)

基础认知&#xff1a; 电脑的目录结构是一颗多叉树。不管是Linux还是windows&#xff0c;目录结构都是一样的。所以我们在查找某个目录或者文件的时候&#xff0c;本质就是在多叉树结点的查找。多叉树示例图如下&#xff1a; ​​​​​​​ ​​​​​​​ ​​…

Unity发布webgl设置占满浏览器运行

Unity发布webgl设置占满浏览器运行 Unity发布webgl的时候index.html的模板文件 模板文件路径&#xff0c;根据自己的需求修改。 C:\Program Files\Unity\Hub\Editor\2021.1.18f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default再桌面新建一个t…

飞桨AI应用@riscv OpenKylin

在riscv编译安装飞桨PaddlePaddle参见&#xff1a; 算能RISC-V通用云编译飞桨paddlepaddleopenKylin留档_在riscv下进行paddlelite源码编译-CSDN博客 安装好飞桨&#xff0c;就可以用飞桨进行推理了。刚开始计划用ONNX推理&#xff0c;但是在算能云没有装上&#xff0c;所以最…

【Linux】从零认识进程 — 中下篇

送给大家一句话&#xff1a; 人一切的痛苦&#xff0c;本质上都是对自己无能的愤怒。而自律&#xff0c;恰恰是解决人生痛苦的根本途径。—— 王小波 从零认识进程 1 进程优先级1.1 什么是优先级1.2 为什么要有优先级1.3 Linux优先级的特点 && 查看方式1.4 其他概念 2…