Go与HTTP

很多曾经都是使用PHP和Python进行Web开发的人对于怎么使用Go语言构建Web应用往往存在疑惑。疑惑的主要原因大概有如下两点:

  1. 习惯了使用框架编写Web应用,他们面对的是取出Request的参数,然后根据自己内部的逻辑,实现相应的数据处理,然后返回或者不返回。
  2. 传统的web开发往往会输出模版文件,换句话说,就是面对浏览器的输出,返回的结果往往都是一个html文件。

从PHP或者Python迁移到Go,往往都是有一个比较重要的原因:那就是为了提升性能。提升性能这个工作,往往对底层了解的越多,那么方向也就越明确。因此,这里要明确一点:所谓的Web编程就是网络编程,一个远程数据交换的过程。接下来的内容描述,假设读者了解使用TCP进行网络编程,在Go里面,网络编程可以简单的抽象为对一个文件描述符的读和写。

以前的Web编程,主要是偏向于输出html文件,而随着移动互联网的到来,现在的web编程慢慢向着移动设备转移。因此Web编程会更加纯粹化,不再需要去关注具体的展示格式,而只要关注数据内容本身就可以了。内容的具体展示效果由客户端或者浏览器去做,现在诸多前端框架的出现,也正体现了这种思想的趋势,例如 AngularJS 等,它们都更加关注数据本身,彻底将前后端的编程进行隔离。

在我还在学校的时候,就觉得在html里面嵌入PHP代码是一种无比丑陋的事情。而这些年前后端的发展,也体现了数据和展示分离的大趋势。Web编程向基于API编程的方向发展,我觉得整体的抽象程度更加高了,对编程人员的能力要求也更加高了,开发人员多少需要知道一些网络的知识,需要清楚的知道HTTP格式,这些应用层的数据是如何在基于TCP连接之上进行传输的,它们是如何被打包和解包的。

基于API的编程,其数据抽象更加纯粹,因此Web框架扮演的角色就没有那么重要了,Web Server仅仅是一个代理的作用,而不是像PHP,Web Server同时兼顾着容器的作用。开发者在读取网络数据和将数据写入网络的时候,要有一个面向字节流编程的概念。举一个简单的例子,在传统的Web开发中,很少有人会关注POST方法的body中的数据编码格式是怎样的,JSON? 表单?区别在哪里?因为这些都在框架层面做了,相对于开发者而言,只需要根据框架提供的接口读取相应的数据即可。但是,我希望在使用Go进行Web开发的时候,不是这样子的,你需要清楚的知道数据内容在网络传输中的样子。这种思想对于在定位问题的时候非常有帮助,尤其是在输入输出的时候,因为你清楚每一个细节。

面向的越是底层,写出来的代码越是高性能。当然这个思想也要根据场景有个度,一味追求高性能,可能会带来效率上负面影响,最终我们还是需要做出应用,而不是搞研究。我觉得Go语言就是编写API服务合适语言,当然它在处理Json的序列化和反序列化上存在性能缺陷,但是我个人认为可以使用生成代码的方式去优化,避免使用 interface{} 类型。因为确定性编程,在工程上给我们带来的好处是无法拒绝的。

基于文档的编程,代码即文档,文档即代码。在面向API编程的方式中,服务写好了,往往需要提供一份可靠的文档才能供其他人来使用。而开发接口的时候,也是根据文档进行的,因此,API文档是可以由对应的项目代码生成的,而反过来根据API文档是可以自动化测试API接口服务的。

项目 -> API文档 -> 自动化测试项目	

这是一条非常良性的链条。

基于模版的Web编程是一种过时的Web开发方式,它是在Web时代到来的初期产生的一种Web开发方式。真正的Web开发方式随着 Web2.0 到来的时候就应该是面向API的Web开发。这种开发方式才是更加适合程序去处理的一种方式,也是更加合理和自然的Web开发。当然上面还提到了接口文档导出,以及基于文档的自动化测试,这种思想可以引出一种我认为是工程化开发的思想,这种思想,将编码抽象成面向代码的开发,而不是面向功能的开发,以后有时间可以谈一谈这种思想。

Xiang Chao 02 May 2015
blog comments powered by Disqus
Fork me on GitHub