服务注册与发现之go语言设计与实现,为什么需要租约模式?watch机制解决了什么问题?
1.定义接口
首先确认整个流程需要做的事情;
1 | 1. 创建注册表对象,建立连接; |
从这些需要做的事情可以抽象出三个角色注册者(Registrar)、发现者(Discovery)、观察者(Watcher)以及方法。伪代码如下:
1 | type Registrar interface { |
2.实现接口
Consul
1 | go get -u github.com/go-kratos/kratos/contrib/registry/consul/v2 |
Etcd
1 | go get -u github.com/go-kratos/kratos/contrib/registry/etcd/v2 |
zookeeper
1 | go get -u github.com/go-kratos/kratos/contrib/registry/zookeeper/v2 |
Nacos
1 | go get -u github.com/go-kratos/kratos/contrib/registry/nacos/v2 |
kubernetes
1 | go get -u github.com/go-kratos/kratos/contrib/registry/kubernetes/v2 |
polaris
1 | go get -u github.com/go-kratos/kratos/contrib/registry/polaris/v2 |
3.问题
为什么需要租约模式?定期续租是为了什么?
服务注册到注册表中,如果服务挂了,不从注册表中移除,它还会在注册表中,请求就可能进入异常服务中,这并不是我们想要的结果。于是便有了租约模式,服务需要定期发送续租请求,在指定时间(keepalive)内未发送请求,就认为服务处于异常状态,将被从注册表中移除。
watch机制是解决什么问题?
服务发现是从注册表中发现一组服务列表,服务列表并未更新,我们还是需要主动从注册表中获取服务列表,在我们看来服务列表未更新,这种操作是没必要的,为了避免这种反复轮询,便有了watch机制,从主动变成了被动,我们对key进行监听,如果key的value更新了,便进行通知,我们才去获取服务列表进行更新。
最后
虽然服务注册与发现的基础使用是有了,但实际使用下来会有以下两个问题:
服务发现获取到是服务列表,从中选择一个涉及负载均衡算法
服务发现获取的是服务连接信息,其中可能是http服务,可能是grpc服务,不能很好的使用;
从这两个问题我们可以抽象几个角色选择器(Selecter)、均衡器(Banlancer)、解析器(Reslover)等。下一篇从这两个问题出发介绍这几个角色的实现。