1、什么是服务发现?
服务发现:是指使用一个注册中心来记录分布式系统中的全部服务的信息,以便其他服务能够快速的找到这些已注册的服务。
通俗的讲,就是 程序如何通过一个标志来获取服务列表的过程,并且这个服务列表是能够随着服务的状态而动态变更的。
服务发现在服务目录中注册并维护所有服务的记录。此服务目录充当单一事实来源,允许您的服务相互查询和通信。
2、服务发现的工作原理
服务发现有三个角色,服务提供者、服务消费者 和 服务中介
服务中介:是联系服务提供者和服务消费者的桥梁。
服务提供者:将自己提供的服务地址注册到服务中介,以供他人消费使用。
服务消费者:从服务中介那里查找自己想要的服务的地址,然后享受这个服务。
服务中介提供多个服务,每个服务对应多个服务提供者。
通俗的讲:
服务中介:就是一个字典,字典里有很多key/value键值对,key是服务名称,value是服务提供者的地址列表。
服务注册:就是调用字典的Put方法塞东西。
服务查找:就是调用字典的Get方法拿东西。
当服务提供者节点挂掉时,要求服务能够及时取消注册,以便及时通知消费者重新获取服务地址。
当服务提供者新加入时,要求服务中介能及时告知服务消费者,有新的服务注册,可以使用。
3、服务发现模式
服务发现模式主要分为两种:客户端发现 和 服务器端发现
3.1 客户端发现模式
使用客户端发现模式时,客户端决定相应服务实例的网络位置,并且对请求实现负载均衡。
客户端查询服务注册表,后者是一个可用服务实例的数据库;然后使用负载均衡算法从中选择一个实例,并发出请求。
服务实例的网络位置在启动时被记录到服务注册表,等实例终止时被删除。服务实例的注册信息通常使用心跳机制来定期刷新。
客户端发现模式优缺点:
有点:相对直接,除了服务注册外,其它部分无需变动。此外,由于客户端知晓可用的服务实例,能针对特定应用实现智能负载均衡,比如使用哈希一致性。
缺点:就是客户端与服务注册绑定,要针对服务端用到的每个编程语言和框架,实现客户端的服务发现逻辑。
3.2 服务端发现模式
客户端通过负载均衡器向某个服务提出请求,负载均衡器查询服务注册表,并将请求转发到可用的服务实例。
服务端发现模式优缺点:
优点:是客户端无需关注发现的细节,只需要简单地向负载均衡器发送请求,这减少了编程语言框架需要完成的发现逻辑。并且如上文所述,某些部署环境免费提供这一功能。
缺点:除非负载均衡器由部署环境提供,否则会成为一个需要配置和管理的高可用系统组件。
3.3 客户端模式 与 服务端模式 对比
客户端模式 | 服务端模式 |
---|---|
只需要周期性获取列表,在调用服务时可以直接调用少了一个RT。但需要在每个客户端维护获取列表的逻辑 | 简单,不需要在客户端维护获取服务列表的逻辑 |
可用性高,即使注册中心出现故障也能正常工作 | 可用性由路由器中间件决定,路由中间件故障则所有服务不可用,同时,由于所有调度以及存储都由中间件服务器完成,中间件服务器可能会面临过高的负载 |
服务上下线对调用方有影响(会出现短暂调用失败) | 服务上下线调用方无感知 |
目前来说,大部分服务发现的实现都采取了客户端模式。
4、常见的服务发现框架
常见服务发现框架 Consul、 ZooKeeper 以及 Etcd
ZooKeeper 是这种类型的项目中历史最悠久的之一,它起源于 Hadoop。它非常成熟、可靠,被许多大公司(YouTube、eBay、雅虎等)使用。
Etcd是一个采用 HTTP 协议的健/值对存储系统,它是一个分布式和功能层次配置系统,可用于构建服务发现系统。其很容易部署、安装和使用,提供了可靠的数据持久化特性。搭配一些第三方工具,etcd(健/值对存储系统)+ Registrator(服务注册器) + Confd(轻量级的配置管理工具)
Consul 是强一致性的数据存储,使用 Gossip 形成动态集群。它提供分级键/值存储方式,不仅可以存储数据,而且可以用于注册器件事各种任务,从发送数据改变通知到运行健康检查和自定义命令
服务发现和负载均衡的关系:
服务发现是负载均衡的前提,负载均衡要解决的是拿到服务列表后将流量合理的分配到各个节点上的问题
最后编辑:joker.liu 更新时间:2023-05-18 11:16