使用nacos作为注册中心。
spring cloud gateway、spring cloud openfeign、spring cloud loadbalancer的版本都是3.1.4。
服务发现过程
远程服务调用的流程:
- 服务消费者(gateway、openfeign)从注册中心(nacos)获取服务的服务实例列表。
- 服务消费者使用负载均衡策略,从若干个服务实例中选出一个目标实例。
- 服务消费者根据目标实例的ip、端口,重新构造请求并发起远程调用。
在实际的实现上,一二步都封装在了负载均衡器内。
spring cloud gateway、spring cloud openfeign都默认使用RoundRobinLoadBalancer(基于轮询的负载均衡策略,在spring cloud loadbalancer包中)。
RoundRobinLoadBalancer的choose方法:
image.pngRoundRobinLoadBalancer从注册中心获取服务实例列表前,首先经过一个缓存策略。
image.png默认缓存35秒。所以就算注册中心能够保证服务的秒级上下线,由于这个缓存的存在,gateway和openfeign还是可能会在一小段时间内调用已下线的服务实例。可以根据需求调整这个缓存时间。
如果缓存中没有找到,gateway使用ReactiveDiscoveryClient接口获取服务实例列表,openfeign使用DiscoveryClient接口获取。两个接口一个是响应式的一个是非响应式的,都由spring cloud定义,nacos提供了具体的实现。
nacos提供的两个实现中,都是通过NacosServiceDiscovery的getInstances方法从nacos服务端获取注册的服务实例列表。
image.png
网友评论