当我们的服务使用RESTAPI调用服务时,我们需要知道服务实例的网络位置(IP地址和端口)。在服务器上运行的传统应用程序中服务实例的API通常是静态的。在当今基于云的微服务应用程序中,API的设置通常并不那么简单。服务实例会因自动缩放、故障和升级而动态变化。因此,我们不得不在客户端代码中使用服务发现。1、服务发现服务的IP地址不能在客户端静态配置。需要使用动态服务发现。从概念上讲,服务发现非常简单,它的主要组成部分是一个服务注册中心,其中包含应用服务实例的网络位置列表。当服务实例启动和停止时,服务注册表会更新。服务发现机制的工作原理是在服务注册表中查询可用服务实例列表,并在客户端调用服务时将请求路由到其中一个实例。2.应用级服务发现模式应用程序及其客户端的服务可以与服务注册中心进行交互,实现服务发现。每个服务实例都将其网络位置注册到服务注册表,在调用服务之前从中请求服务实例列表。然后客户端向其中一个实例发送请求。这种方法是两种模式的组合。自注册模式:服务实例在启动过程中调用注册中心的注册API注册其网络位置,注册中心要求服务实例周期性调用heartbeatAPI防止其注册过期。当服务实例关闭时,它会从服务注册表中注销自己。客户端发现模式:为了调用服务,服务客户端查询服务注册表以获取服务实例列表。客户端使用负载均衡算法选择服务实例,客户端请求选择的实例。Netflix和Pivotal已经普及了企业级服务发现。例如,Netflix的Eureka是一个高可用的服务注册中心。Netflix组件可以很容易地与SpringCloud一起使用,这是一个由Pivotal开发的基于Spring的框架。基于SpringCloud的服务向Eureka注册,基于SpringCloud的客户端使用Eureka来发现服务。3.应用层服务发现的缺点需要特定语言的服务发现库。运维人员需要维护设置和管理服务注册表。当服务实例正在运行但未处理请求时,可能会出现从服务注册表中丢失注销的情况。4、平台提供的服务发现模式许多部署平台,如Docker、Kubernetes,都内置了服务注册中心和服务发现机制。每个服务都分配有一个DNS名称、一个虚拟IP(VIP)地址和一个解析为VIP地址的DNS名称。服务客户端请求DNS名称/VIP,部署平台自动将请求路由到可用的服务实例。这样,服务注册、服务发现、请求路由等都由部署平台来处理。服务注册表跟踪部署平台中已部署服务的IP地址。这种方法是两种模式的组合:第三方注册模式:第三方注册商(通常是部署平台的一部分)代替服务向服务注册中心注册自己。注册器在启动时向服务注册表注册服务实例。当实例关闭时,注册器从服务注册表中注销服务实例。服务器端发现模式:它不是客户端查询服务注册表,而是向DNS名称发出请求,DNS名称解析为查询注册表并负载平衡请求的请求路由器。AWS弹性负载均衡器(ELB)是服务器端发现路由器的一个示例。客户端向ELB发送HTTP/TCP请求,ELB负载平衡一组EC2实例之间的流量。ELB还充当服务注册中心。实例通过API调用显式注册到ELB,或者自动作为自动缩放组的一部分。5.基于平台的服务发现的好处部署平台处理所有服务发现的工作。服务和客户端都不包含任何用于服务发现的代码。服务发现适用于所有服务和客户端,无论它们是用什么语言编写的。6.基于平台的服务发现的缺点只能发现使用平台部署的服务。
