100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 微服务调用为什么用RPC框架 – java – 前端

微服务调用为什么用RPC框架 – java – 前端

时间:2019-08-23 23:42:53

相关推荐

微服务调用为什么用RPC框架 – java – 前端

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使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。