简介
@Bean @LoadBalanced //使用ribbon public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); return restTemplate; }
Ribbon分析
org.springframework.cloud.client.loadbalancer.LoadBalancerClient
下载源码后看到
▪️为了给一些系统使用,创建一个带有真实host和port的URI。 ▪️一些系统使用带有原服务名代替host的URI,比如http://myservice/path/to/service。 ▪️该方法会从服务实例中取出host:port来替换这个服务名。
从该接口中,我们可以通过定义的抽象方法来了解到客户端负载均衡器中应具备的几种能力:
▪️ServiceInstance choose(String serviceId):父接口ServiceInstanceChooser的方法,根据传入的服务名serviceId,从负载均衡器中挑选一个对应服务的实例。
▪️ T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest request):使用从负载均衡器中挑选出的服务实例来执行请求内容。
▪️URI reconstructURI(ServiceInstance instance, URI original):为系统构建一个合适的host:port形式的URI。在分布式系统中,我们使用逻辑上的服务名称作为host来构建URI(替代服务实例的host:port形式)进行请求,比如http://myservice/path/to/service。在该操作的定义中,前者ServiceInstance对象是带有host和port的具体服务实例,而后者URI对象则是使用逻辑服务名定义为host的URI,而返回的URI内容则是通过ServiceInstance的服务实例详情拼接host:port形式的请求地址。
org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient
此类实现了接口并作了具体逻辑处理。
然后在与LoadBalancerClient类同包下发现了自动配置类
org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration
从LoadBalancerAutoConfiguration类上的注解可知,Ribbon实现负载均衡自动化配置需要满足下面两个条件:
▪️@ConditionalOnClass(RestTemplate.class):RestTemplate必须存在于当前工程的环境中。
▪️@ConditionalOnBean(LoadBalancerClient.class):在Spring的Bean工程中必须有LoadBalancerClient的实现bean。
该自动配置类,主要做了下面三件事:
创建了一个LoadBalancerInterceptor的Bean,用于实现对客户端发起请求时进行拦截,以实现客户端负载均衡。
创建了一个RestTemplateCustomizer的Bean,用于给RestTemplate增加LoadbalancerInterceptor
维护了一个被@LoadBalanced注解修饰的RestTemplate对象列表,并在这里进行初始化,通过调用RestTemplateCustomizer的实例来给需要客户端负载均衡的RestTemplate增加LoadBalancerInterceptor拦截器。
负载均衡器
ServerList: 服务列表(总)
ServerListUpdater: 服务更新时最新到达的地方
ServerListFilter:接口非常简单,该接口中定义了一个方法List getFilteredListOfServers(List servers),主要用于实现对服务实例列表的过滤,通过传入的服务实例清单,根据一些规则返回过滤后的服务实例清单。
Rule --> IRule: 负载策略接口本片简略刨析,详解转到 https://www.jianshu.com/p/1bd66db5dc46