1. 程式人生 > 實用技巧 >微服務負載均衡元件-Ribbon

微服務負載均衡元件-Ribbon

什麼是Ribbon

Ribbon是Netflix釋出的開源專案,其主要功能是提供客戶端側負載均衡演算法。Ribbon客戶端元件提供一系列完善的配置項如連線超時,重試等。Ribbon會自動的幫助你基於某種規則(如輪詢,隨機等)去連線這些機器,用時,Ribbon也支援自定義的負載均衡演算法

在SpirngCloud中,Ribbon利用從Eureka中讀取到的服務提供者列表資訊,在呼叫服務節點提供服務時,基於內建的負載均衡演算法,進行服務請求。

Ribbo和Nginx區別

一般實現負載均衡,會有倆個選擇,客戶端負載均衡和服務端的負載均衡

Nginx是服務端負載均衡,負載均衡的策略演算法是在服務端實現的。

Ribbon是客戶端負載均衡,負載均衡演算法是由呼叫者本身進行維護的。

策略

Ribbon內建了多種負載均衡策略,內部負責複雜均衡的頂級介面為

com.netflix.loadbalancer.IRule;

com.netflix.loadbalancer.RoundRobinRule;輪詢策略
com.netflix.loadbalabcer.RandomRule; 隨機策略;
com.netflix.loadbalancer.BestAvailableRule;  最佳可用策略

用法

1.新增pom檔案

        <!--Ribbon-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-ribbon</artifactId>-->
<!--            <version>1.4.6.RELEASE</version>-->
<!--        </dependency>-->
         
         <!--自帶有ribbon-->
  <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-   client</artifactId>
   </dependency>

2. 添加註解

 @Bean
    @LoadBalanced //Ribbon
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

自定義ribbon

1. 重寫方法


public class KuangRandomRule extends AbstractLoadBalancerRule {

    //每個服務,訪問5次~,換下一個服務(3個)

    // total=0, 預設=0,如果=5,我們指向下一個服務節點
    // index=0,預設0,如果total=5,index+1,

    private int total = 0; //被呼叫的次數
    private int currentIndex = 0; //當前是誰在提供服務~
   //@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
   public Server choose(ILoadBalancer lb, Object key) {
       if (lb == null) {
           return null;
       }
       Server server = null;

       while (server == null) {

           if (Thread.interrupted()) {
               return null;
           }

           List<Server> upList = lb.getReachableServers(); //獲得活著的服務
           List<Server> allList = lb.getAllServers(); //獲得全部的服務

           int serverCount = allList.size();
           if (serverCount == 0) {
               return null;
           }

// int index = chooseRandomInt(serverCount); //生成區間隨機數
// server = upList.get(index); //從活著的服務中,隨機獲取一個~

       //-=========================================================

           if (total<5){
               server = upList.get(currentIndex);
               total++;
           }else {
               total = 0;
               currentIndex++;
               if (currentIndex>upList.size()){
                   currentIndex = 0;
               }
               server = upList.get(currentIndex); //從活著的服務中,獲取指定的服務來進行操作
           }
  //-=========================================================

           if (server == null) {
               Thread.yield();
               continue;
           }

           if (server.isAlive()) {
               return (server);
           }

           server = null;
           Thread.yield();
       }

       return server;

   }

   protected int chooseRandomInt(int serverCount) {
       return ThreadLocalRandom.current().nextInt(serverCount);
   }
@Override
   	public Server choose(Object key) {
   		return choose(getLoadBalancer(), key);
   	}

   	@Override
   	public void initWithNiwsConfig(IClientConfig clientConfig) {
   		// TODO Auto-generated method stub
   		
   	}
   }


   2. 注入進去

      ````java
       @Bean
          public IRule myRule(){
              return new RoundRobinRule(); //預設是輪詢,現在我們定義為~ KuangRandomRule
          }

:一定要寫在主配置外面,不然會被componentscan掃描到。否則,它由所有@RibbonClients共享。如果您使用@ComponentScan(或@SpringBootApplication),則需要採取措施避免將其包括在內(例如,可以將其放在單獨的,不重疊的程式包中,或指定要在@ComponentScan)。