服务化架构
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实现远程调用。
网友评论