likes
comments
collection
share

扫盲篇-理解微服务中的服务注册与发现

作者站长头像
站长
· 阅读数 16

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第4篇文章,点击查看活动详情

前言

在使用微服务架构时,我们会将一个大的单应用拆分成多个独立自治的小服务,如果在没有服务发现的情况下,我们要想在服务之间进行通信,我们只能使用硬编码的方式,将需要通信的服务配置信息写在程序中,这样可能会导致一系列的问题,如服务提供方的网络发生了变化,服务的调用方如不及时修改将会影响使用,无法动态收缩和扩容等。为了解决这个问题,本文将从服务发现的实现原理、常用的服务发现框架等方面进行简要介绍。需要的朋友可以参考以下内容,希望对大家有帮助。

什么是服务注册与发现

顾名思义,服务注册与发现主要包含两部分:服务注册与服务发现。

  • 服务注册:是指服务实例启动时将自身信息注册到服务注册与发现中心,并在运行时通过心跳等方式向服务注册与发现中心汇报自身服务状态;
  • 服务发现:是指服务实例向服务注册与发现中心获取其他服务实例信息,用于进行后续的远程调用。

扫盲篇-理解微服务中的服务注册与发现

注册中心主要有三种角色:

  • 服务提供者(RPC Server) :在启动时,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态。
  • 服务消费者(RPC Client) :在启动时,向 Registry 订阅服务,把 Registry 返回的服务节点列表缓存在本地内存中,并与 RPC Sever 建立连接。
  • 服务注册中心(Registry) :用于保存 RPC Server 的注册信息,当 RPC Server 节点发生变更时,Registry 会同步变更,RPC Client 感知后会刷新本地 内存中缓存的服务节点列表。

服务注册与发现中心的职责

  1. 管理当前注册到服务注册与发现中心的微服务实例元数据信息,包括服务实例的服务名、IP地址、端口号、服务状态和服务描述信息等。
  2. 与注册到服务注册与发现中心的微服务实例维持心跳,定期检查注册表中的服务实例是否在线,并剔除无效服务实例信息。
  3. 提供服务发现能力,为调用方提供服务方的服务实例元数据。

服务注册与发现的特点

  1. 高可用:因为服务之间的调用信息来自于服务注册与发现中心,当它不可用时,服务之间的调用肯能无法正常进行,因此服务注册与发现一般会多实例部署,保证其高可用性和稳定性。
  2. 方便配置:本身是一个分布式,一致性的 k-v 存储系统。提供方启动的时候将自身配置信息向协调器中进行注册,提供方下线的时候向协调器进行反注册。
  3. 可监控:提供心跳机制,如果对方程序意外挂掉,没有进行反注册,协调器也会超时剔除不可用的提供方。

常见的服务框架对比

常见的服务发现框架有Consul、Zookeeper以及Etcd。

名称ZookeeperetcdConsulNacos
语言JavaGoGoJava
一致性PaxosRaftRaftRaft
key/value存储支持支持支持支持
多数据中心不支持不支持支持支持
健康检查支持长连接连接心跳
web界面较为复杂不支持支持支持
capcpcpcp配置中心:cp注册中心:ap
使用接口rpc客户端http/grpchttp/dns支持基于dns和基于rpc的服务发现

以上主要对Consul、Etcd和Zookeeper这三个常用的组件进行简单的比较,它们之间各有千秋,在组件选型时可以根据自身业务的需要进行选择和改造。

转载自:https://juejin.cn/post/7142800484758192165
评论
请登录