Kitex 拓展 resolver-rule-based 提供了一个基于规则的解析器。它允许用户配置规则以过滤服务发现中的服务实例,实现流量切分的功能。
这个解析器需要一个已实现的 Resolver,能够从注册中心解析实例,同时还需要一些定制化的过滤规则(例如,在实例中根据标签进行过滤)。
功能特性
支持自定义过滤规则,能够基于实例的标签或其他元数据进行筛选。
支持顺序执行多个过滤函数,灵活定义服务解析的逻辑。
实现你自己的解析器。参考这个文档关于解析器的定义: 服务发现扩展
定义过滤规则。
// 定义一个过滤函数
// 例如,只获取具有标签 {"k":"v"} 的实例
filterFunc := func(ctx context.Context, instance []discovery.Instance) []discovery.Instance {
var res []discovery.Instance
for _, ins := range instance {
if v, ok := ins.Tag("k"); ok && v == "v" {
res = append(res, ins)
}
}
return res
}
// 构造过滤规则
filterRule := &FilterRule{Name: "rule-name", Funcs: []FilterFunc{filterFunc}}
注意:FilterFuncs 将按顺序执行。
配置解析器
import (
ruleBasedResolver "github.com/kitex-contrib/resolver-rule-based"
"github.com/cloudwego/kitex/client"
"github.com/cloudwego/kitex/pkg/discovery"
)
// 实现你的解析器
var newResolver discovery.Resolver
// 使用 `newResolver` 和 `filterRule` 构造一个 RuleBasedResolver
tagResolver := ruleBasedResolver.NewRuleBasedResolver(resolver, filterRule)
// 在构建 Kitex 客户端时添加此选项
opt := client.WithResolver(tagResolver)
使用示例请参考 Demo 。