一、功能说明
·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 头设置方式二:在微服务网关应用的配置文件设置
在微服务网关的请求 Header 头里设置标识某个请求是自定义路由 API 的请求。
·请求的 Header 头里设置 TSF-Opensource-Mode: true:表示本次网关请求是自定义路由 API 的请求,走自定义路由模式的逻辑,否则依然走分组路由模式(默认都是分组路由模式)。
·请求的 Header 头里设置 TSF-NamespaceId: namespace-xxxxx :表示本次网关请求路由到命名空间 ID 为 namespace-xxxxx 的下游服务,如果不设置则默认请求到与网关相同命名空间的下游服务。
·请求的Header 头里设置 TSF-NamespaceId: namespace-xxxxx :表示本次网关请求路由到命名空间 ID 为 namespace-xxxxx 的下游服务,如果不设置则默认请求到与网关相同命名空间的下游服务。
·在微服务网关应用的配置文件设置 tsf.gateway.opensource-mode: true。
tsf: gateway: opensource-mode: true
注意:说明:
三、自定义路由规则配置
自定义路由模式下,默认请求路径为{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