1 基于TCP协议的RPC
1.1 RPC名词解释
RPC全称Remote Process Call,即远程过程调用,实现方式很多,有RMI,WebService 等诸多成熟的方案。
1.2 对象的序列化
无论是何种数据类型的数据,最终都需要转换成二进制流在网络上传输。将对象转换为二进制流的过程称为对象的序列化,将二进制流恢复为对象的过程称为对象的反序列化。常用的方案有Google的Protocal Buffers、java 本身内置的序列化方式、Hessian,以及JSON和XML等。
java 内置序列化实现:
Hessian序列化,需要hessian-4.0.7.jar:
1.3 基于TCP协议实现RPC
基于socket API ,我们能实现一个简单的RPC调用,
服务接口:
服务的实现:
服务消费者Consumer类的实现。实际生产环境中处于性能考虑,往往使用非阻塞式IO,以提供更大的吞吐量:
服务提供者Provider的实现:
服务提供端事先将服务实例化后放到services这个MAP中,通过while循环,不断的根据请求调用。
2 基于HTTP协议的RPC
2.1 HTTP协议栈
HTTP是超文本传输协议 HypertextTransfer Protocol 的缩写。它构建于TPC和IP协议之上,它不需要处理下层协议间诸如丢包补发、握手及数据分段和重组等问题。
OutputStream中写入一个int类型,会截取低8位,丢弃高24位,因此需要转换为字节流。
2.2 HTTP请求与响应
Web浏览器与Web服务器之间的一次HTTP请求与响应过程,需要完成如下几个步骤。
2.3 通过HttpClient发送HTTP请求
HttpClient对HTTP协议通信的过程进行了封装,提供高效且功能丰富的客户端编程工具包。
2.4 使用HTTP协议的优势
基于TCP协议的RPC,能够更灵活的对协议字段进行定制,减少网络传输字节数,降低网络开销,提高性能,但是需要更多的关注底层负责的细节,实现代价更高,难以得到平台厂商和开源社区的支持,较难实现跨平台调用。
基于HTTP协议的RPC可以使用JSON和XML格式的响应数据,非常便捷和简单。
基于TCP协议的RPC实现,需要考虑多线程并发、锁、IO等复杂的底层实现,而基于HTPP协议的实现很多WEB容器已经处理好了这些事情,如Tomcat、JBoss、Apache等。
基于HTTP协议的实现,传输内容相同的情况下,效率会比基于TCP协议数据传输低。通过优化代码和使用gzip数据压缩,能够缩小这一差距。
2.5 JSON和XML
JSON JavaScript Object Notation 是一种轻量级数据交换语言。
使用jackson-all.jar工具包实现JSON对象的转换:
XML 可扩展标记语言 ExtensibleMarkup Language 可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义,用于标记电子文件使其具有结构性的源语言。
使用xstream.jar 工具包对JAVA对象进行转换:
2.6 RESTful 和RPC
两种主流的URL链接风格,一种是RPC,另一种是REST。
REST是Roy Thomas Fielding 在2000年的博士论文中提出。他是HTTP协议的主要设计者、Apache服务器的作者之一、Apache基金会的第一任主席。REST即 Representational State Transfer ,表现层状态转换。网络上的一个资源,用URL进行访问,资源通过表现层呈现出来,如图片可以通过JPG格式来表现,也可以通过GIF格式来表现,一段文字可以用HTML来表现,也可以通过JSON、XML来表现。如果客户端想要操作服务器,必须通过某种手段,如HTTP协议中的几种操作方式,如GET、POST、PUT、DELETE。这便是REST原则的一个大致思想,符合REST原则的设计,便称之为RESTful风格。
通过SpringMVC实现RESTful的CRUD操作:
2.7 基于HTTP协议的RPC实现
服务接口:
服务实现:
服务消费者实现,通过 servlet 解析请求参数,通过httpClient进行参数封装和远程调用:
服务提供者的实现,通过servlet获得远程调用请求,解析参数,通过serviceMap中已保存的服务,进行调用:
通过SpringMVC实现基于RESTful的 RPC。
服务消费者的实现:
服务提供者的实现:
Spring的配置: