当我们讨论微服务体系结构时,第一直觉会想到大量的小型服务一起工作,并且每一个都是独立的,可以单独部署。在大多数情况下,服务实例的数量及其地址会动态变化,由于虚拟机和容器通常会分配一个动态IP地址。此外,在自动伸缩的情况下,底层平台会根据负载和其他因素调整实例的数量。这就提出了一个问题:服务或路由器的客户机如何知道服务的可用实例(主机和端口)?

 

常规的解决方案是实现一个注册服务,它是包含服务地址、服务实例等一系列数据的数据库。实例在启动时向注册中心注册,并在关闭时注销。客户机或路由器通过查询注册中心,直接定位到服务的可用实例。目前在商业和开源领域有很多可用的实现,例如:

  • Netflix Eureka

  • etcd

  • consul 

  • Apache Zookeeper 

大多数可用的注册中心服务实现都提供了一个接口(通常是REST API)来注册和查询实例。一个实例的生命周期可以描述为以下三个阶段:

1.     Register阶段:在第一阶段中,微服务实例需要在服务注册中心注册自己。

2.     Heartbeat阶段:实例以预定义的间隔发送它们的心跳。如果注册中心在特定时间内没有接收到实例的心跳,那么它将该实例标记为down并根据配置删除该实例。

3.     注销/关闭阶段:如果实例将要关闭或正在关闭,则实例需要从服务注册中心注销自己。一旦注册表将一个实例标记为“down”,它将停止该实例的所有通信。

图1

大多数注册中心提供即插即用的客户端类库,从而减少了实现整个过程所需的工作。Netflix Eureka是一个开源服务注册中心,为Java提供客户端类库。它与Spring完美整合并被广泛使用。

 

微服务的主要优势之一是不受特定编程语言或技术的约束。此外,Eureka还提供了一个用于交互的REST接口。接下来将尝试在Golang中实现一个服务,该服务通过Netflix Eureka注册表进行注册。为此,需要实现以下流程:

图2

首先注册一个名为“MY_AWSOME_GO_MS”的应用程序。假设本地机器上运行着Eureka注册表。

1、输入:注册表的详细信息需要作为输入提供。在本例中,我们将读取环境变量。

    • REGISTRY_TYPE: 该变量中将包含"NETFLIX_EUREKA"。

    • REGISTRY_URL: 我们将在端口8761上本地运行Netflix Eureka注册表,因此值为http://localhost:8761/eureka/apps/。

    • REGISTRY_USER: 用户名将用于身份验证。

    • REGISTRY_PASSWORD: 用户密码。

2、在启动实例时,通过调用URL“http://localhost:8761/eureka/apps/{SERVICE_NAME}”注册实例。在我们的示例中,URL将是“http://localhost:8761/eureka/apps/MY_AWSOME_GO_MS”。这里应该是一个POST请求并且包含体:

{

"instance": {

"hostName": "MY_HOSTNAME",#hostname of my machine

"app": "org.github.hellosatish.microservicepattern.awesomeproject",

"vipAddress":"org.github.hellosatish.microservicepattern.awesomeproject",

"secureVipAddress":"org.github.hellosatish.microservicepattern.awesomeproject",

"ipAddr": "10.0.0.10",

"status": "STARTING",

"port": {"$":"8080", "@enabled": "true"},

"securePort": {"$":"8443", "@enabled": "true"},

"healthCheckUrl":"http://MY_HOSTNAME:8080/healthcheck",

"statusPageUrl":"http://MY_HOSTNAME:8080/status",

"homePageUrl":"http://MY_HOSTNAME:8080",

"dataCenterInfo": {

"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",

"name": "MyOwn"

},

}

}

3、一旦应用程序服务启动成功,我们需要将实例状态更新为UP。这将通过再次向注册表发送HTTP POST请求来实现。请求主体将是相同的,只是这次状态将为UP。

4、Eureka需要每30秒从实例接收一次心跳请求。心跳通过“HTTP PUT”调用发送到URL“http://localhost:8761/eureka/apps/{APP_NAME}/{INSTANCE_ID}”。默认情况下,实例ID是应用程序的主机名,因此我们的URL将是:http://localhost:8761/eureka/apps/my_awsome_go_ms/my_hostname。

5、如果实例需要关闭,那么我们需要再次将状态更新为down。请求体与之前注册状态start或UP时使用的相同,但是status的值是DOWN。

图3

如果Eureka在90秒内没有收到心跳,它将自动从注册表中删除实例。当我们停止应用程序,90秒后,可以看到实例已经从注册表中删除。

图4

可以在这个GitHub存储库GitHub repository中找到工作代码和已编译的二进制文件。

 

版权声明:本文版权归作者(译者)所有,欢迎转载,但未经作者(译者)同意必须保留此段声明,且在文章页面明显位置给出,本文链接如有问题,可留言咨询。