有什么原因吗?
WSGI
协议是Python特有的。对于Go,您有三个选项(实际上是四个,但普通的CGI
不应被认为适用于中高负载设置):
在这种情况下,您的应用是一个独立的服务器。这可能是最简单的设置,但可能会有以下问题:
goagain
)。与以上相同,但在反向HTTP
代理后面,以Web服务器的形式。
大多数情况下,消除了独立变体的问题,但仍具有传递完整HTTP
流量的开销。
通过合适的Web服务器使用FastCGI
。Nginx
和Apache
(以及众多其他)都可以使用。Go标准库中有FCGI客户端实现。
除了没有独立设置的问题之外,还实现了更高效的数据交换协议。另一个优点是,您的Go服务器可能使用Unix管道与前端Web服务器通信,这比反向HTTP
代理变体涉及的TCP套接字具有更少的传输成本。
因此,如果您的设置当前使用了WSGI
,我建议选择FCGI
。
¹ 正如几位评论者指出的那样,严格来说,这并不完全正确:WSGI允许将用任何语言编写的Web应用程序与Web服务器或应用程序服务器(反过来连接到Web服务器)解耦。
为了实现这一点,双方必须使用相同的协议WSGI,该协议是与语言无关的。
然而,似乎大多数非Python编写的软件都会使用HTTP或FastCGI与前端服务器通信。
更新于2020-11-19
正如Andrea Citrolo在他们的评论中正确指出的那样,在当前普遍存在容器化的情况下,当您部署多个相同服务的副本,并需要对它们进行负载平衡时,使用纯HTTP通常是唯一的选择。
我还要补充的是,如果您打算将用Go编写的程序暴露在互联网上(这很好),则应阅读此文。
FastCGI
和HTTP
反向代理 - 我同意您的观点,独立服务器应该是所有解决方案中最快的。 - kostix默认情况下,uWSGI Go插件支持
http.DefaultServeMux
处理程序,因此如果您的应用程序已经基于它,那么在uWSGI中运行它应该非常简单。
以下示例改编自uWSGI文档:
package main
import (
"uwsgi"
"net/http"
"fmt"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "<h1>Hello, World!</h1>")
}
func main() {
http.HandleFunc("/hello/", helloHandler)
uwsgi.Run()
}
http.ListenAndServe()
。
uwsgi就像一个适配器,可以让你插入不同的语言。
WSGI是一种协议。uwsgi只共享"wsgi"这几个字母。
这就像说香蕉和芭蕉是一样的,如果你需要保姆,你应该买香蕉。这是不合适的。 - user2312578这里有一个Go WSGI服务器:
http://bitbucket.org/classroomsystems/wsgi
然而,它的目的不是为了使Python服务器更快 - 它运行单个带有GIL的CPython解释器。我编写它是为了在我们的产品从Python移动到Go时,为我的客户提供平稳的过渡。