随笔分类 - Lua
摘要:背景 全链路监控作为公司的重要的基础设施之一,可以帮助理解系统行为、用于分析性能问题,以便发生故障的时候,能够快速定位和解决问题。 网关作为流量的入口是非常重要的服务,也是全链路中的重要一环,需要讲信息传入全链路系统。 数据生成 全链路包含的信息越全面,查找问题的时候就越方便。 全链路中比较重要的信
阅读全文
摘要:背景 随着云技术和基础架构的成熟,发布过程中可以通过引入相应的发布策略,能让我们在早期实验阶段就可以发现、调整问题,来保证整体系统的稳定性 网关作为流量入口,要求有能力进行流量分流配置支持各种灰度发布、金丝雀发布、滚动更新等模式 发布模式 蓝绿发布 通过部署两套环境来解决新老版本的发布问题,流量逐渐
阅读全文
摘要:背景 使用Openresty作为网关进行动态节点IP负载均衡时,要求网关有能力在负载均衡之前摘除掉有问题的节点。所以网关需要一定的健康检查能力。 设计 如果每一个网关节点都对服务节点进行探活,假设每1s探活一次,网关节点有M个,服务节点有N个,那整个网络中每秒出现M*N条探活协议,而且大部分都是探活
阅读全文
摘要:背景 为网关提供健康检查功能时需要对节点发送http或者tcp探活请求。Openresty 提供cosocket来处理非阻塞IO。 实现 跟工程结合在一起,这里简单拼接数据结构 local function __default_check_alive(status) return status >=
阅读全文
摘要:背景 在程序开发过程中有时会遇到事件流的问题,某一个结果会触发A、B、C等一系列动作。需要将各种事件注册给委托类(Delegate)。Delegate类会依次触发注册的函数,完成相应的动作。 实现原理 lua中可以使用元表和队列的形式进行实现 实现细节 delegate.lua local _M =
阅读全文
摘要:背景 静态的nginx配置需要将负载均衡的服务节点信息都配置在配置文件中。现在微服务或云服务都会接入一些服务发现或者云控平台场景,经常需要更换节点,如果每次都要更新配置并且重启服务是无法接受的,所以需要网关提供动态扩展,实时更新自己负载均衡节点的能力,使用openresty网关需要使用lua扩展来实
阅读全文
摘要:背景 在某些业务场景下,比如数据更新,程序执行,只需要某个进程执行一次,但是其他进程需要知道本次执行的结果,所以就需要一个通知机制,主工作进程执行程序,执行之后的结果通知给其他进程,当然本质上也是通过共享内存进行处理。 场景逻辑 源码准备 本次插件来源依然是来自kong的插件 插件地址:https:
阅读全文
摘要:背景 网关的高可用是比较重要的内容,即使etcd数据库挂掉,也可以根据现有的数据提供负载均衡应用 所以采用几级缓存的形式 cache-->lmdb-->etcd cache属于进程级别,每一个进程都有一个cache,lmdb相当于多个进程的共享内存,只有一个进程master进行同步更新etcd的数据
阅读全文
摘要:背景 在使用openresty时有一些定制化的负载均衡功能,有些元数据是保存在etcd中的,所以需要openresty与etcd进行交互,可以获取全量数据,并且使用etcd的watch功能。 上一篇 1.编译Openresty进行服务器初始化搭建 工程代码库 https://github.com/z
阅读全文
摘要:相关issue https://github.com/openresty/lua-nginx-module/issues/1115 网关采用nginx + lua 进行的功能扩展,在lua中使用ngx.var.proxy_add_x_forwarded_for获取不到值 查看该issue应该是跟版本
阅读全文
摘要:背景 前置网关采用的是ngx中调用lua代码块的形式实现的功能扩展。 在网关开发过程中有很多的waf功能,比较常见就包括黑白名单的功能。为了批量的对某个IP段进行屏蔽,在配置时可能会以CIDR的形式配置IP段 结合lua代码进行处理 计算思路 我们查看某个IP是否在某个用CIDR表示的IP段时,只需
阅读全文