springcloud:RPC和HTTP


1.RPC和HTTP

無論是微服務還是SOA,都面臨着服務間的遠程調用。那么服務間的遠程調用方式有哪些呢?

常見的遠程調用方式有以下2種:

  • RPC:Remote Produce Call遠程過程調用,類似的還有RMI。自定義數據格式,基於原生TCP通信,速度快,效率高。早期的webservice,現在熱門的dubbo,都是RPC的典型代表

  • Http:http其實是一種網絡傳輸協議,基於TCP,規定了數據傳輸的格式。現在客戶端瀏覽器與服務端通信基本都是采用Http協議,也可以用來進行遠程服務調用。缺點是消息封裝臃腫,優勢是對服務的提供和調用方沒有任何技術限定,自由靈活,更符合微服務理念。

    現在熱門的Rest風格,就可以通過http協議來實現。

如果你們公司全部采用Java技術棧,那么使用Dubbo作為微服務架構是一個不錯的選擇。

相反,如果公司的技術棧多樣化,而且你更青睞Spring家族,那么SpringCloud搭建微服務是不二之選。在我們的項目中,我們會選擇SpringCloud套件,因此我們會使用Http方式來實現服務間調用。

 

2.2.Http客戶端工具

既然微服務選擇了Http,那么我們就需要考慮自己來實現對請求和響應的處理。不過開源世界已經有很多的http客戶端工具,能夠幫助我們做這些事情,例如:

  • HttpClient

  • OKHttp

  • URLConnection

接下來,不過這些不同的客戶端,API各不相同

 

2.3.Spring的RestTemplate

Spring提供了一個RestTemplate模板工具類,對基於Http的客戶端進行了封裝,並且實現了對象與json的序列化和反序列化,非常方便。RestTemplate並沒有限定Http的客戶端類型,而是進行了抽象,目前常用的3種都有支持:

  • HttpClient

  • OkHttp

  • JDK原生的URLConnection(默認的)

 首先在項目中注冊一個RestTemplate對象,可以在啟動類位置注冊:

@SpringBootApplication
public class HttpDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(HttpDemoApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
   
        return new RestTemplate();
    }
}

在測試類中直接@Autowired注入:

@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會自動發起請求,接收響應,並且幫我們對響應結果進行反序列化。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM