spring cloud服務(wù)之間的調(diào)用之ribbon詳解
前言
昨天,我們通過一個實例演示了,spring-cloud服務(wù)注冊組件——Eureka的基本配置和簡單用法,但是服務(wù)注冊就是為了方便后期的發(fā)現(xiàn)和調(diào)用,所以今天我們趁熱打鐵,分享下spring-cloud服務(wù)之間的調(diào)用。
服務(wù)間的調(diào)用
關(guān)于spring-cloud的服務(wù)調(diào)用,我們首先需要了解它的兩個核心組件Ribbon和Feign。
我們都知道,spring boot的接口都是基于REST實現(xiàn)的,但是在實際線上運行的時候,考慮到用戶規(guī)模、服務(wù)可用性等方面的因素,我們一般很少是單節(jié)點運行的,通常都是以集群模式部署的,但是在集群部署中,又有一個核心的問題必須解決——負(fù)載均衡。關(guān)于負(fù)載均衡,各位小伙伴應(yīng)該不陌生,最常用的組件之一nginx其中一個很核心的用途就是做負(fù)載均衡,但是nginx在實際做負(fù)載均衡的時候,確實不夠方便,需要手動配置服務(wù)地址,如果服務(wù)地址發(fā)生變化,相關(guān)配置也需要修改,所以不夠靈活。
當(dāng)然spring cloud作為一款微服務(wù)綜合框架,它自然也提供了自己的一套負(fù)載均衡解決方案,所以接下來我們就來看下spring cloud的負(fù)載均衡組件——Ribbon。
Ribbon
Ribbon中文的意思是絲帶、帶狀物,正如它的含義,它就是連接調(diào)用方和服務(wù)之間的紐帶。
依賴
我們先通過一個簡單實例,來演示下,然后在示例的過程中來解釋,首先是它的核心依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
配置
這個組件你需要添加到服務(wù)調(diào)用方的依賴中。同時,還需要增加它的配置:
@Configuration
public class RibbonConfig {
// 多節(jié)點負(fù)載
@LoadBalanced
@Bean(name = "restTemplate")
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@LoadBalanced注解的作用是啟用多節(jié)點負(fù)載,這樣后期我們在調(diào)用的時候,RestTemplate客戶端其實就是通過負(fù)載均衡的方式在調(diào)用服務(wù)提供者。
服務(wù)調(diào)用方
然后,在服務(wù)調(diào)用方,我們通過RestTemplate去調(diào)用我們的服務(wù)提供者:
@Autowired
private RestTemplate restTemplate;
@GetMapping("/ribbon")
public Object queryUserByProductId() {
List<JSONObject> jsonObjectList = Lists.newArrayList();
for (int i = 0; i < 10; i++) {
JSONObject forObject = restTemplate.getForObject("http://user-center/user/" + (i + 1), JSONObject.class);
jsonObjectList.add(forObject);
}
return jsonObjectList;
}
這里我們通過前面配置的restTemplate來調(diào)用我們的用戶服務(wù),接口的地址就是我們eureka注冊中心顯示的地址:

這里的地址不區(qū)分大小寫,都可以正常訪問。調(diào)用十次,主要是為了測試負(fù)載均衡的效果。
服務(wù)提供者
首先我們看下服務(wù)提供者配置:
server.port=8776 eureka.client.service-url.defaultZone=http://localhost:8999/eureka, http://localhost:9000/eureka
第一個配置是指定服務(wù)的端口,如果在本地啟動的話,需要每啟動一次改一個端口,否則會提示端口沖突,如果你用的是IDEA的話,要先運行多應(yīng)用啟動:

第二個配置就是設(shè)定我們的注冊中心,我們有兩個注冊中心,所以指定了兩個地址。
服務(wù)提供者就是一個簡單的controller,在controller內(nèi)部,我們通過DiscoveryClient打印出被調(diào)用者的信息,方便我們查看。
@RestController
public class UserController {
private Logger logger = LoggerFactory.getLogger(UserController.class);
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/user/{id}")
public JSONObject getUserById(@PathVariable(name = "id") Long id) {
List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
logger.info("instances = {}", instances);
JSONObject user = new JSONObject();
user.put("id", id);
user.put("name", "syske");
return user;
}
}
這里需要注意的是,我們導(dǎo)入的DiscoveryClient是org.springframework.cloud.client.discovery包下的,如果不是同這個類,啟動的時候會報錯:
Consider defining a bean of type 'com.netflix.discovery.DiscoveryClient' in your configuration.
測試
我們分別啟動服務(wù)調(diào)用發(fā)和被調(diào)用方,這里我啟動了5個user-center,同時eureka服務(wù)也啟動了兩個,這個兩個注冊中心互相注冊監(jiān)控,在實際應(yīng)用中也可以確保服務(wù)穩(wěn)定性。5個user-center有2個注冊在8999的注冊中心上,有3個注冊在9000的注冊中心上:


然后,我們訪問product的ribbon接口:
瀏覽器返回結(jié)果如下:

同時,在user-center端口為8771和8775的控制臺,會看到如下信息:


為什么只有8771和8775收到了請求,因為8771和8775都注冊到了8999的注冊中心,而且我們的product-service也注冊在該服務(wù)中心,所以就只調(diào)用了8771和8775這兩個服務(wù):

根據(jù)運行結(jié)果,我們還發(fā)現(xiàn)在10次請求中,8771和8775各處理五次,這里面還有一個潛藏的知識點:Ribbon默認(rèn)的負(fù)載策略是輪詢策略,這樣可以確保同一個注冊中心下的所有服務(wù)節(jié)點接收到同樣的請求頻次。
如果你把user-center(5個服務(wù))、product-serive都注冊在同一個注冊中心,那么你會發(fā)現(xiàn)每個服務(wù)都會被調(diào)用2次。
總結(jié)
總體來說,Ribbon對用戶來說感知確實不夠強,而且經(jīng)過我的測試,我發(fā)現(xiàn)就算拿掉ribbon的依賴,依然可以正常負(fù)載均衡,這是因為eureka-client的依賴,已經(jīng)添加過ribbon的依賴了:

好了,今天的Ribbon分享就先到這里吧,我們明天分享基于Feign的聲明式調(diào)用。
到此這篇關(guān)于spring-cloud服務(wù)之間的調(diào)用之ribbon的文章就介紹到這了,更多相關(guān)spring cloud服務(wù)調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaSwing基礎(chǔ)之Layout布局相關(guān)知識詳解
上次我們說到View的Mearsure流程,今天接著說說layout. 關(guān)于layout,很多朋友知道它是負(fù)責(zé)布局的,那么具體是怎么布局的?viewGroup和view的layout方法又有什么不同?一起來看看吧,需要的朋友可以參考下2021-05-05
SpringBoot設(shè)置接口超時的方法小結(jié)
這篇文章主要介紹了SpringBoot設(shè)置接口超時的方法小結(jié),包括配置文件,config配置類及相關(guān)示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
使用java web 在jsp文件及Class中連接MySQL和SQLserver 的驅(qū)動方法
這篇文章主要介紹了使用java web 在jsp文件及Class中連接MySQL和SQLserver的驅(qū)動方法的相關(guān)資料,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下2016-10-10
Spring?Boot多個定時任務(wù)阻塞問題的解決方法
在日常的項目開發(fā)中,往往會涉及到一些需要做到定時執(zhí)行的代碼,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot多個定時任務(wù)阻塞問題的解決方法,需要的朋友可以參考下2022-01-01

