今天这篇,我们主要讲解微服务架构中,为什么需要服务发现,服务发现是什么,服务发现中有哪些重要角色,又有哪些具体发现模式供我们应用实践。
微服务架构下服务实例具有动态分配的网络地址,随着服务的自动扩展、故障和发布升级,导致服务实例的网络地址发生动态变更。
因此,需要一种机制,支持服务消费者在服务提供者实例地址发生变更时,能够及时感知获取实例最新的地址,即服务发现机制。
服务发现的概念是随着计算机体系结构的发展而演变的旧概念。随着互联网的发展,主机的增加速度越来越快,需要一个自动化,可扩展性的更强系统,从而导致了DNS的发明和广泛采用。
现在,微服务架构正在推动服务发现的不断发展。随着容器化平台或云平台的不断普及,基于平台的微服务架构部署,服务的生命周期以秒和分钟来衡量。
同时,因为微服务的自动扩展、故障和发布升级,导致微服务具有动态变化的地址列表,微服务的灵活性再次推动了服务发现技术的发展。现代基于容器化平台或云平台的微服务应用程序,需要解决服务地址动态变化的问题。
服务实例的地址动态变化,对于客户端而言,手工维护服务实例地址列表的方式已经不能满足需求,而使用服务发现模式动态更新维护服务实例地址列表是目前微服务架构下使用的必备技术。
目前微服务的服务发现机制主要包含三个角色:服务提供者、服务消费者和服务注册表
服务发现机制的关键部分是服务注册表(Service Registry)。服务注册表提供管理和查询服务注册信息的API。当服务提供者的实例发生变更时(新增/删除服务),服务注册表需要通知服务消费者同步最新的服务实例地址列表。
目前大多数的微服务框架使用Netflix Eureka、Etcd、Consul或Apache Zookeeper等作为服务注册表。
微服务有两种主要的服务发现模式:客户端发现模式和服务端发现模式。
使用客户端发现模式,客户端负责确定服务提供者的可用实例地址列表和负载均衡策略。客户端访问服务注册表,定时同步目标服服务发现的关键部分是服务注册表。
服务注册表提供管理和查询服务注册信息的API。可以使用Netflix Eureka、etcd、Consul或Apache ZooKeeper等服务注册表搭建服务发现基础设施。
上图所示客户端服务发现包含自注册和客户端发现两个部分:
我们常用的客户端服务发现模式可以这样实现。用Etcd作为服务注册表,它是一个强一致性键值数据存储的分布式系统,它提供了REST APIs,用于管理服务实例注册和查询服务实例地址列表。
MSF SDK作为微服务SDK,它提供了服务注册功能,支持定期续租服务注册信息。它提供了服务发现功能,访问服务注册表同步并缓存目标服务的实例地址列表,支持基于负载均衡策略选择可用的目标服务并发送请求。
优点:
缺点:
使用服务端发现模式,服务客户端通过路由器(或者负载均衡器)访问目标服务。路由器负责查询服务注册表,获取目标服务实例的地址列表转发请求。
上图所示服务端服务发现包含第三方注册和服务端发现两个部分:
现代容器化部署平台(如Docker和Kubernetes)就是服务端服务发现模式的一个例子,这些部署平台都具有内置的服务注册表和服务发现机制。容器化部署平台为每个服务提供路由请求的能力。
服务客户端向路由器(或者负载均衡器)发出请求,容器化部署平台自动将请求路由到目标服务一个可用的服务实例。因此,服务注册,服务发现和请求路由完全由容器化部署平台处理。
优点:
缺点: