微服务架构(七): 服务发现与服务注册
工作中使用了微服务架构,接下来的一段时间里,我会写一系列的文章来介绍微服务架构,同时我也会在github上写一个microservices的应用框架(地址会在后续文章给出)。这篇文章主要讲述了微服务架构中的API Gateway。翻译和整理自:http://microservices.io/patterns/client-side-discovery.htmlhttp://
工作中使用了微服务架构,接下来的一段时间里,我会写一系列的文章来介绍微服务架构,同时我也会在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实例上。
2.问题
service的客户端- API Gateway或者别的service怎么去发现service实例的地址?
3.强制条件
- 每个service实例在具体的地址上(host,port)暴露出一个像HTTP/REST那样的远端API
- service的数目和地址动态改变
- 虚拟机和容器经常被赋予动态IP
4.解决方案
1)客户端服务发现
客户端发送请求到service时,通过查询一个Service Registry(它知道所有service实例的地址)的方式来获取service实例的地址,如下所示:
优点:
- 与服务端服务发现相比有更少的网络跳数
缺点:
- 把客户端与Service Registry绑定了
- 你需要为你用的每个编程语言/框架实现客户端服务发现的逻辑。
2)服务端服务发现
发送到可用的service实例。
示例
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. 自己注册
2. 第三方注册
更多推荐
所有评论(0)