站务联系

主页 > 镇江 > 内容

服务器端服务发现模式

发布时间:2021-03-10   来源:网络整理    
字号:

为什么使用服务发觉?

想象一下,如果你在写代码读取一个有REST API或Thrift API的服务,你的代码还要晓得一个服务例子的网路地址(IP地址跟端口)。运行在数学软件上的传统应用中微端服务器,服务例子的网路地址是相对静态的,你的代码可以从一个甚少更新的配置文件中调用网路地址。

在一个现代的,基于云的微服务应用中,这个问题就显得复杂多了,如下图所示:

无服务发现时,无法确定连接的服务

服务例子的网路地址是动态分配的。而且,由于手动扩充,失败跟更新,服务例子的配置也时常变化。这样一来,你的客户端代码还要一套更精细的服务发觉体系。

有两种主要的服务发觉方式:客户端服务发觉(client-side discovery)和服务器端服务发觉(server-side discovery)。我们首先来看下客户端服务发觉。

客户端服务发觉方式

当使用客户端服务发觉的时侯,客户端负责决定可用的服务例子的网路地址,以及紧扣她们的负载均衡。客户端向服务注册表(service registry)发送一个恳求,服务注册表是一个可用服务例子的数据库。客户端使用一个负载均衡算法,去选择一个可用的服务例子,来响应这个恳求,下图展示了这些机制的构架:

客户端发现模式

一个服务例子被启动时,它的网路地址会被讲到注册表上;当服务例子中止时,再从注册表中删掉。这个服务例子的注册表通过心跳机制动态刷新。

Netflix OSS提供了一个客户端服务发觉的好实例。Netflix Eureka是一个服务注册表,提供了REST API拿来管理服务例子的注册跟查询可用的例子。Netflix Ribbon是一个IPC客户端,和Eureka一起处理可用服务例子的负载均衡。下面会深入讨论Eureka。

客户端的服务发觉方式有优势还有劣势。这种方式相对直接,但是不仅服务注册表,没有其它动态的部份了。而且,由于客户端晓得可用的服务例子,可以做到智能的,应用明晰的负载均衡决策,比如经常用hash算法。这种方式的一个重大缺陷在于,客户端跟服务注册表是一一对应的,必须为服务客户端用到的每一种编程语言跟框架实现客户端服务发觉逻辑。

服务器端服务发觉方式

下图展示了这些机制的构架

服务器端服务发现模式

微端服务器_7k7k创世兵魂微端登陆器_下载微端登陆器

客户端通过负载均衡器向一个服务发送恳求,这个负载均衡器会查询服务注册表,并将恳求路由至可用的服务例子上。通过客户端的服务发觉,服务例子在服务注册表上被注册跟吊销。

AWS的ELB(Elastic Load Blancer)就是一个服务器端服务发觉路由器。一个ELB一般被拿来均衡来自互联网的外部流量,也可以用ELB去均衡流向VPC(Virtual Private Cloud)的流量。一个客户端通过ELB发送恳求(HTTP或TCP)时,使用的是DNS,ELB会均衡这种注册的EC2例子或ECS(EC2 Container Service)容器的流量。没有另外的服务注册表,EC2例子跟ECS容器也只会在ELB上注册。

HTTP服务器跟类似Nginx、Nginx Plus的负载均衡器也可以被用做服务器端服务发觉负载均衡器。例如,Consul Template可以拿来动态配置Nginx的反向代理。

Consul Template定期从储存在Consul服务注册表的数据中,生成任意的配置文件。每当文件变化时,会运行一个shell命令。比如,Consul Template可以生成一个配置逆向代理的nginx.conf文件,然后运行一个命令告诉Nginx去再次读取配置。还有一个更复杂的实现,通过HTTP API或DNS去动态地再次配置Nginx Plus。

有些布署环境,比如Kubernetes跟Marathon会在集群中的每位host上运行一个代理。这个代理承当了服务器端服务发觉负载均衡器的角色。为了向一个服务发送一个恳求,一个客户端使用host的IP地址跟服务分配的端口,通过代理路由这个恳求。这个代理会直接将恳求发送至集群上可用的服务例子。

图说天下

×
织梦二维码生成器