服务注册与发现 | 青训营

104 阅读6分钟

服务注册与发现

什么是服务注册与发现

服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。

服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。

微服务注册与发现类似于生活中的"电话通讯录"的概念,它记录了通讯录服务和电话的映射关系。在分布式架构中,服务会注册进去,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。

步骤如下:

  1. 你先要把"好友某某"记录在通讯录中。

  2. 拨打电话的时候通过通讯录中找到"好友某某",并拨通回电话。

  3. 当好友某某电话号码更新的时候,需要通知到你,并修改通讯录服务中的号码。

从这个过程中我们看到了一些特点:

  1. 把 "好友某某" 的电话号码写入通讯录中,统一在通讯录中维护,后续号码变更也是更新到通讯录中,这个过程就是服务注册的过程。

  2. 后续我们通过"好友某某"就可以定位到通讯录中的电话号码,并拨通电话,这个过程理解为服务发现的过程。

而我们微服务架构中的服务注册与发现结构如下图所示:

img

图片中是一个典型的微服务架构,这个结构中主要涉及到三大角色:

  • provider - 服务提供者

  • consumer - 服务消费者

  • register center - 注册中心

它们之间的关系大致如下:

  1. 每个微服务在启动时,将自己的网络地址等信息(微服务的ServiceName、IP、Port、MetaData等)注册到注册中心,注册中心存储这些数据。

  2. 服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。

  3. 各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。

优点如下:

  1. 解耦:服务消费者跟服务提供者解耦,各自变化,不互相影响

  2. 扩展:服务消费者和服务提供者增加和删除新的服务,对于双方没有任何影响

  3. 中介者设计模式:用一个中介对象来封装一系列的对象交互,这是一种多对多关系的中介者模式。

从功能上拆开主要有三块:服务注册、服务发现,和注册中心。我们一个一个来看。

1.1 服务注册

如图中,为Register注册中心注册一个服务信息,会将服务的信息:ServiceName、IP、Port以及服务实例MetaData元数据信息写入到注册中心。当服务发生变化的时候,也可以更新到注册中心。

img

服务提供者(服务实例) 的服务注册模型是一种简单、容易理解、流行的服务注册模型,其在多种技术生态中都有所体现:

  1. 在K8S生态中,通过 K8S Service服务信息,和Pod的 endpoint(用来记录service对应的pod的访问地址)来进行注册。
  2. 在其他的注册组件中,比如 Eureka、Consul,服务模型也都是 服务→ 服务实例。

可以认为服务实例是一个真正的实体的载体,服务是对这些相同能力或者相同功能服务实例的一个抽象。

点击查看大图

1.2 服务发现

服务发现实际就是我们查询已经注册好的服务提供者,比如 p->p.queryService(serviceName),通过服务名称查询某个服务是否存在,如果存在,

返回它的所有实例信息,即一组包含ip 、 port 、metadata元数据信息的endpoints信息。

这一组endpoints信息一般会被缓存在本地,如果注册中心挂掉,可保证段时间内依旧可用,这是去中心化的做法。对于单个 Service 后面有多个 Instance的情况(如上图),做 load balance。

服务发现的方式一般有两种:

  1. 拉取的方式:服务消费方(Consumer)主动向注册中心发起服务查询的请求。

  2. 推送的方式:服务订阅/通知变更(下发):服务消费方(Consumer)主动向注册中心订阅某个服务,当注册中心中该服务信息发生变更时,注册中心主动通知消费者。

1.3 注册中心

注册中心提供的基本能力包括:提供服务注册、服务发现 以及 健康检查。

服务注册跟服务发现上面已经详细介绍了, 健康检查指的是指注册中心能够感知到微服务实例的健康状况,便于上游微服务实例及时发现下游微服务实例的健康状况。采取必备的访问措施,如避免访问不健康的实例。

主要的检查方式包括:

  1. 服务Provider 进行 TTL 健康汇报(Time To Live,微服务Provider定期向注册中心汇报健康状态)。

  2. 注册中心主动检查服务Provider接口。

综合我们前面的内容,可以总结下注册中心有如下几种能力:

  1. 高可用

这个主要体现在两个方面。一个方面是,注册中心本身作为基础设施层,具备高可用;第二种是就是前面我们说到的去中心化,极端情况下的故障,短时间内是不影响微服务应用的调用的

  1. 可视化操作

常用的注册中心,类似 Eureka、Consul 都有比较丰富的管理界面,对配置、服务注册、服务发现进行可视化管理。

  1. 高效运维

注册中心的文档丰富,对运维的支持比较好,并且对于服务的注册是动态感知获取的,方便动态扩容。

  1. 权限控制

数据是具有敏感性,无论是服务信息注册或服务是调用,需要具备权限控制能力,避免侵入或越权请求

  1. 服务注册推、拉能力

这个前面说过了,微服务应用程序(服务的Consumer),能够快速感知到服务实例的变化情况,使用拉取或者注册中心下发的方式进行处理。

点击查看大图