Poslua Blog

「你是一个出色的程序员」要比「你是一个开发总监」要有意义的多

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...

Kong 的事件和缓存

Kong 集群解析

Kong 从 0.11.0 版本开始节点之间的消息通信改为了数据库轮训机制(原先是通过 serf 实现的),通过最终一致性实现了节点的无状态,任何时候节点只需连上数据库即可工作。 当多个 Kong 节点连接到相同数据库时,便构建起了一个可以动态水平扩展的集群。Kong 通过其多级缓存 lua-resty-mlcache 和 worker 间事件通讯 lua-resty-worker-eve...

TCP 常见故障排查

TCP Troubleshooting

TCP 协议相当复杂,并充斥着各种细节。然而 TCP 协议又是如此重要的一个协议,引领风骚三十年,可以说是互联网的奇迹。这些细节正是 TCP 协议成功的原因,并值得我们深入了解。 1. 丢包,错包 对于 ifconfig 这个命令,我想大家并不陌生,我们常常用它来查看本机的 IP 地址。但是还有些细节往往容易被忽略,那就是网卡的错包和丢包情况: 当然你还可以通过 ethtool -...

Kong 插件非官方 FAQ

Unofficial FAQ

经过了前面对 Kong 插件机制的分析,这里来整理一下非官方 FAQ 以加深理解,以下 FAQ 针对于 Kong 0.12.3 版本。 1. 插件怎么用? 插件可以应用在 API 上;也可以应用在 Consumer 上;同样还能应用在指定 API 的指定 Consumer 上;当然也少不了 GLOBAL 用法。总之,Kong 插件可以有四种启用方式: api consumer...

Kong 插件加载机制源码解析

以请求的视角窥探 Kong 的数据走向

前言 我曾经在前面的文章中系统性的描述了下 Kong 的插件加载机制,这篇我将通过源码解析的方式呈现其数据走向。剔除掉第三方依赖,Kong 的核心代码结构如下: kong/ ├── api/ ├── cluster_events/ ├── cmd/ ├── core/ ├── dao/ ├── plugins/ ├── templates/ ├── tools/ ├── vendor/ ...