無論是微服務還是SOA,都面臨着服務間的遠程調用。那么服務間的遠程調用方式有哪些呢?
常見的遠程調用方式有以下2種:
-
RPC:Remote Produce Call遠程過程調用,類似的還有RMI。自定義數據格式,基於原生TCP通信,速度快,效率高。早期的webservice,現在熱門的dubbo,都是RPC的典型代表
-
Http:http其實是一種網絡傳輸協議,基於TCP,規定了數據傳輸的格式。現在客戶端瀏覽器與服務端通信基本都是采用Http協議,也可以用來進行遠程服務調用。缺點是消息封裝臃腫,優勢是對服務的提供和調用方沒有任何技術限定,自由靈活,更符合微服務理念。
現在熱門的Rest風格,就可以通過http協議來實現。
如果你們公司全部采用Java技術棧,那么使用Dubbo作為微服務架構是一個不錯的選擇。
相反,如果公司的技術棧多樣化,而且你更青睞Spring家族,那么SpringCloud搭建微服務是不二之選。在我們的項目中,我們會選擇SpringCloud套件,因此我們會使用Http方式來實現服務間調用。
既然微服務選擇了Http,那么我們就需要考慮自己來實現對請求和響應的處理。不過開源世界已經有很多的http客戶端工具,能夠幫助我們做這些事情,例如:
-
HttpClient
-
OKHttp
-
URLConnection
接下來,不過這些不同的客戶端,API各不相同
2.3.Spring的RestTemplate
Spring提供了一個RestTemplate模板工具類,對基於Http的客戶端進行了封裝,並且實現了對象與json的序列化和反序列化,非常方便。RestTemplate並沒有限定Http的客戶端類型,而是進行了抽象,目前常用的3種都有支持:
-
HttpClient
-
OkHttp
-
JDK原生的URLConnection(默認的)
@SpringBootApplication public class HttpDemoApplication { public static void main(String[] args) { SpringApplication.run(HttpDemoApplication.class, args); } @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
@RunWith(SpringRunner.class) @SpringBootTest(classes = HttpDemoApplication.class) public class HttpDemoApplicationTests { @Autowired private RestTemplate restTemplate; @Test public void httpGet() { // 調用springboot案例中的rest接口 User user = this.restTemplate.getForObject("http://localhost/user/1", User.class); System.out.println(user); } }
通過RestTemplate的getForObject()方法,傳遞url地址及實體類的字節碼,RestTemplate會自動發起請求,接收響應,並且幫我們對響應結果進行反序列化。