higress
higress copied to clipboard
SpringCloudGateway迁移到MSE Higress最佳实践
1 SCG简介
1.1 SCG定位
微服务网关,面向研发人员,提供业务域级的,与后端微服务紧耦合的配置,需要支持扩展开发能力,以便开发与微服务业务相关的插件,需要对接微服务架构的注册中心。从使用场景上来看:
● 南北向流量,需要流量网关和微服务网关配合使用,主要是为了区分外部流量和微服务流量,将内部的微服务能力,以统一的 HTTP 接入点对外提供服务。
● 东西向流量,在一些业务量比较大的系统中,可能会按照业务域隔离出一系列的微服务,在同一业务域内的微服务通信走的是服务发现机制,而跨业务域访问,则建议借助于微服务网关。
1.2 SCG核心功能
SCG产品的核心功能,基本可以用下面一张图来概括。
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通过白屏配置+内置插件基本都可以覆盖,一些较个性化的能力也均可以通过自定义插件来实现。
下文分别列出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实现方式
Higress实现方式
3.2 通过路由的策略配置-重写可以实现StripPrefix
SCG实现方式
Higress实现方式
3.3 实现请求header和响应header的传递
SCG实现方式
Higress实现方式
3.4 实现请求参数的传递
SCG实现方式
Higress实现方式
3.5 实现自定义鉴权
实现对接NACOS配置中心,根据配置中心的动态配置实现特定鉴权业务逻辑。
SCG实现方式,通过GLOBAL Filter来实现
HIGRESS实现方式
通过自定义鉴权实现,把对接NACOS监听NACOS配置的JAVA程序打包发布成一个ACK集群中的服务,然后HIGRESS中配置自定义鉴权,绑定对应的鉴权服务,如下图
更详细的自定义鉴权可参考官网文档:https://help.aliyun.com/zh/mse/user-guide/configure-custom-authentication?spm=a2c4g.11186623.0.0.230723acxRgqDq
3.6 通过redis-limit插件实现对接redis实现redis限流
SCG实现方式
HIGRESS实现方式
3.7 通过query参数配置实现按内容灰度
SCG实现方式
Higress实现方式
时间Before等断言,是说higress后续会支持这种插件吗?还是需要用户自己实现?