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