學習類似於ribbon機制的輪詢負載均衡
ribbon主要的作用就是在本地做負載均衡,
簡單理解為:在註冊中心上根據相同的一個服務名稱,拿到叢集服務的地址,
把叢集的服務地址輪詢,
它的主要原理就是在於,輪詢,就是呼叫不同的地址
所以在底層程式碼實現思路:
1.從註冊中心上面取值,
2.取值之後的個數,次數怎麼計算,拿到的一定是URL,即服務地址
3.呼叫服務地址取值,
程式碼實現如下:
1,@EnableDiscoveryClient註解是基於spring-cloud-commons依賴,並且在classpath中實現; 適合於consul、zookeeper註冊中心
2,@EnableEurekaClient註解是基於spring-cloud-netflix依賴,只能為eureka作用;
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
private int requestCount = 1;
@RequestMapping("/discoveryClient")
public String discoveryClient() {
String serviceUrl = getServiceUrl() +
if (StringUtils.isEmpty(serviceUrl)) {
return "請求地址為null";
}
// 請求地址
System.out.println("serviceUrl:" + serviceUrl);
String result = restTemplate.getForObject(serviceUrl, String.class);
return
}
@RequestMapping("/getServiceUrl")
private String getServiceUrl() {
List<ServiceInstance> instances = discoveryClient.getInstances("app-itmayiedu-member");
if (instances == null || instances.size() == 0) {
return null;
}
int size = instances.size();
int index = requestCount % size;
requestCount++;
return instances.get(index).getUri().toString();
}
Ribbon與Nginx區別
伺服器端負載均衡Nginx
nginx是客戶端所有請求統一交給nginx,由nginx進行實現負載均衡請求轉發,屬於伺服器端負載均衡。
既請求有nginx伺服器端進行轉發。
客戶端負載均衡Ribbon
Ribbon是從eureka註冊中心伺服器端上獲取服務註冊資訊列表,快取到本地,讓後在本地實現輪訓負載均衡策略。
既在客戶端實現負載均衡。
應用場景的區別:
Nginx適合於伺服器端實現負載均衡 比如Tomcat ,Ribbon適合與在微服務中RPC遠端呼叫實現本地服務負載均衡,比如Dubbo、SpringCloud中都是採用本地負載均衡。