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

统一服务入口——Spring Cloud Gateway

一、快速上手

1.1 准备工作

API网关也是一个服务

一、创建网关服务


二、添加依赖

        <!--⽹关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--基于nacos实现服务发现依赖,网关支持动态路由,需要服务发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--网关服务也需要loadbalancer将服务名转换为对应的IP地址--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

三、编写启动类

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class,args);}
}

四、添加配置

server:port: 10030
spring:application:name: gatewaycloud:nacos: #将网关服务注册到nacosdiscovery:server-addr: 110.41.17.130:8848gateway:routes: #网关路由设置- id: order-service #路由规则id,随便起,不重复即可uri: lb://order-service/ #目标服务地址predicates: #路由条件- Path=/order/**,/feign/**

其中,id可以随便起一个,uri中的lb表示负载均衡,predicates表示路由条件(在当前配置表示所有路径符合Path规则的请求,都会代理到uri参数指定的地址)


1.2 测试

(1)访问订单服务

(2)访问商品服务

可以看到,只有已配置的路由才可以通过gateway服务访问,未配置的路由无法访问


二、Route Predicate Factories

我们可能对于配置中的一些配置存有疑问,现在我们深入了解上述配置的predicates

2.1 Predicate

Predicate是Java8提供的一个函数式编程接口,它接收一个参数并返回一个布尔值,用于条件过滤、请求参数的校验。

使用示例:

/*
* 判断字符串是否为空
* 空 -true
* 非空 -false
* */
public class StringPredicate implements Predicate<String> {@Overridepublic boolean test(String s) {return s == null || s.isEmpty();}
}

接下来,调用方法进行测试:

    public void test(){Predicate<String> predicate = new StringPredicate();System.out.println(predicate.test(""));}

Predicate的其它方法:


2.2  Route Predicate Factories

Route Predicate Factories(路由断言工厂),由Predicate提供路由规则的匹配机制。

在配置文件中所写得断言规则只是字符串,这些字符串被Route Predicate Factories处理后转变为路由得判断条件,如:下图的Path属性就是匹配url前缀是product/  或 feign/ 的请求

Spring Cloud Gateway 默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请求的不同属性,并且多个Predicate通过and逻辑进行组合

 在前面的代码中已经测试了Path属性,现在再添加一个Predicate After:

          predicates: #路由条件- Path=/order/**,/feign/**- After=2026-01-20T17:42:47.789-07:00[America/Denver]

可以看到After属性配置为2026年后才可访问,现在再次测试:

注释After配置,访问成功:


2.3 Gateway Filter Factories(网关过滤工厂)

Predicate决定了请求由哪个路由处理,如果需要再请求前后加上一些逻辑,就需要使用Filter。

Filter分为两种类型:

1> Pre 类型过滤器:请求处理前执行,可以做鉴权、限流等工作

2> Post 类型过滤器:请求处理后、返回客户端前执行

Spring Cloud Gateway中内置很多Filter,用于拦截和链式处理Web请求(权限校验、访问超时等处理),Spring Cloud Gateway 将Filter分为两类:

GatewayFilte(应用到单个路由或一个分组路由上)

GlobalFilter(应用到所有路由)

2.3.1 GatewayFilter

这里以其中一个Filer(AddRequestParam)为例

一、添加配置

      routes:- id: order-service #路由规则id,随便起,不重复即可uri: lb://order-service/ #目标服务地址predicates: #路由条件- Path=/order/**,/feign/**filters:- AddRequestParameter=userName, wangwu

与predicates同级,这个Filter给Path中指定请求添加一个参数userName


二、修改feign/o1代码(添加一个参数userName)


三、测试

成功添加参数userName

想了解其它过滤器可以访问Spring官网: GatewayFilter Factories :: Spring Cloud Gateway


2.3.2 GlobalFilter

Spring Cloud Gateway中内置的全局过滤器也有很多,如:

Gateway Metrics Filter:网关指标,提供监控指标 

Forward Routing Filter:用于本地forword,请求不转发到下游服务器

LoadBalancer Client Filter:针对下游服务,实现负载均衡

更多全局过滤器可参考官网:Global Filters :: Spring Cloud Gateway

这里我们只练习使用 Gateway Metrics Filter:

一、添加依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

二、添加配置

spring:cloud:gateway:metrics:enabled: true
management:endpoints:web:exposure:include: "*"endpoint:health:show-details: alwaysshutdown:enabled: true

三、测试

访问127.0.0.1:10030/actuator,显示所有监控的信息链接:


2.4 过滤器执行顺序

一个项目中既有GatewayFilter又有GlobalFilter时,执行的先后顺序是什么呢?

请求路由后,网关会将当前的GatewayFilter和GlobalFilter合并到一个过滤器链中,进行排序,依次执行过滤,每一个过滤器都必须指定⼀个int类型的order值,默认值为0,表示该过滤的优先级。order值越小,优先级越高,执行顺序越靠前

• Filter通过实现Order接口或者添加@Order注解来指定order值。

• Spring Cloud Gateway提供的Filter由Spring指定。用户也可以自定义Filter,由用户指定。

• 当过滤器的order值⼀样时,会按照 defaultFilter > GatewayFilter > GlobalFilter的顺序执行。

http://www.lryc.cn/news/596960.html

相关文章:

  • 高亮匹配关键词样式highLightMatchString、replaceHTMLChar
  • Effective Python 第15条 不要过分依赖给字典添加条目时所用的顺序
  • CodeBuddy IDE实战:用AI全栈能力快速搭建课程表网页
  • JavaScript HTTP 请求:从老古董到新潮流
  • 在线深凹槽深检测方法都有哪些 —— 激光频率梳 3D 轮廓检测
  • 如何在Pico等Android头显中实现无人机低延迟RTMP全景巡检画面播放
  • 2025年7月份实时最新获取地图边界数据方法,省市区县街道多级联动【文末附实时geoJson数据下载】
  • 从零开始学习Dify-Excel数据可视化(四)
  • 无人机光伏巡检误检率↓78%!陌讯多模态融合算法实战解析
  • 【Android】用 ViewPager2 + Fragment + TabLayout 实现标签页切换
  • Android用户鉴权实现方案深度分析
  • react18更新哪些东西
  • Nginx和Apache的区别
  • Apache PDFBox深入实践
  • Apache JMeter 使用记录踩坑
  • MCP客户端架构与实施
  • Apache POI 介绍与使用指南
  • apache-doris安装兼datax-web配置
  • LNMP-zblog分布式部署
  • 【Unity Shader】Special Effects(十二)Glow 外发光(UI)
  • Unity × RTMP × 头显设备:打造沉浸式工业远控视频系统的完整方案
  • 如何在macOS上修改iPhone的定位
  • ESP32的ADF详解:5. Streams的API
  • 聊聊 Flutter 在 iOS 真机 Debug 运行出现 Timed out *** to update 的问题
  • 在AI深度嵌入企业业务的当下——AI时代的融合数据库
  • Qt 菜单与工具栏设计:提升用户体验
  • AI产品经理面试宝典第48天:产品设计与用户体验优化策略
  • 【数学建模 | Matlab】二维绘图 和 三维绘图
  • 国产数据库转向 “融合” 赛道:电科金仓的下一代形态定义之路
  • Leetcode力扣解题记录--第240题(矩阵搜索)