分布式组件-ribbon,feign-负载均衡和远程调用

2021-02-10  本文已影响0人  乙腾

服务化架构

ribbon

image.png

可以看见引入nacos后的服务化架构,每个服务都有nacos的客户端。

F&Q

1.ribbon如何实现负载均衡?

每次请求外部服务都会被ribbon拦截,ribbon拿着调用的服务去nacos中查找对应的在其中注册的列表,拿到注册列表后,将之在本地缓存一份,下次调用,就在本地缓存的注册列表中找到对应服务-对应的机器,轮询调用。

2.nacos中如何动态感知服务注册和下线?

机器新增

一旦有新机器加入,新机器加入后启动必然会再次在nacos中注册,注册中心更新注册列表,而本地客户端的ribbon有定时向nacos注册中心,定时pull注册列表的机制,拉取过来新的注册列表,更新本地cache的注册列表。

机器下线

从nacos注册的底层原理说起

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

这个包会自动帮服务向nacos中注册,同时这个包会和nacos之间维持一个心跳检查,一旦一个机器下线,长时间不给服务发心跳,服务端会感知到,后将之从服务列表中删除,下一次ribbon客户端定时查询服务注册列表的时候,发现注册列表发生变化,更新本地cache注册列表。

3.nacos感知注册列表中的服务下线会有一点的延迟,同理ribbon感知注册列表的变化也会有一定的延迟,如果在这期间服务调用会是什么样的呢?

ribbon调用一次失败后,会在本地缓存的注册列表中挑取服务重试,直到找到一个没有下线的机器。

feign

image.png

此时架构图,此时调用外接服务通过Feign调用,而Feign底层依赖于Ribbon组件。

feign组件底层调用原理

feign底层依赖ribbon,当调用远程服务的时候,feign组件将请求拼成url


image.png

然后依赖底层ribbon实现远程调用。

上一篇 下一篇

猜你喜欢

热点阅读