API 网关服务 Kong介绍和安装

2020-09-15 0 By admin

Kong是一个云原生,高效,可扩展的分布式 API 网关。自 2015 年在 github 开源后,广泛受到关注,其核心价值在于高性能和可扩展性。

一、API 网关

1.1、使用API网关的好处

统一API入口、隔离后端、认证鉴权流控、负载均衡、降低后端开发对API安全性的考虑。
其实无论是否是微服务的架构,只要用到了认证鉴权流控功能,都应该使用API网关,这将大大减低后端开发的成本和速度,未来扩张也方便。
目前各大云厂商都可用了商用的API网关,例如阿里云,功能强大,性能稳定,如果应用于云上的生产环境,也可以考虑。

1.2、几种开源的方案

  1. Tyk : Tyk是一个开放源码的API网关,它是快速、可扩展和现代的。Tyk提供了一个API管理平台,其中包括API网关、API分析、开发人员门户和API管理面板。Try 是一个基于Go实现的网关服务。
  2. Kong : Kong是一个可扩展的开放源码API Layer(也称为API网关或API中间件)。Kong 在任何RESTful API的前面运行,通过插件扩展,它提供了超越核心平台的额外功能和服务。
  3. Orange : Orange和Kong类似也是基于OpenResty的一个API网关程序,是由国人开发的。
  4. Zuul : Zuul是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。
  5. apiaxle : Nodejs 实现的一个 API 网关。
  6. api-umbrella : Ruby 实现的一个 API 网关。

二、Kong的概念

Kong 是一个在Nginx中运行的Lua应用程序,并且通过lua-nginx模块实现。Kong不是用这个模块编译Nginx,而是与OpenResty一起发布,OpenResty已经包含了lua-nginx-module。OpenResty 也不是 Nginx的分支,而是一组扩展其功能的模块。
Kong 是 Mashape 开源的高性能高可用 API 网关和 API 服务管理层,一款基于 Nginx_Lua 模块写的高可用服务网关,由于 Kong 是基于 Nginx 的,所以它是一个可扩展的服务,只需要添加多台服务器就可以配置成一个集群。通过前置的负载均衡配置把请求均匀地分发到各个 Server,来应对大批量的网络请求。
Kong是一个可扩展的开源API网关,运作在RESTfull API之前,提供统一的入口,并且通过插件的形式进行扩展,插件提供了平台核心功能以外的功能和服务,例如鉴权、流控等等。

2.1、Kong 支持的功能点

Kong 的插件机制是其高可扩展性的根源,Kong 可以很方便地为路由和服务提供各种插件,网关所需要的基本特性。

  1. 云原生: 与平台无关,Kong可以从裸机运行到Kubernetes
  2. 动态路由:Kong 的背后是 OpenResty+Lua,所以从 OpenResty 继承了动态路由的特性
  3. 熔断
  4. 健康检查
  5. 日志: 可以记录通过 Kong 的 HTTP,TCP,UDP 请求和响应。
  6. 鉴权: 权限控制,IP 黑白名单,同样是 OpenResty 的特性
  7. SSL: Setup a Specific SSL Certificate for an underlying service or API.
  8. 监控: Kong 提供了实时监控插件
  9. 认证: 如数支持 HMAC, JWT, Basic, OAuth2.0 等常用协议
  10. 限流
  11. REST API: 通过 Rest API 进行配置管理,从繁琐的配置文件中解放
  12. 可用性: 天然支持分布式
  13. 高性能: 背靠非阻塞通信的 nginx,性能自不用说
  14. 插件机制: 提供众多开箱即用的插件,且有易于扩展的自定义插件接口,用户可以使用 Lua 自行开发插件

三、Kong 安装

3.1、安装 Kong 的软件包

yum install epel-release
yum install https://kong.bintray.com/kong-community-edition-rpm/centos/7/kong-community-edition-1.1.2.el7.noarch.rpm --nogpgcheck

3.2、Kong 环境介绍

whereis kong
# output:kong: /etc/kong /usr/local/bin/kong /usr/local/kong

  1. /ect/kong 目录为配置文件目录,安装后会有一个官方的默认配置文件 kong.conf.default 复制这个文件为 kong.conf 即可启动Kong。
  2. /usr/local/kong 为Kong的运行目录,Kong启动后会生成nginx的配置文件放在此目录,当然缓存文件也会存放在这个目录中。

Kong 的配置文件中,如果没有启用某一项目配置,那么 Kong 会使用其默认的配置文件。Kong 基于openresty,所以通过包管理器来安装也会安装 openresty,安装目录为/usr/local/openresty/。

3.3、配置数据库存储

Kong 将数据存储在数据库中,支持的数据库有PostgreSQL 9.5+和Cassandra 3.xx作为其数据存储。我们选用并部署PostgreSQL。
sudo su - postgres
psql
###创建用户、库和赋予权限
create user kong with password '123456';
create database kong owner kong;
grant all privileges on database kong to kong;

现在,运行Kong迁移:
kong migrations bootstrap -c /etc/kong/kong.conf
Kong <0.15的注意事项: Kong版本低于0.15(最高0.14)时,请使用up子命令代替bootstrap。还要注意,Kong <0.15时,永远不要同时运行迁移;一次只能有一个Kong节点执行迁移。对于0.15、1.0及更高版本,此限制被取消。

3.4、编辑配置文件

Notice: Please configure kong’s data storage before this
cp /etc/kong/kong.conf.default /etc/kong/kong.conf
Fill the postgresql information you installed into the kong configuration file: /etc/kong/kong.conf

# 两个代理端口
proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443 ssl
# 两个外部管理端口
admin_listen = 0.0.0.0:8001, 0.0.0.0:8444 ssl

database = postgres
pg_host = pgsql地址
pg_port = 5432
pg_user = kong
pg_password = "123456"
pg_database = kong

ssl = off # 如果不希望开放 8443 的 ssl 访问可关闭

3.5、Kong 运行管理

启动kong
kong start -c /etc/kong/kong.conf --vv
--vv 可以打印更多的启动日志

Kong 默认监听以下端口

  1. 8000 Kong通过它来处理客户端进来的http请求,转发给上游服务
  2. 8443 Kong通过它来处理客户端进来的https请求,转发给上游服务.这个端口功能与8000有些像,除了它是用于https的。这个端口可以在配置文件中禁用。
  3. 8001 管理接口使用,用于配置Kong
  4. 8444 管理接口使用,https

关闭Kong
$ kong stop
重载Kong
$ kong reload

四、Kong Dashboard 之 Konga安装

当前 KONG 的社区版是没有 dashboard 的,但是付费的企业版是有带的。如果我们需要展示界面,则可以单独部署 Dashboard 服务。
GitHub上开源且还在更新维护的dashboard有两个:

  1. kong-dashboard:Kong Dashboard 3.3.0 is only partially compatible with Kong 0.13. It does not support the new Service and Route objects introduced in Kong 0.13.kong-dashboard最新版本v3.6.0,只能支持到kongv0.14.x,对于kong的更高版本,功能支持不齐全;
  2. konga:From 0.14.0 onwards, Konga is ONLY compatible with Kong >= 1.0.0;konga从0.14.0开始,仅与Kong> = 1.0.0兼容。Konga 0.12+与Kong 0.14+完全兼容。较早的Kong版本仍然兼容,但不能保证。

4.1、配置依赖环境

依赖:node: version >= 8.x、npm
lib库:Sails.js、AngularJS

1、安装npm
wget -P /app/tools/ https://nodejs.org/dist/v8.11.3/node-v8.11.3-linux-x64.tar.xz
tar -xf /app/tools/node-v8.11.3-linux-x64.tar.xz -C /opt/
cd /opt/
mv node-v8.11.3-linux-x64 nodejs
chown -R root.root nodejs
#echo 'export PATH=$PATH:/opt/nodejs/bin' >> /etc/profile
#source /etc/profile
ln -s /opt/nodejs/bin/node /usr/local/bin/
ln -s /opt/nodejs/bin/npm /usr/local/bin/

2、Install bower, ad gulp packages
# 如果下载慢,可以修改npm源:$ npm --registry https://registry.npm.taobao.org info underscore
npm install -g gulp
npm install -g bower
npm install -g sails
npm install -g unirest

4.2、安装konga

由于我们的kong是社区版 kong-community v1.1.2,最新版本UI – konga v0.14.7在连接kong之后产生不兼容的情况(字段:Https redirect status code),因此,我们改用了可兼容的konga v0.14.1版本,版本对比并无重大变化,所以并不影响我们的学习和使用。
至于,UI – konga v0.14.7是否可兼容kong的最新版v1.4.1,并未验证。
如果你的kong版本的最新的v1.4.x,仅需要忽略下面git相关操作即可。

cd /opt/
git clone https://github.com/pantsel/konga.git
cd konga
git checkout -b v0.14.1-1 0.14.1
git checkout v0.14.1-1
git branch -a
git describe --tags
###安装
npm install konga # 如果报`permission denied`相关错误, $ npm install konga --unsafe-perm=true --allow-root 
npm i pm2 -g
###安装依赖
npm run bower-deps
npm install dotenv-extended
npm install angular

4.3、配置 Kong

项目内已经提供了配置文件用例.env_example,复制为.env并修改配置项即可。关键的配置有PORT、DB_ADAPTER、DB_URI、DB_USER、DB_PASSWORD等。

$ cp .env_example .env
$ vim .env,根据自身环境修改,默认配置如下:
PORT=1337
NODE_ENV=production
KONGA_HOOK_TIMEOUT=120000
DB_ADAPTER=postgres
#DB_HOST=127.0.0.1
#DB_PORT=5432
#DB_USER=konga
#DB_PASSWORD=konga
#DB_DATABASE=konga
DB_URI=postgresql://konga:konga@localhost:5432/konga
KONGA_LOG_LEVEL=warn
TOKEN_SECRET=some_secret_token

4.4、数据库配置

konga的数据库支持:MySQL、MongoDB、PostgreSQL;为了使用它们,请在.env文件中设置适当的环境变量。
我选用的是PostgreSQL,版本建议9.6,过高可能出现不兼容状况。为了保障一切顺利进行,pgsql的部署可参考[postgresql安装及配置]
[root@sltkp3cbpch konga]# su - postgres
Last login: Wed Nov 27 16:39:27 CST 2019 on pts/0
-bash-4.2$ psql
Password:
psql (10.11)
Type "help" for help.

postgres=# create user konga with password 'konga';
CREATE ROLE
postgres=# create database konga owner konga;
CREATE DATABASE
postgres=# grant all privileges on database konga to konga;
GRANT
postgres=#

重启生效
systemctl restart postgresql-9.6

数据初始化

如果连接的是MySQL或PostgresSQL,则在生产模式下运行时,Konga将不会执行数据库迁移。
您可以通过调用$ node ./bin/konga.js prepare 传递数据库连接所需的args 来手动执行迁移。示例:
node ./bin/konga.js prepare --adapter postgres --uri postgresql://konga:konga@127.0.0.1:5432/konga

4.5、konga 服务管理

# 官方启动方式
nohup npm run production &
# 其他启动方式(建议使用):
pm2 start app.js --name konga
pm2 start npm --name 'konga' -- run production

如果在启动时报erro,可以根据日志提示进行修复 /root/.npm/_logs/”date“-debug.log

登录验证
用浏览器打开Konga地址,一般是http://localhost:1337