注册与发现服务
为了具备韧性与可伸缩性,系统必须支持位置透明性。这使你能把同一微服务的多个实例跑在多台主机上,在故障时把实例从一台主机迁移到另一台,并随负载变化增减主机数量。在这样的响应式系统里,微服务实例不断移动、诞生与消亡,客户端和其他微服务都需要一种方式来定位可用的服务实例。
Lagom 在开发过程中为你的微服务系统提供以下能力:
注意:本页以 HTTP 为例,但这些概念适用于任何类型的流量,例如基于 TCP 的二进制流量。
服务注册
服务注册中心(Registry)与微服务实例协作,维护一份最新的查找表,包含每个可用微服务实例的主机与端口。随负载变化,系统可以在持续响应请求的同时,在任意位置生成或销毁实例。你可以设计让微服务自我注册,也可以使用 第三方注册(3rd Party Registration)模式。
Lagom 微服务实例启动时,注册器(Registrar)会在服务注册表中登记该微服务的名称、URL 以及可定位的服务描述符名称,从而使它们可被找到。关闭服务实例时,注册器也必须更新服务注册表。Lagom 的 开发环境 提供了服务注册表与注册器的实现,方便你在本地运行微服务。
许多现成技术都提供 Service Registry 能力。你需要选择并/或开发适合部署环境的服务定位器(例如 Lagom ZooKeeper 服务定位器);你还需要找到一种方式,把 Lagom 服务与注册器关联起来。
客户端服务发现
一旦把每个服务的信息存储下来,就可以通过服务注册表让服务可用;服务利用注册表查找信息——这种模式称为客户端服务发现。 ——Jonas Bonér,《响应式微服务体系结构:分布式系统的设计原理》
Lagom 会为每个服务描述符创建服务客户端,让应用能与 Lagom 服务交互。假设某个非 Lagom 应用想使用 hello 服务,它可以使用 Welcome Service Client,直接调用 hello 方法;Welcome 服务客户端会利用服务注册表,找到 welcome 服务可用的位置的有效 URL 并满足请求。这种方式需要用到 Lagom 提供的代码;在生产环境里,注入到你服务中的服务定位器,就会成为参与客户端发现的一环。详见 与非 Lagom 服务集成。
服务器端服务发现
另一种策略是,把信息存储并维护在负载均衡器中,这种模式称为服务器端服务发现。 ——Jonas Bonér,《响应式微服务体系结构:分布式系统的设计原理》
如果无法在每个客户端都嵌入服务定位器,就可以用服务器端服务发现:它借助服务网关,让客户端用服务描述符注册所提供的端点。在此模型下,浏览器只需知道服务网关的位置。使用服务器端发现时,只有当服务描述符的调用被加入 ACL,才能被访问到。
例如,浏览器可以通过向服务网关请求 /hello/steve 路径,向用户显示问候消息。服务网关会知道是哪个服务提供了该端点,并向服务注册表询问该服务的实例;注册表返回能满足请求的主机与端口;最后,服务网关执行请求,把结果返回给浏览器。
为方便测试服务器端服务发现,Lagom 开发环境会启动所有服务,以及服务注册表与服务网关。