如何实现远程通信?
1、Webservice:效率不高基于soap协议。项目中不推荐使用。
2、使用restful形式的服务:http+json。很多项目中应用。如果服务太多,服务之间调用关系混乱,需要治疗服务。
3、使用dubbo。使用rpc协议进行远程调用,直接使用socket通信(进程间通信)。传输效率高,并且可以统计出系统之间的调用关系、调用次数
首先了解一下IPC概念:
进程间通信(IPC,InterProcess Communication):是指在不同进程之间传播或交换信息。
IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。
ISO模型:
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLIP,PPP,MTU
socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用,从而实现进程在网络中通信。
在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所谓的socket编程,只要熟悉这些接口即可。
短连接
连接->传输数据->关闭连接
HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束后就中断连接。短连接是指SOCKET连接后发送后接收完数据后马上断开连接。
长连接
连接->传输数据->保持连接->传输数据->....->关闭连接
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
http的长连接
HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持,但还是无状态的,或者说是不可以信任的。
那什么场景下使用长连接或者短连接?
长连接多用于操作频繁,点对点的通讯(及时通讯),而且连接数不能太多。每个TCP连接都需要三次握手,建立连接,会比较耗时。如果每个操作都要先连接,再操作的话,处理速度会降低很多。长连接的特点是每个操作完后都不断开连接,直接发送数据包就可以了,不需要每次都建立连接。
使用场景如下:
1.数据库的连接用长连接。如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建也是对资源的浪费。
2.像web网站的http服务一般都是用短连接,因为长连接对于服务器来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一点资源,如果用长连接,而且同时又成千上万的用户,如果每个用户都占用一个连接的话,并发量大,对服务器的压力比较大。如果每个用户无需频繁操作情况下需用短连接。
备注理解:
连接的长短跟Socket没有关系,Socket只是操作系统提供给应用程序进行网络通信的抽象API。但是需要理解的是Socket API大多数情况下工作在传输层(偶尔可以工作在数据链路层),这意味着,你可以使用Socket开发基于TCP、UDP等的应用。
HTTP是基于TCP的应用层协议,虽然TCP是支持长连接的,但是HTTP并不强制要求长连接,大部分情况下,一次HTTP请求的完成经过了建立TCP链接
->客户端发送报文
->服务端返回报文
->服务端或客户端关闭此连接
这个过程,由于每次都要建立连接,并在完成一次请求响应后关闭连接,所以大家称为“短连接”。HTTP的所谓Keep-Alive,实际上是一种不可控的行为,是为了在一定程度上改善HTTP性能的,即服务端和客户端希望不立刻断开连接,这样下次发送数据时就不需要建立TCP连接了,但是服务端和客户端的任何一方都可以随时断开。
HTTP keep-alive connection timeouts
Firefox: 约115秒(定义在about:config中的network.http.keep-alive.timeout)
Chrome: 约320秒
Opera: 约120秒
MSIE: 约60秒(可以在注册表中自定义)
Nginx: 默认值75秒(keepalive_timeout 75s)
HTTP 1.1默认启用的HTTP持久连接(keep-alive)能够在keepalive_timeout前省去每次传输报文都要建立TCP连接(三次握手)的时间和开销.
keep-alive期间服务端和客户端的TCP连接状态是ESTABLISHED,执行以下命令可见:
date && sudo netstat -antp |grep "127.0.0.1"|egrep "firefox|nginx"|egrep "ESTABLISHED|WAIT"
i表示不区分大小写,在查一次相当于"AND条件","|"表示"OR条件".
sudo netstat -antp|head -n2 && sudo netstat -antp|grep firefox