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.mzph.cn/news/766675.shtml

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

相关文章

STM32---DHT11温湿度传感器与BH1750FVI光照传感器(HAL库、含源码)

写在前面&#xff1a;本节我们学习使用两个常见的传感器模块&#xff0c;分别为DHT11温湿度传感器以及BH1750FVI光照传感器,这两种传感器在对于环境监测中具有十分重要的作用&#xff0c;因为其使用简单方便&#xff0c;所以经常被用于STM32的项目之中。今天将使用分享给大家&a…

QGIS编译(跨平台编译)057:FastCGI编译(Windows、Linux、MacOS环境下编译)

文章目录 1、FastCGI介绍2、FastCGI下载3、Windows下编译4、linux下编译5、MacOS下编译1、FastCGI介绍 FCGI 是 FastCGI 的缩写,是一种用于改善 CGI(Common Gateway Interface)性能的协议。在传统的 CGI 中,每次请求都需要启动一个新的进程来处理,这导致了较高的资源消耗和…

【测试思考】设计测试用例时,你在想什么

突然想写这篇文章是因为&#xff0c;前两天看到一篇文章【像用户一样测试】 然后想起事儿 .. 想到在2020年上海爆发疫情后&#xff0c;开始频繁使用买菜软件&#xff0c;在一个深夜从某团紧急挑选加购商品&#xff0c;看到提醒自己账户还有一张满减优惠券&#xff0c;挺高兴的…

claude3国内怎么用

你是否苦恼没有渠道接触最牛的AI——Claude3&#xff0c;这个已经被媒体刷屏的彻底吊打了ChatGPT-4的地表最强AI。 最近&#xff0c;一个国内的claude3镜像站出现了&#xff0c;国内的小伙伴也可以体验了。 无论你用它写文案、做PPT、写代码、调bug、还是画图&#xff0c;都不…

【Linux】调试器-gdb的安装与使用

1. 背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g 选项 GDB的安装 在开始之前&#xff0c;确保已经安装了GDB。如果没有安…

Android 观察者模式

在Android中&#xff0c;观察者模式&#xff08;Observer Pattern&#xff09;是一种常用的设计模式&#xff0c;用于在对象之间建立一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。在Android开发中&#xff0…

HTML5和CSS3笔记

一&#xff1a;网页结构(html)&#xff1a; 1.1&#xff1a;页面结构&#xff1a; 1.2&#xff1a;标签类型&#xff1a; 1.2.1&#xff1a;块标签&#xff1a; 1.2.2&#xff1a;行内标签&#xff1a; 1.2.3&#xff1a;行内块标签&#xff1a; 1.2.4&#xff1a;块标签与行…

独孤思维:流量暴涨,却惨遭违规

最近独孤操作虚拟资料短视频&#xff0c;有个很深的感悟。 每天发10条短视频&#xff0c;积累到20天左右&#xff0c;播放量和粉丝数开始暴涨。 虽然很多牛比的比我数据好&#xff0c;但是对于刚做短视频的独孤来说&#xff0c;我已经满足了。 但是又发了10来天&#xff0c;…

如何用VSCode和Clangd与Clang-Format插件高效阅读Linux内核源码及写驱动

一、如何高效阅读Linux源码&#xff1a;基于clangd uboot/busybox等都可以用这种方式&#xff0c;理论上说所有基于Make和Cmake的源码工程都可以用这套方案 阅读Linux源码最大问题在于调用链太复杂&#xff0c;一个函数或变量引用太多&#xff0c;source insight和cscope等基于…

Pink老师Echarts教学笔记

可视化面板介绍 ​ 应对现在数据可视化的趋势&#xff0c;越来越多企业需要在很多场景(营销数据&#xff0c;生产数据&#xff0c;用户数据)下使用&#xff0c;可视化图表来展示体现数据&#xff0c;让数据更加直观&#xff0c;数据特点更加突出。 01-使用技术 完成该项目需…

阿里云服务器(Ubuntu22)上的MySQL8数据库下载,安装和远程连接

最近阿里云centos主机到期了改为使用Ubuntu操作系统&#xff0c;在上面安装mysql并远程连接出现了一系列问题并解决。 之前在centos系统上下载mysql8的教程如下&#xff1a; 阿里云服务器&#xff08;centos7&#xff09;上的MySQL8数据库下载&#xff0c;安装和远程连接 主机操…

rollup打包起手式

使用Rollup打包JavaScript rollup是一款小巧的javascript模块打包工具&#xff0c;更适合于库应用的构建工具;可以将小块代码编译成大块复杂的代码&#xff0c;基于ES6 modules,它可以让你的 bundle 最小化&#xff0c;有效减少文件请求大小,vue在开发的时候用的是webpack,但是…

【小沐学Python】Python实现Web图表功能(Lux)

文章目录 1、简介2、安装3、测试3.1 入门示例3.2 入门示例2 结语 1、简介 https://github.com/lux-org/lux 用于智能可视化发现的 Python API Lux 是一个 Python 库&#xff0c;通过自动化可视化和数据分析过程来促进快速简便的数据探索。通过简单地在 Jupyter 笔记本中打印出…

招聘自媒体编辑岗位的人才测评方案

人才测评工具在招聘入职的方案&#xff0c;在线工具网根据自媒体岗位的特性和需求来分析&#xff0c;并制定自媒体主编的测评方案。 自媒体作为互联网时代的产物&#xff0c;自然也为我们带来了很多的福利&#xff0c;例如&#xff1a;海量的信息、快捷的传媒方式&#xff0c;那…

百度网盘联盟申请盘主的方法

在百度网盘联盟目前有3种赚钱方式&#xff0c;第一种是自己售卡赚佣金&#xff1b;第二种是外链分享&#xff08;分销联盟&#xff09;&#xff1b;第三种是邀请好友加盟&#xff0c;好友售卡&#xff0c;自己得提成收入&#xff0c;需要申请盘主后即可开始 申请盘主&#xff1…

3个Tips,用“AI”开启新生活

相信最近&#xff0c;很多朋友们都回归到了忙碌的生活节奏中。生活模式的切换&#xff0c;或多或少会带来身体或情绪状况的起伏。新技术正在为人们生活的方方面面带来便利。3个小Tips或许能让你也从新技术中获益&#xff0c;从身到心&#xff0c;用“AI”开启新生活。 关”A…

RAPTOR:树结构的索引和检索系统的递归抽象处理

论文地址&#xff1a;https://arxiv.org/pdf/2401.18059.pdf 摘 要 增强型检索语言模型能够更好地适应世界状态的变化&#xff0c;并整合长尾知识&#xff0c;然而现有大多数方法仅能从检索语料库中检索到较短的连续文本片段&#xff0c;这限制了对整个文档上下文的整体理解。…

强化学习之父Richard Sutton:通往AGI的另一种可能

2019年&#xff0c;强化学习之父、阿尔伯塔大学教授Richard Sutton发表了后来被AI领域奉为经典的The Bitter lesson&#xff0c;这也是OpenAI研究员的必读文章。 在这篇文章中&#xff0c;Richard指出&#xff0c;过去 70 年来&#xff0c;AI 研究的一大教训是过于重视人类既有…

mysql 索引相关操

1、创建索引 第一种方式&#xff1a;在执行 CREATE TABLE 时创建索引&#xff0c;例如&#xff1a; CREATE TABLE test( id INT auto_increment PRIMARY KEY, name VARCHAR (16), last_name VARCHAR (16), id_card VARCHAR…

文件包含一-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

演示案例&#xff1a; 文件包含-原理&分类&利用&修复黑盒利用-VULWEB-有无包含文件白盒利用-CTFSHOW-伪协议玩法 #文件包含-原理&分类&利用&修复 1、原理 程序开发人员通常会把可重复使用的函数写到单个文件中&#xff0c;在使用某些函数时&#xff0c…