微服务架构(七): 服务发现与服务注册

工作中使用了微服务架构,接下来的一段时间里,我会写一系列的文章来介绍微服务架构,同时我也会在github上写一个microservices的应用框架(地址会在后续文章给出)。

这篇文章主要讲述了微服务架构中的服务发现与服务注册。

翻译和整理自:

  • http://microservices.io/patterns/client-side-discovery.html
  • http://microservices.io/patterns/server-side-discovery.html
  • http://microservices.io/patterns/service-registry.html
  • http://microservices.io/patterns/self-registration.html
  • http://microservices.io/patterns/3rd-party-registration.html

一、客户端服务发现与服务端服务发现


1.上下文


service经常需要调用另一个service,在单一架构应用中,service通过语言层面或者程序层面去调用,在传统的分布式系统部署中,服务运行在一个固定的已知的地址(host和ports),从而可以简单的被别的service通过HTTP/REST或者某种RPC机制来调用。但是,微服务架构应用经常运行在虚拟化的或者容器化的环境中,很多服务和他们的地址是动态变化的。

微服务架构(七): 服务发现与服务注册_第1张图片

因此, 你必须实现一种机制,使得service的客户端可以发送请求到动态变化的service实例上。


2.问题


service的客户端- API Gateway或者别的service怎么去发现service实例的地址?


3.强制条件


  • 每个service实例在具体的地址上(host,port)暴露出一个像HTTP/REST那样的远端API
  • service的数目和地址动态改变
  • 虚拟机和容器经常被赋予动态IP

4.解决方案


1)客户端服务发现


客户端发送请求到service时,通过查询一个Service Registry(它知道所有service实例的地址)的方式来获取service实例的地址,如下所示:

微服务架构(七): 服务发现与服务注册_第2张图片

优点:

  • 与服务端服务发现相比有更少的网络跳数

缺点:

  • 把客户端与Service Registry绑定了
  • 你需要为你用的每个编程语言/框架实现客户端服务发现的逻辑。

2)服务端服务发现


当发送请求到一个service的时候,客户端发送请求到一个router,这个router是在一个已知的地址上运行的。router查询 service registry(可能在这个router中实现), 然后把请求

发送到可用的service实例。

微服务架构(七): 服务发现与服务注册_第3张图片

示例

AWS Elastic Load Balancer (ELB)就是一个服务端发现router的例子。客户端发送HTTP(s) 到ELB,ELB把流量负载均衡到一系列EC2机器上。除了作为负载均衡器,ELB同时也是一个Service Registry。 EC2实例在ELB上注册。

一些集群解决方案比如Kubernetes 和 Marathon在每个主机上运行一个proxy,这个proxy的作用就是一个服务端发现router。为了访问一个service,客户端连接到这个本地的proxy,通过那个service的port来访问到service。 proxy把请求发送到运行在这个集群上某个地方的service实例。


优点:

  • 与客户端服务发现相比, 客户端的代码更简单。
  • 一些云环境提供这个功能,比如ELB

缺点:

  • 除非是云环境,否则router必须是一个系统的组件,需要安装和配置。为了可用性和性能,也需要做replicate
  • 比客户端服务发现有更多的网络跳数

二、服务注册处(Service Registry)



服务注册处是一个保存了services, 实例,以及他们的地址的数据库。service实例在启动时被注册,在停止时删去注册。service的客户端或者router查询服务注册处来找到可用的service实例。服务注册处可以通过调用服务实例的健康检查API来验证它是否可以处理请求。

你需要决定service实例如何被注册到服务注册处。有两种选择:

  • Self registration pattern - service实例自己注册他们
  • 3rd party registration pattern - 第三方注册service实例

1. 自己注册


服务实例负责把自己注册到服务注册处。在service实例启动时,它注册自己到服务注册处,在停止时,服务实例注销自己。


2. 第三方注册


一个第三方的注册器负责注册和注销服务实例到服务注册处。在service实例启动时,第三方的注册器注册服务到服务注册处,在停止时,第三方的注册器注销服务实例。





你可能感兴趣的:(架构,微服务,AWS)