RestTemplate+loadBalancer實現(xiàn)負載均衡代碼演示及源碼分析

上一篇 <<<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超時配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容