微服务为什么要有服务发现与注册?

 

 

1)微服务为什么要使用服务发现与注册?

 

前文中提到,微服务独立部署、具有清晰的边界,服务之间通过远程调用来构建复杂的业务功能。那为什么要引用服务注册与发现呢?服务注册与发现具体要解决什么问题?

 

服务注册与发现主要解决了如下两个重要问题:

 

1)屏蔽,解耦服务之间相互依赖的细节

 我们知道服务之间的远程调用必须要知道对方的IP、端口信息。我们可以在调用方直接配置被调用方的IP、端口,这种调用方直接依赖IP、端口的方式存在明显的问题,如被调用的IP、端口变化后,调用方法也要同步修改。

 

通过服务发现,将服务之间IP与端口的依赖转化为服务名的依赖,服务名可以根据具微服务业务来做标识,因此,屏蔽、解耦服务之间的依赖细节是服务发现与注册解决的第一个问题。

 

2)对微服务进行动态管理

在微服务架构中,服务众多,服务之间的相互依赖也错综复杂,无论是服务主动停止,意外挂掉,还是因为流量增加对服务实现进行扩容,这些服务数据或状态上的动态变化,都需要尽快的通知到被调用方,被调用方才采取相应的措施。因此,对于服务注册与发现要实时管理者服务的数据与状态,包括服务的注册上线、服务主动下线,异常服务的剔除。

 

服务发现将服务IP、端口等细节通过一个服务名抽象给调用者,并动态管理者各个微服务的状态检测、状态更新,服务上线,下线等,这些都是微服务治理的基础,包括,负载均衡,链路跟踪。

对于服务发现与注册 一般有两种实现模式:服务器端模式,客户端模式。

2)微服务发现的服务器端模式

服务器端模式通过使用一个中间的服务器,来屏蔽被调用服务的复杂性与变动性,当有新的服务加入或老服务剔除时,只需要修改中间服务器上的配置即可,此模式的显著特点是:引入独立的中间代理服务器来屏蔽真实服务的具体细节。

 

如下图所示:服务A是调用方(消费者),服务B是被调用方,微服B有三个负载,分别部署在三台IP为100、101、102的机器上。当服务A要调用服务B时,先通过DNS域名解析找到Nginx服务器,然后将请求发送给Nginx,因为在Nginx上配置了服务B的真实访问地址,Nginx收到请求后根据负载均衡算法,将请求转发到某个真实的服务B,服务B将请求结果返回给Nginx,Nginx再将返回结果给服务A,整个请求流程结束。

 

当然中间服务器不一定非得Nginx,还可以时基于硬件的F5,也可以工作在传输层的IP负载均衡等。

该模式的优点是:配置集中在独立的中间服务器端完成,对代码没有任何入侵,也不存在跨平台跨语言的问题。因为,所有请求都需要穿透中间服务器,缺点也很明显:中间服务器会成为一个单点,对性能也会有所影响。

​服务器独立模式

 

3)微服务发现客户端模式(进程内)

我们再看客户端模式(下图),应用场景还是一样,服务A要调用服务B,服务B有三个负载。服务A调用服务B时,不需要通过中间服务器,而是在自己进程内维护了服务B的信息,再通过负载算法选择一个服务B直接调用。那服务A具体是怎么维护服务B的信息呢?为此引入了服务注册中心的概念,当服务B启动时向注册中心注册自己(将自己的信息发送到注册中心的注册表里),服务A再从注册中心获取所有注册的服务,这就是客户端模式的基本原理。

​客户端(进程内)模式

 

客户端模式因为在进程内直接调用服务,也叫做进程内负载,由于不需要穿透中间服务器,所以客户端模式的性能损耗比较小。但是,需要在服务内部维护服务注册信息,负载算法等,有一定的代码入侵性,对于跨平台,跨语言的支持不太友好。

 

服务发现的两种模式各有优缺点,也适用于不同的场景,对于大型应用一般会有多层负载,外层用服务器端负载均衡,内部用客户端负载均衡。下面将重点介绍Netflix的Eureka服务发现组件,我们会从设计理念与原理,代码实现等多个维度进行解析。

       

微服系列文章

第1篇: “四个维度” 讲明白什么是微服务!

第2篇: 微服务涉及的技术生态有哪些?

第3篇: 微服务-为什么要有服务发现与注册?

第4篇: 万字长文,助你吃透Eureka服务发现机制!

 

转自:

版权声明: 本文为 InfoQ 作者【攀岩飞鱼】的原创文章。

原文链接:【https://xie.infoq.cn/article/13a6973621381b27bbcd9ab45】。文章转载请联系作者。

posted @ 2020-09-07 14:58  KoMiles  阅读(2939)  评论(0编辑  收藏  举报