Bootstrap

【dubbo系列】dubbo协议与http协议对比

前言
​ 什么是协议?协议可以认为是一种语言,是一种交互的标准。比如A和B互相发手机短信。A和B必须互相知道对方手机号(IP地址),知道手机号后,全部使用汉语(协议)即可互相通信。
​ http即超文本传输协议,它是运行在TCP之上的应用层协议。http诞生之初主要是应用于WEB端内容获取。http协议简单快速,支持很多请求方法,如GET,POST等等;使用灵活,可以传输任意数据,只需要Content-Type标记即可;安全性,使用https交互,可防止数据窃取;

​ 既然http应用这么厉害,为什么还会dubbo协议?那么dubbo协议存在的意义又是什么?

报文格式不同

​ 创建socketServer,因为http是tcp之上的协议,dubbo是tcp协议进行传输,所以通过socketServer即可查看两者发送数据的区别。

 public static final Integer port = 8080;
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(port);
            Socket accept = serverSocket.accept();
            InputStreamReader reader = new InputStreamReader(accept.getInputStream());
            BufferedReader bufferedReader = new BufferedReader(reader);
            String str = null;
            while ((str = bufferedReader.readLine())!=null){
                System.out.println("----------");
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

启动之后,通过浏览器发送一个简单的http请求,比如http://localhost:8080/index.html?userName=123这种请求是其为常见的。
在这里插入图片描述

我们只是需要请求index.html,并且携带userName=123,即可发现,浏览器发送了很多数据,浏览器类型,cookie等等。

通过dubbo客户端发送一个简单的dubbo请求,比如访问com.nacos.dubbo.service.IUserService接口中的getUserInfo方法并且入参为哈哈

在这里插入图片描述

请求数据很明显,http协议数据量要大很多。

传输方式不同

​ http协议是应用层协议,是一种无状态协议,在交互之前需要进行tcp三次握手,握手成功之后进行数据传输。不知道大家有没有想过,http每次传输都需要三次握手么?那么本来一个页面那么多http请求都需要三次握手么?岂不是很浪费资源?

​ 在早期的HTTP/1.0中,每次http请求都要创建一个连接,而创建连接的过程需要消耗资源和时间,为了减少资源消耗,缩短响应时间,就需要重用连接。在后来的HTTP/1.1中,引入了重用连接的机制,就是在http请求头中加入Connection: keep-alive来告诉对方这个请求响应完成后不要关闭,下一次咱们还用这个请求继续交流。协议规定HTTP/1.1如果想要保持长连接,需要在请求头中加上Connection: keep-alive,而HTTP/1.1默认是支持长连接的,有没有这个请求头都行。

​ dubbo默认使用socket长连接,即首次访问建立连接以后,后续网络请求使用相同的网络通道。

总结

​ 通过如上对比,到现在dubbo存在的意义就很明显了,dubbo协议追求的是数据量小,小则快,协议的设计也符合dubbo框框架的理念,适用与内部服务之间的数据交互。安全性就没有https做的那么好,但是也不需要,毕竟dubbo协议设计的初衷就是内部使用的。

​ 既然dubbo协议适用于服务之间的互相调用。spring cloud的feign内部为什么使用http协议呢?个人认为是架构的需要吧,例如服务A是java写的,服务B是python写的。这个时候dubbo协议就跑不通了。只能用http这种标准协议来交互。

;