功能说明
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 超时等) | 支持 | 不支持 |
自定义路由规则 | 不支持 | 支持 |
前提条件
操作步骤
您可以通过以下两种方式配置网关自定义路由功能。
在微服务网关的请求 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-demouri: lb://provider-demo # 走服务发现,跨命名空间配置参考这里predicates:- Path=/provider-demo/** # /provider-demo/ 前缀的请求转发走服务发现转发到 provider-demo 实例上filters:- StripPrefix=1 # 标识在转发之前应删除此路由的前缀- id: business-serveruri: http://localhost:9999 # 静态地址,不走服务发现predicates:- Path=/business/** # /business/ 前缀的请求直接转发到 http://localhost:9999filters:- StripPrefix=1- id: websocketuri: ws://127.0.0.1:1234 # websocket 转发,只支持配置静态地址predicates:- Path=/websocketfilters:- 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