上一篇 <<<feign和openfeign的區(qū)別
下一篇 >>>OpenFeign實現(xiàn)負載均衡代碼演示
1.引入依賴包
<!-- springboot 整合web組件,不需要引入ribbon的jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
2.Bean初始化
//RestTemplate的bean初始化時增加注解@LoadBalanced
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
3.代碼直接使用
/**
* 訂單調(diào)用會員服務,使用時直接使用服務名稱即可
*/
@RequestMapping("/orderToLoadBalancerMember")
public String orderToLoadBalancerMember() {
/**RestTemplate不是SpringCloud寫的,是Spring內(nèi)部的,它本身支持http協(xié)議調(diào)用。*/
String result = restTemplate.getForObject("http://member-service/test", String.class);
return "訂單調(diào)用會員獲取結(jié)果:" + result;
}
4.源碼分析
4.1 LoadBalanced注解的真實調(diào)用
注解里其實是調(diào)用了LoadBalancerClient,而這個接口下面有Ribbon負載均衡客戶端的實現(xiàn)。
4.2真正調(diào)用的方法
根據(jù)serviceId獲得其中一個具體Server地址
public ServiceInstance choose(String serviceId) {
Server server = this.getServer(serviceId);
return server == null ? null : new RibbonLoadBalancerClient.RibbonServer(serviceId, server, this.isSecure(server, serviceId), this.serverIntrospector(serviceId).getMetadata(server));
}
調(diào)用下來方法:
protected Server getServer(String serviceId) {
return getServer(getLoadBalancer(serviceId));
}
//加載服務對應的地址列表信息
@Override
public <C> C getInstance(String name, Class<C> type) {
C instance = super.getInstance(name, type);
if (instance != null) {
return instance;
}
IClientConfig config = getInstance(name, IClientConfig.class);
return instantiateWithConfig(getContext(name), type, config);
}

//根據(jù)地址列表和默認負載均衡策略獲取具體的具體數(shù)據(jù)
protected Server getServer(ILoadBalancer loadBalancer) {
if (loadBalancer == null) {
return null;
}
return loadBalancer.chooseServer("default"); // TODO: better handling of key
}
4.3路由算法

推薦閱讀:
<<<本地負載均衡和nginx負載均衡
<<<SpringCloud中負載均衡客戶端的使用
<<<如何選擇ribbon還是loadbalancer
<<<feign和openfeign的區(qū)別
<<<OpenFeign實現(xiàn)負載均衡代碼演示
<<<Feign超時配置
