KONG
一、什么是KONG
Kong 是一个可扩展的开源API 层(也称为API 网关或API 中间件)。它运行在任何RESTful
API 之前,并可通过官网提供的插件进行扩展,也可自定义插件进行用户定制的功能扩展。通过
插件,可使其提供超出核心平台之外的功能和服务,譬如使用统计,用户身份验证,API 授权等。
二、特性
可扩展: 通过简单地添加更多的机器,可以轻松地平行扩展,这意味着您的平台可以在一个较低
负载的情况下处理任何请求。
模块化: 可以通过添加新的插件进行扩展,这些插件可以通过RESTful Admin API 轻松配置。
在任何基础架构上运行: Kong 可以在任何地方都能运行。您可以在云或内部部署环境中部署
Kong,包括单个或多个数据中心设置,以及public,private 或invite-only APIs。
Kong 是基于NGINX 和Apache Cassandra 或PostgreSQL 构建的,能提供易于使用的
RESTful API 来操作和配置API 管理系统
三、请求流程
为了更好地理解系统,这是使用Kong 的API 的典型请求工作流程:
当Kong 运行时,每个对API 的请求将先被Kong 命中,然后这个请求将会被代理到最终的API。
在requests 和responses 之间,Kong 将会执行已经事先安装和配置好的任何插件,授权您
的API。Kong 是每个API 请求的入口点(point)。
四、Kong 安装
1、CentOS7 下安装包下载;
2、执行sudo yum install epel-release,下载依赖包,选择Y,直到出现Complete;
3、切换到kong-community-edition-0.11.2.el7.noarch.rpm 安装包的目录下,执行
sudo yum install kong-community-edition-0.11.2.*.noarch.rpm –nogpgcheck,
安装kong,然后选择Y,直到出现Complete,安装完成。
4、检查版本kong version;
5、使用PostgreSQL 作为数据存储的话,先创建一个数据库和一个用户:
执行以下命令:
1>、su - postgres;
2>、psql -U postgres;
3>、CREATE USER kong;
4>、CREATE DATABASE kong OWNER kong;
5>、\l;查看
KONG 迁移,执行kong migrations up [-c /path/to/kong.conf]
查看Postgres 中kong 数据库下面的表:
5、启动kong,执行kong start
显示kong started,表示kong 已经启动成功。
6、使用kong,执行curl -i http://localhost:8001/
7、通过管理员添加API,通过curl 来添加,如下:
$ curl -i -X POST \
–url http://localhost:8001/apis/ \
–data ‘name=example-api’ \
–data ‘hosts=example.com’ \
–data ‘upstream_url=http://www.baidu.com’
以下信息,确认API 已添加到KONG 里了。
8、通过KONG 转发请求。如下:
$ curl -i -X GET \
–url http://localhost:8000/ \
–header ‘Host: example.com’
9、通过API 添加插件。为您的API 配置key-auth 插件,通过以下命令,为之前添加的API
新增认证功能:
$ curl -i -X POST \
–url http://localhost:8001/apis/example-api/plugins/ \
–data ‘name=key-auth’
NOTE:该插件还接受一个config.key_names 参数,默认为[apikey]。它表示在一次请求
中,应该包含API 密钥[apikey]和参数列表,apikey 可以放在header 中,也可以直接当作一
个请求参数来使用。
10、增加用户(Consumer)
用户可以被单独管理,以及控制他们对API 的访问。用户是与使用您的API 的个人相关
联,可用于跟踪,访问管理等
$ curl -i -X POST \
–url http://localhost:8001/consumers/ \
–data “username=Jason”
NOTE:如果想要将用户和已有的其他数据库中的用户进行关联,可通过添加`custom_id`参
数来实现,其值可以是现存用户的id。
11、为该用户添加一个[apikey]认证,通过以下请求为刚创建的用户Jason 创建一个密钥:
$ curl -i -X POST \
–url http://localhost:8001/consumers/Jason/key-auth/ \
–data ‘key=ENTER_KEY_HERE’
12、验证用户的apikey 是否有效。
$ curl -i -X GET \
–url http://localhost:8000 \
–header “Host: example.com” \
–header “apikey: ENTER_KEY_HERE”
13、配置参考
配置加载:如果您通过其中一个官方软件包安装了Kong,Kong 会附带默认配置文件,该
文件可以在/etc/kong/kong.conf.default 中找到。要开始配置Kong,您可以复制此文件:
cp/etc/kong/kong.conf.default/etc/kong/kong.conf如果您的配置中的所有内容都注释掉,Kong将使用默认设置进行操作。启动时,Kong会查找可能包含配置文件的几个默认位置:/etc/kong/kong.conf/etc/kong.conf您可以通过使用CLI中的−c/–conf命令,自定义配置文件的路径来覆盖此行为:
c
p
/
e
t
c
/
k
o
n
g
/
k
o
n
g
.
c
o
n
f
.
d
e
f
a
u
l
t
/
e
t
c
/
k
o
n
g
/
k
o
n
g
.
c
o
n
f
如
果
您
的
配
置
中
的
所
有
内
容
都
注
释
掉
,
K
o
n
g
将
使
用
默
认
设
置
进
行
操
作
。
启
动
时
,
K
o
n
g
会
查
找
可
能
包
含
配
置
文
件
的
几
个
默
认
位
置
:
/
e
t
c
/
k
o
n
g
/
k
o
n
g
.
c
o
n
f
/
e
t
c
/
k
o
n
g
.
c
o
n
f
您
可
以
通
过
使
用
C
L
I
中
的
−
c
/
–
c
o
n
f
命
令
,
自
定
义
配
置
文
件
的
路
径
来
覆
盖
此
行
为
:
kong start –conf /path/to/kong.conf
配置格式很简单:只需取消注释任何属性(注释由#字符定义),并根据您的需要进行修改。
布尔值可以指定为on / off 或true / false,使用起来很方便。
验证您的配置:您可以使用check 命令验证设置的完整性:
$ kong check
五、安装git
5.1、确保安装gcc、g++以及编译git 所需要的包
–安装gcc
yum install gcc
–安装g++
yum install gcc-c++
–安装编译所需的包
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install gcc perl-ExtUtils-MakeMaker
5.2、下载源码(*.tar.gz)到指定的目录
–下载文件到/usr/src/git-2.12.2 目录
wget -P /usr/src/git-2.12.2 https://www.kernel.org/pub/software/scm/git/git-2.12.2.tar.gz
5.3、切换到刚刚保存下载文件的目录并解压文件
–切换到指定目录
cd /usr/src/git-2.12.2/
–解压源码包
tar zxvf git-2.12.2.tar.gz
5.4、进入解压目录
cd git-2.12.2/
5.5、配置安装目录并编译和安装
./configure –prefix=/usr/local/git-2.12.2
make install
5.6、将编译好的git-2.12.2 bin 目录添加到bashrc 中,相当于添加全局变量
echo ‘export PATH=$PATH:/usr/local/git-2.12.2/bin’ > /etc/profile.d/git.sh
5.7、使bashrc 立即生效,全局变量立即生效
source /etc/bashrc
5.8、查看git 版本
git –version
六、安装node.js
访问该地址:https://nodejs.org/en/download/
点击红框处下载最新版nond.js 包
解压:
tar zxvf node-.tar.gz(是版本号)
进入解压后的文件夹:
cd node-*
逐个执行下面命令:
./configure –prefix=/usr/local/node/*
make
make install
Node.js 安装完成
七、安装kong-dashboard
7.1、kong-dashboard 安装
git clone https://github.com/PGBI/kong-dashboard
安装Kong Dashboard:
npm install -g kong-dashboard@v2
启动kong-dashboard:
kong-dashboard start(建议不要sudo)
7.2、访问kong-dashboard
http://localhost:8080/
查看现有api 列表,下图红色按钮
新增api,点击下图红框内+
7.3、kong-dashboard 的使用
7.3.1 注册api 服务
有如下两个api 服务:
http://www.163.com/
http://www.ifeng.com
向kong 中添加api
注意:
name 为api 服务名不能重复
hosts、uris、methods 至少应指定一个,uris 指定该api 在kong 上访问时的uri 路径,
当有多个时使用逗号分割
upstream_url 为真正的api 服务地址
strip_uri 表示通过其中一个uris 前缀匹配API 时,是否从upstream_url 中删除匹配到
的uris 前缀。默认值:true
kong-dashboard 管控台api 列表
curl -i -X POST –url http://10.100.50.22:8001/apis/ –data ‘name=info’ –data
‘uris=/info,/getinfo’ –data ‘methods=GET’ –data
curl -i -X POST –url http://10.100.50.22:8001/apis/ –data ‘name=users’
–data ‘uris=/users,/getusers’ –data ‘methods=GET’ –data
‘upstream_url=http://10.100.50.22:8129/users’ –data ‘strip_uri=true’
7.3.2 访问注册在kong 中的api 服务
curl -i -X GET –url http://10.100.50.22:8000/info
curl -i -X GET –url http://10.100.50.22:8000/getinfo
curl -i -X GET –url http://10.100.50.22:8000/users
curl -i -X GET –url http://10.100.50.22:8000/getusers
7.3.3 从kong 中删除api
curl -i -X DELETE http://10.100.50.22:8001/apis/info
curl -i -X DELETE http://10.100.50.22:8001/apis/users
7.3.4 查看apis 列表
curl -i -X GET http://10.100.50.22:8001/apis
或浏览器访问http://10.100.50.22:8001/apis
7.3.5 插件管理
添加插件
/apis/{name or id}/plugins/
安装file-log 插件
curl -X POST http://10.100.50.22:8001/apis/{api}/plugins \
–data “name=file-log” \
–data “config.path=/tmp/file.log”
安装rate-limiting
curl -X POST http://10.100.50.22:8001/apis/{api}/plugins \
–data “name=rate-limiting” \
–data “config.second=5” \
–data “config.hour=10000”
安装ip-restriction 插件
curl -X POST http://10.100.50.22:8001/apis/{api}/plugins \
–data “name=ip-restriction” \
–data “config.whitelist=10.100.50.22”
–data “config.blacklist=143.1.0.0/24”
安装key-auth 插件
curl -X POST http://10.100.50.22:8001/apis/{api}/plugins \
–data “name=key-auth” \
–data “config.hide_credentials=true”
–data “config.key_names=apikey”
创建Consumer
curl -X POST http://10.100.50.22:8001/consumers/ \
–data “username=admin” \
–data “custom_id=qtonecloud-admin”
curl -X POST http://10.100.50.22:8001/consumers/ \
–data “username=guest” \
–data “custom_id=qtonecloud-guest”
创建API Key
curl -X POST http://10.100.50.22:8001/consumers/{consumer}/key-auth -d ‘key=get’
使用API Key 调用服务
curl http://10.100.50.22:8000/getusers?apikey=ad097442ea4e4e0c911da52ad5c4cea2
如果上面运行不行尝试如下
curl http://10.100.50.22:8000/getusers?apikey=get
安装basic-auth 插件
curl -X POST http://10.100.50.22:8001/apis/{api}/plugins \
–data “name=basic-auth” \
–data “config.hide_credentials=true”
创建Consumer
curl -d “username=qtonecloud&custom_id=qtonecloud”
http://10.100.50.22:8001/consumers/
创建Credential
curl -X POST http://10.100.50.22:8001/consumers/{consumer}/basic-auth \
–data “username=admin” \
–data “password=admin”
使用Credential 调用api 服务
curl http://10.100.50.22:8000/getusers \
-H ‘Authorization: Basic YWRtaW46YWRtaW4=’
其中YWRtaW46YWRtaW4= 为上一步中username 与password 的Base64 编码后的值即
admin:admminBase64 编码后的值
安装ACL 插件
ACL 依赖authentication plugin
安装acl,添加组白名单、黑名单
curl -X POST http://10.100.50.22:8001/apis/{api}/plugins \
–data “name=acl” \
–data “config.whitelist=user, admin”
–data “config.blacklist=guest”
关联Consumers
curl -X POST http://10.100.50.22:8001/consumers/{consumer}/acls \
–data “group=guest”
启用任何一种Authentication 插件,如之前安装的basic-auth 或key-auth 插件
使用对应的Authentication 插件认证方式调用api
7.3.6 查看插件列表
curl -i -X GET http://10.100.50.22:8001/plugins
或浏览器访问http://10.100.50.22:8001/plugins
kong-dashboard 管控台插件列表
rate-limiting 插件限流
ip-restriction 插件IP 黑名单(我把自己的ip 设置为黑名单)
key-auth 插件
basic-auth
acl
同时启用basic-auth 和acl
7.4、Kong 负载均衡
目前有如下APIs
创建一个upstream
命令如下:
curl -X POST http://10.100.50.55:8001/upstreams \
–data “name=hello”
此处的hello 要和api 的名字对应,如下图
创建蓝色upstream 目标
命令如下:
目标一:
curl -X POST http://10.100.50.55:8001/upstreams/hello/targets \
–data “target=10.100.50.55:8888”
–data “weight=100”
目标二:
curl -X POST http://10.100.50.55:8001/upstreams/hello/targets \
–data “target=10.100.50.55:9999”
–data “weight=50”
访问该蓝色API 结果如下:
创建绿色upstream 目标
命令如下:
目标一:
curl -X POST http://10.100.50.55:8001/upstreams/saybye/targets \
–data “target=10.100.50.55:6666”
–data “weight=100”
目标二:
curl -X POST http://10.100.50.55:8001/upstreams/saybye/targets \
–data “target=10.100.50.45:9002”
–data “weight=50”
访问该绿色API 结果如下:
要激活蓝/绿开关,我们现在只需要更新API:
curl -X PATCH http://10.100.50.22:8001/apis/hi \
–data “upstream_url=http://saybye/bye”
此时就将API hi 切换为bye
访问hi 的API 结果输出为bye 的API 输出结果
访问如下:
再次切回去
curl -X PATCH http://10.100.50.22:8001/apis/hi \
–data “upstream_url=http://hello/hi”
访问hi 的API 结果输出为hi 的API 输出结果
访问如下:
7.5、用openssl 生成证书
7.5.1 API 对http2 的支持实现
首先使用oauth2.0 需要kong 配置https 协议,由于是本地开发,随便自己生成就可以了,
没有openssl 的自己装
安装步骤如下:
生成私钥:
openssl genrsa -out server.key 1024
执行结果
Generating RSA private key, 1024 bit long modulus
.++++++
……………++++++
e is 65537 (0x10001)
生成证书
openssl req -new -x509 -key server.key -out server.pem -days 365
将证书配置到kong 的API
创建API
如果使用https 则需要修改API 为Https only(如下所示)
访问结果如下:
到此该API 就支持http2 的请求
7.5.2 使用token
待上面步骤完成后,创建oauth2 插件(因为使用oauth2 的前提是需要https)
创建oauth2 插件:
此时请求该API 将会报下图错误
需要创建一个用户
让这个用户来管理这个API ,通过oauth2 关联
申请accesstoken 并访问
Token 和用户关联关系
7.6、使用JWT
创建JWT
[root@localhost etc]# curl -X POST http://10.100.50.22:8001/apis/AMF/plugins \
–data “name=jwt”
创建用户
curl -X POST http://10.100.50.22:8001/consumers \
–data “username=BZHJWT” \
–data “custom_id=testjwt”
把用户和JWT 绑定
curl -X POST http://10.100.50.22:8001/consumers/BZHJWT/jwt -H “Content-Type:
application/x-www-form-urlencoded”
删除JWT
curl -X DELETE http://10.100.50.22:8001/consumers/{consumer}/jwt/{id}
Id:是JWT 的ID
查看JWT
curl -X GET http://10.100.50.22:8001/consumers/BZHJWT/jwt
通过程序算法生成JWT
public class JWT {
//Sample method to construct a JWT
public static String createJWT(String id, String issuer, String
subject, long ttlMillis,String secret) {
//The JWT signature algorithm we will be using to sign the token
SignatureAlgorithm signatureAlgorithm =
SignatureAlgorithm.HS256;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
//We will sign our JWT with our ApiKey secret
// byte[] apiKeySecretBytes =
DatatypeConverter.parseBase64Binary(apiKey.getSecret());
byte[] apiKeySecretBytes =
DatatypeConverter.parseBase64Binary(secret);
Key signingKey = new SecretKeySpec(apiKeySecretBytes,
signatureAlgorithm.getJcaName());
//Let’s set the JWT Claims
JwtBuilder builder = Jwts.builder().setId(id)
.setIssuedAt(now)
.setSubject(subject)
.setIssuer(issuer)
.signWith(signatureAlgorithm, signingKey);
//if it has been specified, let’s add the expiration
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
//Builds the JWT and serializes it to a compact, URL-safe string
return builder.compact();
}
//Sample method to validate and read the JWT
public static Map
IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 10.100.50.45/32(需要连接的服务器IP) trust
11、重启服务,执行systemctl restart postgresql-10;
12、使用Navicat Premium 软件连接,连接成功。
Cassandra 数据库
一、Cassandra 数据库的安装
1.1 通过RPM 包安装
首先,将下面文字添加在/etc/yum.repos.d/cassandra.repo 文件下(例如:安装的版本号
为3.11)
[cassandra]
name=Apache Cassandra
baseurl=https://www.apache.org/dist/cassandra/redhat/311x/
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://www.apache.org/dist/cassandra/KEYS
1.2 安装Cassandra,接受gpg 密钥导入提示
sudo yum install cassandra
1.3 启动Cassandra(不会自动启动)
service cassandra start
注:基于Systemd 的发行版可能需要运行systemctl daemon-reload 一次才能使Cassandra
成为systemd 服务。这应该通过运行上面的命令自动发生。
chkconfig cassandra on
最后运行cassandra -v
如果能出现版本号则说明安装成功