微服务模式系列之五:服务端服务发现

译者自序:

熟悉我的朋友都知道,我很不喜欢翻译东西,因为在两种语言的思维方式之间做频繁切换对我来说是件很痛苦的事情。但是这次不一样,公司和同事的大力支持降低了我的痛苦指数,让我能够坚持把Chris Richardson的微服务模式系列文章翻译完,今天发布第五篇——《服务端服务发现》。

背景

不同服务之间通常需要相互调用。在单体应用程序当中,服务间通过语言层级的方法或者过程实现相互调用。在传统的分布式系统部署下,服务在固定并且已知的位置(主机与端口)运行,从而确保各服务可利用HTTP/REST或者某种RPC机制进行相互调用。然而,现代化微服务应用程序中通常在虚拟化或者容器化环境中运行,在这样的环境中服务的实例数量和位置是动态变化的。

因此,要想实现客户端向动态变化的一组服务端实例发送请求,我们必须采用新的机制。

问题

服务的客户端——包括API网关或者其它服务——如何才能获取服务端实例的位置?

需求

  • 每一服务实例都会在特定位置(主机与端口)通过HTTP/REST或者Thrift等方式发布一个远程API。
  • 服务端实例的具体数量及位置会发生动态变化。
  • 虚拟机与容器通常会被分配动态IP地址。
  • 服务实例的数量会发生动态变化。例如,EC自动伸缩组会根据负载情况随时调整实例数量。

方案

在向某一服务发送请求时,客户端会通过在已知位置运行的路由器(或者是负载均衡器)发送请求。路由器会查询Service Registry(即服务注册表),并向可用的服务实例转发该请求。服务注册表也可能背内建于路由器之中。

以下示意图展现了这种模式的结构。

示例

AWS Elastic Load Balancer(即AWS弹性负载均衡,简称ELB)便是一个服务器端服务发现模式的例子。客户端向该ELB发出HTTP(S)请求(或者开启TCP连接),而ELB则在一组EC2实例中对该流量进行负载均衡。ELB既能够对来自互联网的外部流量进行负载均衡,又能够被部署在VPC中,对内部流量进行负载均衡。ELB同样可作为Service Registry发挥作用。EC2实例可通过API调用或者借助自动伸缩分组机制注册至ELB。

一些集群解决方案如Kubernetes以及Marathon,会在每台主机上运行一套代理,用来提供服务器端服务发现模式的路由机制。为了访问服务,客户端可以利用被分配至该服务的端口接入这个本地代理。该代理随后会将各请求转发给在集群某处运行的服务实例。

结果

服务器端发现机制拥有以下优势:

  • 相较于客户端发现,其客户端代码由于无需实现发现功能而更为简单。而且客户端只需要向路由机制发送请求即可。
  • 部分云环境提供此项功能,例如AWS Elastic Load Balancer。

但服务器端发现机制亦存在着以下弊端:

  • 除非成为云环境的一部分,否则该路由机制必须作为另一系统组件进行安装与配置。为实现可用性和一定的接入能力,还需要为其配置一定数量的副本。
  • 相较于客户端发现,服务器端发现机制需要更多的网络跳转。

相关模式

原文链接:http://microservices.io/patterns/server-side-discovery.html

关于译者:

宋潇男

EAII-企业架构创新研究院 专家委员

现任普元云计算架构师,曾任华为云计算产品技术总监。曾负责国家电网第一代云资源管理平台以及中国银联基于OpenStack的金融云的技术方案、架构设计和技术原型工作。

原著作者

Chris Richardson

世界十大软件架构师之一,《POJOS IN ACTION》一书的作者。他的研究领域包括Spring、Scala、微服务架构设计、NoSQL数据库、分布式数据库、分布式数据管理、事件驱动的应用编程等。

原文发布于微信公众号 - EAWorld(eaworld)

原文发表时间:2016-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

美国邮政服务网站漏洞可暴露6000万用户数据,现已修复

美国邮政服务系统刚刚修复了一个严重的网站漏洞,该漏洞使得拥有usps.com帐户的任何人都可查看和修改约6000万用户的账户详情。

1203
来自专栏游戏杂谈

移动APP的IM后台架构浅析

IM(InstantMessaging 即时通讯)作为一项基础功能,很多APP都有,比如:手机QQ、微信、易信、钉钉、飞信、旺旺、咚咚、陌陌等。而IM如同我们日...

4532
来自专栏全华班

基于PHP爬虫的博客小程序

小程序后端是基于 Wext-server-thinkphp3.2 实现的数据爬虫,使用 ThinkPHP3.2 框架开发。Wext-server-thinkph...

3451
来自专栏SDNLAB

分层安全用于通用客户端设备(uCPE)部署的准则

1535
来自专栏腾讯架构师的专栏

多核处理器下数据库系统日志管理器优化技术探讨

传统数据库的设计假设磁盘为主要存储设备,其性能取决于基于I/O代价模型的优化。然而,当前数据库运行的平台已逐渐转移到由多核处理器、大内存和以闪存为代表的低延迟存...

2541
来自专栏IT技术精选文摘

NoSQL和数据可扩展性

介绍 本文提供了一个易于理解和有用的一组有关当前可用NoSQL数据库的信息。 可扩展数据架构 可扩展数据架构已发展用于提高整体系统效率并降低运营成本。 具体的...

5056
来自专栏魏艾斯博客www.vpsss.net

owncloud 轻松搭建私有云盘 Windows/android/ios/Mac/Linux 全平台支持

1.3K3
来自专栏铭毅天下

Elasticsearch全文检索实战小结——复盘我带的第二个项目

一、项目概述 这是一个被我称之为“没有枪、没有炮,硬着头皮自己造”的项目。项目是和其它公司合作的三个核心模块开发。 使用ES的目的是: 1)、采集数据、网站...

4549
来自专栏竹清助手

深入理解什么是RESTful API ?

越来越多的人开始意识到,网站即软件,而且是一种新型的软件。   这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(hig...

1052
来自专栏Java架构师学习

一文归纳总结分布式架构的那些事!

进入十一月,最火热的话题与期待的日子自然是双十一狂欢购物节了,作为程序员的你除了要清空自己的购物车之外,最关心的是不是双十一架构技术是如何承受亿级用户流量的冲击...

1164

扫码关注云+社区

领取腾讯云代金券