1. 程式人生 > >微服務spring cloud實戰—為服務消費者整合Ribbon

微服務spring cloud實戰—為服務消費者整合Ribbon

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微服務架構實戰》