天天看點

SpringCloud服務調用(RestTemplate)

使用微服務架構的分布式系統,微服務之間通過網絡通信。我們通過服務提供者與服務消費者來描述微服務間的調用關系。

  • 服務提供者:服務的被調用方,提供調用接口的一方
  • 服務消費者:服務的調用方,依賴于其他服務的一方

我們以電商系統中常見的使用者下單為例,使用者向訂單微服務發起一個購買的請求。在進行儲存訂單之前需要調用商品微服務查詢目前商品庫存,單價等資訊。在這種場景下,訂單微服務就是一個服務消費者,商品微服務就是一個服務提供者
SpringCloud服務調用(RestTemplate)
在使用者下單時需要調用商品微服務擷取商品資料。那應該怎麼做呢?衆人皆知商品微服務提供了供人調用的HTTP接口。是以可以再下定單的時候使用http請求的相關工具類完成,如常見的HttpClient,OkHttp,當然也可以使用Spring提供的RestTemplate

RestTemplate介紹

Spring架構提供的RestTemplate類可用于在應用中調用rest服務,它簡化了與http服務的通信方式,統一了RESTful的标準,封裝了http連結, 我們隻需要傳入url及傳回值類型即可。相較于之前常用的HttpClient,RestTemplate是一種更優雅的調用RESTful服務的方式。

在Spring應用程式中通路第三方REST服務與使用Spring RestTemplate類有關。RestTemplate類的設計原則與許多其他Spring 模闆類(例如JdbcTemplate、JmsTemplate)相同,為執行複雜任務提供了一種具有預設行為的簡化方法。

RestTemplate預設依賴JDK提供http連接配接的能力(HttpURLConnection),如果有需要的話也可以通過setRequestFactory方法替換為例如 Apache HttpComponents、Netty或OkHttp等其它HTTP library。

考慮到RestTemplate類是為調用REST服務而設計的,是以它的主要方法與REST的基礎緊密相連就不足為奇了,後者是HTTP協定的方法:HEAD、GET、POST、PUT、DELETE和OPTIONS。例如,RestTemplate類具有headForHeaders()、getForObject()、postForObject()、put()和delete()等方法。

RestTemplate方法介紹

SpringCloud服務調用(RestTemplate)

RestTemplate調用微服務

  1. 在訂單工程中OrderApplication啟動類中配置RestTemplate
//配置RestTemplate交給spring管理
@Bean
public RestTemplate getRestTemplate() {
	return new RestTemplate();
}
           
  1. 編寫下訂單方法
@PostMapping("/{id}")
public String order(Integer id) {
	//通過restTemplate調用商品微服務
	Product object = restTemplate.getForObject("http://127.0.0.1:9002/product/1", Product.class);
	System.out.println(object);
	return "操作成功";
}
           

寫死存在的問題

至此已經可以通過RestTemplate調用商品微服務的RESTFul API接口。但是我們把提供者的網絡位址(ip,端口)等寫死到了代碼中,這種做法存在許多問題:

  • 應用場景有局限
  • 無法動态調整

那麼應該怎麼解決呢,就需要通過注冊中心動态的對服務注冊和服務發現

繼續閱讀