原文地址:gRPC naming and discovery

etcd提供一个gRPC解析器支持备用的命名系统,该命名系统从etcd获取主机以发现gRPC服务。以下机制基于监视对以服务名称为前缀的Key的更新。

通过go-grpc使用etcd发现服务


etcd客户端提供一个gRPC解析器通过etcd后端解析gRPC主机,解析器通过etcd客户端初始化并指定了解析目标:

import (
"go.etcd.io/etcd/clientv3"
etcdnaming "go.etcd.io/etcd/clientv3/naming" "google.golang.org/grpc"
) ... cli, cerr := clientv3.NewFromURL("http://localhost:2379")
r := &etcdnaming.GRPCResolver{Client: cli}
b := grpc.RoundRobin(r)
conn, gerr := grpc.Dial("my-service", grpc.WithBalancer(b), grpc.WithBlock(), ...)

管理服务主机

etcd解析器对于解析目标前缀下所有Keys后面跟一个"/"(例如"my-service/"),使用JSON编码go-grpcnaming.Update值作为潜在的服务主机。通过创建一个新的Key将主机添加到服务中,通过删除Keys将主机从服务中删除。

添加一个主机

一个新的主机可以通过etcdctl添加到服务中:

ETCDCTL_API=3 etcdctl put my-service/1.2.3.4 '{"Addr":"1.2.3.4","Metadata":"..."}'

etcd客户端的GRPCResolver.Update方法也可以通过key匹配Addr注册一个新的主机到服务中:

r.Update(context.TODO(), "my-service", naming.Update{Op: naming.Add, Addr: "1.2.3.4", Metadata: "..."})

删除一个主机

通过etcdctl可以从服务中删除一个主机:

ETCDCTL_API=3 etcdctl del my-service/1.2.3.4

etcd 客户端的GRPCResolver.Update方法也可以删除一个主机:

r.Update(context.TODO(), "my-service", naming.Update{Op: naming.Delete, Addr: "1.2.3.4"})

注册一个主机并绑定一个租约

注册一个主机ging绑定一个租约确保如果主机不能维护保持存活的心跳(例如机器宕机),该主机将会从服务中移除。

lease=`ETCDCTL_API=3 etcdctl lease grant 5 | cut -f2 -d' '`
ETCDCTL_API=3 etcdctl put --lease=$lease my-service/1.2.3.4 '{"Addr":"1.2.3.4","Metadata":"..."}'
ETCDCTL_API=3 etcdctl lease keep-alive $lease

最新文章

  1. (二十一)WebGIS中鹰眼的实现思路
  2. javascript中DOM部分基础知识总结
  3. apache httpd.conf 参数详解
  4. js10秒倒计时鼠标点击次数统计
  5. [SQL]详解CUBE和ROLLUP区别<使用rollup或cube通过交叉列可产生高级汇总结果集>
  6. 【转】【玩转cocos2d-x之二十三】多线程和同步03-图片异步加载
  7. UML Distilled - Development Process
  8. 隐藏index.php - ThinkPHP完全开发手册 - 3.1
  9. 国内最简单的短视频SDK
  10. Swift—静态方法-备
  11. 一封在JSP课程结束之后给学生的信
  12. sqlmap用户手册 [详细]
  13. Python-数据类型-转摘
  14. LindDotNetCore~入门基础
  15. .NET Core 2.0 项目的智能提示是英文,改成中文的解决方案
  16. JUnit5 快速指南
  17. 数据库(mysql)基本使用命令大全
  18. Day18--Python--面向对象--类与类之间的关系
  19. tips:Jquery的attr和prop的区别
  20. P1032 字串变换 字符串BFS

热门文章

  1. RabbitMQ之交换机及spring整合
  2. Ubuntu16.04+GTX2070+Driver418.43+CUDA10.1+cuDNN7.6
  3. TypeScript引入moment.js报错“无法找到moment模块”及解决方法
  4. Python面向对象-多重继承之MixIN
  5. 全字段多条件搜索(api接口)
  6. Python学习之while
  7. Springboot Activiti6 工作流 集成代码生成器 shiro 权限 vue.js html 跨域 前后分离
  8. 百度大脑UNIT3.0详解之数据生产工具DataKit
  9. 63-容器在 Weave 中如何通信和隔离?
  10. django补充CBV和FBV模式