kong 介绍:

Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。

Kong主要有三个组件:

  1. Kong Server :基于nginx的服务器,用来接收API请求。

  2. Apache Cassandra/PostgreSQL :用来存储操作数据。

  3. Kong dashboard:官方推荐UI管理工具,当然,也可以使用 restfull 方式 管理admin api。

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

1.1 Kong网关的特性

Kong网关具有以下的特性:

  • 可扩展性: 通过简单地添加更多的服务器,可以轻松地进行横向扩展,这意味着您的平台可以在一个较低负载的情况下处理任何请求;

  • 模块化: 可以通过添加新的插件进行扩展,这些插件可以通过RESTful Admin API轻松配置;

  • 在任何基础架构上运行: Kong网关可以在任何地方都能运行。您可以在云或内部网络环境中部署Kong,包括单个或多个数据中心设置,以及public,private 或invite-only APIs。

1.2 Kong网关架构

 

 

 

 

 

 

 

  1. Kong核心基于OpenResty构建,实现了请求/响应的Lua处理化;

  2. Kong插件拦截请求/响应;

  3. Kong Restful 管理API提供了API/API消费者/插件的管理;

  4. 数据中心用于存储Kong集群节点信息、API、消费者、插件等信息,目前提供了PostgreSQL和Cassandra支持,如果需要高可用建议使用Cassandra;

  5. Kong集群中的节点通过gossip协议自动发现其他节点,当通过一个Kong节点的管理API进行一些变更时也会通知其他节点。每个Kong节点的配置信息是会缓存的,如插件,那么当在某一个Kong节点修改了插件配置时,需要通知其他节点配置的变更。

1.3 Kong环境搭建

官网安装的地址:https://docs.konghq.com/gateway/latest/install-and-run/centos/

1,安装之前请先安装psql,关于psql的安装postgresql 那章里面有详细的讲解

安装和初始化完psql,使用下面的脚本进行kong用户创建:

# 创建一个 Linux 用户 `kong`
$ adduser kong

# 切换到 Linux 系统用户 `postgres`,因为它是 PostgreSQL 数据库的系统管理员
$ su postgres

# 进入 PostgreSQL 控制台
$ psql

# 设置用户 `postgres` 的密码【仅仅首次需要】
# 注意开头的 \ 必须有!
$ \password postgres 

# 创建一个 PostgreSQL 用户 `kong`,和上面创建的 Linux 用户 `kong` 对应。
# 密码 '123456' 根据自己需要生成
$ create user kong with password '123456'; 
# 创建一个 PostgreSQL 数据库 `kong`
$ create database kong owner kong;
# 将数据库 `kong` 授权给 PostgreSQL 用户 `kong`
$ grant all privileges on database kong to kong;

# 退出 PostgreSQL 控制台
$ \q

 

2, yum 安装:

curl $(rpm --eval "https://download.konghq.com/gateway-2.x-centos-%{centos_ver}/config.repo") | tee /etc/yum.repos.d/kong.repo
yum install kong-enterprise-edition-2.8.1.1

 配置kong:

Kong 的默认配置文件是 /etc/kong/kong.conf.default,使用 cp /etc/kong/kong.conf.default /etc/kong/kong.conf 命令,复制一份新的配置文件。

复制完成后,修改 /etc/kong/kong.conf 配置文件,设置使用 PostgreSQL 数据库。

 

 

执行 kong migrations bootstrap -c /etc/kong/kong.conf 命令,进行 Kong 的 PostgreSQL 数据库的表初始化。

navicat中可以看到表信息

执行 kong start -c /etc/kong/kong.conf 命令,执行 Kong 的启动。

#启动命令
kong start -c /etc/kong/kong.conf 
# 停止命令
kong stop
# 重新加载kong
kong reload

默认情况下,Kong 绑定 4 个端口:

  • Proxy 8000:接收客户端的 HTTP 请求,并转发到后端的 Upstream。

  • Proxy 8443:接收客户端的 HTTPS 请求,并转发到后端的 Upstream。

  • Admin 8001:接收管理员的 HTTP 请求,进行 Kong 的管理。

  • Admin 8444:接收管理员的 HTTPS 请求,进行 Kong 的管理。

# 请求 Proxy 端口
$ curl http://127.0.0.1:8000
{"message":"no Route matched with those values"} 
# 因为我们暂时没配置 Kong 路由。

# 请求 Admin 端口
# 注意,考虑到安全性,Admin 端口只允许本机访问。
$ curl http://127.0.0.1:8001
{"plugins":{"enabled_in_cluster":[],"available_on_server":{... // 省略 

Docker 安装这里先不做介绍,后面会补上:

安装Kong 管理UI

Kong 企业版提供了管理UI,开源版本是没有的。但是有很多的开源的管理 UI ,其中比较好用的是
Konga。项目地址:https://github.com/pantsel/konga,国内访问github比较慢可以尝试使用gitee,下面是konga的gitee地址:

https://gitee.com/freeasm/konga?_from=gitee_search#installation

安装方法可以参考konga的readme

注:生产中UI界面只是用于查看不太用于配置。

 

注册页面:

 

 

 通过注册后进入,然后在dashboard面板里面添加Kong的管理Api路径 http://ip:8001

 

 

 

 

 

 

 

 

 kong的负载均衡:

在了解kong负载均衡前我们先来复习下nginx的负载均衡实现:

upstream tulingmall-product-upstream {
    server 192.168.65.190:8866 weight=100;
    server 192.168.65.190:8867 weight=100;
}

server {
    listen    80;
    location /pms/ {
        proxy_pass http://tulingmall-product-upstream;
    }
}

kong组件:

Kong 组件说明
service service 对应服务,可以直接指向一个 API 服务节点(host 参数设置为 ip + port),也可以指定一个 upstream 实现负载均衡。简单来说,服务用于映射被转发的后端 API 的节点集合
route route 对应路由,它负责匹配实际的请求,映射到 service
upstream upstream 对应一 API 节点,实现负载均衡
target target 对应一 API 节点

kong 组件关系:

 

 

 

创建 upstream 和 target

调用 Kong Admin API /upstreams,创建名字为 demo-upstreamupstream

$ curl -X POST http://127.0.0.1:8001/upstreams --data "name=tulingmall-product-upstream"

 

 

 

 

调用 Kong Admin API /upstreams/{upstream}/targets,创建 tulingmall-product服务对应的 2 个 target。注意,{upstream} 路径参数为 upstream 的名字。

# 192.168.65.190:8866 对应的 target
$ curl -X POST http://127.0.0.1:8001/upstreams/tulingmall-product-upstream/targets --data "target=192.168.65.190:8866" --data "weight=100"
# 192.168.65.190:8867 对应的 target
$ curl -X POST http://127.0.0.1:8001/upstreams/tulingmall-product-upstream/targets --data "target=192.168.65.190:8867" --data "weight=100"

 

 

创建 service 和 route

调用 Kong Admin API /services,创建名字为 tulingmall-productservice。host 参数,用于设置对应的 upstream 的名字。

curl -X POST http://127.0.0.1:8001/services --data "name=tulingmall-product" --data "host=tulingmall-product-upstream" --data "path=/pms"

 

 

 

调用 Kong Admin API services/${service}/routes,创建一个请求路径为 pathroute。注意,{service} 路径参数,为 service的名字。

curl -X POST http://localhost:8001/services/tulingmall-product/routes --data "name=tulingmall-product-route" --data "paths[]=/pms"

 

 

 

3.2 kong限流配置

Kong 提供了 Rate Limiting 插件,实现对请求的限流功能,避免过大的请求量过大,将后端服务打挂。

Rate Limiting 支持秒/分/小时/日/月/年多种时间维度的限流,并且可以组合使用。例如说:限制每秒最多 100 次请求,并且每分钟最多 1000 次请求。

Rate Limiting 支持 consumercredentialip 三种基础维度的限流,默认为 consumer。例如说:设置每个 IP 允许每秒请求的次数。计数的存储,支持使用 localclusterredis 三种方式进行存储,默认为 cluster

  • local:存储在 Nginx 本地,实现单实例限流。

  • cluster:存储在 Cassandra 或 PostgreSQL 数据库,实现集群限流。

  • redis:存储在 Redis 数据库,实现集群限流。

Rate Limiting 采用的限流算法是计数器的方式,所以无法提供类似令牌桶算法的平滑限流能力。

配置 Rate Limiting 插件

调用 Kong Admin API services/${service}/plugins,创建 Rate Limiting 插件的配置:

# 服务上启用插件
$ curl -X POST http://127.0.0.1:8001/services/tulingmall-product/plugins \
    --data "name=rate-limiting"  \
    --data "config.second=1" \
    --data "config.limit_by=ip"
    
# 路由上启用插件
$ curl -X POST http://127.0.0.1:8001/routes/{route_id}/plugins \
    --data "name=rate-limiting"  \
    --data "config.second=5" \
    --data "config.hour=10000"

# consumer上启用插件
$ curl -X POST http://127.0.0.1:8001/plugins \
    --data "name=rate-limiting" \
    --data "consumer_id={consumer_id}"  \
    --data "config.second=5" \
    --data "config.hour=10000"
  • name 参数,设置为 rate-limiting 表示使用 Rate Limiting 插件。

  • config.second 参数,设置为 1 表示每秒允许 1 次请求。

  • config.limit_by 参数,设置为 ip 表示使用 IP 基础维度的限流。

    也可以通过konga UI操作添加rate-limiting插件

 

 

 

 

 

3.3 Basic Auth身份认证

# 在服务上配置插件
curl -X POST http://127.0.0.1:8001/services/{service}/plugins \
    --data "name=basic-auth"  \
    --data "config.hide_credentials=true"

#在路由上配置插件
curl -X POST http://127.0.0.1:8001/routes/{route_id}/plugins \
    --data "name=basic-auth"  \
    --data "config.hide_credentials=true"

 

 测试:

 

 

3.4 JWT身份认证

配置 JWT 插件

调用 Kong Admin API services/${service}/plugins,创建 JWT 插件的配置:

curl -X POST http://127.0.0.1:8001/services/tulingmall-product/plugins \
    --data "name=jwt"

name 参数,设置为 jwt 表示使用 JWT 插件。

# 查看插件列表
curl -X GET localhost:8001/services/tulingmall-product/plugins

#查看jwt插件
curl -X GET localhost:8001/services/tulingmall-product/plugins/jwt

#删除jwt插件
curl -X DELETE localhost:8001/services/tulingmall-product/plugins/{jwt.id}

通过konga UI操作添加jwt 插件

 

 

创建Consumer

调用 Kong Admin API consumers,创建一个 Consumer 消费者:

$ curl -i -X POST http://localhost:8001/consumers/ \
    --data "username=fox"

调用 Kong Admin API consumers/{username}/{plugin}生成该消费者的 JWT 信息:

  • {username} 路径参数,为 Consumer 的用户名。

  • {plugin} 路径参数,为 Plugin 的插件名。

可以指定算法algorithmiss签发者key,密钥secret,也可以省略,会自动生成。

$ curl -i -X POST http://localhost:8001/consumers/fox/jwt/ \
-d "algorithm=HS256" \
-d "key=fox123" \
-d "secret=uFLMFeKPPL525ppKrqmUiT2rlvkpLc9u"

查看fox的jwt凭证

curl -X GET localhost:8001/consumers/fox/jwt
{
    "rsa_public_key":null,
    "algorithm":"HS256",
    "id":"3dc4d177-8a7a-4edc-bc88-ee7aa2447fc7",
    "tags":null,
    "consumer":{
        "id":"8e7fb82d-68ef-4f2b-a30c-613866378525"
    },
    "secret":"uFLMFeKPPL525ppKrqmUiT2rlvkpLc9u",
    "created_at":1625803149,
    "key":"fox123"
}

 

 

生成jwt token

业务服务器根据kong生成的jwt凭证中的algorithm、key(iss)、secret进行token的演算和下发。请求鉴权接口需携带 Authorization: Bearer jwt进行请求。测试可以在https://jwt.io/中通过Debugger生成jwt token

 

 获取到jwt token令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJpc3MiOiJmb3gxMjMifQ.hqHGVujYheALxXpEVtgisA5pPTGfQYet0IKadnYPtj8

测试

curl http://192.168.65.200:8000/pms/productInfo/42 \
    -H "Authorization: Bearer  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJpc3MiOiJmb3gxMjMifQ.hqHGVujYheALxXpEVtgisA5pPTGfQYet0IKadnYPtj8"

3.5 黑白名单配置

配置插件

# 在服务上启用插件
$ curl -X POST http://kong:8001/services/{service}/plugins \
    --data "name=ip-restriction"  \
    --data "config.whitelist=54.13.21.1, 143.1.0.0/24"

# 在路由上启用插件
$ curl -X POST http://kong:8001/routes/{route_id}/plugins \
    --data "name=ip-restriction"  \
    --data "config.whitelist=54.13.21.1, 143.1.0.0/24"
  • config.whitelist :白名单,逗号分隔的IPs或CIDR范围。

  • config.blacklist :白名单,逗号分隔的IPs或CIDR范围。

curl -X POST http://127.0.0.1:8001/routes/ad515a07-bae4-4b54-a927-35bc6c85565b/plugins \
    --data "name=ip-restriction"  \
    --data "config.whitelist=192.168.65.200"

 

 

 

 

 

posted on 2022-06-17 23:13  EZgod  阅读(2083)  评论(0编辑  收藏  举报