AdairXie Blog

坚持做对的事情,并把事情做对

谈谈 Golang 中的 Data Race

到底啥是原子性

Any race is a bug 我在接手其他同事的 golang 项目时,一般都会习惯性的做一个竞态检测。有时总会得到一些“惊喜”,比如像下面这段代码: package main import ( "fmt" "runtime" "time" ) var i = 0 func main() { runtime.GOMAXPROCS(2) ...

说下 Kong 的非主流 Service Mesh 之路

Service Mesh

转载自 聊一聊微服务网关 kong 近期的模型变迁 我也不喜欢最新的 Kong Service 模型,这里讨论一些我曾经的疑问。 在 0.13.X 版本之前,Kong 的核心域模型名为 API Object Routes,从 0.13.X 版本开始,Kong 引入了 Service/Route Object,把 API Object 标记为 deprecated。在当前的 1.1...

Golang Dep 依赖冲突处理

Dep Dependencies

对于 Golang 应用内存堆栈的监控,基本都是读取 runtime.MemStats,然后发往一些 TSDB 进行可视化展示。代码一般都是这样的: memStats := &runtime.MemStats{} runtime.ReadMemStats(memStats) 如果希望获取 GC 状态,可以这样: gcstats := &debug.GCStats{Pa...

Kong 0.12.3 的一处内存泄漏分析

OpenResty TroubleShooting

Kong 0.12.3 是最后一个以 API 形式组织接口的版本,后续的版本中 Kong 新增了 Service 和 Route 的概念,对于插件的应用规则更加复杂,当然也更为灵活。不过就我个人而言,我更喜欢直接以 API 的形式来管理接口,简单粗暴,所以也就用 0.12.3 这个版本多一些。 然而这个版本当开启 bot-detection 插件的时候会有比较严重的内存泄漏问题。不过,复现...

OpenResty Con 2017 中的一个彩蛋

welcome to the future

上周的「Ant Design」圣诞节彩蛋事件确实炸开了锅,我相信加彩蛋的初衷是好的,只是这次玩过了火。最后搞得比较重,作者不得不出来发布道歉。其实在开源软件中,加彩蛋是一种乐趣,并不为奇。那为什么这个事件会成为一个反例?我觉得@依云的看法就很好: 在程序库中加入未预期的行为,是十分不负责任的表现。 库应当提供机制而非策略,并且具有良好定义的行为。软件中彩蛋这种东西由来已久,为什么这...

IPv4 也是可以访问 IPv6 服务的

Golang 总是喜欢一厢情愿的隐藏掉很多细节

起因 对于 Golang 的 net.Listen() 函数,如果你不强行指定 IPv4 或 IPv6 的话,在双栈系统上默认只会监听 IPv6 地址。比如,用 Golang 实现一个 HTTP 服务非常简单: package main import ( "net/http" ) type helloHandler struct{} func (h *helloHandler) ...

也谈 ngx.ctx 继承问题

适合自己的才是最好的

在前一阵子的 OpenResty Con 2018 上,来自又拍云的 @tokers 分享了他们对 ngx.ctx 的 hack,以确保在发生内部跳转后 ngx.ctx 的信息依旧不会丢失。其实这个 hack 早在去年就被 @tokers 分享到了社区:ngx.ctx inheirt,并且写了一篇文章来详细阐述其思路:对 ngx.ctx 的一次 hack 这回呢,@tokers 重新封装并...

If-None-Match 在刷票软件中的应用

那些刷票的骚操作

优化系统的极限就是不发送任何请求,这一点通常使用缓存来实现。例如,在一些流量非常大 WEB 的系统中,我们通常会在源站前面启用 CDN。这样用户直接访问的是 CDN 中的缓存内容,降低真实服务端的压力。 同样服务端在输出响应时,可以通过响应头输出一些与缓存有关的信息,从而达到少发或不发请求的目的。 例如,服务端可以通过响应头里的 Last-Modified(最后修改时间) 或者 ET...

Golang -ldflags 的一个技巧

go version 信息注入

我在开发 go 的项目时,习惯上会在编译后的二进制文件中注入 git 等版本信息后再发布。一直以来都是这么做的: package main import ( "fmt" "os" "runtime" ) var buildstamp = "" var githash = "" func main() { args := os.Args if len(args) == 2 &...

Kong 插件开发指南

Plugin Development

Kong 的插件使用了一个叫 Classic 的 class 机制。所有的插件都是从 base_plugin.lua 基类上继承而来。base_plugin.lua 定义了插件在各个阶段被执行的方法名: function BasePlugin:init_worker() ngx_log(DEBUG, "executing plugin \"", self._name, "\": ini...