深度思维者

永远年轻,永远热泪盈眶

摘要: 1. 忽略某个字段 格式 // 使用json tag指定json序列化与反序列化时的行为 type Person struct { Name string `json:"name"` // 指定json序列化/反序列化时使用小写name Age int64 Weight float64 `json: 阅读全文
posted @ 2021-09-16 09:51 failymao 阅读(15) 评论(0) 推荐(0) 编辑
摘要: 1. 对创建的gorouting负责 1.1 不要创建一个你不知道何时退出的 goroutine 下面的代码有什么问题? 是不是在我们的程序种经常写类似的代码? // Week03/blog/01/01.go package main import ( "log" "net/http" _ "net 阅读全文
posted @ 2021-09-14 23:41 failymao 阅读(1448) 评论(2) 推荐(5) 编辑
摘要: 1. 限流对比 类型 实现 优点 缺点 单机限流 令牌桶 1. 稳定可靠,实现简单,性能高2. 支持突发流量应对 1. 流量不均匀会导致误限制2. 阈值设置较为困难,需要提前压测 漏桶 1. 稳定可靠,实现简单,性能高 1. 流量不均匀会导致误限制2. 阈值设置较为困难,需要提前压测3.不支持突发流 阅读全文
posted @ 2021-09-10 07:58 failymao 阅读(38) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 无论是令牌桶, 漏桶 还是 自适应限流的方法,总的来说都是服务端的单机限流方式。虽然服务端限流虽然可以帮助我们抗住一定的压力,但是拒绝请求毕竟还是有成本的。如果我们的本来流量可以支撑 1w rps,加了限流可以支撑在 10w rps 的情况下仍然可以提供 1w rps 的有效请求,但是流 阅读全文
posted @ 2021-09-09 00:10 failymao 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 令牌桶与 漏桶 两种算法最大的一个问题就是他们都属于需要提前设置阈值的算法,基于 QPS 进行限流的时候最麻烦的就是这个阈值应该怎么设定。一般来说我们可以通过压测来决定这个阈值。但是也会存在问题 如果每个系统上线前都要经过很严格的压测,那么成本相对来说会比较大 很多时候压测都会在测试环境 阅读全文
posted @ 2021-09-06 07:56 failymao 阅读(19) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 在上一篇文章 Go微服务: 令牌桶 当中简单的介绍了令牌桶实现的原理,然后利用 /x/time/rate 这个库 10 行代码写了一个基于 ip 的 gin 限流中间件,那这个功能是怎么实现的呢?接下来我们就从源码层面来了解一下这个库的实现。这个实现很有意思,并没有真正的使用一个定时器不 阅读全文
posted @ 2021-09-03 07:32 failymao 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 1. 令牌桶 1.1 原理 我们以 r/s 的速度向桶内放置令牌,桶的容量为 b , 如果桶满了令牌将会丢弃 当请求到达时,我们向桶内获取令牌,如果令牌足够,我们就通过转发请求 如果桶内的令牌数量不够,那么这个请求会被缓存等待令牌足够时转发,或者是被直接丢弃掉 由于桶的存在,所以令牌桶算法不仅可以限 阅读全文
posted @ 2021-09-01 07:57 failymao 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 1. panic 在什么情况下使用panic? 在程序启动的时候,如果有强依赖的服务出现故障时panic退出 在程序启动的时候,如果发现有配置明显不符合要求,可以panic退出(预防编程) 其他情况下只要不是不可恢复的程序错误,都不应该直接panic,应该返回error 在程序入口处,例如gin中间 阅读全文
posted @ 2021-08-08 23:51 failymao 阅读(33) 评论(0) 推荐(0) 编辑
摘要: 这里列举的Go语言常见坑都是符合Go语言语法的,可以正常的编译,但是可能是运行结果错误,或者是有资源泄漏的风险。 1. 可变参数是空接口类型 当参数的可变参数是空接口类型时,传入空接口的切片时需要注意参数展开的问题。 package main import "fmt" func main() { v 阅读全文
posted @ 2021-08-04 07:35 failymao 阅读(304) 评论(2) 推荐(2) 编辑
摘要: 1. 简介 为了确保一致性构建,Go引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。 考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构 阅读全文
posted @ 2021-08-03 07:03 failymao 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 1. 简介 GOPATH模式下,依赖包存储在$GOPATH/src,该目录下只保存特定依赖包的一个版本,而在GOMODULE模式下,依赖包存储在$GOPATH/pkg/mod,该目录中可以存储特定依赖包的多个版本。 需要注意的是$GOPATH/pkg/mod目录下有个cache目录,它用来存储依赖包 阅读全文
posted @ 2021-08-02 23:00 failymao 阅读(28) 评论(0) 推荐(0) 编辑
摘要: 1.简介 在go.mod中通常使用语义化版本来标记依赖,比如v1.2.3、v0.1.5等。因为go.mod文件通常是go命令自动生成并修改的,所以实际上是go命令习惯使用语义化版本。 诸如v1.2.3和v0.1.5这样的语义化版本,实际是某个commit ID的标记,真正的版本还是commit ID 阅读全文
posted @ 2021-08-02 07:29 failymao 阅读(20) 评论(0) 推荐(0) 编辑
摘要: 1. 简介 Go module的版本选择机制,其中介绍了一个Module的版本号需要遵循v<major>.<minor>.<patch>的格式,此外,如果major版本号大于1时,其版本号还需要体现在Module名字中。 比如Module github.com/RainbowMango/m,如果其版 阅读全文
posted @ 2021-08-02 07:14 failymao 阅读(45) 评论(0) 推荐(0) 编辑
摘要: 1. 版本选择机制 使用go get <pkg>来获取某个依赖,如果没有特别指定依赖的版本号,go get会自动选择一个最优版本,并且如果本地有go.mod文件的话,还会自动更新go.mod文件. 事实上除了go get,go build和go mod tidy也会自动帮我们选择依赖的版本。这些命令 阅读全文
posted @ 2021-08-01 22:36 failymao 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 1.indirect含义 在使用 Go module 过程中,随着引入的依赖增多,也许你会发现go.mod文件中部分依赖包后面会出现一个// indirect的标识。这个标识总是出现在require指令中,其中//与代码的行注释一样表示注释的开始,indirect表示间接的依赖。 比如开源软件 Ku 阅读全文
posted @ 2021-08-01 17:21 failymao 阅读(57) 评论(0) 推荐(0) 编辑
摘要: 前言 Go提供了两种定时器, 即 一次性定时器, 周期定时器 一次性定时器:定时器只计时一次,结束便停止 周期定时器:定时器周期性进行计时 本篇将快速介绍这两种定时器的基本用法,重点介绍其内部实现原理,最后再给出一个案例揭示使用定时器的风险。 Timer 定时器 简介 Timer实际上是一种单一事件 阅读全文
posted @ 2021-07-27 07:44 failymao 阅读(31) 评论(0) 推荐(0) 编辑
摘要: 单元测试的原则,就是你所测试的函数方法,不要受到所依赖环境的影响,比如网络访问等,因为有时候我们运行单元测试的时候,并没有联网,那么总不能让单元测试因为这个失败吧?所以这时候模拟网络访问就有必要了。 对于go的web应用程序中往往需要与其他系统进行交互, 比如通过http访问其他系统, 此时就需要一 阅读全文
posted @ 2021-07-22 23:39 failymao 阅读(40) 评论(0) 推荐(0) 编辑
摘要: 前言 benchmark测试是实际项目中经常使用的性能测试方法,我们可以针对某个函数或者某个功能点增加benchmark测试, 以便在CI测试中监测其性能变化,当该函数或功能性能下降时能够及时发现。 此外,在日常开发活动中或者参与开源贡献时也有可能针对某个函数或功能点做一些性能优化,此时,如何把be 阅读全文
posted @ 2021-07-20 07:31 failymao 阅读(26) 评论(0) 推荐(0) 编辑
摘要: 前言 go test有非常丰富的参数,一些参数用于控制测试的编译,另一些参数控制测试的执行。 有关测试覆盖率、vet和pprof相关的参数先略过,我们在讨论相关内容时再详细介绍。 控制编译的参数 -args 指示go test把-args后面的参数带到测试中去。具体的测试函数会根据此参数来控制测试流 阅读全文
posted @ 2021-07-19 23:16 failymao 阅读(16) 评论(0) 推荐(0) 编辑
摘要: 简介 简单的说,子测试提供一种在一个测试函数中执行多个测试的能力,比如原来有TestA、TestB和TestC三个测试函数,每个测试函数执行开始都需要做些相同的初始化工作,那么可以利用子测试将这三个测试合并到一个测试中,这样初始化工作只需要做一次。 除此之外, 子测试还提供了诸多便利, 下面逐一说明 阅读全文
posted @ 2021-07-18 11:59 failymao 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 1. 忽略某个字段 格式 // 使用json tag指定json序列化与反序列化时的行为 type Person struct { Name string `json:"name"` // 指定json序列化/反序列化时使用小写name Age int64 Weight float64 `json: 阅读全文
posted @ 2021-09-16 09:51 failymao 阅读(15) 评论(0) 推荐(0) 编辑
摘要: 1. 对创建的gorouting负责 1.1 不要创建一个你不知道何时退出的 goroutine 下面的代码有什么问题? 是不是在我们的程序种经常写类似的代码? // Week03/blog/01/01.go package main import ( "log" "net/http" _ "net 阅读全文
posted @ 2021-09-14 23:41 failymao 阅读(1448) 评论(2) 推荐(5) 编辑
摘要: 1. 限流对比 类型 实现 优点 缺点 单机限流 令牌桶 1. 稳定可靠,实现简单,性能高2. 支持突发流量应对 1. 流量不均匀会导致误限制2. 阈值设置较为困难,需要提前压测 漏桶 1. 稳定可靠,实现简单,性能高 1. 流量不均匀会导致误限制2. 阈值设置较为困难,需要提前压测3.不支持突发流 阅读全文
posted @ 2021-09-10 07:58 failymao 阅读(38) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 无论是令牌桶, 漏桶 还是 自适应限流的方法,总的来说都是服务端的单机限流方式。虽然服务端限流虽然可以帮助我们抗住一定的压力,但是拒绝请求毕竟还是有成本的。如果我们的本来流量可以支撑 1w rps,加了限流可以支撑在 10w rps 的情况下仍然可以提供 1w rps 的有效请求,但是流 阅读全文
posted @ 2021-09-09 00:10 failymao 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 令牌桶与 漏桶 两种算法最大的一个问题就是他们都属于需要提前设置阈值的算法,基于 QPS 进行限流的时候最麻烦的就是这个阈值应该怎么设定。一般来说我们可以通过压测来决定这个阈值。但是也会存在问题 如果每个系统上线前都要经过很严格的压测,那么成本相对来说会比较大 很多时候压测都会在测试环境 阅读全文
posted @ 2021-09-06 07:56 failymao 阅读(19) 评论(0) 推荐(0) 编辑
摘要: 1.序 除开前面章节讲到的令牌桶算法实现的网络限流外, 还有另外一种常见的限流算法, 漏桶算法 2. 漏桶算法 漏桶算法(Leaky Bucket) 是网络世界中 流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的一种算法,它的主要目的是控制数据注入到网络 阅读全文
posted @ 2021-09-05 00:23 failymao 阅读(29) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 在上一篇文章 Go微服务: 令牌桶 当中简单的介绍了令牌桶实现的原理,然后利用 /x/time/rate 这个库 10 行代码写了一个基于 ip 的 gin 限流中间件,那这个功能是怎么实现的呢?接下来我们就从源码层面来了解一下这个库的实现。这个实现很有意思,并没有真正的使用一个定时器不 阅读全文
posted @ 2021-09-03 07:32 failymao 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 1. 令牌桶 1.1 原理 我们以 r/s 的速度向桶内放置令牌,桶的容量为 b , 如果桶满了令牌将会丢弃 当请求到达时,我们向桶内获取令牌,如果令牌足够,我们就通过转发请求 如果桶内的令牌数量不够,那么这个请求会被缓存等待令牌足够时转发,或者是被直接丢弃掉 由于桶的存在,所以令牌桶算法不仅可以限 阅读全文
posted @ 2021-09-01 07:57 failymao 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 隔离设计源于船舶行业,一般而言无论大船还是小船,都会有一些隔板,将船分为不同的空间,这样如果有船舱漏水一般只会影响这一小块空间,不至于把整个船都给搞沉了。 同样我们的软件服务也是一个道理,我们要尽量避免出现一个问题就把这个业务给搞挂的情况出现 那什么是「服务隔离」呢? 顾名思义,它是指将 阅读全文
posted @ 2021-08-30 23:29 failymao 阅读(293) 评论(1) 推荐(0) 编辑
摘要: 1.前言 前面的章节讲述了项目结构, 依赖注入,API设计,包管理,单元测试。。。基本上还是将工程化当中的大部分东西都讲到了。 结合前面文章中提到的各种知识来看一下如何将一个老的项目迁移到新的项目结构当中来,这里面的坑也非常的多。 2. 重构前 2.1 目录结构 你的目录结构可能是这样的。 ├── 阅读全文
posted @ 2021-08-25 23:36 failymao 阅读(18) 评论(0) 推荐(0) 编辑
Fork me on GitHub