所以只能用loadbalancer
spring-cloud-loadbalancer 官网文档
首先说明一下
spring cloud loadbalancer 是可以单独使用的
但通常我们会和consul等注册中心一起使用
这样我们就不用写死配置了(配置集群里面有哪些服务)
还有这个版本与OpenFeign 和 consul配合使用是不需要做任何配置的
并且spring-cloud-loadbalancer 是 spring-cloud-commons的一个子项目
springfactories
功能:
首先在spring-cloud-commons包下也有个叫LoadBalancerAutoConfiguration的配置类,这个配置类会在它前面执行
功能:
请先读一下这篇文章: spring boot open feign 客户端调用过程
会知道OpenFeign发起请求前会调用BlockingLoadBalancerClientchoose选择一个服务端
上面也提到了BlockingLoadBalancerClient 它的加载过程。
接下来看看它的 实现
从 loadBalancerClientFactory 里取得服务列表
但我们提到了,我们并没有主动的创建服务器列表。
而是通过consul取得的,那么是什么时候取得的呢?
读一下: spring boot consul 客户端加载过程
我们能知道 consul是在web服务器启动完成后,才向注册中心发起注册的
也就是在这之前LoadBalancerClientFactory 一直是空的
所以是调用choose方法的时候才去拉取consul 上的服务器列表
所以我们看下:ReactiveLoadBalancerchoose
它是一个接口,看一下它有哪些实现
共两个实现:
1,RoundRobinLoadBalancer
2,RandomLoadBalancer
这里的ReactiveLoadBalancer实际上是RoundRobinLoadBalancer(默认的)
但我们在
spring-cloud-loadbalancer的springfactories
并没有发现RoundRobinLoadBalancer的初始化
不过我们发现它是从
loadBalancerClientFactory里取出来的
继承自:NamedContextFactory:真正创建ReactiveLoadBalancer对象
实现了:ReactiveLoadBalancerFactory。看名字就知道,它就是用来创建ReactiveLoadBalancer 的,但它是委托给了NamedContextFactory 来做的
看一下NamedContextFactory是怎么做的
可以看到
先getContext(name)
没有的化就createContext
然后就是这句
defaultConfigType是LoadBalancerClientConfiguration
context将LoadBalancerClientConfiguration注册到上下文环境中
然后contextrefresh();
LoadBalancerClientConfiguration的对象就创建出来了(springfatories里是没有它的)
可以看到 这里创建了 RoundRobinLoadBalancer
为什么要用NamedContextFactory这样创建
因为,道理很简单,spring-cloud-balancer要为每一个rpc客户端创建一个自己的上下文环境包含自己的配置
用服务名去取,这个serviceId在OpenFeign, Loadbalancer,Consul里是一致的
然后这里还创建了ServiceInstanceListSupplier
看这句,创建这个类的时候用到了DiscoveryClient,还把它们缓存了起来
这里context:ConfigurableApplicationContext包含ConsuDiscoveryClient
这里用到了BiFunciton,大家可以自己去查一下怎么用
DiscoveryClientServiceInstanceListSupplier
这里还用到了 Flux
大家可以自己去看
主要是这句
这里的delegate就是ConsulDiscoveryClient
然后就回到RoundRobinLoadBalancer
这个类其实很简单,就是取到服务器列表,然后一个简单的轮询
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)