RPC 淺談


RPC——Remote Procedure Call Protocol,這是廣義上的解釋,遠程過程調用。但是,我接下倆要說的是應用層面的,而不是所謂協議層面的。

上一篇文章講到的互聯網中一般都會涉及都這部分技術,那么一般學習都會基於 “Scrum 模式”(LZ 自創模式,非正式^_^)去思考——是什么?干嘛用的?有什么好處?

LZ自認為萬物圍繞上面三個問題,一般就會深入展開學習,才是最有效率最能代表訴求的;好了廢話不多說,正式開始。

是什么?

應用層開發說的RPC概念也是一種“接口”or“服務”的具體實現,也是一種SOA(面向服務架構)的實現手段。

顧名思義,這一技術都會涉及到通訊概念中的傳輸層,可以理解“網絡”。

在這里我也先普及一下后面會提及到的一些基本概念知識,現有的RPC框架按底層協議區分機制一般分為兩種:長連接和短連接。

長連接:一般基於Socket,而短鏈接一般都是基於HTTP的,會遵循三次握手原則。

*關於Socket,TCP/IP, HTTP 三者的概念及關系,度娘說的比LZ好。

LZ的理解,一句話:Socket是底層通訊層的通訊端口API,TCP/IP是基於Socket那一層通訊層之上的協議,而HTTP是TCP/IP的實現。

而我在這里說的RPC就是用具體技術代碼實現的,能讓對方通過傳輸層調用的一種服務。

干嘛用的?

在一般的公司,不光只有一個業務,也許會涉及到很多部門很多Team很多Project,以現有電子商務業務為例子:商品,供應鏈,訂單,交易,財務,倉儲,配送,售后,還有例

如上一篇文章提到的很多中間件業務,這些業務下面還會有Project,每個Team負責一部分業務,這些業務邏輯實現通常對外部是透明的而業務又緊密關聯的,都會相互依賴相互

調用,這時候對方無需知道也不應該知道該業務怎么實現,只需知道我入口滿足什么條件得到自己所需的信息即可,所以每個Team會發布一個服務出來提供給需求方調用。

有什么好處?

1.每個調用方只需要提出需求,不需要了解對方具體的業務。

2.各自模塊各自業務隔離開來,滿足面向對象思維,各自封裝各自的業務邏輯,不會因為不熟悉業務的人的修改而導致系統崩潰。

3.可以實現跨語言跨平台調用,.NET可以調用JAVA服務,反之亦可。

4.易於拓展,易於復用,當然滿足了面向對象的特性肯定有具有面向對象的優勢了。此處舉個實例,當然的項目因為業務分布不一樣,后端服務邏輯一樣,有.NET平台的

winForm端及JAVA web 的PC頁面,改造的時候只需要做一套所謂的展示即可,調用的服務是一樣的。

.......(此處優勢待兄弟們補充,實在是架構上的必備寶刀)

==================================================

上述說了那么多,接下來就是具體的實例了。

長連接的框架有最出名的Dubbo,MINA,Netty;Dubbo底層其實也是用后兩者包裝的,都是基於JAVA NIO的實現。阿里內部還有一個未開源的HSF。

長連接框架優勢:效率高,適用於內部業務系統間的調用,都經歷雙11這種節奏的調用,不要LZ說明了吧,腦補一下就好。

Dubbo的資料文檔太多太全了,無需LZ廢話。直接度娘鏈接即可,LZ最近也做了源碼拜讀

短鏈接的框架最常用的RESTFul ,Hessian,SOAP。

  RESTful WSDL Hessian
協議 HTTP SOAP Binary
性能
優缺點

優點:易擴展,數據結構多變

缺點:安全方面,規范化不夠

優點:文檔結構直觀,樣式統一

缺點:數據格式大,開銷大,耦合緊

優點:簡單易用,數據傳輸小,效率高

缺點:安全性,異常機制不完善

適用性

一般的對外接口服務都能滿足,不限於平台

一般的對外接口服務都能滿足,通用性高

一般適應於系統內部間調用

以LZ最喜歡的RESTful為實例,在java里實現RESTful有很多,Axis2,Xfire,CXF和Java6自帶的WebService引擎,下面用最常見的CXF方式為實例。

接下來就是Quick Start了。

傳送門:https://github.com/luyichenn/COD 

這里是半成品,后續會補充集成上各種。這次着重看 cod-web  cod-ws  這兩個包。

首先,先搭建一個web項目,因為RESTful 基於HTTP 必定需要web容器,這里不做過多解釋,參照git項目配置。

然后看cod-web下resources下有ws包下面的兩個配置文件,一個常規CXF配置:spring-rest-config.xml 一個是加密帶token方案,參見spring-rest-token-config.xml

具體暴露接口:  com.cod.basic.ws.rest.BasicQueryService

這次用的是JAX-RS(JSR 311,Java API for XML-RESTful Web Services)是基於annotation的實現方式,我們通過annotation的方式把一個java class標注成RESTful

webservice,並把它的方法標注成HTTP的CRUD。相關的annotation有@path, @Produces,@GET, @POST, @DELETE,@PUT, @PathParam等,對java開發人員在使用起來比較

方便。

@Path("/basic")  這個就是路徑

@Consumes({"application/json"})

@Produces({"application/json"})

這兩個我相信一下就是解釋說明數據格式的

最終請求REST服務的路徑:http://localhost:8090/service/rest/?_wadl

參見web.xml 里的

    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>
            org.apache.cxf.transport.servlet.CXFServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/service/*</url-pattern>
    </servlet-mapping>

也就是攔截/service/* 的服務

參見spring-rest-config.xml 里的

  <jaxrs:server address="/rest">
        <jaxrs:serviceBeans>
            <bean class="com.cod.basic.ws.rest.BasicQueryService"/>
        </jaxrs:serviceBeans>
       
        <jaxrs:providers>
            <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
        </jaxrs:providers>

        <jaxrs:inInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
        </jaxrs:inInterceptors>
        <jaxrs:outInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
        </jaxrs:outInterceptors>
    </jaxrs:server>

也就是攔截<jaxrs:server address="/rest"> 的服務,最終會在瀏覽器里看到

最終請求方法的URL即為:http://localhost:8090/service/rest/basic/query/findRestService?_wadl

會看到控制台的HTTP status:200

 以上就是簡單的RPC RESTful CXF實現,歡迎同學互相學習吐槽,后續會看時間繼續補充系列文章。


免責聲明!

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



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