From a4dcf67da213e7dccc0ef52650a92cd5bd1e88e0 Mon Sep 17 00:00:00 2001 From: felixhao Date: Fri, 24 May 2019 16:22:38 +0800 Subject: [PATCH] add warden resolver doc --- doc/wiki-cn/warden-resolver.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/doc/wiki-cn/warden-resolver.md b/doc/wiki-cn/warden-resolver.md index 7e8d4c208..5d6b62b17 100644 --- a/doc/wiki-cn/warden-resolver.md +++ b/doc/wiki-cn/warden-resolver.md @@ -6,7 +6,7 @@ direct://default/127.0.0.1:9000,127.0.0.1:9091 ``` -> 关于`target`就是标准的`URL`资源定位符[查看WIKI](https://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E5%AE%9A%E4%BD%8D%E7%AC%A6) +> `target`就是标准的`URL`资源定位符[查看WIKI](https://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E5%AE%9A%E4%BD%8D%E7%AC%A6) 其中`direct`为协议类型,此处表示直接使用该`URL`内提供的地址`127.0.0.1:9000,127.0.0.1:9091`进行连接,而`default`在此处无意义仅当做占位符。 @@ -129,14 +129,15 @@ import ( // AppID your appid, ensure unique. const AppID = "demo.service" // NOTE: example -// NewClient new member grpc client -func NewClient(cfg *warden.ClientConfig, opts ...grpc.DialOption) (DemoClient, error) { - +func init(){ // NOTE: 注意这段代码,表示要使用discovery进行服务发现 // NOTE: 还需注意的是,resolver.Register是全局生效的,所以建议该代码放在进程初始化的时候执行 - // NOTE: !!!切记不要在一个进程内进行不同中间件的Register!!! + // NOTE: !!!切记不要在一个进程内进行多个不同中间件的Register!!! resolver.Register(discovery.Builder()) +} +// NewClient new member grpc client +func NewClient(cfg *warden.ClientConfig, opts ...grpc.DialOption) (DemoClient, error) { client := warden.NewClient(cfg, opts...) conn, err := client.Dial(context.Background(), "discovery://default/"+AppID) if err != nil { @@ -149,7 +150,13 @@ func NewClient(cfg *warden.ClientConfig, opts ...grpc.DialOption) (DemoClient, e } ``` -注意看传入`client.Dial`的`target`是`discovery://default/${appid}`,当gRPC进行解析后会得到`scheme`=`discovery`,`warden/resolver.Builder`会通过该`scheme`获取到`naming/discovery.Discovery`对象。而`naming/discovery.Discovery`对象基于`id`就知道要获取哪个服务的实例信息。 +> 注意:`resolver.Register`是全局行为,建议放在包加载阶段或main方法开始时执行,该方法执行后会在gRPC内注册构造方法 + +`target`是`discovery://default/${appid}`,当gRPC内进行解析后会得到`scheme`=`discovery`和`appid`,然后进行以下逻辑: + +1. `warden/resolver.Builder`会通过`scheme`获取到`naming/discovery.Builder`对象(靠`resolver.Register`注册过的) +2. 拿到`naming/discovery.Builder`后执行`Build(appid)`构造`naming/discovery.Discovery` +3. `naming/discovery.Discovery`对象基于`appid`就知道要获取哪个服务的实例信息 # 服务注册