AdairXie Blog

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

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 的种子...

谈谈 Kong rate-limiting 插件中的缺陷

Redis 高频卡控中的 Race Conditions 问题

知名 API 网关 Kong 有个 rate-limiting 的插件,可以利用它来实现限流的需求。例如:根据特定时间窗口来限制 API 的调用次数。其关键代码是这么实现的: red:init_pipeline() for i = 1, idx do red:incrby(keys[i], value) if expirations[i] then red:expire(k...

pairs 的遍历顺序

其实本质上还是按照顺序遍历的

在 Lua 中,我们经常使用 pairs 来遍历一个 “hashmap”,但是你有没有想过,pairs 遍历的顺序到底依据的是啥? 为了搞清楚这个问题,这里先来做个测试: 注:以下测试结果均基于 Lua 5.1.4 case 1 local st = { lguafYWz = "1 ", BNwGryzZ = "2 ", FuKaDkdd = "3 "...

Lua string hash 算法

JSHash

我在前一篇文章介绍过下面这 3 个字符串拥有相同的 hash,会导致 Hash Dos 问题: "0000000000000000000000000000000000" "f0l0l0w0m0e0n0t0w0i0t0t0e0r0?0:0)0" "x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0" 但是 Lua 并没有将自己的 string hash 算法暴露出来,那...