前言
什么是协议?协议可以认为是一种语言,是一种交互的标准。比如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这种标准协议来交互。