W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
kitex-contrib 中提供了 DNS 服務(wù)發(fā)現(xiàn)擴展。
用戶如果需要更換其他的服務(wù)發(fā)現(xiàn),例如 ETCD,用戶可以根據(jù)需求實現(xiàn) ?Resolver
?接口,client 通過 ?WithResolver
?Option 來注入。
接口在 pkg/discovery/discovery.go 中,具體定義如下:
// 服務(wù)發(fā)現(xiàn)接口定義
type Resolver interface {
Target(ctx context.Context, target rpcinfo.EndpointInfo) string
Resolve(ctx context.Context, key string) (Result, error)
Diff(key string, prev, next Result) (Change, bool)
Name() string
}
type Result struct {
Cacheable bool // 是否可以緩存
CacheKey string // 緩存的唯一 key
Instances []Instance // 服務(wù)發(fā)現(xiàn)結(jié)果
}
// diff 的結(jié)果
type Change struct {
Result Result
Added []Instance
Updated []Instance
Removed []Instance
}
?Resolver
?接口定義如下:
Resolve
?:作為 ?Resolver
?的核心方法, 從 target key 中獲取我們需要的服務(wù)發(fā)現(xiàn)結(jié)果 ?Result
?。
Target
?:從 Kitex 提供的對端 EndpointInfo 中解析出 ?Resolve
?需要使用的唯一 target, 同時這個 target 將作為緩存的唯一 key。
Diff
?:用于計算兩次服務(wù)發(fā)現(xiàn)的變更, 計算結(jié)果一般用于通知其他組件, 如 loadbalancer 和熔斷等, 返回的是變更 ?Change
?。
Name
?:用于指定 Resolver 的唯一名稱, 同時 Kitex 會用它來緩存和復(fù)用 Resolver。首先需要實現(xiàn) Resolver 接口需要的方法, 通過配置項指定 Resolver。
Kitex 提供了 Client 初始化配置項 :
import (
"xx/kitex/client"
)
func main() {
opt := client.WithResolver(YOUR_RESOLVER)
// new client
xxx.NewClient("destServiceName", opt)
}
我們通過復(fù)用 Resolver 的方式來提高性能, 要求 Resolver 的方法實現(xiàn)需要是并發(fā)安全的。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: