RPC數據通訊

RPC全稱爲Remote Procedure Call,翻譯過來爲「遠程過程調用」。目前,主流的平臺中都支持各類遠程調用技術,以知足分佈式系統架構中不一樣的系統之間的遠程通訊和相互調用。遠程調用的應用場景極其普遍,實現的方式也各式各樣。php

 

從通訊協議的層面,大體能夠分爲:java

基於HTTP協議的(例如基於文本的SOAP(XML)、Rest(JSON),基於二進制Hessian(Binary))python

基於TCP協議的(一般會藉助Mina、Netty等高性能網絡框架)c++

 

從不一樣的開發語言和平臺層面,分爲:web

單種語言或平臺特定支持的通訊技術(例如Java平臺的RMI、.NET平臺Remoting)數據庫

支持跨平臺通訊的技術(例如HTTP Rest、Thrift等)apache

 

從調用過程來看,分爲:編程

同步通訊調用(同步RPC)安全

異步通訊調用(MQ、異步RPC)性能優化

 

常見的幾種通訊方式

1. 遠程數據共享(例如:共享遠程文件,共享數據庫等實現不一樣系統通訊)

2. 消息隊列

3. RPC(遠程過程調用)

 

序列化/反序列化

只有二進制數據才能在網絡中傳輸,序列化和反序列化的定義是:

將對象轉換成二進制流的過程叫作序列化,

將二進制流轉換成對象的過程叫作反序列化。

 

OSI網絡結構的七層模型

各層的具體描述以下:

  第七層:應用層     定義了用於在網絡中進行通訊和數據傳輸的接口 - 用戶程式;提供標準服務,好比虛擬終端、文件以及任務的傳輸 和處理; 
  第六層:表示層     掩蓋不一樣系統間的數據格式的不一樣性; 指定獨立結構的數據傳輸格式; 數據的編碼和解碼;加密和解密;壓縮和 解壓縮 
  第五層:會話層     管理用戶會話和對話; 控制用戶間邏輯鏈接的創建和掛斷;報告上一層發生的錯誤 
  第四層:傳輸層     管理網絡中端到端的信息傳送; 經過錯誤糾正和流控制機制提供可靠且有序的數據包傳送; 提供面向無鏈接的數 據包的傳送; 
  第三層:網絡層     定義網絡設備間如何傳輸數據; 根據惟一的網絡設備地址路由數據包;提供流和擁塞控制以防止網絡資源的損耗 
  第二層:數據鏈路層 定義操做通訊鏈接的程序; 封裝數據包爲數據幀; 監測和糾正數據包傳輸錯誤 
  第一層:物理層      定義經過網絡設備發送數據的物理方式; 做爲網絡媒介和設備間的接口;定義光學、電氣以及機械特性。

 在上述7層中,http協議是應用層協議。HTTP協議是超文本傳送協議(HyperText Transfer Protocol)的縮寫,它是萬維網(World Wide Web,www,也簡稱爲Web)的基礎。HTTP協議設計之初就是爲了實現Web的想法。HTTP協議位於TCP/IP協議棧的應用層。基於HTTP協議的客戶/服務器模式的信息交換過程,分四個過程:創建鏈接、發送請求信息、發送響應信息、關閉鏈接。

而關於RPC的基本概念介紹以下:


英文原義:Remote Procedure Call Protocol
中文釋義:(RFC-1831)遠過程調用協議
   註解:一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加輕易。
   RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息的到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用過程接收答覆信息,得到進程結果,而後調用執行繼續進行。
RPC信息協議由兩個不一樣結構組成:調用信息和答覆信息。

兩者的聯繫是:


RPC OVER HTTP

Microsoft RPC-over-HTTP 部署(RPC over HTTP)容許RPC 客戶端安全和有效地經過Internet 鏈接到RPC 服務器程序並執行遠程過程調用。這是在一個名稱爲RPC-over-HTTP 代理,或簡稱爲RPC 代理的中間件的幫助下完成的。

  RPC 代理運行在IIS 計算機上。它接受來自Internet 的RPC 請求,在這些請求上執行認證,檢驗和訪問檢查,若是請求經過全部的測試,RPC 代理將請求轉發給執行真正處理的RPC 服務器。經過RPC over HTTP,RPC 客戶端不和服務器直接通訊,它們使用RPC 代理做爲中間件。


關於xml-rpc

1.xml rpc是什麼 
1.1. xml rpc簡介 
xml rpc是使用http協議作爲傳輸協議的rpc機制,使用xml文本的方式傳輸命令和數據。 
一個rpc系統,必然包括2個部分:1.rpc client,用來向rpc server調用方法,並接收方法的返回數據;2.rpc server,用於響應rpc client的請求,執行方法,並回送方法執行結果。 
1.2. xml rpc的可用版本 
xml rpc client和xml rpc server都有不少版本的實現。通常而言,一個實現版本都會同時實現client/server。但因爲都知足xml rpc規範,從理論上講,任何一個版本的rpc client實現與任何一個版本的rpc server都能配套使用。 
更進一步,因爲xml rpc以xml文本的方式,使用http協議傳輸,因此與編程語言無關。例如:rpc client的已實現版本包括了:perl,php,python,c/c++,java,等等;rpc server的實現語言包括perl,java,等。 
同一種編程語言所實現的版本也不止一個。例如java版的實現有:Marque的xmlrpc實現(http://xmlrpc.sourceforge.net/),apache的xmlrpc 實現(http://ws.apache.org/xmlrpc/)

1.3.xmlrpc的工做原理 
完整的須要參考xmlrpc規範(http://www.xmlrpc.com/spec
簡單描述: 
rpcclient的工做原理:rpcclient根據URL找到rpcserver -> 構造命令包,調用rpcserver上的某個服務的某個方法 -> 接收到rpcserver的返回,解析響應包,拿出調用的返回結果。 
rpcserver的工做原理:啓動一個webserver(在使用內置的webserver的狀況下) -> 註冊每一個能提供的服務,每一個服務對應一個Handler類 ->進入服務監聽狀態。

 

常見RPC技術和框架

1)應用級的服務框架:Dubbo/Dubbox、ZeroICE、GRpc、Spring Boot/Spring Cloud。

2)遠程通訊協議:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。

3)通訊框架:MINA和Netty。

五、圖例說明

二.RPC架構的做用

    RPC框架的主要目標就是讓遠程服務調用更簡單、透明。RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式(XML/JSON/二進制)和通訊細節。開發人員在使用的時候只須要了解誰在什麼位置提供了什麼樣的遠程服務接口便可,並不須要關心底層通訊細節和調用過程。

一、從通訊協議的層面,大體能夠分爲:

(1)基於HTTP協議的(例如基於文本的SOAP(XML)、Rest(JSON),基於二進制Hessian(Binary));

(2)基於TCP協議的(一般會藉助Mina、Netty等高性能網絡框架)。

二、只有二進制數據才能在網絡中傳輸,序列化和反序列化的定義是:

(1)將對象轉換成二進制流的過程叫作序列化;

(2)將二進制流轉換成對象的過程叫作反序列化。

三、 RPC架構分爲三部分:

(1)服務提供者,運行在服務器端,提供服務接口定義與服務實現類。

(2)服務中心,運行在服務器端,負責將本地服務發佈成遠程服務,管理遠程服務,提供給服務消費者使用。

(3)服務消費者,運行在客戶端,經過遠程代理對象調用遠程服務。

三.RPC的性能優化

一、性能

影響RPC性能的主要在幾個方面:

(1)序列化/反序列化的框架;

(2)網絡協議,網絡模型,線程模型等。

二、安全

RPC安全的主要在於服務接口的鑑權和訪問控制支持。

四.服務化架構的演進之路

一、MVC架構:當業務規模很小時,將全部功能都不熟在同一個進程中,經過雙機或者負載均衡器實現負債分流;此時,分離先後臺邏輯的MVC架構是關鍵。

二、PRC架構:當垂直應用愈來愈多,應用之間交互不可避免,將核心和公共業務抽取出來,做爲獨立的服務,實現先後臺邏輯分離。此時,用於提升業務複用及拆分的RPC框架是關鍵。

三、SOA架構:隨着業務發展,服務數量愈來愈多,服務生命週期管控和運行態的治理成爲瓶頸,此時用於提高服務質量的SOA服務治理是關鍵。

四、微服務架構:經過服務的原子化拆分,以及微服務的獨立打包、部署和升級,小團隊的交付週期將縮短,運維成本也將大幅度降低。

五.java 實例演示

1)實現技術方案

下面使用比較原始的方案實現RPC框架,採用Socket通訊、動態代理與反射與Java原生的序列化。

2)具體實現

(1)服務提供者接口定義與實現,代碼以下:

[java]  view plain  copy
 
  1. package com.aync.rpcServer;  
  2.   
  3. public interface HelloService {  
  4.     String sayHi(String name);  
  5. }  

(2)HelloServices接口實現類:

[java]  view plain  copy
 
  1. package com.aync.rpcImpl;  
  2.   
  3. import com.aync.rpcServer.HelloService;  
  4.   
  5. public class HelloServiceImpl implements HelloService{  
  6.   
  7.     @Override  
  8.     public String sayHi(String name) {  
  9.          return "Hi, " + name;    
  10.     }  
  11. }  
相關文章
相關標籤/搜索