系统设计,协议先行。
大部分人不了解协议的设计细节,更多使用已有协议进行应用层设计,例如:
使用HTTP,设计 get/post/cookie 参数,以及json包格式;
使用dubbo,而不用去深究内部的二进制包头包体细节;
无论如何,了解协议设计的原则,对深入理解系统通信非常有帮助。
所谓“协议”,是双方共同遵守的规则,例如:离婚协议,停战协议。协议有语法、语义、时序三要素:
语法,即数据与控制信息的结构或格式;
语义,即需要发出何种控制信息,完成何种动作以及做出何种响应;
时序,即事件实现顺序的详细说明;
画外音:后文主要讲语法设计。
应用层协议选型,常见的有三种:文本协议、二进制协议、流式XML协议。
文本协议是指“贴近人类书面语言表达”的通讯传输协议,典型的协议是HTTP协议,一个HTTP协议的请求报文样例如下:
复制
GET / HTTP/1.1
User-Agent: curl
Host: musicml.net
Accept: */*
文本协议的特点是:
可读性好,便于调试;
扩展性较好,能通过key:value扩展;
解析效率不高,一行一行读入,按照冒号分割,解析key和value;
对二进制不友好 ,比如语音/视频等;
它使用的是Google的Protobuf协议,容易看到:
请求报文传入的是用户名与密码;
响应包返回的是用户的uid;
PB是很流行的二进制变长包体协议,其优点为:
通用,可以生成C++、Java、PHP等多语言代码;
自带压缩功能;
对二进制友好;
在工业界已广泛应用;画外音:Google出品,必属精品。