codecamp

Kitex 服务发现扩展

服务发现扩展

kitex-contrib 中提供了 DNS 服务发现扩展。

用户如果需要更换其他的服务发现,例如 ETCD,用户可以根据需求实现 ​Resolver ​接口,client 通过 ​WithResolver ​Option 来注入。

接口定义 

接口在 pkg/discovery/discovery.go 中,具体定义如下:

// 服务发现接口定义
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 // 服务发现结果
}

// diff 的结果
type Change struct {
    Result  Result
    Added   []Instance
    Updated []Instance
    Removed []Instance
}

Resolver ​接口定义如下:

  • Resolve​:作为 ​Resolver ​的核心方法, 从 target key 中获取我们需要的服务发现结果 ​Result​。
  • Target​:从 Kitex 提供的对端 EndpointInfo 中解析出 ​Resolve ​需要使用的唯一 target, 同时这个 target 将作为缓存的唯一 key。
  • Diff​:用于计算两次服务发现的变更, 计算结果一般用于通知其他组件, 如 loadbalancer 和熔断等, 返回的是变更 ​Change​。
  • Name​:用于指定 Resolver 的唯一名称, 同时 Kitex 会用它来缓存和复用 Resolver。

自定义 Resolver

首先需要实现 Resolver 接口需要的方法, 通过配置项指定 Resolver。

Kitex 提供了 Client 初始化配置项 :

import (
    "xx/kitex/client"
)


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

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

注意事项

我们通过复用 Resolver 的方式来提高性能, 要求 Resolver 的方法实现需要是并发安全的。


Kitex 服务注册扩展
Kitex 负载均衡扩展
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }