问题

route优先级策略(需要自己测试)

缓存未命中结果被缓存逻辑在吗?

Clustering Reference - v2.8.x | Kong Docs (konghq.com)
image-20220312145026471.png
agora的网关设置的过期时间为0,也就是永不过期。那么如果一个缓存未命中的结果被缓存下来了,那么就一直存在,除非自己手动清除。缓存的逻辑在 resty.mlcache 中。

kong是如何把插件的daos.lua中的schema加载到数据库中的?

load plugin daos。在这里会去每个插件的文件夹中找到对应的daos.lua文件。一般创建了daos.lua 也会创建 migrations文件夹,在init.lua文件中会返回每个migration,其中000_*.lua 一般都是初始化表。

插件下面的migrations是如何执行的?

upstream如何管理target的?

刚开始kong 会调用apply_history方法,然后会调用rb:addHost。objBalancer:addHost 中会调用 objBalancer:newHost,newHost中会调用 objHost:queryDns 把传递的DNS域名转换成ip形式,然后加到一致性hash环上。

然fd后每次去访问上游的时候会调用 ring_balancer:getPeer,然后其中会对每一个addr调用 objAddr:getPeer(如果错误信息返回dns失效,那么会重试), objAddr:getPeer中会调用 objHost:addressStillValid 判断当前addr指向的host是否是有效、未过期的。addressStillValid中判断如果过期了,则会调用 objHost:queryDns 查询dns,queryDns会调用update_dns_result去更新dns记录,并且添加或者删除ip地址。并且调用 ring_balancer:afterHostUpdate, ring_balancer:afterHostUpdate中会调用 redistributeIndices 去重建当前的ip hash环。 这一步做好之后就会层层返回到objAddr:getPeer流程中,重新尝试拿到一个新的ip地址。

kong healthcheck和balancer如何联动?

create_healthchecker 中创建了healthchecker,然后将它跟balancer进行绑定,然后attach_healthchecker_to_balancer 中会在balancer上绑定report_http_status、report_tcp_failure、report_timeout,然后他们会分别调用healthchecker的同名函数。在create_healthchecker中还对balancer设置了回调函数,只要target被重新放置了就会调用ring_balancer_callback 来往healthchecker中增加或者删除节点。

值得注意的是在调用healthcheck.new()函数时,会根据传递的checks参数来判断是否是主动还是被动健康检查。然后再healthcheck.new()函数中会判断如果当前是主动健康检查,则会调用start 函数,在里面会调用utils.gctimer 来创建定时任务,定时任务中会调用self:active_check_targets,里面会继续调用run_work_package,它里面又会调用run_single_check,里面就会调用各种report函数。report函数中如果发现节点不正常会raise一个事件。又因为attach_healthchecker_to_balancer会注册一个回调函数。如果healthchecker那边有状态变化会调用raise event,然后attach_healthchecker_to_balancer中的回调函数 会调用balancer:setPeerStatus设置节点的状态。

插件的daos schema是如何继承DAO这个对象的?