KONG处理流程

init_by_lua*
  发生在master进程启动阶段。这里会对数据访问层进行初始化,加载插件的代码,构造路由规则表。
init_worker_by_lua*
  发生在worker进程启动阶段。这里会开启数据同步机制,执行每个插件的init_worker方法。

       balancer.init()  读取数据库UPSTREAM表,初始化负载均衡器(给每个均衡器加载TARGET【读取TARGET表】),给每个负载均衡器配备一个健康检查器

      

   create_healthchecker(balancer, upstream)

       构造完健康检查器后,调用populate_healthchecker方法把负载均衡器中节点添加到健康检查器中。

       然后调用attach_healthchecker_to_balancer监听健康检查器的事件:healthchecker.events.healthy和healthchecker.events.unhealthy,并设置回调方法。

       回调方法就是根据健康检查器的事件类型,在负载均衡器中把后端节点标记为可用或不可用

set_by_lua*
  处理请求第一个执行阶段。这里可以做一些流程分支处理判断变量初始化。kong没有使用该阶段。
rewrite_by_lua*
  这里可以对请求做一些修改。kong在这里会把处理代理给插件的rewrite方法。
access_by_lua*
  kong在这里对请求进行路由匹配,找到后端的upstream服务的节点。

       规则的匹配在kong.access方法里面,调用router.exec方法进行匹配

local match_t = router.exec()
负载前的数据准备
balancer_prepare(ctx, match_t.upstream_scheme,
upstream_url_t.type,
upstream_url_t.host,
upstream_url_t.port,
service, route)
当请求匹配出一条路由规则之后,就会在该规则下面的target中选一个目标实例进行转发。
目标实例的选择发生在kong.access()的后置handler中,
balancer, upstream = get_balancer(target[balancer_data])
--根据路由对像中的service.host--查询出upstream,然后由upstream查询出负载器
调用balancer.execute方式进行选择。target的选择全权委托给了resty.dns.balancer对象  
{
balancer, upstream = get_balancer(target)
//选择出一个host,利用dns动态解析和从
ip, port, hostname, handle = balancer:getPeer(dns_cache_only,
target.balancer_handle,
hash_value)--kongcongresscontroller--在发现k8s资源的时候,会建立routeservice默认建立一条target(和service对应host一致)
 ////设置均衡选择后数据
}  

balancer_by_lua*
  kong在这里会把上一阶段找到的服务节点设置给nginx的load balancer。如果设置了重试次数,此阶段可能会被执行多次。

Kong.balancer(){
local ok, err = set_current_peer(balancer_data.ip, balancer_data.port)
}
 

      
header_filter_by_lua*
  这里可以对响应头做一些处理。kong在这里会把处理代理给插件的header_filter方法。
body_filter_by_lua*
  这里可以对响应体做一些处理。kong在这里会把处理代理给插件的body_filter方法。
log_by_lua*
  kong在这里会通过插件异步记录日志和一些metrics数据。
————————————————
版权声明:本文为CSDN博主「aa1215018028」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aa1215018028/article/details/81297724

原文地址:https://www.cnblogs.com/justart/p/12420834.html