Kitex 服務(wù)發(fā)現(xiàn)擴(kuò)展

2022-04-27 10:27 更新

服務(wù)發(fā)現(xiàn)擴(kuò)展

kitex-contrib 中提供了 DNS 服務(wù)發(fā)現(xiàn)擴(kuò)展。

用戶如果需要更換其他的服務(wù)發(fā)現(xiàn),例如 ETCD,用戶可以根據(jù)需求實(shí)現(xiàn) ?Resolver ?接口,client 通過(guò) ?WithResolver ?Option 來(lái)注入。

接口定義 

接口在 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 提供的對(duì)端 EndpointInfo 中解析出 ?Resolve ?需要使用的唯一 target, 同時(shí)這個(gè) target 將作為緩存的唯一 key。
  • ?Diff?:用于計(jì)算兩次服務(wù)發(fā)現(xiàn)的變更, 計(jì)算結(jié)果一般用于通知其他組件, 如 loadbalancer 和熔斷等, 返回的是變更 ?Change?。
  • ?Name?:用于指定 Resolver 的唯一名稱, 同時(shí) Kitex 會(huì)用它來(lái)緩存和復(fù)用 Resolver。

自定義 Resolver

首先需要實(shí)現(xiàn) Resolver 接口需要的方法, 通過(guò)配置項(xiàng)指定 Resolver。

Kitex 提供了 Client 初始化配置項(xiàng) :

import (
    "xx/kitex/client"
)


func main() {
    opt := client.WithResolver(YOUR_RESOLVER)

    // new client
    xxx.NewClient("destServiceName", opt)
}

注意事項(xiàng)

我們通過(guò)復(fù)用 Resolver 的方式來(lái)提高性能, 要求 Resolver 的方法實(shí)現(xiàn)需要是并發(fā)安全的。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)