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. 基础版本
新建docker-compose.yml文件
version: '3'
services:
kong-database:
image: postgres:12
container_name: kong-database
ports:
- 5432:5432
environment:
- POSTGRES_USER=kong
- POSTGRES_DB=kong
- POSTGRES_PASSWORD=kong
networks:
- kong-net
volumes:
- "db-data-kong-postgres:/var/lib/postgresql/data"
kong-migrations:
image: kong
environment:
- KONG_DATABASE=postgres
- KONG_PG_HOST=kong-database
- KONG_PG_PASSWORD=kong
- KONG_CASSANDRA_CONTACT_POINTS=kong-database
command: kong migrations bootstrap
restart: on-failure
networks:
- kong-net
depends_on:
- kong-database
kong:
image: kong
container_name: kong
environment:
- LC_CTYPE=en_US.UTF-8
- LC_ALL=en_US.UTF-8
- KONG_DATABASE=postgres
- KONG_PG_HOST=kong-database
- KONG_PG_USER=kong
- KONG_PG_PASSWORD=kong
- KONG_PROXY_ACCESS_LOG=/dev/stdout
- KONG_ADMIN_ACCESS_LOG=/dev/stdout
- KONG_PROXY_ERROR_LOG=/dev/stderr
- KONG_ADMIN_ERROR_LOG=/dev/stderr
- KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl
- KONG_PROXY_LISTEN=0.0.0.0:8000, 0.0.0.0:8443 ssl
restart: on-failure
ports:
- 8000:8000
- 8443:8443
- 8001:8001
- 8444:8444
links:
- kong-database:kong-database
networks:
- kong-net
depends_on:
- kong-migrations
konga:
image: pantsel/konga
ports:
- 1337:1337
links:
- kong:kong
container_name: konga
environment:
- NODE_ENV=production
volumes:
db-data-kong-postgres:
networks:
kong-net:
external: false
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
docker run --rm \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=10.3.90.7" \
-e "KONG_PG_PASSWORD=kong" \
-e "POSTGRES_USER=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong kong migrations bootstrap
2. 安装kong
下载和安装
可以到这里找下载链接: https://docs.konghq.com/install/centos/
curl -Lo kong-2.1.0.amd64.rpm $( rpm --eval "https://download.konghq.com/gateway-2.x-centos-%{centos_ver}/Packages/k/kong-2.1.0.el%{centos_ver}.amd64.rpm")
sudo yum install kong-2.1.0.amd64.rpm
编辑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服务都需要客户端有与份认证,目不允许错误的认证或无认证的请求通过,认证插件可以实现这一需求。这些插件的通用方案/流程如下: 1.向一个API或全局添加AJTH插件(此插件不作用于consumers] ; 2创建一个consumer对象; 3.为consumer是俱指定的验证插件方案的身份验证凭居: 4.现在,只要有请求进入Kong,都将检查其提供的身份验证凭据(取决于auth类型),如果该请求无法被验证或者验证失败,则话求会被锁定,不执行向上游服务转发的操作。 但是,上述的一般流程并不是总是有效的。警如,当使用了外部验证方案(比如LDAP)时,KONG就不会(不需要) 对consumer进行身份验证.
Consumers
最简单的理解和配置consumer的方式是,将具于用户进行一一映时,即一个consumer代表一个用户 (或心用)但是对于KONG而言,这些都无所谓。consumer的核心原则是你可以为其添加插件,从而自定义他的请求行为所以,或许你会有一个手机APP应用,并为他的每个版本都定义一个consumer,又或者你又一个应用或几个应用,并为这些应用定义统一个consumer,这些都无所谓,这是一个横制的概念,他叫做consumer,而不是user!万万要区分开来,且不可混滑。
匿名验证
首先需要创建一个Scrvice来做上有服务,来匹配到相应的相应的转发的目的地,一个scrvice可以由多个Route. 匹断图的Route都会转发给Serice。 Service可以县一个世纪的的地址,也可以是kong内部提供的upstream object
配置jwt
配置过程
- 新建一个consumer
- 为这个consumer添加jwt,记住key!
- 配置全局的plugins
- a.设置header为x-token
- a.设置header为x-token
- 在jwt.io生成一个token来测试
- a.在payload添加iss,最好和代码的iss保持一致
测试一下
- a.在payload添加iss,最好和代码的iss保持一致
注意:新建jwt的时候key必须和文际生成的token中的payload中的iss的值保持一致
9.kong配置反爬和ip黑名单
反爬
黑白名单