kong简介
我们都知道Nginx
是一个非常流行的web服务器,现在基本上的web服务都离不开它,Nginx
的发展已经有许多年了,虽然Nginx
的功能已经非常强大的,但是程序员爱折腾的心是非常炽热的,这不,出现了基于nginx
的openResty
项目,这个项目可以使用Lua
脚本配合Nginx
来做基本上所有的web开发。最近我想做个网关,通过搜索发现了kong
这个项目,kong
是openResty
的一个应用,一个Gateway
应用。配合Lua
语言可以高性能地完成许多功能,具体可以查阅 官网。
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网关,可提供无与伦比的延迟性能和可伸缩性。
基本术语:
名称 | 描述 |
---|---|
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的主要属性是其URL,Service在其中侦听请求。您可以使用单个字符串指定URL,也可以分别指定其协议,主机,端口和路径。
在开始对Service提出请求之前,您需要为其添加一条route。路由确定请求到达Kong Gateway后如何(以及是否)发送到其service。单个服务可以具有多个route。
配置服务和路由后,您将可以开始通过Kong Gateway发出请求。
配置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
上