这个标题真的很难起,我在产生这个需求的时候,真是各种方式搜索了各种平台,都没有找到答案。最终在硬磕了几天之后,终于在kong源码中找到了解决方案。于是,我决定把我遇到的这个问题记录下来,但是,这个时候困扰我的就是,标题该如何定,才能容易被搜索到。
需求:
在kong的插件中,我要获取到真实代理的target,就是要找到最终请求IP和port,然后由我发送请求到这些IP上,不走nginx的代理了。
这真是奇葩的需求,但这需求还真不少!!
需求了解清楚了之后,就是要如何解决了,当了解方案之后,回过来看,就是我自己走一遍负载均衡那一套,最终获取到一个代理目标target。
说起来简单,但实现起来可是真难啊。不过,kong帮助我们实现好了,我们之后调用kong的api就可以了。不多说,代码如下:
local kong = kong
local ngx = ngx
local runloop = require("kong.runloop.handler");
local MyTestPlugin = {
PRIORITY = 1000,
VERSION = "1.0.0",
}
-- 生命周期函数
function MyTestPlugin:access(conf)
-- 获取到代理的真实target
runloop.access.after(ngx.ctx);
local balancer_data = ngx.ctx.balancer_data;
for k,v in pairs(balancer_data) do
print(k .. ":" .. v);
end;
end
return MyTestPlugin
有了上面的代码,懂的朋友自然就懂了。
在balancer_data中,就有封装好了的真是代理的IP和端口。
host: 这个是kong配置的service名称 user-service
port:代理的真实端口 8899
hostname:代理真是的主机IP 192.168.4.3
取到这个真实代理的IP之后,后面的操作就简单了。