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