暂且放下你的编程语言来瞻仰下我所见过的最棒的标准库。

为项目选择编程语言和挑选你最爱的球队不一样。应该从实用主义出发,根据特定的工作选择合适的工具。

在这篇文章中我会告诉你从何时开始并且为什么我认为 Go 语言如此闪耀,具体来说是它的标准库对于基本的网络编程来说显得非常稳固。更具体一点,我们将要编写一个反向代理程序。

Go 为此提供了很多,但真正支撑起它的在于这些低级的网络管道任务,没有更好的语言了。

反向代理是什么? 有个很棒的说法是流量转发 。我获取到客户端来的请求,将它发往另一个服务器,从服务器获取到响应再回给原先的客户端。反向的意义简单来说在于这个代理自身决定了何时将流量发往何处。

为什么这很有用?因为反向代理的概念是如此简单以至于它可以被应用于许多不同的场景:负载均衡,A/B 测试,高速缓存,验证等等。

当读完这篇文章之后,你会学到:

  • 如何响应 HTTP 请求
  •  如何解析请求体
  • 如何通过反向代理将流量转发到另一台服务器

 我们的反向代理项目

我们来实际写一下项目。我们需要一个 Web 服务器能够提供以下功能:

  • 获取到请求
  • 读取请求体,特别是 proxy_condition 字段
  • 如果代理域为 A,则转发到 URL 1
  • 如果代理域为 B,则转发到 URL 2
  • 如果代理域都不是以上,则转发到默认的 URL

准备工作

环境配置

我们要做的第一件事是将我们的配置信息写入环境变量,如此就可以使用它们而不必写死在我们的源代码中。

.env

以下就是我为特定项目编写的文件内容:

这是我从 12 Factor App 项目中获得的技巧。

.env

在任何时候都可以运行该指令来将配置加载进环境变量。

项目基础工作

main.go
PORTA_CONDITION_URLB_CONDITION_URLDEFAULT_CONDITION_URL/

现在你就可以运行代码了。

解析请求体

handleRequestAndRedirectproxy_condition

通过 proxy_condition 判断将流量发往何处

proxy_condition
proxy_conditionAA_CONDITION_URLproxy_conditionBB_CONDITION_URLDEFAULT_CONDITION_URL

反向代理到 URL

最终我们来到了实际的反向代理部分。在如此多的语言中要编写一个反向代理需要考虑很多东西,写大段的代码。或者至少引入一个复杂的外部库。

然而 Go 的标准库使得创建一个反向代理非常简单以至于你都不敢相信。下面就是你所需要的最关键的一行代码:

注意下面代码中我们做了些许修改来让它能完整地支持 SSL 重定向(虽然不是必须的)。

全部启动

13301331–1333
  1. source .env && go install && $GOPATH/bin/reverse-proxy-demo
  2. http-server -p 1331
  3. http-server -p 1332
  4. http-server -p 1333

这些服务都启动之后,我们就可以在另一个终端中像下面这样开始发送带有 JSON 体的请求了:

如果你在找一个好用的 HTTP 请求客户端,我极力推荐 Insomnia 。

proxy_condition

总结

Go 为此提供了很多,但真正支撑起它的在于这些低级的网络管道任务,没有更好的语言了。我们写的这个程序简单,高性能,可靠并且随时可用于生产环境。

我能看到在以后我会经常使用 Go 来编写简单的服务。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

‍ 代码是开源的,你可以在 Github 上找到。 :heart: 在 Twitter 上我只聊关于编程和远程工作相关的东西。如果关注我,你不会后悔的。