通过本文你能彻底理解协议的发展历程,各个协议的优缺点
问题1grpc协议 ,dubbo 协议,rest 协议,json协议,xml协议,htttp1 和http2 协议的根本区别 在哪?我们为什么要了解协议?
协议的作用
协议是软件之间交互的根本。最早的通信协议是基于socket,为了降低复杂度,降低门槛1984年,Bruce Jay Nelson 发表了奠定基础性的论文 Implementing Remote Procedure Call,定义了系统之间互通这种远程调用的标准。定义了如何解决了两个应用系统之间交互的根本,沟通的术语。比如传递的什么什么对象,对象有哪些属性,这次调用调用的是哪个接口?底层的传输是用什么协议解决的?http1?http2?netty?mina?传输的过程中链路断开了怎办?服务怎发现?
借用下插图
xml
姑且称第一代协议。协议的特点,1可读性比较强。2面向对象,定义了对象,属性,属性类型,服务。
应用场景 :在以前传统软件行业中应用比较多。
解决的问题:解决了有无的问题。降低了服务端和客户端的耦合性问题。
缺点: 协议内容比较大,带来的效率低下,性能低。
json
为了精简xml文件的大小,后来就出现了json格式,定义了key value格式,json格式比xml更简约,体积更精简,字符传输毕竟还是体积过大,为了进一步提升性能,出现了二进制格式
二进制
通过对对象进行编解码,压缩,序列化后二进制传递,字段使用了简称代替,比如"ABC" 字段名,我用1代替,后面出现的。属性的引用,全是1标识,就大大压缩了体积。这样在高并发系统中,减少了数据的传输,极大提高了性能 。grpc dubbo rpc 都是这些思想的产物。下面重点就对这些协议进行对比。
跨编程语言:Hessian rpcx gRPCThrift,其他不支持
支持REST:Dubbox,Spring Cloud
dubborpc 和grpc 进行比较。
grpc 支持跨平台,跨语言,性能是这些prc框架最高的。支持http2传输协议,双向传输。适用一些服务端 推送客户端的场景,支持流式传输,响应式编程适用io密集型的场景。grpc 有如此之多的好处。但是有一个缺点,不支持服务治理,dubbo将其纳入体系。完美解决了问题
rest 和rpc 进行比较
rest 基于http协议的。采用json进行传输内容。rest比rpc 协议的依赖性耦合性更松,不需要客户端依赖服务端发布的接口定义。rest 适用于和浏览器前端进行交互的协议。rpc 适合后端系统之间的调用,REST是一种设计风格,它的很多思维方式与RPC是完全冲突的。 RPC的思想是把本地函数映射到API,也就是说一个API对应的是一个function,我本地有一个getAllUsers,远程也能通过某种约定的协议来调用这个getAllUsers。至于这个协议是Socket、是HTTP还是别的什么并不重要; RPC中的主体都是动作,是个动词,表示我要做什么。 而REST则不然,它的URL主体是资源,是个名词。而且也仅支持HTTP协议,规定了使用HTTP Method表达本次要做的动作,类型一般也不超过那四五种。这些动作表达了对资源仅有的几种转化方式
http1 和http2 有什么区别?
http2 和http1 相比本质上支持链路复用,所谓的链路复用 ,就是一条链接链路上可以分批发送不同请求的数据,这是因为协议的规范性改进了。带来的性能的提升。http1 的协议规范之间的间隔,服务端通过读取 换行符 和结束符 进行处理,无法支持多个请求在一个通道进行传输,http2 在http1的协议基础上,定义了此次传输的数据大小。流有多少帧构成,无需非得等待一个业务请求处理完,才进行下一个业务请求的处理,穿插着进行传输就行。
问题2,带来了性能的提升
grpc 利用probuffer 进行序列化和反序列化。pb的性能很高,为什么高呢?有以下特点。
1 编解码简单,高效,不同的类型数据进行编码。 只需要简单的数学运算,位移操作即可。
2存储紧凑高效。
3反序列化高效,hession2 还采用反射法