基於TCP的RPC實現

RPC即遠程服務調用html

出現緣由:隨着項目愈來愈大,訪問量愈來愈大,爲了突破性能瓶頸,須要將項目拆分紅多個部分,這樣比起傳統的項目都是本地內存調用,分佈式的項目之間須要在網絡間進行通訊apache

服務之間的遠程調用一般有兩種方式,即基於TCP的遠程調用和基於Http的遠程調用json

RPC=Remote Produce Call 是一種技術的概念名詞. HTTP是一種協議,RPC能夠經過HTTP來實現,也能夠經過Socket本身實現一套協議來實現安全

爲何須要RPC,而不是簡單的HTTP接口 服務器

http接口是在接口很少、系統與系統交互較少的狀況下,解決信息孤島初期常使用的一種通訊手段;優勢就是簡單、直接、開發方便。利用現成的http協議進行傳輸。可是若是是一個大型的網站,內部子系統較多、接口很是多的狀況下,RPC框架的好處就顯示出來了,首先就是長連接,沒必要每次通訊都要像http同樣去3次握手什麼的,減小了網絡開銷;其次就是RPC框架通常都有註冊中心,有豐富的監控管理;發佈、下線接口、動態擴展等,對調用方來講是無感知、統一化的操做。第三個來講就是安全性。最後就是最近流行的服務化架構、服務化治理,RPC框架是一個強力的支撐網絡

 

基於TCP的RPC實現
一、基本思路架構

首先,遠程控制調用RPC的本質仍是底層的Scoket通訊。對於簡單的設計實現來講,其基本思路是:app

一、服務的調用方Consumer經過Socket創建起與服務的提供方Provider的鏈接;
二、Consumer將須要調用的方法名稱和參數經過Socket發送給Provider;
三、Provider獲取Consumer請求的數據並進行解析,執行具體的某一個方法,構造返回數據,返回給Consumer;
四、Consumer得到Provider返回的數據進行相應的處理;框架

 

RPC是基於socket通訊,在協議層面處於較底層,優勢是傳輸效率高,可是開發難度相對較高,而HTTP處於較高層面,開發難度相對較小,不用維護socket端口和數據序列化相關問題,可是傳輸效率比起TCP來低了一些socket

 

Dubbo(淘寶開源的基於TCP的RPC框架)

Hessian(基於HTTP的遠程方法調用)

RMI(遠程方法調用)是JAVA自帶的遠程方法調用工具,不過有必定的侷限性,畢竟是JAVA語言最開始時的設計,後來不少框架的原理都基於RMI

 

基於http的RPC實現

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>
@Test
    public void testHttpService() throws UnsupportedEncodingException {
        System.out.println("測試http請求開始~");
        //封裝請求參數
        Map map = new HashMap<String, String>();
        map.put("reqData","Hello World,世界你好~");
        //http://localhost/testHttpService  請求的服務器地址URL
        String resp = HttpUtil.post("http://localhost/testHttpService", map);
        System.out.println("http服務返回結果爲:"+ com.alibaba.fastjson.JSON.toJSON(resp));
    }
@RequestMapping("/testHttpService")
    public void testHttpService(HttpServletRequest request,HttpServletResponse response) throws IOException {
        logger.info("測試HTTP請求 服務端開始~");
        String reqData=request.getParameter("reqData");

        //模擬 相關業務邏輯處理
        logger.info("處理相關業務~reqData="+reqData);

        //模擬 返回業務結果
        logger.info("業務處理完成,返回結果~");
        Map mapResult=new HashMap();
        mapResult.put("success",true);
        mapResult.put("code","0000");
        mapResult.put("msg","http請求測試成功~");
        //防止Http請求中文亂碼
        response.setHeader("Content-Type", "text/html;charset=utf-8");
        PrintWriter printWriter=response.getWriter();
        printWriter.write(com.alibaba.fastjson.JSON.toJSONString(mapResult));
        printWriter.flush();
        logger.info("測試HTTP請求 服務端結束~");

    }
相關文章
相關標籤/搜索