微服务调用为什么用RPC框架?
RPC是一种概念,http是RPC实现的一种方式,用http交互其实就已经属于rpc了!
RPC 协议名词解释在一个典型RPC的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中RPC协议就指明了程序如何进行网络传输和序列化 。也就是说一个RPC协议的实现就等于一个非透明的RPC调用,如何做到的的呢?
RPC 协议的组成1.地址:服务提供者地址
2.端口:协议指定开放的端口
3.运行服务
nettyminaRMI服务servlet容器(jetty/tomcat/Jboss)4.报文编码:协议报文编码 。注①:http 报文编码 。注②:Dubbo 报文编码
5.序列化方式
Hessian2SerializationDubboSerializationJavaSerializationJsonSerializationRPC协议报文编码与实现详解1、HTTP协议报文
2、Dubbo协议报文
协议编解码过程Dubbo 支持的RPC协议列表1、dubbo
实现描述: 传输服务: mina, netty(默认), grizzy序列化: dubbo, hessian2(默认), java, fastjson 自定义报文
连接描述:
单个长连接NIO异步传输
适用场景:
1、常规RPC调用2、传输数据量小 3、提供者少于消费者
2、rmi
实现描述:
传输:java rmi 服务序列化:java原生二进制序列化
连接描述:
多个短连接BIO同步传输
适用场景:
1、常规RPC调用2、与原RMI客户端集成 3、可传少量文件 4、不支持防火墙穿透
3、hessian
实现描述:
传输服务:servlet容器序列化:hessian二进制序列化
连接描述:
基于Http 协议传输,依懒servlet容器配置
适用场景:
1、提供者多于消费者2、可传大字段和文件 3、跨语言调用
4、http
实现描述:
传输服务:servlet容器序列化:http表单
连接描述:
依懒servlet容器配置
适用场景:
1、数据包大小混合
RPC 传输实现RPC的协议的传输是基于 TCP/IP 做为基础使用Socket 或Netty、mina等网络编程组件实现。但有个问题是TCP是面向字节流的无边边界协议,其只管负责数据传输并不会区分每次请求所对应的消息,这样就会出现TCP协义传输当中的拆包与粘包问题
拆包与粘包产生的原因们知道tcp是以流动的方式传输数据,传输的最小单位为一个报文段(segment)。tcp Header中有个Options标识位,常见的标识为mss(Maximum Segment Size)指的是,连接层每次传输的数据有个最大限制MTU(Maximum Transmission Unit),一般是1500比特,超过这个量要分成多个报文段,mss则是这个最大限制减去TCP的header,光是要传输的数据的大小,一般为1460比特。换算成字节,也就是180多字节。
tcp 为 提高性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了之后,再将缓冲中的数据发送到接收方。同理,接收方也有缓冲区这样的机制,来接收数据。这时就会出现以下情况:
应用程序写入的数据大于MSS大小,这将会发生拆包应用程序写入数据小于MSS大小,这将会发生粘包接收方法不及时读取套接字缓冲区数据,这将发生粘包。拆包与粘包解决办法设置定长消息,服务端每次读取既定长度的内容作为一条完整消息{"type":"message","content":"hello"}\n使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有