动态路由
当前支持针对 dubbogo 消息的以下内容进行动态路由:
消息类型 | dubbo消息内容 | 路由规则请求类型 |
---|---|---|
消息头 | attachment | 请求头(HEADER) |
RPC方法 | method | 路径(PATH) |
环境准备
参考 dubbogo 官网文档
dubbogo.yaml 配置文件
dubbo:
registries:
polaris-1:
protocol: polaris
address: ${北极星服务端IP}:8091
namespace: ${北极星命名空间信息}
token: ${北极星资源鉴权 token} # 如果北极星服务端开启了针对客户端的鉴权,则需要配置该参数
说明:
- 在使用动态路由能力时,需要先启用 Polaris 在 dubbogo 中的注册发现功能。
如何配置服务路由参数
dubbogo 中的 PolarisMesh PriorityRouter 扩展点实现,能够根据用户配置的服务路由规则,自动的从当前 RPC 调用上下文以及请求信息中识别出需要参与服务路由的请求标签信息。
假定一个场景:
- 希望 uid 为 user-1 的请求,路由到 environment 标签为 pre 的实例上
- 希望 uid 为 user-2 的请求,路由到 environment 标签为 dev 的实例上
其他则路由到 environment 标签为 prod 的实例上,那可以为 dubbogo 服务设置三条路由规则。
请求匹配规则为 请求参数(QUERY)
- 请求匹配规则为 请求头(HEADER):
- 标签来源: RPC 调用的额外标签信息,即 Invoaction.Attachments()
示例代码(dubbogo 原生使用方式)
func (s *Service) GetUser(uid string) {
atta := make(map[string]interface{})
atta["uid"] = uid
// 通过这种方式往 attachement 传入路由条件
reqContext := context.WithValue(context.Background(), constant.DubboCtxKey("attachment"), atta)
for i := 0; i < 5; i++ {
time.Sleep(200 * time.Millisecond)
user, err := userProvider.GetUser(reqContext, &User{Name: "Alex001"})
if err != nil {
logger.Errorf("error: %v\n", err)
}
logger.Infof("response: %v\n", user)
}
}
验证
可根据 dubbogo example 开展