原文地址:https://microservices.io/patterns/self-registration.html
背景
假设你采用了客户端服务发现或者服务端服务发现,服务启动时需要向注册中心注册实例,在关闭时向注册中心注销,以便其他服务感知。
问题
服务实例如何向注册中心注册或注销?
考虑因素
- 服务在启动时必须向注册中心注册实例,并且在关闭时在注册中心注销实例
- 必须从注册中心注销崩溃的服务实例
- 正在运行但是无法正常提供服务的实例,也需要在注册中心注销
解决方案
引入一个第三方注册代理,负责服务实例在服务注册中心注册和注销。当服务实例启动时,注册代理将实例注册到注册中心。当服务实例关闭时,注册代理负责注销实例。
举例
第三方注册模式的例子包括:
- Netflix Prana,用于非 JVM 注册到 Eureka 上,已不再更新,参考:Towards being better about open source personally
- AWS 自动扩容组,自动注册 EC2 实例到 AWS 负载均衡器上。
- ContainerPilot,作为服务的父进程在Docker容器中运行,并将其注册到注册中心中。
- Registrator,负责 Docker 容器向各种不同的注册中心的注册与注销
- Kubernetes 和 Marathon这种容器编排框架的服务实例都有内置的隐式服务注册
结果分析
第三方注册模式的好处包括:
- 服务的代码比使用自注册模式更加简单,因为它不负责注册
- 注册代理可以对服务实例执行健康检查,并根据健康状态注册/注销实例。
也有一些缺点:
- 注册代理只对服务实例的状态有模糊的理解,例如只有 UP 和 DOWN,因此可能不知道它是否能够正常处理请求。上面提到的 Netflix Prana 等一些 注册代理 利用健康检查,以确定服务实例的可用性。
- 需要额外维护一个 注册代理 服务,而且需要高可用。
相关模式
- 注册中心 - 服务发现的核心
- 客户端服务发现 与 服务端服务发现
- 微服务基础框架 - 一般微服务基础框架都有自注册的功能实现
- 自注册 - 另一种可替代的设计模式