RPC 淺談

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

上一篇文章講到的互聯網中通常都會涉及都這部分技術,那麼通常學習都會基於 「Scrum 模式」(LZ 自創模式,非正式^_^)去思考——是什麼?幹嗎用的?有什麼好處?java

LZ自認爲萬物圍繞上面三個問題,通常就會深刻展開學習,纔是最有效率最能表明訴求的;好了廢話很少說,正式開始。git

是什麼?github

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

顧名思義,這一技術都會涉及到通信概念中的傳輸層,能夠理解「網絡」。spring

在這裏我也先普及一下後面會說起到的一些基本概念知識,現有的RPC框架按底層協議區分機制通常分爲兩種:長鏈接和短鏈接。apache

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

*關於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實現,歡迎同窗互相學習吐槽,後續會看時間繼續補充系列文章。

相關文章
相關標籤/搜索