1. 程式人生 > >springcloud-Ribbon-負載均衡元件

springcloud-Ribbon-負載均衡元件

Ribbon負載均衡

1.Ribbon簡介

ribbin是Netflix釋出的負載均衡器,有助於控制http和tcp客戶端的行為,為ribbon配置服務提供者列表後,ribbon就可以基於某種負載均衡演算法,自動的幫助服務消費者去請求。ribbon提供了很多的負載均衡演算法例如

  • RoundRobinRule(輪詢演算法)
  • RandomRule(隨機演算法)
  • AvailabilityFilteringRule():會先過濾由於多次訪問故障而處於斷路器跳閘狀態的服務,還有併發的連線數量超過閾值的服務,然後對剩餘的服務列表按照輪詢策略進行訪問
  • WeightedResponseTimeRule():根據平均響應的時間計算所有服務的權重,響應時間越快服務權重越大被選中的概率越高,剛啟動時如果統計資訊不足,則使用RoundRobinRule策略,等統計資訊足夠會切換到WeightedResponseTimeRule
  • RetryRule():先按照RoundRobinRule的策略獲取服務,如果獲取失敗則在制定時間內進行重試,獲取可用的服務。
  • BestAviableRule():會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,然後選擇一個併發量最小的服務

在springCloud中,當ribbon和Eureka配和使用時ribbon可以自動獲取服務註冊列表,並基於負載均衡演算法,請求其中的一個服務提供例項

在消費者與服務者之間做了一個Nginx代理,有效的分發請求到同一個服務者叢集,如果將ribbon搭建在服務者一方,沒有任何作用。

2.為消費者整合ribbon

1.ribbon和springcloud的啟動器

注意:如果已經引入了spring-cloud-starter-eureka依賴,其中已經包含了spring-cloud-starter-ribbon,所以不需要再次引入

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
2.ribbon整合RestTemplate
   @Bean
   @LoadBalanced
    RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
3.消費者控制器
@RestController
@RequestMapping("/query")
public class ClientController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/load")
    public void loadBalanceTest(String name){
        IRule iRule; //該介面管控ribbon負載均衡策略實現類
        ServiceInstance instance = loadBalancerClient.choose("EUREKA-PROVIDER");
        String host = instance.getHost();
        int port = instance.getPort();
        URI uri = instance.getUri();
        System.out.println(host);
        System.out.println(port);
        System.out.println(uri);
    }
}
服務者叢集1的控制器
@RestController
@RequestMapping("/test")
public class TestController {

    @RequestMapping("/test1")
    public String test(String name){
        return "xixixi 8763  :"+name;
    }
}
服務者叢集2的控制器
@RestController
@RequestMapping("/test")
public class TestController {

    @RequestMapping("/test1")
    public String test(String name){
        return "xixixi 8764  :"+name;
    }
}
4.驗證負載均衡

訪問:http://localhost:8762/query/load?name=hahahaha

得到結果如下:

因為ribbon預設的實現類是輪詢策略,如果要修改如下↓

3.自定義ribbon配置

在消費者配置檔案天新增如下內容,將負載均衡策略指向其他實現類

HI-SERVICE.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

還有其他實現類如下: