了解Web开发中的网关接口协议

了解Web开发中的网关接口协议

前言

最近软工课团队做了个uniapp+django的项目,我虽然负责前端,但是后端都是佬,就偶尔偷师学艺一下。

以前也用过Django搭建过Web服务,部署的似乎一般就是一条指令完事:

python manage.py runserver 80

但是后端项目里看佬们使用了一堆看不懂的uwsgi、ASGI……阿巴阿巴。

故作此文,督促自己去学习新东西。


我们需要考虑Web开发的两大部分:

  • Web服务器:

    • 解析来自客户端的请求报文,从而调用Web框架程序来处理请求

    • 处理Web框架程序的返回值来组织成响应报文

  • Web框架:

    • 进行路由解析与分发,从而找到相应的正确处理函数

    • 编写处理函数来实现业务逻辑

这里我们就能看出,如何要实现不同的Web服务器和Web框架交叉混用,最关键的一点就在于规范Web服务器和Web框架之间的调用关系,这也就是接口协议的由来。


而这个接口协议的一切的一切都得从CGI说起。

CGI是一种协议,是一种通用的网关接口协议,是Web服务器运行时针对外部程序的一种规范,需要注意的是CGI支持多种语言原生,也就是通用

CGI初步实现一个最直觉的Web服务过程:客户端向Web服务器发送数据调用服务并取得返回值

FastCGI则在CGI的基础上扩展了更多的功能,突出一个Fast……=。=哦真的吗?其实不一定会更快。主要区别在于其令CGI解释器称为常驻内存的进程,减少了解释器的反复加载带来的性能消耗。

FastCGI会起很多CGI解释器进程,由FastCGI进程管理器管理,将来自客户端的请求分发给这些常驻内存的CGI解释器进程。参考CGI 和 FastCGI 协议的运行原理

SCGI是Simple CGI,是CGI的一种替代版本,强调实现更加简单。

WSGI则同样是一种Web服务器的网关接口协议,但是是为Python语言专门定义的。

基于Python实现的Web框架太多了,某位程序员不堪其扰,干脆定义了WSGI,希望让所有基于Python实现的Web框架都要支持WSGI

ASGI则在WSGI的基础上进一步支持了异步,添加了对WebSocket的支持,同样是一种协议。

WebSocket是一种不同于HTTP的协议,实现了基于TCP协议的全双工通信,而且和HTTP具有良好的兼容性。在握手部分使用HTTP协议,而其最大特点在于持久化有状态,这与无状态的HTTP协议形成了良好互补。参考WebSocket 是什么原理?为什么可以实现持久连接?

uWSGI是一种快速便携的Web服务器软件,采用C编写,支持上述的协议。

uWSGI是Web服务器,是一种桥梁,一边处理着HTTP请求,一边使用上述协议与应用程序进行交互

nginx是一种更专业的久经验证的Web服务器软件,其相较于uWSGI的区别在于其更加复杂而功能更加全面,处理静态资源会更加优秀,且能够进行均衡负载。因此一般采用nginx根据策略转发给多个uWSGI服务器,再由uWSGI根据接口协议调用框架程序。

uwsgi是一种基于二进制的线路协议,专门用于uWSGI服务器通信,可以用它在nginx和uWSGI间建立更加高效的链接。

uwsgi协议相较于其他协议提供了更高的性能,利用二进制文件加快机器解析速率


Django自带了自己的支持WSGI协议的Web服务器,因此我们通常采用这么一条指令就能启动服务,其中自动使用这套自带的Web服务器作为桥梁。

python manage.py runserver 80

通常来说,我们在调试期间使用这座桥梁是完全足够的。但是面临实际生产环境或新的需求时,这座基于WSGI的桥梁就不大行了:

  • 基于同步的WSGI不支持异步通信,不支持WebSocket

  • WSGI协议的性能可能不达预期

因此我们需要为我们的后端配置新的Web服务器,通常来说我们采用uWSGI服务器,因为其支持所有上述协议。


posted @ 2022-05-15 10:31  neumy  阅读(287)  评论(0编辑  收藏  举报