初识 kong

kong简介

我们都知道Nginx是一个非常流行的web服务器,现在基本上的web服务都离不开它,Nginx的发展已经有许多年了,虽然Nginx的功能已经非常强大的,但是程序员爱折腾的心是非常炽热的,这不,出现了基于nginxopenResty项目,这个项目可以使用Lua脚本配合Nginx来做基本上所有的web开发。最近我想做个网关,通过搜索发现了kong这个项目,kongopenResty的一个应用,一个Gateway应用。配合Lua语言可以高性能地完成许多功能,具体可以查阅 官网

kong对比

Kong 的安装支持多种平台的安装,这里使用的是docker安装,数据库选用的是postgresql

centos docker的安装

卸载旧版本

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

从docker仓库安装

  • 设置仓库

    # 安装需要的工具
    sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    # 设置docker仓库
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
  • 安装docker

    sudo yum install docker-ce docker-ce-cli containerd.io
    

安装kong

创建网络

docker create network kong-net
[root@localhost ~]# docker network list
NETWORK ID          NAME                DRIVER              SCOPE
5889aae16ef7        bridge              bridge              local
7f7a3d95a65f        host                host                local
0979fa4f0954        none                null                local
[root@localhost ~]# docker network create kong-net
0517a4bc50ee7aa28437199ae52c9bd334dca596c1280ac8ac27d8427c72f51e
[root@localhost ~]# docker network list
NETWORK ID          NAME                DRIVER              SCOPE
5889aae16ef7        bridge              bridge              local
7f7a3d95a65f        host                host                local
0517a4bc50ee        kong-net            bridge              local
0979fa4f0954        none                null                local

开启postgres数据库

docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_HOST_AUTH_METHOD=trust" \  # 如果不设置密码就需要加上这个,不然会报错
--restart always \
postgres:9.6 

(可选) 安装postgres管理工具

docker run -d -p 8900:80 \
    --name=pgadmin \
    --network=kong-net \
    --link kong-database:kong-database \                        
    -e "PGADMIN_DEFAULT_EMAIL=1449693643@qq.com" \   # 设置登录邮箱号
    -e "PGADMIN_DEFAULT_PASSWORD=xxxxxx" \               # 设置登录密码
    -d dpage/pgadmin4

迁移kong的基础数据库

docker run --rm \                                               # --rm 说明是临时容器,用完就自动删除
        --network=kong-net \                            # 指定网络
        -e "KONG_DATABASE=postgres" \     # 指定数据库类型
        -e "KONG_PG_HOST=kong-database" \  # 指定postgres的host 可以用之前启动的name来指定
        kong kong migrations bootstrap

运行kong

docker run -d --name kong \
--network=kong-net \
-e "KONG_DATABASE=postgres" \                       # 指定postgres数据库
-e "KONG_PG_HOST=kong-database" \               # 指定postgres的host
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \    
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001,0.0.0.0:8444 ssl" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
--restart always \
kong

管理界面一:kong-dashboard (不支持V2.x

docker run --name kong-dashboard -p 8080:8080 pgbi/kong-dashboard start --kong-url http://192.168.1.14:8001  --basic-auth kongUser=kong

因为已经不支持2.0版本及以上,所以运行会报错,低版本可用。

This version of Kong dashboard doesn't support Kong v2.0 and higher.

管理界面二:konga

  • 迁移数据
docker run --rm pantsel/konga:latest -c prepare -a {{adapter}} -u {{connection-uri}} -c command -a adapter -u full database connection url
docker run --rm pantsel/konga:latest -c prepare -a postgres -u postgresql://kong:@192.168.1.14:5432/konga
  • 启动konga
docker run -p 1337:1337 \
--network kong-net \
-e "TOKAN_ SECRET=199772pht" \
-e "DB_ADAPTER=postgres" \
-e "DB_URI=postgresql://kong:@kong-database:5432/konga" \ # 注意是URI 不是URL
-e "NODE_ENV=production" \
--name konga \
pantsel/konga

kong 的使用

概述

Kong Gateway是为微服务优化的开源,轻量级API网关,可提供无与伦比的延迟性能和可伸缩性。

kong架构图

基本术语:

名称 描述
Consumers 使用者代表您的API的最终用户。使用使用者对象,您可以控制谁可以访问您的API。他们还允许您使用日志记录插件和Kong Vitals报告流量。
Service 服务对象是Kong Gateway用来引用其管理的上游API和微服务的ID
Routes 路由指定在请求到达API网关后如何(以及是否)将请求发送到其服务。单个服务可以具有多个路由。
Load Balancing Kong Gateway提供了两种负载平衡方法:基于DNS的直接方法或使用环形平衡器的方法。在本指南中,您将使用环形平衡器,该平衡器需要配置上游和目标实体。使用这种方法,后端服务的添加和删除由Kong Gateway处理,并且不需要DNS更新。
Admin API Kong Gateway随附一个内部RESTful API,用于管理目的。API命令可以在群集中的任何节点上运行,并且配置将一致地应用于所有节点。
Plugins 插件提供了用于修改和控制Kong Gateway功能的模块化系统。例如,为了保护您的API,您可能需要一个访问密钥,可以使用key-auth插件进行设置。插件提供了广泛的功能,包括访问控制,缓存,速率限制,日志记录等等。

Service 和 Routes

服务路由对象使您可以通过Kong Gateway向客户端暴露Service。在配置对API的访问权限时,您将从指定Service开始。在Kong Gateway中,服务是表示外部上游API或微服务的实体,例如,数据转换微服务,计费API等。

Service的主要属性是其URLService在其中侦听请求。您可以使用单个字符串指定URL,也可以分别指定其协议,主机,端口和路径。

在开始对Service提出请求之前,您需要为其添加一条route。路由确定请求到达Kong Gateway后如何(以及是否)发送到其service。单个服务可以具有多个route

配置服务和路由后,您将可以开始通过Kong Gateway发出请求。

kong请求流程

配置kong

kong的核心就是 通过kong生成nginx配置文件,kong提供了一系列的admin api供用户配置kong,官方文档

nginx配置示例

upstream testUpstream {
      server test.com:8080 weight=100;
}
server {
      listen 80;
      location /test {
          proxy_pass http://testUpstream;
      }
}

使用admin api 配置kong

  • 配置upstream 官方文档

    curl -x POST http://localhost:8001/upstrams --data "name=testUpstream"
    
  • 配置target 官方文档

    curl -x POST http://localhost:8001/upstreams/testUpstream/targets --data "target=test.com:8080" --data "weight=100"
    
  • 配置service 官方文档

    curl -x POST http://localhost:8001/services --data "name=testservice" --data "host=testUpstream"
    
  • 配置route 官方文档

    curl -x POST http://localhost:8001/routes --data "paths[]=/test" --data "service.id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
    

kong 提供了amidn api 可以很方便的动态生成nginx的配置,而且不需要手动让nginx重新加载配置。还可以添加插件,例如:

  • testservice添加限流:

    curl -X POST http://localhost:8001/services/testservice/plugins --data "name=rate-limiting" --data "config.second=50"
    
  • testservice添加jwt插件:

    curl -x POST http://localhost:8001/services/login/plugins --data "name=jwt"
    

    以上是将插件安装在service上, 这些插件也可以安装在route

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353