漏桶算法与令牌桶限流算法实现

限流算法 在开发中我们可能会遇到接口访问频次过高,这时候就需要做流量限制,你可能是用的 Nginx 这种 Web Server 来控制也可能是用了一些流行的类库实现。在分布式

GoKit使用:熔断与限流

限流 限流实现 gokit 基于go包 golang.org/x/time/rate 内置了一种实现. 本次实现基于gokit内建的类型endpoint.Middleware,该类型实际上是一个func

GoKit使用:日志功能

基础日志 Gokit有自身的基础日志模块,配置如下: 1 2 3 4 5 6 var logger log.Logger { logger = log.NewLogfmtLogger(os.Stderr) //错误输出到控制台 logger = log.With(logger, "ts", log.DefaultTimestampUTC) logger = log.With(logger, "caller", log.DefaultCaller) } 如果我们想要加入通用日

GoKit使用:注册发现

server 服务注册: 1、连接注册中心 2、注册当前服务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 package

Go实现层级时间轮

引言 在软件系统中,“在一段时间后执行一个任务” 的需求比比皆是。比如: 客户端发起 HTTP 请求后,如果在指定时间内没有收到服务器的响应,则自动断开连接

Golang如何获取MySQL的各类型数据

数据类型对应关系 时间类型的转换 修改DSN 构建 DSN 时增加 loc 指定时区,并区增加对时间的解析。打印出来的 uri: 1 xiaoju:@tcp(127.0.0.1:3306)/test?charset=utf8&loc=Asia%2FShanghai&parseTime=true 后面的 parseTime 必须要有,用法如下: 这样

Go中TrimLeft和TrimPrefix的区别

问题 看这样一个例子: 1 2 3 4 5 6 7 8 9 10 11 package main import ( "fmt" "strings" ) func main() { str := "/some/key" fmt.Println(strings.TrimLeft(str, "/some")) } 1 2 3 key Program exited. 上例有正确返回,再看一例: 1 2 3 4 5 6 7 8 9 10 11 package main import

Go的timer和ticker用法

定时器:timer time包中有两个函数可以帮我们初始化 time.Timer (类型) 在高性能场景下,不应该使用time.After,而应该使用New.Time

Go的定时器源码剖析

前言 准确的时间对于任何一个正在运行的应用非常重要,但是在分布式系统中我们很难保证各个节点的绝对时间一致,哪怕通过 NTP 这种标准的对时协议也只能把

单机定时器的实现方案

理解定时器 很多场景会用到定时器,例如 使用 TCP 长连接时,客户端需要定时向服务端发送心跳请求。 财务系统每个月的月末定时生成对账单。 双 11 的 0 点,定时

异步任务队列:machinery源码剖析

导语 异步任务,是每一位开发者都遇到过的技术名词,在任何一个稍微复杂的后台系统中,异步任务总是无法避免的,而任务队列由于其松耦合、易扩展的特性

分布式延时任务方案

引言 在开发中,往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个

cron库源码剖析

Cron表达式 基本cron格式: 1 2 3 4 5 6 7 8 # cron格式說明 # ┌──分鐘(0 - 59) # │ ┌──小時(0 - 23) # | │ ┌──日(1 - 31

一致性哈希算法实现

一致性哈希算法 我们希望构造一种函数 f(k,n)→m 把字符串映射到 n 个槽上: 它的输入是随机到来的字符串 k 和 槽的个数 n. 输出是映射到的槽的标号 m ,

go generate介绍

介绍 go generate命令是go 1.4版本里面新添加的一个命令,当运行go generate时,它将扫描与当前包相关的源代码文件,找出所有包含