• 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

  • 相关阅读:
    Sublime : python环境
    shell:遍历目录和子目录的所有文件
    Java:方法的参数是传值还是传引用
    Sublime Text:Windows下配置C 编译环境和GDB调试环境
    代码优化的一些尝试
    go:关于变量地址的疑惑
    go:结构体的可访问性
    go:channel(未完)
    H5常见问题及解决方案。
    谷歌插件大全地址
  • 原文地址:https://www.cnblogs.com/justart/p/12420834.html
Copyright © 2020-2023  润新知