RPC
RPC 全称是 Remote Procedure Call, 也称为远程过程调用,通过 RPC 我们可以像调用本地方法一样远程调用某个方法。这个「远程的方法」可能部署在不同的机器,使用不同的开发语言开发等等。
RPC 是解决进程间通信的技术。部署在同一台机器上的多个进程,实际是远程的一种情况。Dubbo 在 Java 应用中的使用,对于 RPC 来说,是两方使用相同的编程实现的一种情况。
流行的RPC框架
目前流行的开源RPC框架还是比较多的。下面重点介绍三种:
1、gRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言。我们知道HTTP2.0是基于二进制的HTTP协议升级版本,目前各大浏览器都在快马加鞭的加以支持。这个RPC框架是基于HTTP协议实现的,底层使用到了Netty框架的支持。
2、Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架。它有一个代码生成器来对它所定义的IDL定义文件自动生成服务代码框架。用户只要在其之前进行二次开发就行,对于底层的RPC通讯等都是透明的。不过这个对于用户来说的话需要学习特定领域语言这个特性,还是有一定成本的。
3、Dubbo是阿里集团开源的一个极为出名的RPC框架,在很多互联网公司和企业应用中广泛使用。协议和序列化框架都可以插拔是及其鲜明的特色。同样 的远程接口是基于Java Interface,并且依托于spring框架方便开发。可以方便的打包成单一文件,独立进程运行,和现在的微服务概念一致。
RPC 需要在一条 TCP 链接上进行多次消息传递。
基于 TCP 链接之上的单条消息如果过大,就会被网络协议栈拆分为多个数据包进行传送。如果消息过小,网络协议栈可能会将多个消息组合成一个数据包进行发送。对于接收端来说它看到的只是一串串的字节数组,如果没有明确的消息边界规则,接收端是无从知道这一串字节数组究竟是包含多条消息还是只是某条消息的一部分。
(1)用特殊符号区分:“\r\n”--------------->HTTP 和 Redis 协议就大量使用了\r\n
分割符
(2)消息发送端在每条消息的开头增加一个 4 字节长度的整数值,标记消息体的长度.
注:(HTTP 协议是一种基于特殊分割符和长度前缀法的混合型协议。比如 HTTP 的消息头采用的是纯文本外加\r\n
分割符,而消息体则是通过消息头中的 Content-Type 的值来决定长度。HTTP 协议虽然被称之为文本传输协议,但是也可以在消息体中传输二进制数据数据的,例如音视频图像,所以 HTTP 协议被称之为「超文本」传输协议。)