ribbon
客戶端從註冊中心根據別名的方式獲取對應服務地址列表,將其緩存至本地內存,本地進行負載均衡
使用discoveryClient負載本地負載均衡
// 原子類保證線程安全
private AtomicInteger atomicInteger = new AtomicInteger();
@RequestMapping("/discoveryClient")
public String discoveryClient() {
String serviceUrl = getServiceUrl() + "/getMember";
if (StringUtils.isEmpty(serviceUrl)) {
return "請求地址爲null";
}
// 請求地址
System.out.println("serviceUrl:" + serviceUrl);
String result = restTemplate.getForObject(serviceUrl, String.class);
return result;
}
@RequestMapping("/getServiceUrl")
private String getServiceUrl() {
List<ServiceInstance> instances = discoveryClient.getInstances("order-service");
if (instances == null || instances.size() == 0) {
return null;
}
int size = instances.size();
int index = atomicInteger.intValue() % size;
atomicInteger.incrementAndGet();
return instances.get(index).getUri().toString();
}
Ribbon與Nginx區別
nginx是客戶端所有請求統一交給nginx,由nginx進行實現負載均衡請求轉發,屬於服務器端負載均衡。
既請求有nginx服務器端進行轉發。
Ribbon是從eureka註冊中心服務器端上獲取服務註冊信息列表,緩存到本地,讓後在本地實現輪訓負載均衡策略。
既在客戶端實現負載均衡。
Nginx適合於服務器端實現負載均衡 比如Tomcat ,
Ribbon適合與在微服務中RPC遠程調用實現本地服務負載均衡,比如Dubbo、SpringCloud中都是採用本地負載均衡。