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文件

  1. version: '3'
  2. services:
  3. kong-database:
  4. image: postgres:12
  5. container_name: kong-database
  6. ports:
  7. - 5432:5432
  8. environment:
  9. - POSTGRES_USER=kong
  10. - POSTGRES_DB=kong
  11. - POSTGRES_PASSWORD=kong
  12. networks:
  13. - kong-net
  14. volumes:
  15. - "db-data-kong-postgres:/var/lib/postgresql/data"
  16. kong-migrations:
  17. image: kong
  18. environment:
  19. - KONG_DATABASE=postgres
  20. - KONG_PG_HOST=kong-database
  21. - KONG_PG_PASSWORD=kong
  22. - KONG_CASSANDRA_CONTACT_POINTS=kong-database
  23. command: kong migrations bootstrap
  24. restart: on-failure
  25. networks:
  26. - kong-net
  27. depends_on:
  28. - kong-database
  29. kong:
  30. image: kong
  31. container_name: kong
  32. environment:
  33. - LC_CTYPE=en_US.UTF-8
  34. - LC_ALL=en_US.UTF-8
  35. - KONG_DATABASE=postgres
  36. - KONG_PG_HOST=kong-database
  37. - KONG_PG_USER=kong
  38. - KONG_PG_PASSWORD=kong
  39. - KONG_PROXY_ACCESS_LOG=/dev/stdout
  40. - KONG_ADMIN_ACCESS_LOG=/dev/stdout
  41. - KONG_PROXY_ERROR_LOG=/dev/stderr
  42. - KONG_ADMIN_ERROR_LOG=/dev/stderr
  43. - KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl
  44. - KONG_PROXY_LISTEN=0.0.0.0:8000, 0.0.0.0:8443 ssl
  45. restart: on-failure
  46. ports:
  47. - 8000:8000
  48. - 8443:8443
  49. - 8001:8001
  50. - 8444:8444
  51. links:
  52. - kong-database:kong-database
  53. networks:
  54. - kong-net
  55. depends_on:
  56. - kong-migrations
  57. konga:
  58. image: pantsel/konga
  59. ports:
  60. - 1337:1337
  61. links:
  62. - kong:kong
  63. container_name: konga
  64. environment:
  65. - NODE_ENV=production
  66. volumes:
  67. db-data-kong-postgres:
  68. networks:
  69. kong-net:
  70. external: false

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. docker run --rm \
  8. -e "KONG_DATABASE=postgres" \
  9. -e "KONG_PG_HOST=10.3.90.7" \
  10. -e "KONG_PG_PASSWORD=kong" \
  11. -e "POSTGRES_USER=kong" \
  12. -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
  13. kong kong migrations bootstrap

2. 安装kong

下载和安装

可以到这里找下载链接: https://docs.konghq.com/install/centos/

  1. 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")
  2. sudo yum install kong-2.1.0.amd64.rpm

编辑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 2.kong的安装和配置 - 图9

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

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

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

配置过程

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

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

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

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