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实现,欢迎同窗互相学习吐槽,后续会看时间继续补充系列文章。