微服務spring cloud實戰—為服務消費者整合Ribbon
阿新 • • 發佈:2018-11-07
Ribbon簡介
Ribbon是Netflix釋出的負載均衡器,它有助於控制HTTP和TCP客戶端的行為。
為Ribbon配置服務提供者地址列表後,Ribbon就可基於某種負載均衡演算法,自
動地幫助服務消費者去請求。Ribbon預設為我們提供了很多負載聚恆演算法,例如
輪詢、隨機等。當然,我們也可為Ribbon實現自定義的負載均衡演算法。
在Spring Cloud中,當Ribbon與Eureka配合使用時,Ribbon可自動從Eureka Server
獲取服務提供者地址列表,並基於負載均衡演算法,請求其中一個服務提供者例項。
為服務消費者整合Ribbon
1.複製專案microservice-consumer-movie,將ArtifactId修改為microservice-consumer-movie-ribbon。
2.為專案新增Ribbon依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
3.為RestTemplate新增@LoadBalanced註解
兩者對比可以發現,只須添加註解@LoadBalanced,就可以為RestTemplate
整合Ribbon,使其具備負載均衡的能力。
4.修改Conroller
@RestController
public class MovieController {
private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class);
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/user/{id}" )
public User findById(@PathVariable Long id){
return this.restTemplate.getForObject("http://users/" + id, User.class);
}
@GetMapping("/log-instance")
public void logUserInstance(){
ServiceInstance serviceInstance = this.loadBalancerClient.choose(
"users");
//列印當前選擇的是哪個節點
MovieController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort() );
}
}
5.測試
1.啟動microservice-discovery-eureka。
2.啟動 2個或者多個 microservice-provider-user例項。
3.啟動microservice-consumer-movie-ribbon。
4.訪問http://localhost:8761,如圖
5.多次訪問http:localhost:8010/user/1,返回結果如下:
同時,控制檯會列印查詢如下日誌:
6.多次訪問http://localhost:8010/log-instance,控制檯就會列印如下的日誌
注意點:
1.虛擬主機名和虛擬IP非常相似,如果大家接觸過 HAProxy或Heartbeat,理解虛擬主機名就非常容易了。
如果無法理解虛擬主機名,可將其簡單理解成為提供者的服務名稱,因為在預設情況下,虛擬主機名和服務
名稱是一致的。當然,也可以使用配置屬性eureka.instance.virtual-host-name或eureka.instance.secure-
virtual-host-name指定虛擬主機名。
2.不能將restTemplate.getForObject(...)與loadBalancerClient.choose(...)寫在同一個方法中,
兩者之間會有衝突—因為此時程式碼中的 rest-Template 實際上是一個Ribbon客戶端,本身已經包含“choose”的行為。
3.虛擬主機名不能包含“_”之類的字元,否則Ribbon在呼叫時會報異常。
本文大部分內容轉載自周立的《Spring Cloud與Docker微服務架構實戰》