当前位置: 首页 > news >正文

一文学习和掌握网关SpringCloudGateway

目录

  • 什么是网关,网关的作用
  • 网关工作过程
  • 网关服务搭建
  • 路由断言
  • 路由过滤
    • 自定义路由过滤器

什么是网关,网关的作用

通俗的讲,网关就是一个网络的看门的大爷,请求消息从一个网络传递到另一个网络,在微服务架构体系中,不再是直接打到目标服务的服务器实例上,而是直接与目标网络的网关建立连接,将请求消息首先传递到网关,注意的是网关不是一个网络设备,而是一个微服务,网关接收到请求消息后,可以进行数据校验,校验通过后,可能将一些其他有用的信息放在请求头上(路由过滤),然后根据请求消息中的请求路径进行请求转发(路由断言),具体的说就是从nacos中拉取实例列表,根据负载均衡挑选一个实例,将请求消息转发到目标服务实例上。
在这里插入图片描述

网关工作过程

  1. 客户端请求进入网关后由HandlerMapping对请求做判断,找到与当前请求匹配的路由规则(Route),然后将请求交给WebHandler去处理
  2. WebHandler则会加载当前路由下需要执行的过滤器链(Filter chain),然后按照顺序逐一执行过滤器(后面称为Filter)
  3. 图中Filter被虚线分为左右两部分,是因为Filter内部的逻辑分为pre和post两部分,分别会在请求路由到微服务之前和之后被执行。
  4. 只有所有Filter的pre逻辑都依次顺序执行通过后,请求才会被路由到微服务。
  5. 微服务返回结果后,再倒序执行Filter的post逻辑。
  6. 最终把响应结果返回。

在这里插入图片描述

网关服务搭建

1. 引入依赖

  <!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--nacos discovery--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

2. 配置网关路由(路由断言和路由过滤)
路由断言和路由过滤是配置网关的核心功能,

  • 路由断言是精准匹配当前请求需要转发到哪个微服务
  • 路由过滤是请求消息、响应消息的动态处理,包括添加请求头,修改URL路径等等,支持全局过滤器和局部过滤器,全局过滤器是所有路由都生效,也可以单独配置某一个路由的过滤规则(局部路由);可以使用gateway的内置过滤器,也可以自定义路由过滤器,并配置在某一个路由或者全局配置。
server:port: 8080
spring:application:name: gatewaycloud:nacos:server-addr: 192.168.150.101:8848gateway:default-filters:  # 全局过滤器- AddResponseHeader=X-Gateway-Default, true  #为所有路由的请求消息添加请求头routes:- id: item # 路由规则id,自定义,唯一uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务- Path=/items/**,/search/** # 这里是以请求路径作为判断规则filters: #局部路由过滤- StripPrefix=1[1,2,4](@ref)- id: carturi: lb://cart-servicepredicates:- Path=/carts/**

路由断言

网关支持的路由断言类型有很多,不过常用的就是Path,根据请求路径断言,进而转发
在这里插入图片描述

路由过滤

  1. 上文我们说过,网关的过滤器分为两种,内置的过滤器和自定义过滤器,无论是内置的过滤器还是自定义过滤器可以配置到某一个路由中,也可以配置成全局路由,这样所有的路由都会走该过滤器,内置路由可以参考官方文档网关内置路由
  2. 如果内置过滤器不满足需求,我们还可以自定义过滤器。

自定义路由过滤器

自定义路由过滤器分为两种

  • GatewayFilter:路由过滤器,作用范围比较灵活,可以配置到某个路由作为局部过滤器,也可以配置成全局路由器,但是必须手动配置,不配置不生效。
  • GlobalFilter:全局过滤器,作用范围是所有路由,不需手动配置,声明即生效。

实际开发工作中,GlobalFilter用的比较多,GatewayFilter用的比较少,下面主要说一下GlobalFilter的开发过程。主要是实现两个接口,GlobalFilter, Ordered,其中Ordered接口的目的是指定我们开发的过滤器在过滤器链中的执行时机,因为需要保证在NettyRoutingFilter过滤器之前执行才可以

/*** 处理请求并将其传递给下一个过滤器* @param exchange 当前请求的上下文,其中包含request、response等各种数据* @param chain 过滤器链,基于它向下传递请求* @return 根据返回值标记当前请求是否被完成或拦截,chain.filter(exchange)就放行了。*/
@Component
public class PrintAnyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 编写过滤器逻辑System.out.println("未登录,无法访问");// 要不放行,要不拦截//添加请求头并放行ServerHttpRequest newRequest = exchange.getRequest().mutate().header("X-User", "Alice") // 添加新头.build();ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();return chain.filter(exchange);// 拦截ServerHttpResponse response = exchange.getResponse();response.setRawStatusCode(401);return response.setComplete();}@Overridepublic int getOrder() {// 过滤器执行顺序,值越小,优先级越高return 0;}
}
http://www.dtcms.com/a/348288.html

相关文章:

  • Java基础知识(五)
  • 南科大C++ 第二章知识储备
  • 电脑深度清理软件,免费磁盘优化工具
  • Shell脚本-如何生成随机数
  • 设置接收超时(SO_RCVTIMEO)
  • 8月精选!Windows 11 25H2 【版本号:26200.5733】
  • 牛市阶段投资指南
  • ffmpeg强大的滤镜功能
  • SingleFile网页保存插件本地安装(QQ浏览器)
  • 【图像处理基石】如何把非笑脸转为笑脸?
  • ffmpeg 问答系列-> mux 部分
  • 启动Flink SQL Client并连接到YARN集群会话
  • Node.js自研ORM框架深度解析与实践
  • 柱状图中最大的矩形+单调栈
  • STM32 入门实录:macOS 下从 0 到点亮 LED
  • Java全栈开发面试实录:从基础到实战的深度探讨
  • 微服务-19.什么是网关
  • 【论文阅读】AI 赋能基于模型的系统工程研究现状与展望
  • Redis--day12--黑马点评--附近商铺用户签到UV统计
  • Excel 表格 - 合并单元格、清除单元格格式
  • 包裹堆叠场景漏检率↓79%!陌讯多目标追踪算法在智慧物流的实践优化
  • EXCEL实现复制后倒序粘贴
  • 暗影哨兵:安全运维的隐秘防线
  • 深度学习部署实战 Ubuntu24.04单机多卡部署ERNIE-4.5-VL-28B-A3B-Paddle文心多模态大模型(详细教程)
  • 用墨刀开发能碳管理系统 —— 从流程图到设计稿全流程拆解
  • EAM、MES和CRM系统信息的整理
  • c语言指针学习
  • C文件编译
  • IQC、IPQC、PQC、FQC、OQC在ERP/MES/WMS中的系统协同
  • 【SBP】Unity 打包构建管线原理解析于对比