站务联系

微服务架构中的服务发现(Service Discovery)

发布时间:2021-05-06   来源:网络整理    
字号:

为什么要使用服务发觉功能?

当我们写一些代码来读取基于REST API 或Thrift API的服务时,为了建立一个恳求,我们还要晓得服务例子的网路地址(IP跟端口)。在基于数学软件的传统应用中,服务例子的地址相对固定。比如,代码可以从配置文件中调用服务的网路地址,这些地址只会时常更新。

但是,在现代的基于云的微服务应用中,这却是一个还要解决的窘境,如下图所示:

微服务架构中的服务发现(Service Discovery)注册表,该注册表是可用服务例子的数据库。客户端使用负载均衡算法从可用的服务例子中选择一个,然后发起恳求。

下图为这些机制的构架图:

微服务架构中的服务发现(Service Discovery)

当服务例子启动时,会将自己的网路地址信息注册至服务注册表,当服务中止时它会被服务注册表移除。通常使用心跳机起草刷新服务例子的注册。

Netflix OSS提供了一个非常棒的客户端发觉方式的例子。Netflix Eureka是一个服务注册表,它提供了基于REST API的服务例子注册跟可用服务例子查询功能。Netflix Ribbon是一个IPC客户端,配合Eureka实现对服务例子恳求的负载均衡。在文章的旁边我们会深入学习一下Eureka。

客户端发觉方式有一系列的特点跟劣势。这种方式相对简略,除服务注册表外微端服务器,没有其他变动部份。同时,由于客户端晓得所有的可用服务例子微端服务器,因此,它可以作出更明智的、基于特定应用负载均衡决策,比如使用一致性哈希算法。这种方式的一个重要劣势是它将客户端跟服务注册表耦合在了一起。你应当为客户端使用的每种编程语言跟框架实现客户端的服务发觉逻辑。

了解了客户端发觉以后,我们来瞧瞧服务器端发觉。

服务器端发觉方式

服务器端发觉的另外一种模式就是服务器发觉方式。下图中展示了该机制的结构:

微服务架构中的服务发现(Service Discovery)

AWS的ELB(Elastic Load Balancer)是服务器发觉路由器的样例。ELB一般适于来自内网的流量的负载均衡,但是你也可以使用ELB来负载均衡私有云(VPV)内部的流量。客户端使用DNS名称,通过ELB发送恳求(Http或TCP),ELB在已注册的弹性估算云(EC2)实例或EC2容器服务(ECS)的容器之间进行负载均衡。这种实现并没有单独的服务注册表,而是将EC2例子跟ECS容器注册至ELB自身上。

Http服务器跟负载均衡器(比如,Nginx plus跟Nginx)也可以用作服务器发觉的负载均衡器。比如,使用Consul模版动态配置Nginx反向代理。Consul模版是一个工具,可以从储存在Consul服务注册表中的配置数据中定时再次生成任意配置文件。每当文件改变时,它可以运行一个任意shell命令。在本例中,Consul模版生成一个nginx.conf文件,用于配置逆向代理,然后执行命令告诉Nginx去再次读取配置。更复杂的实现可以使用Http API后DNS动态再次配置Nginx plus。

某些布署环境(例如Kubernetes跟Marathon)会在集群中的每位主机上运行一个代理。这个代理饰演服务器端发觉负载平衡器的角色。客户端为了向服务发出恳求,会通过代理基于主机IP跟服务端口进行路由。然后,代理透明地将恳求准发至集群中某个可用的服务例子。

图说天下

×
二维码生成