微服务API网关Spring Cloud Gateway实战
2025-02-26 15:06:04 0 举报
AI智能生成
微服务API网关Spring Cloud Gateway实战,分享给大家学习。 更多干货内容,欢迎关注我的公众号:Fox爱分享
作者其他创作
大纲/内容
课程目标
理解Spring Cloud Gateway的核心概念和工作原理
能够使用Spring Cloud Gateway实现微服务API网关
掌握Spring Cloud Gateway的常用配置和扩展点,能够在工作中根据业务需求进行扩展
怎么学
没接触过微服务的同学一定要先把《轻松玩转微服务:新手入门Spring Cloud Alibaba》这节课跟一遍
技术选型
使用Spring Cloud Gateway实现微服务网关
阿里云推荐的微服务网关方案:Higress
官网地址
云原生网关Higress实战
产品对比
课上代码
项目地址
nacos-examples/tlmall-gateway01
git切换到fox-dev分支,选择 tag v2.5.0
基础回顾
智能门卫:Gateway轻松守护微服务入口
微服务为什么需要API网关
在微服务架构中,通常一个系统会被拆分为多个微服务,面对这么多微服务客户端应该如何去调用呢?
如果根据每个微服务的地址发起调用,存在如下问题:
为了解决上面的问题,微服务引入了 API网关 的概念
Spring Cloud Gateway是什么
官方文档
Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul。
Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式,并基于 Filter 的方式提供网关的基本功能,例如说安全认证、监控、限流等等。
Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 实现的响应式的 API 网关。它不能在传统的 servlet 容器中工作,也不能构建成 war 包。
微服务快速接入Spring Cloud Gateway
构建网关服务
创建一个新的module模块tlmall-gateway
pom.xml中引入Spring Cloud Gateway网关依赖
注意:gateway会和spring-webmvc的依赖冲突,需要排除spring-webmvc
微服务快速接入网关服务
以订单服务为例,在网关服务的application.yml
库存服务,账户服务同上
网关服务的完整的application.yml配置如下
此配置可以移到配置中心,新增一个tlmall-gateway.yml的配置
测试,启动网关服务
postman中通过网关服务的18888端口下单,看能否成功
tlmall-frontend前端服务order.html中访问地址都替换为tlmall-gateway:18888,测试下单是否成功
关于Spring Cloud Gateway更多的操作,会在Spring Cloud Gateway实战课程中讲解
小结
gateway就是整个微服务架构的流量入口
Gateway的工作原理分析
核心概念
路由(route)
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。
断言(predicates)
断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。
如果断言为真,则说明请求的URL和配置的路由匹配。
过滤器(Filter)
Filter可以对请求和响应进行处理。
SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。
工作原理
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发送到网关 Web 处理程序,此时处理程序运行特定的请求过滤器链。
过滤器之间用虚线分开的原因是过滤器可能会在发送代理请求的前后执行逻辑。所有 pre 过滤器逻辑先执行,然后执行代理请求;代理请求完成后,执行 post 过滤器逻辑。
Gateway常用配置与自定义扩展详解
路由断言工厂(Route Predicate Factories)配置
官方文档
predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地。
通过网关启动日志,可以查看内置路由断言工厂
路径匹配
测试调用订单查询接口是否能正常调通
Header匹配
使用postman测试调用http://localhost:18888/order/getOrder?userId=fox
不带请求头X-Request-Id
带请求头X-Request-Id
过滤器工厂( GatewayFilter Factories)配置
官方文档
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理
常用的过滤器工厂
添加请求头
需求:给所有进入mall-order的请求添加一个请求头:X-Request-color=red。
只需要修改gateway服务的application.yml文件,添加路由过滤即可
测试
在OrderController中添加测试代码
调用http://localhost:18888/order/testgateway
添加请求参数
测试
添加测试代码
调用http://localhost:18888/order/testgateway3
自定义过滤器工厂
继承AbstractNameValueGatewayFilterFactory且我们的自定义名称必须要以GatewayFilterFactory结尾并交给spring管理。
实现步骤
1)实现自定义过滤器工厂CheckAuthGatewayFilterFactory
2)配置自定义的过滤器工厂
测试
调用http://localhost:18888/order/getOrder?userId=fox
查看控制台输出
全局过滤器(Global Filters)配置
官方网址
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。
区别
- GatewayFilter:网关过滤器,需要通过spring.cloud.routes.filters配置在具体的路由下,只作用在当前特定路由上,也可以通过配置spring.cloud.default-filters让它作用于全局路由上。
- GlobalFilter:全局过滤器,不需要再配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain能够识别的过滤器。
常见的全局过滤器
负载均衡器的过滤器ReactiveLoadBalancerClientFilter
其实就是用来整合负载均衡器loadbalancer的
配置
自定义全局过滤器
需求:实现token校验
自定义全局过滤器CheckAuthFilter
测试,postman调用http://localhost:18888/order/getOrder?userId=fox
请求头部没有携带token
请求头部携带token
Gateway跨域资源共享配置(CORS Configuration)
在前端领域中,跨域是指浏览器允许向服务器发送跨域请求,从而克服Ajax只能同源使用的限制。
所谓同源(即在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。
CORS
跨域问题测试
测试代码Order.html
测试结果
如何解决gateway跨域问题?
官方文档
通过yml配置的方式
通过java配置的方式
限流
Gateway基于redis+lua脚本限流
官方文档
spring cloud官方提供了RequestRateLimiter过滤器工厂,基于redis+lua脚本方式采用令牌桶算法实现了限流。
请求不被允许时返回状态:HTTP 429 - Too Many Requests。
实现步骤
1) 添加依赖
2)修改 application.yml ,添加redis配置和RequestRateLimiter过滤器工厂配置
3) 配置keyResolver,可以指定限流策略,比如url限流,参数限流,ip限流等等
4) 测试
参数限流:http://localhost:18888/order/getOrder?userId=fox
Gateway整合sentinel限流
官方文档
限流维度
- route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId
- 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
Gateway整合sentinel实现网关限流步骤
1)引入依赖
2)添加yml配置,接入sentinel dashboard,通过sentinel控制台配置网关流控规则
重启网关服务进行测试
测试接口
配置流控规则
route维度
注意:基于SpringBoot3的 Spring Cloud Gateway和Sentinel存在兼容性问题
默认的DefaultBlockRequestHandler会抛出上面的异常
解决方案
重新BlockRequestHandler异常处理逻辑
1)自定义实现BlockRequestHandler接口
2) 实现ApplicationRunner接口,springboot启动之后替换异常处理类
测试
配置流控规则
API维度
1)创建API
2)配置流控规则
测试效果
Sentinel网关流控实现原理

收藏

收藏
0 条评论
下一页