Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
jinfengcg opened this issue Jan 12, 2024 · 1 comment
Open

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

jinfengcg opened this issue Jan 12, 2024 · 1 comment
Labels
good first issue Good for newcomers

Comments

@jinfengcg
Copy link

jinfengcg commented Jan 12, 2024

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

@johnlanni johnlanni added the good first issue Good for newcomers label Jan 16, 2024
@Melod-YI
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests

3 participants