限流算法

常见的限流算法主要有两种:令牌桶和漏桶算法,也可以使用计数器进行粗暴限流实现。

算法原理

计数器

维护一个请求数量,在一段时间里,如果请求总数超过了limit,那么我们可以把这个请求拒绝掉,也可以将其放入到缓冲队列中,等待下一个时间段再进行操作。

阅读更多

负载均衡

背景

在实际生产过程中,我们往往会通过集群的方式部署服务器,而不是单机部署,从而可以提高服务的并发能力。

但是这样部署产生了一个新的问题:如何决定某个请求发往的服务器?这就是负载均衡算法所需要解决的问题。

阅读更多

一致性哈希

背景

在介绍一致性哈希之前,首先来看看集群部署可能发生的问题:比如说我现在有5台 Redis 服务器,正常运行了很久,很不巧有一天A服务器崩溃了,这个时候还有4台服务器,系统还可以正常运行,原来发送到A服务器的请求我们肯定要想办法进行重定向吧,如果说我们使用一般的哈希函数进行分配,无疑是 hash(key) % num,不过因为 num 现在变成了 num-1,那么很有可能所有的请求都会发生改变打到不同的服务器上,原来发送到B的请求重新处理之后可能发送到了C服务器了。

阅读更多

Gin 快速上手

使用 Go 搭建 Web 后端,最简单的就是使用原生的 net/http 库了,下面是一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"fmt"
"net/http"
)

func greet(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello World!")
}

func main() {
http.HandleFunc("/", greet)
http.ListenAndServe(":8080", nil)
}

运行代码之后,便会在8080端口处监听,接收客户端的请求,然后返回响应,访问 http://localhost:8080 即可以访问到对应的内容。

阅读更多

Golang 选项模式

需求

Golang不支持在函数定义的时候声明默认值,也就是说我们不能够使用类似下面的代码

1
2
3
func New(addr string="localhost",  port string="8080"){
...
}

并且也不支持函数的重载,函数名不能够重复,无法根据需要的参数数量创建不同的函数形式,也就是我们不能使用下面的方式

1
2
3
4
5
6
7
func New(addr string){
...
}
// 再次使用同样的函数名会报错
func New(addr string, port string){
...
}
阅读更多