为了具有弹性和可扩展性,系统必须支持位置透明性。这允许您在多个主机上运行同一个微服务的实例,在发生故障时将实例从一个主机移动到另一个主机,并在负载变化时扩展主机数量。在这样一个微服务实例不断移动、生成和死亡的反应式系统中,客户端和其他微服务都需要一种定位可用服务实例的方法。
Lagom在开发过程中为您的微服务系统提供以下功能:
- 服务注册
- 客户端服务发现
- 服务端服务发现
注意:文档中使用了HTTP示例,但这些概念适用于任何类型的流量,比如TCP上的二进制数据流。
服务注册
服务注册中心与microservice实例协作,以维护最新的查找表。该表包含每个可用微服务实例的主机和端口。当负载变化时,系统可以在任何位置生成或销毁实例,同时继续满足请求。您可以设计一个系统,使微服务能够自我注册,也可以使用第三方注册服务。
当启动Lagom微服务实例时,注册器将在服务注册表中注册微服务的名称、URL和可定位服务描述符的名称,以便能够定位它们。当关闭服务实例时,注册器也必须更新服务注册表。Lagom的开发环境提供了服务注册和注册器的实现,这样您就可以在本地运行微服务。
许多可用的技术都提供了服务注册中心功能。您需要为您的服务选择和/或开发一个服务定位器,以便在部署环境中运行(例如,参见Lagom ZooKeeper服务定位器)。您可能需要找到一种方法,用注册器插入Lagom服务。
客户端服务发现
正如书中提到,Bonér’sReactive Microservices Architecture: Design Principles for Distributed Systems
存储了关于每个服务的信息之后,就可以通过服务注册中心使其可用,服务可以使用该注册中心查找信息——使用称为客户端服务发现的模式。
Lagom为每个服务描述符创建服务客户端,这样应用程序就可以与Lagom服务交互。假设一个非lagom应用程序想要使用hello服务。它可以使用Welcome服务客户端并简单地调用hello方法。Welcome服务客户端将使用服务注册中心查找一个有效的URL,其中welcom是可用并满足请求。这种方法需要使用Lagom提供的代码。在生产环境中,插入到服务中的服务定位器将是参与此客户端发现的一个元素。有关更多信息,请参见与非lagom服务集成。
服务端服务发现
另一种策略是使用称为服务器端服务发现的模式在负载均衡器中存储和维护信息.
如果不能在每个客户机上嵌入服务定位器,则可以使用服务端服务发现。此模式服务网关允许客户端使用服务描述符注册提供的端点。在这个模型中,浏览器只需要知道服务网关在哪里。在使用服务发现时,只有将服务描述符添加到ACL,服务调用才可用。
例如,浏览器可以通过从服务网关请求/hello/steve路径来向用户显示hello消息。服务网关将知道哪个服务提供了该端点,并将向服务注册中心请求该服务的实例。服务注册中心将响应可以满足请求的服务实例的主机和端口。最后,服务网关将执行请求并将结果返回给浏览器。
为了简化服务端服务发现的测试,Lagom开发环境将会启动所有的服务以及一个服务注册器和一个服务网关。
