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

  1. docker run -d --name kong-database \
  2. -p 5432:5432 \
  3. -e "POSTGRES_USER=kong" \
  4. -e "POSTGRES_DB=kong" \
  5. -e "POSTGRES_PASSWORD=kong" \
  6. -e "POSTGRES_DB=kong" postgres:12
  7. 8b00f13774371b54718d8f905e7ee391bd1190169a68e254fbd5dd4f09b21535
  8. #换成自己的公网ip地址
  9. docker run --rm \
  10. -e "KONG_DATABASE=postgres" \
  11. -e "KONG_PG_HOST=10.3.189.17" \
  12. -e "KONG_PG_PASSWORD=kong" \
  13. -e "POSTGRES_USER=kong" \
  14. -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
  15. kong kong migrations bootstrap

2. 安装kong

下载和安装

  1. 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 – 很重要

  1. systemctl stop firewalld.service
  2. systemctl restart docker
  3. cp /etc/kong/kong.conf.default /etc/kong/kong.conf
  4. vim /etc/kong/kong.conf
  5. #修改如下内容
  6. database = postgres
  7. pg_host = 10.3.90.7 # 这里得配置对外ip地址 不能是127.0.0.1
  8. pg_port = 5432 # Port of the Postgres server.
  9. pg_timeout = 5000 # Defines the timeout (in ms), for connecting,
  10. # reading and writing.
  11. pg_user = kong # Postgres user.
  12. pg_password = kong # Postgres user's password.
  13. pg_database = kong # The database name to connect to.
  14. dns_resolver = 127.0.0.1:8600 #这个配置很重要,配置的是consul的dns端口,默认是8600 可以自己修改默认端口
  15. admin_listen = 0.0.0.0:8001 reuseport backlog=16384, 127.0.0.1:8444 http2 ssl reuseport backlog=16384
  16. proxy_listen = 0.0.0.0:8000 reuseport backlog=16384, 0.0.0.0:8443 http2 ssl reuseport backlog=16384

初始化kong的数据库并启动

  1. kong migrations bootstrap up -c /etc/kong/kong.conf #这里是初始化生成数据库
  2. kong start -c /etc/kong/kong.conf
  3. #添加防火墙规则
  4. firewall-cmd --zone=public --add-port=8001/tcp --permanent
  5. firewall-cmd --zone=public --add-port=8000/tcp --permanent
  6. sudo firewall-cmd --reload

然后在浏览器中访问: http://你的ip地址:8001/ 来确定kong是否启动成功

3. 安装konga

  1. docker run -d -p 1337:1337 --name konga pantsel/konga

>配置一下

2.kong的安装和配置 - 图1

>配置成功

2.kong的安装和配置 - 图2

>确保dns_resolver配置了consul的信息

2.kong的安装和配置 - 图3

4. kong的8001、8000和1337端口号的关系

2.kong的安装和配置 - 图4

5.基本的路由转发

Service >顾名思义,就是我们自己定义的上游服务,通过Kong匹配到相应的请求要转发的地方,Service 可以与下面的Route进行关联一个Service可以有很多Route匹配到的Route就会转发到Service中,当然中间也会通过Plugin的处理增加或者减少一些相应的Header或者其他信息.

Routes; >Route 路由相当于nginx 配置中的locationRoute实体定义匹配客户端请求的规则.每个路由都与一个服务相关联,而服务可能有多个与之相关联的路由.每一个匹配给定路线的请求都将被提交给它的相关服务. 路由和服务的组合 (以及它们之间的关注点分离)提供了一种强大的路由机制,可以在Kong中定义细粒度的入口点,从而引导您的访问到不同upstream服务

2.kong的安装和配置 - 图5

2.kong的安装和配置 - 图6

测试即可

2.kong的安装和配置 - 图7

6.kong的service、routes、upstream

2.kong的安装和配置 - 图8

7.kong集成consul实现服务发现和负载均衡

2.kong的安装和配置 - 图9

8.kong配置jwt实现登录校验

通用认证

一般情况下,上游API服务都需要客户端有与份认证,目不允许错误的认证或无认证的请求通过,认证插件可以实现这一需求。这些插件的通用方案/流程如下:

  1. 向一个API或全局添加JWT插件(此插件不作用于consumers] ;
  2. 创建一个consumer对象;
  3. 为consumer是俱指定的验证插件方案的身份验证凭据
  4. 现在,只要有请求进入Kong,都将检查其提供的身份验证凭据(取决于auth类型),如果该请求无法被验证或者验证失败,则会话请求会被锁定,不执行向上游服务转发的操作。
  5. 但是,上述的一般流程并不是总是有效的。譬如,当使用了外部验证方案(比如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

配置过程

  1. 新建一个consumer 2.kong的安装和配置 - 图10
  2. 为这个consumer添加jwt,记住key! 2.kong的安装和配置 - 图11 2.kong的安装和配置 - 图12
  3. 配置全局的plugins
    • a.设置header为x-token 2.kong的安装和配置 - 图13
  4. 在jwt.io生成一个token来测试
    • a.在payload添加iss,最好和代码的iss保持一致 2.kong的安装和配置 - 图14 测试一下 2.kong的安装和配置 - 图15

>注意:新建jwt的时候key必须和文际生成的token中的payload中的iss的值保持一致

9.kong配置反爬和ip黑名单

反爬 2.kong的安装和配置 - 图16 黑白名单 2.kong的安装和配置 - 图17