网关作为流量的入口,承上启下的中枢,对上游节点的健康状态监测是比不可少的;若上游节点异常,网关需要动态摘除此节点,避免流量转到异常节点去,保证服务的稳定。
本文主要分析lua-resty-upstream-healthcheck源码,以及在实际工作的优化应用。
一、背景介绍
目前本人负责的网关是基于orange二次开发的,health_check健康检查功能是基于插件的形式嵌套在网关中。在lua-resty-upstream-healthcheck的基础上根据业务增加了tcp/http检测、异常节点自动摘除、告警等功能。
二、health_check分析
2.1 分析之前
health_check运行在init_worker阶段,也是一个定时任务。在实际项目中,我们用一个nginx work进程来进行健康检查,比如ngx.worker.id() == 0。这种处理方式的好处就是,就算异常情况下当前处理健康检查的nginx进程因为某些原因crash掉了,新fork出来的nginx worker也会集成这个worker id的,只要nginx master进程不挂掉,健康检查都会正常运行。并且最大限度的减少健康检查对网关整体性能的影响,让网关注重做该做的事情。
2.2 代码分析
基本流程图:
spawn_checker:在health_check模块中,spawn_checker供外部调用,也是代码的入口。这里面主要做了两件事情:初始化健康检查参数和开启定时任务进行check。结合业务需求,增加告警通知配置。同时健康检查