kong:

根据Nginx的不同执行阶段,kong先执行初始化master和worker进程。

init_by_lua_block {
require 'resty.core'
kong = require 'kong'
kong.init()
}

安装完之后加载/usr/local/share/lua/5.1/下面的kong.lua,调用init()方法,加载配置文件,创建事件,建立路由。

  singletons.dns = dns(config)
singletons.loaded_plugins = assert(load_plugins(config, dao, events))
singletons.serf = Serf.new(config, dao)
singletons.dao = dao
singletons.events = events
singletons.configuration = config

在数据库中检查所有的可用的插件,然后加载插件,插件必须有两个文件handler.lua和schema.lua。以keyauth插件为例,格式为:kong.plugins.keyauth.handlerkong.plugins.keyauth.schema

如果存在kong.plugins.keyauth.hooks则注册相应的事件。

不同的插件有不同的优先级,根据插件PRIORITY大小排序。


init_worker_by_lua_block {
kong.init_worker()
}

初始化worker_events(这里我不懂,根据worker的pid,建立路由和注册事件)

kong入口server监听8000端口,还开放一个8001端口提供了restful接口,用于后台查询api的调用,插件等。

处理中间任务,然后init_worker(),调用后台任务:

local function keepalive_handler(premature)
if premature then
return
end -- all workers need to register a recurring timer, in case one of them
-- crashes. Hence, this must be called before the `get_lock()` call.
create_timer(KEEPALIVE_INTERVAL, keepalive_handler) if not get_lock(KEEPALIVE_KEY, KEEPALIVE_INTERVAL) then
return
end log(DEBUG, "sending keepalive event to datastore") local nodes, err = singletons.dao.nodes:find_all {
name = singletons.serf.node_name
}
if err then
log(ERR, "could not retrieve nodes from datastore: ", err) elseif #nodes == 1 then
local node = nodes[1]
local _, err = singletons.dao.nodes:update(node, node, {
ttl = singletons.configuration.cluster_ttl_on_failure,
quiet = true
})
if err then
log(ERR, "could not update node in datastore:", err)
end
end
end

在8000端口中:

access_by_lua_block {
kong.access()
}

before()方法相当于api的一个middleware,检测路由和http方法,获取ip端口,域名等。

after()方法返回一些kong的执行时间等。

在access中加载kong.plugins.keyauth.handler.lua的方法中的access方法,调用前后分别调用before()和after()方法。

  for plugin, plugin_conf in plugins_iterator(singletons.loaded_plugins, true) do
plugin.handler:access(plugin_conf)
end

遍历插件列表,存储在ngx.ctx.plugins_for_request中

header_filter_by_lua_block {
kong.header_filter()
} body_filter_by_lua_block {
kong.body_filter()
} log_by_lua_block {
kong.log()
}

kong流程学习的更多相关文章

  1. rpm构建流程学习总结

    rpm构建流程 学习链接: b站马哥: https://www.bilibili.com/video/BV1ai4y1N7gp RedHat: https://access.redhat.com/do ...

  2. web 安全之页面解析的流程学习

    0x00 任务内容: 理解域名解析的整个过程 理解 web 页面请求的整个流程,绘制流程图(nginx 处理的 11 个过程) 学习 http 协议中的字段及含义 学习 http 请求方法以及返回状态 ...

  3. VerilogHDL概述与数字IC设计流程学习笔记

    一.HDL的概念和特征 HDL,Hard Discrimination Language的缩写,翻译过来就是硬件描述语言.那么什么是硬件描述语言呢?为什么不叫硬件设计语言呢?硬件描述语言,顾名思义就是 ...

  4. MySQL Backup mysqldump备份流程学习

    我们都知道MySQL逻辑备份工具mysqldump可以保证备份数据的一致性,但是它是怎么保持一致性的? 本文不讨论mysqldump具体的选项和用法,一直对mysqldump的工作机制梳理的不太清楚, ...

  5. 挖坑:handoop2.6 开启kerberos(全流程学习记录)

    目录: 1.涉及插件简介 2.安装步骤 3.日志错误查看 1.kerberos是什么东西 度娘指导: Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为 客户机 / 服务器 应用程序提供 ...

  6. tf中计算图 执行流程学习【转载】

    转自:https://blog.csdn.net/dcrmg/article/details/79028003 https://blog.csdn.net/qian99/article/details ...

  7. Centos的启动流程学习

    Centos 6 的启动流程: POST ---> Boot sequence(BOIS) ---> Boot loader (MBR) --->  kernel(ramdiskfs ...

  8. FFmpeg处理音视频流程学习笔记

    原文作者:一叶知秋0830 链接:https://www.jianshu.com/p/1b715966af50 FFmpeg处理音视频完整流程包括5个阶段(输入文件—>编码数据包—>解码后 ...

  9. Mybatis执行流程学习之手写mybatis雏形

    Mybatis是目前开发中最常用的一款基于ORM思想的半自动持久层框架,平时我们都仅仅停留在使用阶段,对mybatis是怎样运行的并不清楚,今天抽空找到一些资料自学了一波,自己写了一个mybatis的 ...

随机推荐

  1. day06_04 购物车讲解02

    1.0 补充知识 a,b = [2,3] print(a) print(b) #>>>2 #>>>3 a,b = (2,3) print(a) print(b) # ...

  2. 【志银】nginx_php_mysql_phpMyAdmin配置(Windows)

    ✄更新中... 更新日期:2018.11.22 ★版本说明+快捷下载(官网)  nginx  nginx-1.14.1  http://nginx.org/download/nginx-1.14.1. ...

  3. HDU 4417 Super Mario ( 离线树状数组 )

    把数值和查询放在一起从小到大排序,纪录每个数值的位置,当遇到数值时就更新到树状数组中,遇到查询就直接查询该区间和. #include <cstdio> #include <cstri ...

  4. free、vmstat监视内存使用情况

    9. free 查询可用内存 free工具用来查看系统可用内存: /opt/app/tdev1$free total used free shared buffers cached Mem: 8175 ...

  5. nginx的入门到框架设计

    mac上安装nginx 安装与启动 安装 brew install nginx 命令 通过 Homebrew 下载的软件默认位置在 /usr/local/Cellar 应该ln-s 加连接就能全局 n ...

  6. Scala 基础(8)—— 占位符_和部分应用函数

    1. 占位符 _ 针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替. 占位符_,用来表示一个或者多个参数.(这 ...

  7. Codeforces Round #384 (Div. 2) 734E(二分答案+状态压缩DP)

    题目大意 给定一个序列an,序列中只有1~8的8个整数,让你选出一个子序列,满足下列两个要求 1.不同整数出现的次数相差小于等于1 2.子序列中整数分布是连续的,即子序列的整数必须是1,1,1.... ...

  8. POJ3252 Round Numbers 【数位dp】

    题目链接 POJ3252 题解 为什么每次写出数位dp都如此兴奋? 因为数位dp太苟了 因为我太弱了 设\(f[i][0|1][cnt1][cnt0]\)表示到二进制第\(i\)位,之前是否达到上界, ...

  9. BZOJ1483 [HNOI2009]梦幻布丁 【链表 + 启发式合并】

    题目 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色. 例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 输入格式 第一行给出N,M表示 ...

  10. Yum只更新安全补丁的方法

    当大家想只给RHEL系统更新安全补丁的时候,往往会把其他一些无用的组件给更新下来,现在就给大家说下怎么只更新安全补丁而又不更新其他组件. 1.安装yum插件即可:   yum install yum- ...