Poslua Blog

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

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

Kong 插件加载机制概述

以请求的视角回顾自己的一生

概述 插件可以认为是 Kong 管理 API 的核心,其模块化和可扩张性做得很好,尤其是其灵活的加载机制使得 Kong 能够针对不同 API 启用、组合任意插件。Kong 默认自带的插件集,按照功能的不同大致可以分为六大类:Authentication 认证、Security 安全、Traffic Control 流量控制、Analytics & Monitoring 分析监控、T...

Source Code Pro 字体其实并不完美

Courier New 不愧为终端之王

事情的起因是这样的,前两天我在服务器上看到一个莫名其妙的文件夹 ‐p,所以决定删了它,于是顺手就敲了 rm -rf -- -p。 然而执行结果却令人意外:rm 提示目录并不存在。 rm 删除包含特殊字符的文件时,需要 -- 参数 显然这里显示出来的 ‐p 其实并不是 ASCII 中的 -p。之后我又手动的拷贝了 ll 输出的 -p,这一次成功删除了这个目录。 为了彻底弄清...

浅谈 Kong key-auth 插件 token 的生成

CSPRNG or 真随机?

最近我在 Kong 的 Blog 上看了一篇文章:That’s So Random: (Pseudo)Random Data Generation in Kong API Gateway,文章中介绍了 Kong 是怎么处理随机数问题的,读后受益良多,在此做一个分享。 seed 的生成 在 OpenResty 中如果使用 ngx.now() 设置种子的话,将会导致各个 worker 的种子...