Api网关Kong简介

2020-03-26微服务框架选择.md

定位

Kong的定位是Api网关,Api网关的地位越发的重要,在这篇文章中,讲的很清楚。总结一下对网关的要求:

  • 动态代理和负载均衡
  • 流量监控,能对接Prometheus、Zipkin等统计监控组件
  • 服务熔断
  • 认证与安全

以上为功能要求,其他方面:

  • 云原生友好,便于容器化
  • 插件化,通过运行时动态执行用户函数的方式来实现 serverless

以下对比了Kong与APISIX、Trk等几款软件。

Kong的定位

与nginx的关系

原文

从这里看出,牛逼的还是nginx,它在请求调用的7个阶段(总11个)支持插件。

nginx执行的11个调用

启动:Kong启动意味着OpenResty启动,也就等同于Nginx的启动,Kong会把配置文件通过OpenResty最终传递给Nginx。在OpenResty中Nginx启动会自动装载ngx_http_lua_module插件模块,该模块扩展了Nginx可支持的几个阶段。

运行:在来自外部请求触发后,Nginx会调用ngx_http_lua_module插件模块中相应的方法,而这些方法已经集成了Luajit库的解析接口,会由LuaVM来解析用lua语言编写的脚本模块,这就是整个Kong的业务模块与Nginx交互的基本处理过程。

Kong运行流程

结构与功能

Kong主要有三个组件:
Kong Server :基于nginx的服务器,用来接收API请求。
Apache Cassandra/PostgreSQL :用来存储操作数据。
Kong dashboard:官方推荐UI管理工具

我们从这篇文章来看看

Kong采用插件机制进行功能定制,插件集(可以是0或N个)在API请求响应循环的生命周期中被执行。插件使用Lua编写,目前已有几个基础功能:HTTP基本认证、密钥认证、CORS、TCP、UDP、文件日志、API请求限流、请求转发以及Nginx监控

Kong在架构中的位置与Zuul类似,通过这种AOP的做法,在请求上做一些工作。Kong可以集成到K8S中(Ingress)。

采用AOP的方式,在路由的请求转发基础上,通过lua插件进行认证、授权、日志监控、限流等功能。

术语

  • Consumer:API 的用户,记录用户信息;

  • Route:请求的转发规则,按照 Hostname 和 PATH,将请求转发给 Service;

  • Upstream:上游对象用来表示虚拟主机名,拥有多个服务(目标)时,会对请求进行负载均衡;

  • Services:多个 Upstream 的集合,是 Route 的转发目标;

  • Target:最终处理请求的 Backend 服务。

  • Plugin:插件,可以是全局的,也可以绑定到 Service、Router 或者 Consumer;

  • Certificate:https 配置的证书;

  • Sni:域名与 Certificate 的绑定,指定了一个域名对应的 https 证书;

Kong如何使用

docker安装

参考

  • docker-compose.yml

    version: "3.7"
    services:
      kong:
        image: kong:1.1.2
        environment:
         - "KONG_DATABASE=postgres"
         - "KONG_PG_HOST=kong-database"
         - "KONG_CASSANDRA_CONTACT_POINTS=kong-database"
         - "KONG_PROXY_ACCESS_LOG=/dev/stdout"
         - "KONG_ADMIN_ACCESS_LOG=/dev/stdout"
         - "KONG_PROXY_ERROR_LOG=/dev/stderr"
         - "KONG_ADMIN_ERROR_LOG=/dev/stderr"
         - "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl"
        ports:
         - 8000:8000
         - 8443:8443
         - 8001:8001
         - 8444:8444
        networks:
         - kong-net
        depends_on:
          - kong-database
    
      konga:
        image: pantsel/konga
        environment:
         - "TOKEN_SECRET=blueskykong.com"
         - "NODE_ENV=production"
        ports:
         - 8080:1337
        networks:
         - kong-net
        depends_on:
          - kong-database
    
      kong-database:
        image: postgres:9.6
        ports:
          - "5432:5432"
        environment:
          - POSTGRES_USER=kong
          - POSTGRES_DB=kong
        networks:
          - kong-net
        volumes:
          - /etc/localtime:/etc/localtime:ro
          - /data/data/postgresql:/var/lib/postgresql/data
    
    networks:
      kong-net:
        external: true
    

    konga 是 Kong 的 Dashboard,基于 js 的客户端管理工具,对外暴露的端口为 8080;kong-database 是 Kong 的数据库服务

    可以访问 http://localhost:8080 访问 Konga 的管理界面,第一次登录使用需要创建管理员帐号和密码。

  • 配置

    创建服务

    curl -i -X POST \
    --url http://localhost:8001/services/ \
    --data 'name=aoho-blog' \
    --data 'url=http://blueskykong.com/'
    

    创建了一个aoho-blog服务,转发的地址是http://blueskykong.com

    创建路由

    curl -i -X POST \
    --url http://localhost:8001/services/aoho-blog/routes \
    --data 'hosts[]=blueskykong.com' \
    --data 'paths[]=/api/blog'
    

Kong插件使用

原文

插件的可作用于一个服务或者路由之上,也可作用于整个Kong服务。Kong本身自带了一些插件,如:我们可以为一个服务添加50次/秒的官方限流插件,通过如下所示的Restful API方式:

curl -X POST http://localhost:8001/services/hello/plugins \
--data "name=rate-limiting" \
--data "config.second=50" 

下边是介绍一下自定义插件的流程,以从Redis中读取数据,进行Authentication为例,插件名为key-auth-redis:

  1. 在Kong_plugins目录,新建key-auth-redis的文件夹,并创建handler.lua文件和schema.lua文件,handler.lua文件中是插件主要的逻辑,需要继承baseplugin。

  2. 根据不同的接入点需要,重写适当的函数,这里需要在后端服务前,需要重写access函数。

    Kong插件的函数名

  3. 配置,在schema中对访问的redis进行配置。

  4. 重启。kong restart -c kong.conf --vv

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×