Kong网关初探

659 阅读5分钟

1、Kong网关概述

云原生架构下的分布式API网关

image.png Kong 是由 Mashape 公司开源的云原生、高性能、可扩展的微服务 API 网关。它基于 OpenResty(Nginx + Lua模块) 实现,使用 Cassandra 或 PostgreSQL 存储数据。

网关的作用: 下图一目了然

image.png

2、Kong网关模块

kong网关主要包含以下三部分:

image.png Dashboard: 管理界面,有官方推荐的UI管理界面、Konga、Kongx等。
Server: 网关服务,核心是基于Nginx+OpenResty来实现的,主要用于接收处理api请求。
Storage: 数据存储,通常使用Cassandra/PostgreSQL来存储数据服务数据。

3、Kong网关服务组件

  • service: 网关服务,用于映射请求接口对应的后端服务节点,其中可以通过host参数配置后端服务的域名/ip:port等,也可使用upstream来实现负载均衡。
  • route: 网关路由,主要用于匹配客户端请求接口,并转发至service。
  • upstream: 顾名思义负载均衡,主要用于管理后端服务节点,提供给service调用。
  • target: upstream里面配置的每一个服务节点。
  • plugin: 插件(lua开发),可自定义开发,提供可扩展功能,可用于全局、route、service等。

4、Kong网关特性

kong网关主要包括以下特性:

  • 可扩展性: Kong网关可以单机搭建、也可以集群搭建,同其他基础服务集群一样支持水平扩展机器,以达到低负载运行,提升服务性能。
  • 无平台限制: Kong网关可以在任何地方都能运行。您可以在云或内部网络环境中部署Kong,包括单个或多个数据中心设置,以及public,private 或invite-only APIs。
  • 模块化: 可以通过添加新的插件进行扩展,这些插件可以通过RESTful Admin API轻松配置。

5、Kong网关整体架构

image.png

6、Kong网关的使用

  • 环境搭建: 单机部署+集群部署,docker-compose方式部署示例如下:
#######################
# postgres
######################
version: '3'
services: 
  kong-database:
    image: postgres:9.6
    restart: always  #每次总是启动
    networks: 
      - kong-net
    environment:
      POSTGRES_USER: kong
      POSTGRES_DB: kong
      POSTGRES_PASSWORD: kong
    ports:
      - "5432:5432"
#######################
# 执行数据库迁移
######################
  kong-migration:
    image: kong:latest
    command: "kong migrations bootstrap"
    networks: 
      - kong-net
    restart: on-failure
    environment:
      - KONG_DATABASE=postgres
      - KONG_PG_DATABASE=kong
      - KONG_PG_PASSWORD=kong
      - KONG_PG_HOST=kong-database
    links: 
      - kong-database #连接的是kong-database服务的
    depends_on:
      - kong-database #依赖于kong-database服务

#####################
# kong gateway
#####################
  kong:
    image: kong:latest
    restart: always
    extra_hosts:
      - "test.api.com:192.168.1.15"
    networks:
      - kong-net
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-database
      KONG_PG_PASSWORD: kong
      KONG_PROXY_LISTEN: 0.0.0.0:8000
      KONG_PROXY_LISTEN_SSL: 0.0.0.0:8443
      KONG_ADMIN_LISTEN: 0.0.0.0:8001
    depends_on:
      - kong-migration
    links: 
      - kong-database
    healthcheck:
      test: ["CMD", "curl", "-f", "http://kong:8001"]
      interval: 5s
      timeout: 2s
      retries: 15
    ports:
      - "8001:8001"
      - "8000:8000"
      - "8443:8443"
    volumes:   #若有配置文件要自己配置,则建议挂在出来
      - /opt/kong/kong.conf:/etc/kong/kong.conf
      - /opt/kong/kong-plugins/kong/plugins:/usr/local/share/lua/5.1/kong/plugins
#######################
#以下两个是konga  GUI
#######################
  konga-prepare:
    image: pantsel/konga:latest
    command: "-c prepare -a postgres -u postgresql://kong:kong@kong-database:5432/konga"  #注意是用户名:密码@数据库服务名称:端口
    networks:
      - kong-net
    restart: on-failure
    links:
      - kong-database
    depends_on:
      - kong        #依赖kong服务
      - kong-database #依赖kong-database服务

  konga:
    image: pantsel/konga:latest
    restart: always
    networks:
      - kong-net
    environment:
      DB_ADAPTER: postgres
      DB_HOST: kong-database
      DB_USER: kong
      DB_DATABASE: konga
      DB_PASSWORD: kong #必须加上密码,不然会失败
    depends_on:
      - kong
      - kong-database
    ports:
      - "1337:1337"
networks:
  kong-net:
    driver: bridge

创建服务并启动:docker-compose up -d
查看服务状态:docker-compose ps 或者docker ps
  • Konga的使用: UI管理页面采用konga工具。

image.png

image.png

  • 使用示例: 服务流程图如下:

image.png

创建upstream:

curl -X POST http://localhost:8001/upstreams --data "name=api-nodes"

image.png 创建target:

curl -X POST http://localhost:8001/upstreams/api-nodes/targets --data "target=192.168.0.15:8080" --data "weight=100"

image.png 创建service:

curl -i -X POST --url http://localhost:8001/services/ --data 'name=unit-api-service' --data 'host=api-nodes'

image.png 创建router:

curl -i -X POST
--url http://localhost:8001/services/unit-api-service/routes
--data 'hosts[]=test.api.com'
--data 'name=unit-api-router'
--data 'strip_path=true'
--data 'paths[]=/api'
--data 'methods[]=GET'
--data 'methods[]=POST'
--data 'methods[]=PUT'
--data 'methods[]=PATCH'
--data 'methods[]=DELETE'

image.png 创建plugins:

curl -X POST --url http://localhost:8001/services/unit-api-service/plugins
--data 'name=unit-check'
--data 'config.user_id=9999999'

image.png 请求示例:

原接口:
get –https://test.api.com/api/user/info?user_id=999999
转发后接口:
get –https://192.168.0.15:8080/user/info?user_id=999999

7、Kong网关插件开发

  • 插件向导:
    使用lua-nginx-module模块可以在Nginx中启用Lua脚本功能,Kong与OpenResty一起发布,OpenResty中已经包含了 lua-nginx-module模块,OpenResty不是Nginx 的分支,而是一组扩展 Nginx功能的模块。因此,Kong 是一个Lua 应用程序,旨在加载和执行Lua模块(我们通常称之为“插件”),并且Kong还为此提供了整套开发环境,包括SDK,数据库抽象、数据迁移等等。插件由Lua模块组成,用户可以使用插件开发包(又称PDK),通过调用请求响应或者流交互实现各种功能 ,PDK是一组Lua方法,插件可以使用它来促进Kong核心模块(或其他组件)与插件本身的交互。
  • 插件约定规则:
    约定配置:
1、指定目录:
kong.plugins.<plugin_name>.<module_name>
2、加载配置:
plugins = bundled,login-check
lua_package_path =/app/wwwroot/kong-plugins/?.lua;./?.lua;./?/init.lua;

基础插件模块:

最基础的插件,必须包含两个模块:
handler.lua:插件的核心,它是一个需要实现的接口,其中每个方法会在请求/连接的生命周期中运行
schema.lua:插件可能需要保留一些用户输入的配置,此模块定义一些规则保存配置的模式,以便用户只能输入有效的配置项
  • 学习文档:
官方文档:https://docs.konghq.com/gateway/latest/pdk/kong.service.response/
中文文档:https://gitee.com/yangth796/kong-docs-cn/tree/master#/yangth796/kong-docs-cn/blob/master/GUIDES&REFERENCES/PDK/kong-request.md
  • 待续: 插件开发详细介绍