前段时间一直研究kong网关,发现kong源码的整体结构还是比较清晰的。核心的目录结构如下:
Api目录-----kong对外发布的管理API,通过8001端口发布。
Cmd目录----kong的命令行,如start、stop等
cluster_events目录------集群事件的策略配置文件,如数据库集群。
Db目录------数据库的操作,如数据操作、结构定义、数据库迁移等
Log目录------日志存储,平台分三类日志,access/admin_access/error
Pdk目录------设计工具集,比如log日志记录工具/client 客户端信息收集工具
Plugins目录----插件目录,系统自带的和自定义的插件都在这里
Resty目录----Resty和SSL配置相关文件
SSL目录------SSL的证书
Tool目录-----工具目录,比如集群配置、调试打印Table、DNS配置等
Templates目录—模板文件nginx模板、yml模板和默认模板。
通过kong的管理工作台查看对应的插件如下:
因为对这个通过【/plugins】管理API返回的数据不太满意,比如在路由服务、业务服务、消费方上使用的插件返回都是ID值,无法做到一目了然。因此要改变管理API返回的数据结构,我们找到插件对应的管理API文件,api/routes/plugins.lua 和 api/endpoints.lua。
观察这两个代码我们发现,endpoints.lua是包含一些通过公共方法生成的API,如分页查询业务对象、查询某个特定的业务对象、插入对象、更新对象。而像plugins.lua是一些特有的API,如查看已激活的插件:/plugins/enabled。
而我们要修改的是/plugins返回的消息,所以对应应该修改 api/endpoints.lua。
if tostring(schema.name)“plugins” then
local daoroute = db[“routes”]
local daoservice = db[“services”]
local daoconsumer = db[“consumers”]
for key,value in pairs(data) do
for key1,value1 in pairs(value) do
if tostring(key1)‘route’ and type(value1)‘table’ then
local entity, _, err_t =daoroute[“select”](daoroute, { id = unescape_uri(value1.id)}, nil)
value1.name=entity.name
end
if tostring(key1)‘service’ and type(value1)‘table’ then
local entity, _, err_t =daoservice[“select”](daoservice, { id = unescape_uri(value1.id)}, nil)
value1.name=entity.name
end
if tostring(key1)‘consumer’ and type(value1)==‘table’ then
local entity, _, err_t =daoconsumer[“select”](daoconsumer, { id = unescape_uri(value1.id)}, nil)
value1.username=entity.username
end
end
end
end
从代码看很简单,判断Schema的name,如果为plugins,则查数据库并将值赋给对象的Name或者UserName.kong网关经过重启,通过管理端重新获取数据后。
我们看到业务服务、路由服务、消费方的ID都变成了名称。