网关配置自定义路由模式

最近更新时间:2024-10-28 10:39:32

我的收藏

功能说明

1.46 版本 SDK 之前,TSF 微服务网关 SDK 只支持分组路由模式,即请求路径需要携带网关分组等信息,并且不支持自定义路由规则。如果客户原本使用的是开源 Zuul 或 SCG,迁移改造量大。
从 1.46 版本 SDK 开始,TSF 微服务网关 SDK 支持两种路由模式:分组路由模式和自定义路由模式。
分组路由模式:TSF 托管微服务API。该模式下,TSF 会校验网关分组、请求 URL 请求路径等是否合法。支持 TSF 服务治理、支持使用网关分组相关能力(网关插件、API 限流、API 超时等)。不支持自定义路由规则 。
自定义路由模式:TSF 不托管微服务 API。路由方式由配置文件定义。该模式下,TSF 不会校验网关分组和 URL 请求路径等是否合法。支持 TSF 服务治理,不支持网关分组的相关能力(包括网关插件、API 限流、API 超时等)
功能
分组路由模式
自定义路由模式
TSF 服务治理
支持
支持
网关分组的相关能力(包括网关插件、TSF API 限流、API 超时等)
支持
不支持
自定义路由规则
不支持
支持

前提条件

开始实践配置微服务 SDK 支持网关自定义路由功能之前,请确保您已完成 微服务网关开发

操作步骤

您可以通过以下两种方式配置网关自定义路由功能。
方式一:在微服务网关的请求 Header 头设置
方式二:在微服务网关应用的配置文件设置
在微服务网关的请求 Header 头里设置标识某个请求是自定义路由 API 的请求。
请求的 Header 头里设置 TSF-Opensource-Mode: true:表示本次网关请求是自定义路由 API 的请求,走自定义路由模式的逻辑,否则依然走分组路由模式(默认都是分组路由模式)。
请求的 Header 头里设置 TSF-NamespaceId: namespace-xxxxx :表示本次网关请求路由到命名空间 ID 为 namespace-xxxxx 的下游服务,如果不设置则默认请求到与网关相同命名空间的下游服务。
说明
只有全局命名空间的网关才可以路由到任意一个命名空间的服务,普通命名空间的网关只能路由到与网关相同普通命名空间的服务。
TSF-NamespaceId 填写的是命名空间 ID,而非命名空间名称。
跨命名空间访问时,需要配置对应自定义路由。
请求的Header 头里设置 TSF-NamespaceId: namespace-xxxxx :表示本次网关请求路由到命名空间 ID 为 namespace-xxxxx 的下游服务,如果不设置则默认请求到与网关相同命名空间的下游服务。
在微服务网关应用的配置文件设置 tsf.gateway.opensource-mode: true
tsf:
gateway:
opensource-mode: true
说明:
TSF-NamespaceId 填写的是命名空间 ID,而非命名空间名称。
跨命名空间访问时,需要配置对应自定义路由。
tsf.gateway.opensource-mode 默认为 false,表示默认是分组路由模式,如果设置为 true 表示开启自定义路由模式。
开启自定义路由模式以后,所有非 TSF 网关分组前缀的请求都会被当作是自定义路由 API 的请求,例如某个 TSF 网关分组名是 /test,那么只有 http://ip:port/test/xxx 的请求才会走原先分组路由模式的逻辑,其他请求(例如 http://ip:port/abc/xxx)走自定义路由 API 请求的逻辑。

自定义路由规则配置

自定义路由模式下,默认请求路径为{Host:port}/{下游服务名}/{下游API路径}。例如: localhost:8080/provider-demo/echo/test,其中 provider-demo 为下游服务名,/echo/aaa为下游 API 路径。
如果需要额外的路由规则,或跨命名空间访问,可以通过以下配置进行设置:

1. SCG网关配置

配置名称
配置说明
spring.cloud.gateway.routes[].id
路由的 ID ,不允许重复
spring.cloud.gateway.routes[].uri
转发地址,可以是服务名,也可以是静态地址
spring.cloud.gateway.routes[].predicates
SCG 断言,用于匹配路由
spring.cloud.gateway.routes[].filters
SCG 过滤器
配置示例:
spring:
cloud:
gateway:
routes:
- id: provider-demo
uri: lb://provider-demo # 走服务发现,跨命名空间配置参考这里
predicates:
- Path=/provider-demo/** # /provider-demo/ 前缀的请求转发走服务发现转发到 provider-demo 实例上
filters:
- StripPrefix=1 # 标识在转发之前应删除此路由的前缀
- id: business-server
uri: http://localhost:9999 # 静态地址,不走服务发现
predicates:
- Path=/business/** # /business/ 前缀的请求直接转发到 http://localhost:9999
filters:
- StripPrefix=1
- id: websocket
uri: ws://127.0.0.1:1234 # websocket 转发,只支持配置静态地址
predicates:
- Path=/websocket
filters:
- StripPrefix=1

2. Zuul 网关配置

配置名称
配置说明
zuul.routes.{路由key}.id
{路由key} 为替换为实际路由名称。路由的 ID(默认情况下与其 map 的 key 相同)。不允许重复。
zuul.routes.{路由key}.path
{路由key} 为替换为实际路由名称。路由的 pattern(样式),例如 /foo/**。
zuul.routes.{路由key}.serviceId
{路由key} 为替换为实际路由名称。映射到此路由的服务 ID(如果有)。您可以指定物理 URL 或服务,但不能两者都指定。
zuul.routes.{路由key}.url
{路由key} 为替换为实际路由名称。完整的物理 URL 以映射到路线。一种替代方法是使用服务 ID 和服务发现来查找物理地址。
zuul.routes.{路由key}.stripPrefix
{路由key} 为替换为实际路由名称。默认为 true,用于标识是否在转发之前是否应删除此路由的前缀
配置示例:
zuul: routes: api-v1: path: /provider-demo/** # /provider-demo/ 前缀的请求转发走服务发现转发到 provider-demo 实例上,跨命名空间配置参考这里 serviceId: provider-demo # 走服务发现 stripPrefix: true api-v2: path: /v2/** url: http://127.0.0.1:18081 stripPrefix: true