Spring 接口限流
Spring 接口限流是指在高并发场景下,对接口进行限制访问次数的一种技术手段。通过限制接口的访问速度和频率,可以保护系统不受到突发流量的冲击,防止系统崩溃或者性能下降。 ...

Spring 接口限流是指在高并发场景下,对接口进行限制访问次数的一种技术手段。通过限制接口的访问速度和频率,可以保护系统不受到突发流量的冲击,防止系统崩溃或者性能下降。 ...

homedir 是一个不借助 cgo 获取用户目录的 go 库。 使用 go 内置的 os/user 也可以获取用户目录,但是在 Darwin 系统中需要使用 cgo,这意味着任何使用了 os/user 的 go 代码都不能交叉编译。但是大多数时候使用 os/user 都只是为了获取用户目录。 ...

colly 是用 Go 语言编写的功能强大的爬虫框架。它提供简洁的 API,拥有强劲的性能,可以自动处理 cookie&session,还有提供灵活的扩展机制。 ...

pie 封装了对切片和 map 的常用操作,能满足工作中的大部分需求。比如计算切片的交集、差集;对切片中元素按条件过滤的 Filter 函数;对切片中元素进行数据转换的 Each、Map 函数等。 ...

singleflight 来源于准官方库 golang.org/x/sync/singleflight,能够抑制对下游的多次重复请求。主要提供了以下三个方法: // Do(): 相同的 key,fn 同时只会执行一次,返回执行的结果给 fn 执行期间,所有使用该 key 的调用 // v: fn 返回的数据 // err: fn 返回的err // shared: 表示返回数据是调用 fn 得到的还是其他相同 key 调用返回的 func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool) // DoChan(): 类似 Do() 方法,以 chan 返回结果 func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result // Forget(): 失效 key,后续对此 key 的调用将执行 fn,而不是等待前面的调用完成 func (g *Group) Forget(key string) 使用方法 package main import ( "context" "fmt" "golang.org/x/sync/singleflight" "sync/atomic" "time" ) type Result string func find(ctx context.Context, query string) (Result, error) { return Result(fmt.Sprintf("result for %q", query)), nil } func main() { var g singleflight.Group const n = 5 waited := int32(n) done := make(chan struct{}) key := "https://weibo.com/1227368500/H3GIgngon" for i := 0; i < n; i++ { go func(j int) { v, _, shared := g.Do(key, func() (interface{}, error) { ret, err := find(context.Background(), key) return ret, err }) if atomic.AddInt32(&waited, -1) == 0 { close(done) } fmt.Printf("index: %d, val: %v, shared: %v\n", j, v, shared) }(i) } select { case <-done: case <-time.After(time.Second): fmt.Println("Do hangs") } } 输出结果如下: ...
