alibaba / higress

🤖 AI Gateway | AI Native API Gateway
https://higress.io
Apache License 2.0
2.86k stars 470 forks source link

SpringCloudGateway迁移到MSE Higress最佳实践 #774

Open jinfengcg opened 8 months ago

jinfengcg commented 8 months ago

1 SCG简介

1.1 SCG定位

微服务网关,面向研发人员,提供业务域级的,与后端微服务紧耦合的配置,需要支持扩展开发能力,以便开发与微服务业务相关的插件,需要对接微服务架构的注册中心。从使用场景上来看:

● 南北向流量,需要流量网关和微服务网关配合使用,主要是为了区分外部流量和微服务流量,将内部的微服务能力,以统一的 HTTP 接入点对外提供服务。 ● 东西向流量,在一些业务量比较大的系统中,可能会按照业务域隔离出一系列的微服务,在同一业务域内的微服务通信走的是服务发现机制,而跨业务域访问,则建议借助于微服务网关。 image

1.2 SCG核心功能

SCG产品的核心功能,基本可以用下面一张图来概括。 image

1.3 SCG实现核心能力的三要素

SCG的所有核心能力,均是通过predicate、route、filter之间的组合来实现。
● 路由Route:即一套路由规则,是集URI、predicate、filter等属性的一个元数据类,对应到云原生网关的路由 ● 断言Predicate:Java8函数断言,这里可以看做是满足什么条件的时候,route规则进行生效。允许开发者去定义匹配来自于Http Request中的任何信息,如请求头和参数,对应到云原生网关的匹配规则。 ● 过滤器Filter:filter针对请求和响应进行增强、修改处理。filter可以认为是Spring Cloud Gateway最核心的模块,熔断、安全、逻辑执行、网络调用都是filter来完成的,其中又细分为gateway filter和global filter,区别在于是具体一个route规则生效还是所有route规则都生效,对应到云原生网关的路由策略和插件

以一次请求看SpringCloud Gateway的调用流程: ● RoutePredicateHandlerMapping:通过lookupRoute方法,遍历所有路由列表,一个路由一个路由的匹配,直到找到第一个可以匹配的Route路由。 ● FilteringWebHandler:创建过滤器链,按顺序调用Filter,filter又分为PreFilter前置过滤器和PostFilter后置过滤器。 ● 整个请求过ServerWebExchange作为上下文贯穿启动,对于一次请求的信息从ServerWebExchange获取,修改则保存在ServerWebExchange中,注意基于Reactive特性,ServerWebExchange是只读的,修改Exchange需重新builder

2 MSE HIGRESS与SCG能力对标

 针对SCG的常用的、核心的能力,MSE HIGRESS通过白屏配置+内置插件基本都可以覆盖,一些较个性化的能力也均可以通过自定义插件来实现。

image

下文分别列出SCG的predicate和filter如果通过HIGRESS具体实现

2.1 SCG的predicate通过Higress实现

断言 | 使用频率 | SCG实现方式 | Higress实现方式 -- | -- | -- | -- Path匹配 | 高 | predicates:Path=/gateway/** | 路由->匹配规则->Path->前缀匹配:/gateway/** Header匹配 | 高 | predicates:Header=uid,18 | 路由->匹配规则->Header:uid 精确匹配 18 Method匹配 | 高 | predicates:Method=GET,POST | 路由->匹配规则->Method:GET,POST Query匹配 | 高 | predicates:Query=uid,...[1-5]. | 路由->匹配规则->Query:uid 正则匹配 ...[1-5]. 权重匹配 | 高 | predicates:Weight=group1, 5 | 通过云原生网关路由中的多服务,配置服务的权重百分比实现 时间Before匹配 | 低 | predicates:Before=2017-01-20T17:42:47.789-07:00[America/Denver] | 插件实现 时间After匹配 | 低 | predicates:After=2017-01-20T17:42:47.789-07:00[America/Denver] | 插件实现 时间Between匹配 | 低 | predicates:Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver] | 插件实现
## 2.2 SCG的filter通过Higress实现
SCG Filter | 说明 | 使用频率 | Higress实现方式 -- | -- | -- | -- AddRequestHeader | 添加请求头 | 高 | 路由 - 策略配置 - header 设置 AddRequestParameter | 添加请求参数 | 高 | Transform 插件 AddResponseHeader | 添加响应头 | 高 | 路由 - 策略配置 - header 设置 SetRequestHeader | 修改请求头 | 高 | 路由 - 策略配置 - header 设置 SetResponseHeader | 修改响应头 | 高 | 路由 - 策略配置 - header 设置 SetPath | 修改请求路径 | 高 | 路由 - 策略配置 - 重写 PrefixPath | 为请求路径添加前缀 | 高 | 路由 - 策略配置 - 重写 StripPrefix | 删除请求路径前缀 | 高 | 路由 - 策略配置 - 重写 RemoveRequestHeader | 删除请求头 | 高 | 路由 - 策略配置 - header 设置 RemoveResponseHeader | 删除响应头 | 高 | 路由 - 策略配置 - header 设置 Redis RateLimiter | 基于redis限流 | 高 | 1、短期通过redis-limit插件实现;2、长期通过产品化方式实现,路由策略配置支持按照参数限流 自定义filter基于nacos动态配置实现鉴权 | 自定义filter基于nacos动态配置实现鉴权 | 高 | 1、如果只是通过nacos简单的实现黑白名单动态更新,可以引导通过网关的黑白名单能力实现,如果有调用接口更新黑白名单诉求,可引导调用open api;2、如果是较复杂的逻辑且包含一定业务语义的,建议通过自定义鉴权实现。3、大于300CORE以上的,我们给写 RemoveRequestParameter | 删除请求参数 | 高 | 路由 - 策略配置 - header 设置 RedirectTo | 重定向 | 高 | 路由- 目标服务 - 重定向 PreserveHostHeader | 保留请求的域名属性 | 高 | 默认保留,若需要重写,在路由-策略配置-重写中修改 CircuitBreaker | 异常时降级到特定路由 | 低 | 路由配置-fallback服务配置实现 RewriteLocationResponseHeader | 302 Location重写 | 低 | 通过自定义插件实现 SecureHeaders | web安全响应头 | 低 | 通过自定义插件实现 MapRequestHeader | 请求头参数映射 | 低 | 通过Transform 插件实现 MapRequestParameter | 请求参数映射 | 低 | 通过Transform 插件实现 DedupeResponseHeader | 删除响应的重复头 | 低 | 通过Transform 插件实现 # 3 对标功能实现方式 下文会会对标SCG如何通过HIGRESS实现核心能力的详细说明,实现的能力包括:按比例路由、按请求参数路由、删除请求路径前缀、添加清求头、添加请求参数、添加响应头、对接redis实现ip维度限流。 ## 3.1 通过路由的多服务可以实现按比例灰度 ### SCG实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/ff64afb9-442a-4a1d-a177-82fc25976986) ### Higress实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/f06502a4-dd9d-4870-9e02-0d1560cb46e0) ## 3.2 通过路由的策略配置-重写可以实现StripPrefix ### SCG实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/ef2c45f2-f432-4ac8-819d-a325d3f48111) ### Higress实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/25a8d61a-3757-4c84-a520-93fa582e9939) ## 3.3 实现请求header和响应header的传递 ### SCG实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/205a26ba-df16-4725-bb1c-6caf559b30b8) ### Higress实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/d6c8270b-dc3d-4ef5-b13b-413c06d49164) ## 3.4 实现请求参数的传递 ### SCG实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/4eba9f34-6b25-44ab-9500-63695558b2af) ### Higress实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/74747d89-5d9d-4356-bbc3-22072a288e9b) ## 3.5 实现自定义鉴权 实现对接NACOS配置中心,根据配置中心的动态配置实现特定鉴权业务逻辑。 ### SCG实现方式,通过GLOBAL Filter来实现 ![image](https://github.com/alibaba/higress/assets/77718431/4a9fb7f8-64c3-40ed-8529-2c25e5cfe33e) ### HIGRESS实现方式 通过自定义鉴权实现,把对接NACOS监听NACOS配置的JAVA程序打包发布成一个ACK集群中的服务,然后HIGRESS中配置自定义鉴权,绑定对应的鉴权服务,如下图 ![image](https://github.com/alibaba/higress/assets/77718431/021264ff-903a-4381-a876-2c7ce93dd940) 更详细的自定义鉴权可参考官网文档:https://help.aliyun.com/zh/mse/user-guide/configure-custom-authentication?spm=a2c4g.11186623.0.0.230723acxRgqDq ## 3.6 通过redis-limit插件实现对接redis实现redis限流 ### SCG实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/abda9bb0-6d5f-40ff-a6ae-14223855a047) ![image](https://github.com/alibaba/higress/assets/77718431/0f6e15f8-944c-4bac-97d1-d759e9357e21) ### HIGRESS实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/31849d08-c9d8-4d38-b703-edbfdb9db112) ![image](https://github.com/alibaba/higress/assets/77718431/4b3af7d9-fd83-4068-b478-b088c87a1dbe) ## 3.7 通过query参数配置实现按内容灰度 ### SCG实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/e70dba96-b1b4-4e31-b5f6-aca167f466be) ### Higress实现方式 ![image](https://github.com/alibaba/higress/assets/77718431/70ce70a1-a426-49da-98bb-24fdc57c3559) ![image](https://github.com/alibaba/higress/assets/77718431/63ac6394-a91c-4ffb-ab2f-fa43103a8a31)
Melod-YI commented 5 months ago

时间Before等断言,是说higress后续会支持这种插件吗?还是需要用户自己实现?