> 原文地址:https://microservices.io/patterns/self-registration.html


# 背景


假设你采用了客户端服务发现或者服务端服务发现,服务启动时需要向注册中心注册实例,在关闭时向注册中心注销,以便其他服务感知。


# 问题


服务实例如何向注册中心注册或注销?


# 考虑因素


 - 服务在启动时必须向注册中心注册实例,并且在关闭时在注册中心注销实例

 - 必须从注册中心注销崩溃的服务实例

 - 正在运行但是无法正常提供服务的实例,也需要在注册中心注销


# 解决方案


服务实例**负责在注册中心注册自己**。在启动时,服务实例向服务注册中心注册自己(主机和IP地址),使自己可以被发现。客户端通常必须定期发送心跳,以便注册中心知道它仍在运行。在关闭时,服务实例从注册中心注销自己。


一般微服务基础框架都会有这个机制。


# 举例


我们用 Scala 编写一个例子,使用 SpringBoot 和 SpringCloud 作为微服务框架,以 Netflix Eureka服务注册中心。在`@Configuration` Spring 框架配置类上使用`@EnableEurekaClient` 这个注解,将会让实例在启动后注册到 Eureka 上面


```

@Configuration

@EnableEurekaClient

class EurekaClientConfiguration {

```


# 结果分析


**自注册**这个设计模式的好处有:

 - 服务实例知道自己真正的状态,所以**可以实现相对于仅 UP/DOWN 这两种状态来说更加复杂的状态机制**,例如:STARTING、AVAILABLE 等等

这种设计也有一些不好的地方需要小心考虑予以避免:

 - **与注册中心耦合**,换一个注册中心就要写新的实现

 - 如果你的微服务系统中不同的微服务使用了不同的编程语言或者框架体系,那么针对这些都需要**实现统一的注册逻辑**。

 - 运行的但是无法正常处理请求的实例,一般无法自己感知到,从而在注册中心自行注销。


# 相关模式


 - **注册中心** - 服务发现的核心

 - **客户端服务发现** 与 **服务端服务发现**

 - **微服务基础框架** - 一般微服务基础框架都有自注册的功能实现

 - **第三方注册** - 另一种可替代的设计模式