Ghost

Ghost

You can delete this user to remove all the welcome posts

用 Go 创建一个简易负载均衡器

负载均衡器在 Web 架构中扮演了很关键的角色。它们能在一组后端机器分配负载。这使得服务扩展性更好。因为配置了很多的后端机器,服务也因此能在某次请求失败后找到正常运行的服务器而变得高可用。 在使用了像 NGINX 等专业的负载均衡器后,我自己也尝试着用 Golang 创建了一个简易负载均衡器。Go 是一种现代语言,第一特性是支持并发。Go 有丰富的标准库,使用这些库你可以用更少的代码写出高性能的应用程序。对每一个发行版本它都有静态链接库。 我们的简易负载均衡器工作原理负载均衡器有不同的策略用来在一组后端机器中分摊负载。 例如: 轮询 平等分摊,认为后端的所有机器处理能力相同加权轮询 基于后端机器不同的处理能力,为其加上不同的权重最少连接数 负载被分流到活跃连接最少的服务器至于我们的简易负载均衡器,我们会实现这里边最简单的方式 轮询。 轮询选择轮询无疑是很简单的。它轮流给每个 worker 相同的执行任务的机会。 上图已经说明了,负载均衡器周期性地选择某台服务器。但是我们不能直接使用它,不是吗? 如果后端机器宕机了怎么办?恐怕我们不会希望流量被路由到挂掉的机器上去。因此除非我们添加一些条件,否则不能直接使用这个算法。我们需要把流量只路由到没有挂掉且正常运行的后端机器上。 定义几个结构体修正思路后,现在我们清楚我们是想要一种能跟踪后端机器状态信息的方法。我们需要检查机器是否存活,也需要跟踪 Url。 我们可以简单地定义一个下面的结构体来维护我们的后端机器。 type

深度剖析 Go 中的 Go 协程 (goroutines) -- Go 的并发

Go 协程 (goroutine) 是指在后台中运行的轻量级执行线程,go 协程是 Go 中实现并发的关键组成部分。由于 Go 协程相对于传统操作系统中的线程 (thread) 是非常轻量级的,因此对于一个典型的 Go 应用来说,有数以千计的 Go 协程并发运行的情形是十分常见的。并发可以显著地提升应用的运行速度,并且可以帮助我们编写关注点分离(Separation of concerns,Soc)的代码。 什么是 Go 协程?我们也许在理论上已经知晓 Go 协程是如何工作的,但是在代码层级上,go 协程何许物也?其实,go 协程看起来只是一个与其他众 Go 协程并发运行的一个简单函数或者方法,但是我们并不能想当然地从函数或者方法中的定义来确定一个 Go 协程,go 协程的确定还是要取决于我们如何去调用。 Go 中提供了一个关键字 go 来让我们创建一个 Go

Go 中基于 IP 地址的 HTTP 请求限流

如果你在运行 HTTP 服务并且想对 endpoints 进行限速,你可以使用维护良好的工具,例如 github.com/didip/tollbooth。但是如果你在构建一些非常简单的东西,自己实现并不困难。 我们可以使用已经存在的试验性的 Go 包 x/time/rate。 在本教程中,我们将创建一个基于用户 IP 地址进行速率限制的简单的中间件。 「干净的」HTTP 服务让我们从构建一个简单的 HTTP 服务开始,该服务具有非常简单的 endpiont。这可能是个非常「重」的 endpoint,因此我们想在这里添加速率限制。 package main import ( "log" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/", okHandler) if

京ICP备19016179号-1