微服务编排的低级协议

时间:2017-07-14 05:18:57

标签: rest redis network-programming apache-zookeeper microservices

最近我开始使用Microservices,我使用Redis编写了一个用于服务发现的库来存储每个服务的URL和端口号,以及该条目的TTL值。事实证明这是一种昂贵的方法,因为对于任何其他服务的每次跨服务调用都需要一次调用Redis。缓存似乎不是一个好主意,因为服务不会一直在增加,也可能有停机时间。

所以我想写一个单独的微服务,它可以处理编排部分。为此,我需要找出一个非常低级别的网络协议来处理心跳的交换(这将帮助我弄清楚是否有任何服务实例不可用)。像zookeeperClient,redisClient这样的应用程序如何处理心跳?

此外,业界首选的跨服务呼叫协议是什么? 我一直在通过HTTP调用REST Api,并消除了不同集合中Joins的所有可能性。

有更好的方法吗?

感谢。

1 个答案:

答案 0 :(得分:2)

我认为术语" Orchestration"对你提出的问题不好。从我迄今为止在微服务领域遇到的术语" Orchestration"在涉及复杂业务流程时使用,而不是用于服务发现。您需要的是Service registryLoad balancer相结合。您可以找到here所需的所有信息。以下是一些很棒的文章:

有两种主要的服务发现模式:客户端发现和服务器端发现。我们先来看看客户端发现。

客户端发现模式

使用客户端发现时,客户端负责确定可用服务实例的网络位置以及跨平台的负载平衡请求。客户端查询服务注册表,该服务注册表是可用服务实例的数据库。然后,客户端使用负载平衡算法选择一个可用的服务实例并发出请求。

enter image description here

服务实例的网络位置在启动时向服务注册表注册。实例终止时,它将从服务注册表中删除。服务实例的注册通常使用心跳机制定期刷新。

Netflix OSS提供了客户端发现模式的一个很好的例子。 Netflix Eureka是服务注册表。它提供了一个REST API,用于管理服务实例注册和查询可用实例。 Netflix Ribbon是一个IPC客户端,与Eureka一起在可用服务实例之间加载平衡请求。我们将在本文后面更深入地讨论Eureka。

客户端发现模式具有各种优点和缺点。这种模式相对简单,除了服务注册表之外,没有其他移动部件。此外,由于客户端了解可用的服务实例,因此可以进行智能的,特定于应用程序的负载平衡决策,例如一致地使用散列。这种模式的一个重要缺点是它将客户端与服务注册表耦合在一起。您必须为服务客户端使用的每种编程语言和框架实现客户端服务发现逻辑。

服务器端发现模式

enter image description here

客户端通过负载均衡器向服务发出请求。负载均衡器查询服务注册表并将每个请求路由到可用的服务实例。与客户端发现一样,服务实例已注册并注销服务注册表。

AWS Elastic Load Balancer(ELB)是服务器端发现路由器的示例。 ELB通常用于对来自Internet的外部流量进行负载均衡。但是,您也可以使用ELB来平衡虚拟私有云(VPC)内部的流量。客户端使用其DNS名称通过ELB发出请求(HTTP或TCP)。 ELB负载平衡一组已注册的弹性计算云(EC2)实例或EC2容器服务(ECS)容器之间的流量。没有单独的服务注册表。相反,EC2实例和ECS容器已在ELB本身注册。

HTTP服务器和负载均衡器(如NGINX Plus和NGINX)也可用作服务器端发现负载均衡器。例如,this blog帖子描述了使用Consul Template动态重新配置NGINX反向代理。 Consul Template是一种工具,可以定期从存储在Consul service registry中的配置数据中重新生成任意配置文件。每当文件更改时,它都会运行任意shell命令。在博客文章描述的示例中,Consul Template生成一个nginx.conf文件,该文件配置反向代理,然后运行一个命令,告诉NGINX重新加载配置。更复杂的实现可以使用its HTTP API or DNS动态重新配置NGINX Plus。

某些部署环境(如Kubernetes和Marathon)会在群集中的每台主机上运行代理。代理扮演服务器端发现负载平衡器的角色。为了向服务发出请求,客户端使用主机的IP地址和服务的分配端口通过代理路由请求。然后,代理将请求透明地转发到在群集中某处运行的可用服务实例。

服务器端发现模式有几个优点和缺点。这种模式的一个很大好处是发现的细节被抽象出客户端。客户端只是向负载均衡器发出请求。这消除了为服务客户端使用的每种编程语言和框架实现发现逻辑的需要。此外,如上所述,某些部署环境免费提供此功能。然而,这种模式也有一些缺点。除非部署环境提供负载均衡器,否则它是您需要设置和管理的另一个高可用性系统组件。