higress icon indicating copy to clipboard operation
higress copied to clipboard

SpringCloudGateway迁移到MSE Higress最佳实践

Open jinfengcg opened this issue 1 year ago • 1 comments

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

Higress实现方式

image

3.2 通过路由的策略配置-重写可以实现StripPrefix

SCG实现方式

image

Higress实现方式

image

3.3 实现请求header和响应header的传递

SCG实现方式

image

Higress实现方式

image

3.4 实现请求参数的传递

SCG实现方式

image

Higress实现方式

image

3.5 实现自定义鉴权

实现对接NACOS配置中心,根据配置中心的动态配置实现特定鉴权业务逻辑。

SCG实现方式,通过GLOBAL Filter来实现

image

HIGRESS实现方式

通过自定义鉴权实现,把对接NACOS监听NACOS配置的JAVA程序打包发布成一个ACK集群中的服务,然后HIGRESS中配置自定义鉴权,绑定对应的鉴权服务,如下图 image 更详细的自定义鉴权可参考官网文档: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

image

HIGRESS实现方式

image

image

3.7 通过query参数配置实现按内容灰度

SCG实现方式

image

Higress实现方式

image

image

jinfengcg avatar Jan 12 '24 09:01 jinfengcg

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

Melod-YI avatar Apr 23 '24 09:04 Melod-YI