1. kong介绍
https://github.com/qianyugang/kong-docs-cn
https://www.zhihu.com/topic/20174970/hot
Kong是一个开源的API网关,它是一个针对API的一个管理工具。你可以在那些上游服务之前,额外地实现一些功能。
Kong本身是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。
2. 安装
1. 安装postgresql和migrations
docker run -d --name kong-database \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
-e "POSTGRES_DB=kong" postgres:12
8b00f13774371b54718d8f905e7ee391bd1190169a68e254fbd5dd4f09b21535
#换成自己的公网ip地址
docker run --rm \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=10.3.189.17" \
-e "KONG_PG_PASSWORD=kong" \
-e "POSTGRES_USER=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong kong migrations bootstrap
2. 安装kong
下载和安装
docker run -d -p 8000:8000 -p 8001:8001 -p 8443:8443 -p 8444:8444 --name kong -v /Users/lishuo/Code/docker/kong/conf/kong.conf:/etc/kong/kong.conf kong/latest
编辑kong配置
关闭防火墙、重启docker – 很重要
systemctl stop firewalld.service
systemctl restart docker
cp /etc/kong/kong.conf.default /etc/kong/kong.conf
vim /etc/kong/kong.conf
#修改如下内容
database = postgres
pg_host = 10.3.90.7 # 这里得配置对外ip地址 不能是127.0.0.1
pg_port = 5432 # Port of the Postgres server.
pg_timeout = 5000 # Defines the timeout (in ms), for connecting,
# reading and writing.
pg_user = kong # Postgres user.
pg_password = kong # Postgres user's password.
pg_database = kong # The database name to connect to.
dns_resolver = 127.0.0.1:8600 #这个配置很重要,配置的是consul的dns端口,默认是8600 可以自己修改默认端口
admin_listen = 0.0.0.0:8001 reuseport backlog=16384, 127.0.0.1:8444 http2 ssl reuseport backlog=16384
proxy_listen = 0.0.0.0:8000 reuseport backlog=16384, 0.0.0.0:8443 http2 ssl reuseport backlog=16384
初始化kong的数据库并启动
kong migrations bootstrap up -c /etc/kong/kong.conf #这里是初始化生成数据库
kong start -c /etc/kong/kong.conf
#添加防火墙规则
firewall-cmd --zone=public --add-port=8001/tcp --permanent
firewall-cmd --zone=public --add-port=8000/tcp --permanent
sudo firewall-cmd --reload
然后在浏览器中访问: http://你的ip地址:8001/ 来确定kong是否启动成功
3. 安装konga
docker run -d -p 1337:1337 --name konga pantsel/konga
>配置一下
>配置成功
>确保dns_resolver配置了consul的信息
4. kong的8001、8000和1337端口号的关系
5.基本的路由转发
Service >顾名思义,就是我们自己定义的上游服务,通过Kong匹配到相应的请求要转发的地方,Service 可以与下面的Route进行关联一个Service可以有很多Route匹配到的Route就会转发到Service中,当然中间也会通过Plugin的处理增加或者减少一些相应的Header或者其他信息.
Routes; >Route 路由相当于nginx 配置中的locationRoute实体定义匹配客户端请求的规则.每个路由都与一个服务相关联,而服务可能有多个与之相关联的路由.每一个匹配给定路线的请求都将被提交给它的相关服务. 路由和服务的组合 (以及它们之间的关注点分离)提供了一种强大的路由机制,可以在Kong中定义细粒度的入口点,从而引导您的访问到不同upstream服务
测试即可
6.kong的service、routes、upstream
7.kong集成consul实现服务发现和负载均衡
8.kong配置jwt实现登录校验
通用认证
一般情况下,上游API服务都需要客户端有与份认证,目不允许错误的认证或无认证的请求通过,认证插件可以实现这一需求。这些插件的通用方案/流程如下:
- 向一个API或全局添加JWT插件(此插件不作用于consumers] ;
- 创建一个consumer对象;
- 为consumer是俱指定的验证插件方案的身份验证凭据
- 现在,只要有请求进入Kong,都将检查其提供的身份验证凭据(取决于auth类型),如果该请求无法被验证或者验证失败,则会话请求会被锁定,不执行向上游服务转发的操作。
- 但是,上述的一般流程并不是总是有效的。譬如,当使用了外部验证方案(比如LDAP)时,KONG就不会(不需要) 对consumer进行身份验证.
Consumers
最简单的理解和配置consumer的方式是,将具于用户进行一一映时,即一个consumer代表一个用户 (或心用)但是对于KONG而言,这些都无所谓。consumer的核心原则是你可以为其添加插件,从而自定义他的请求行为所以,或许你会有一个手机APP应用,并为他的每个版本都定义一个consumer,又或者你又一个应用或几个应用,并为这些应用定义统一个consumer,这些都无所谓,这是一个横制的概念,他叫做consumer,而不是user!万万要区分开来,且不可混滑。
匿名验证
首先需要创建一个Service来做上由服务,来匹配到相应的相应的转发的目的地,一个service可以有多个Router.匹配的Route都会转发给Services。 Service可以先是一个实际的地址(10.3.189.17:8082),也可以是kong内部提供的upstream object(consul服务发现得到多个对象)
配置jwt
配置过程
- 新建一个consumer
- 为这个consumer添加jwt,记住key!
- 配置全局的plugins
- a.设置header为x-token
- 在jwt.io生成一个token来测试
- a.在payload添加iss,最好和代码的iss保持一致 测试一下
>注意:新建jwt的时候key必须和文际生成的token中的payload中的iss的值保持一致
9.kong配置反爬和ip黑名单
反爬 黑白名单