springcloud 系列教程三:RestTemplate實現服務的呼叫以及Ribbon負載均衡
springcloud 中有兩種呼叫方式,RestTemplate、Fegin。RestTemplate 由 spring 提供,而 Fegin 是 springcloud 提供,具體來說當然 Fegin 更好用,但是今天使用 RestTemplate
RestTemplate 簡介
Spring'scentral class for synchronous client-side HTTP access.It simplifies communication with HTTPservers, and enforces RESTful principles. Ithandles HTTP connections, leaving application code to provide URLs(with possible template variables) andextract results.
簡單說就是:簡化了發起 HTTP 請求以及處理響應的過程,並且支援 REST 風格,為什麼是簡化呢?因為他比傳統的 URLConnection 建立連線簡化太多
RestTemplate 的 get 方法有以上幾個,常見的是: getForEntity() 和 getForObject()
首先看 getForEntity() 的返回值型別 ResponseEntity
<T> ResponseEntity<T> getForEntity()
可以看到它繼承了 HttpEntity,封裝了返回的響應資訊,包括響應狀態,響應頭和響應體。但是,通常情況下我們並不想要 Http 請求的全部資訊,只需要相應體即可,對於這種情況,RestTemplate 提供了 getForObject() 方法用來只獲取響應體資訊,非常方便
客戶端負載均衡
負載均衡是我們處理高併發、緩解網路壓力和進行服務端擴容的重要手段之一,但是一般情況下我們所說的負載均衡通常都是指服務端負載均衡
Ribbon 是一個基於 HTTP 和 TCP 的客戶端負載均衡器,當我們將 Ribbon 和 Eureka 一起使用時,Ribbon 會從 Eureka 註冊中心去獲取服務端列表,然後進行輪詢訪問以到達負載均衡的作用,客戶端負載均衡中也需要心跳機制去維護服務端清單的有效性,當然這個過程需要配合服務註冊中心一起完成
客戶端負載均衡和服務端負載均衡最大的區別在於服務清單所儲存的位置。在客戶端負載均衡中,所有的客戶端節點都有一份自己要訪問的服務端清單,這些清單統統都是從 Eureka 服務註冊中心獲取的。在 springcloud 中我們如果想要使用客戶端負載均衡,方法很簡單,開啟@LoadBalanced
服務的叢集部署
首先我們通過修改服務的埠來啟動兩個服務
說明:通過修改埠號,然後多啟動幾個服務就可以了,但是要注意設定下啟動類
將single instance only 勾去掉,使得支援多開
然後重新整理下注冊中心我們可以看到下圖:
8081 和 8082 兩個服務構成簡單的叢集
服務呼叫
在 springcloud 中我們如果想要使用客戶端負載均衡,方法很簡單,開啟@LoadBalanced
註解即可,現在使用springcloud-order
服務呼叫springcloud-emp
服務,再 order 啟動類裡面注入 RestTemplate,並新增@LoadBalanced
註解
@SpringBootApplication
@EnableEurekaClient
public class ApplicationOrder {
public static void main(String[] args) {
SpringApplication.run(ApplicationOrder.class, args);
}
@Bean
@LoadBalanced //該註解可以讓該resttemplate在請求時擁有客戶端負載均衡的能力
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
使用 RestTemplate 呼叫服務springcloud-emp
@RestController
public class OrderController {
/**
* springcloud 中有兩種呼叫方式:restTemplate,fegin(springcloud)
* restTemplate 是spring 提供,預設已經整合了 ribbon 負載均衡器
* restTemplate 底層就是用的httpclient
*/
@Autowired
RestTemplate restTemplate;
@RequestMapping("/orderinfo")
public String orderinfo() {
//兩種呼叫,一種是服務別名,另一種直接呼叫
//String url = "http://127.0.0.1:8101/empinfo";
String url = "http://springcloud-emp/empinfo";
String result = restTemplate.getForObject(url, String.class);
return result;
}
}
springcloud-emp
服務程式碼如下
@RestController
public class EmpController {
@Value("${server.port}")
private String port;
@RequestMapping("/empinfo")
public String getEmp(){
return "hello springcloud. ~~一個窮屌絲!:"+port;
}
}
然後訪問springcloud-order
服務,springcloud-order
服務再呼叫springcloud-emp
服務,多次訪問springcloud-order
服務會看到負載均衡的效果
專案結構如下:
原始碼參考地址:https://gitee.com/d