整合一套高性能网关Kong

打印 上一主题 下一主题

主题 560|帖子 560|积分 1680

前言#

    相信大家对Api网关都比较的熟悉,我们之前的文章也介绍过ASP.NET Core的网关Ocelot,也介绍过Spring Cloud Gateway。说到网关的主要功能,其实总结起来就两个字"统一",无论是作为应用的入口、认证授权、熔断限流等等主要都是为了统一的地方做一些事情。今天我们介绍一款性能更高的网关Kong,相对于Ocelot或Gateway这些类型的网关来说,Kong的优势是具有更高的性能,主要因为Kong是基于Nginx+Lua为核心的,接下来我们就详细介绍一下。
概念介绍#

    在使用Kong之前我们先来大致的介绍一下Kong是什么,Kong是基于OpenResty的开源网关。而OpenResty是基于Nginx与Lua的高性能Web平台。经常使用Nginx的同学们都知道,如果修改了Nginx的配置是需要重启Nginx的。而OpenResty让Nginx具备了动态编程的能力,使得Nginx成为了一个应用服务器软件,Kong正是基于OpenResty的,Nginx的性能不必多说,所以Kong可以理解为运行在Nginx上的高性能网关,在学习的过程中我们可以类比着Nginx进行了解。
Kong#

说了这么多接下来我们大致介绍一下Kong自学三件套
Kong有一点做的还是比较好的,无论是GitHub还是官方文档介绍的都比较详细,而且比较通俗易懂,这里我们就不过多的介绍了,有兴趣的同学可以自行了解一下。介绍完了自学三件套之后,接下来我们了解一下搭建一套Kong的几个组成部分,总结起来就是三个Kong服务、Kong依赖的存储、Kong可视化界面,下面我们大致的介绍一下。

  • 首先是Kong服务,一套可以正常工作的Kong会包含两个对外提供服务的端口,一个是网关常规使用的端口,即对外提供访问的入口。另一个则是管理Kong的Admin端口,比如对Kong管理服务的增删改查以及Kong常用的Plugin管理以及一些常规的配置等,Kong的插件非常的丰富,基本上可以到达常规的一些操作比如限流、认证授权、链路跟踪、监控等都有而且形式非常的丰富。
  • 其次是Kong存储服务,因为在Kong上配置的转发服务、插件、环境变量、认证等相关的信息都是需要存储的,但是外部存储不是必须的,Kong可以将这些信息存储到进程内的缓存中,但是重启Kong之后这些配置将会丢失,因此在正常的使用过程中我们总会给他提供一个外部数据库来存储这些信息。可供Kong使用的存储数据库也有好几个选择分别是Mysql、MongoDB、Postgresql等。本次演示我们使用的是Postgresql,也是官方推荐的方式。
  • 最后是Kong的可视化UI,当然这个不是必须的。Kong提供了Admin管理接口的形式对服务和Plugin查看、新增、修改、删除等操作,但是有一个可视化的管理界面,无疑让有些操作变得更加简单清晰,而且这些可视化系统正式基于Kong的Admin接口开发的。可供选择的可视化UI也比较多,比较出名的有Konga、kong-ui、kong-admin-ui。本次演示我们选择的是Konga,也是推荐使用的最多的一个。
Konga#

    Konga并非Kong官方出品的可视化UI,但是它是最流行的一个,也是使用最多的一个,目前最新版本是v0.6.3。Konga是基于Nodejs开发的,它的Github地址是https://github.com/pantsel/konga,同样的Konga的GitHub文档上介绍的也非常的详细。它的部署方式有两种,一个是直接克隆GitHub上的仓库上的代码通过npm的方式运行,另一种则是使用docker的方式部署。两种方式都非常的简单,本次我们选择docker的方式。
环境搭建#

    关于Kong的搭建,官方网站给出了好几种部署方式可以基于Docker或K8S,也可以在Liunx操作系统Centos、Ubuntu、RHEL等都支持,目前最稳定版本为2.3.x,这些在官方文档上讲解的非常详细非常易懂,具体可参阅官方文档https://konghq.com/install/。如果想能快速的搭建起一套Kong+Postgresql+Konga的环境,docker-compose无疑是一个比较好的选择,接下来我们将演示用过这种方式快速搭建起一条完整的Kong环境。
    Kong官方GitHub有专门的docker-kong仓库地址为https://github.com/Kong/docker-kong,也已将这个仓库Clone下来,找到compose文件运行。但是我们这里还要整合可视化界面Konga,Konga并非官方出品,所以我要要修改一下compose文件整合进去Konga,完整的呈现如下所示
  1. version: '3.3'
  2. #创建kong_data卷
  3. volumes:
  4.   kong_data: {}
  5. #创建kong-net网络
  6. networks:
  7.   kong-net:
  8.     external: false
  9. <p>services:<br>
  10. #数据库运行完成之后需要执行kong进行初始化操作<br>
  11. kong-migrations:<br>
  12. image: "${KONG_DOCKER_TAG:-kong:latest}"<br>
  13. command: kong migrations bootstrap<br>
  14. depends_on:<br>
  15. - db<br>
  16. environment:<br>
  17. KONG_DATABASE: postgres<br>
  18. KONG_PG_DATABASE: ${KONG_PG_DATABASE:-kong}<br>
  19. KONG_PG_HOST: db<br>
  20. KONG_PG_USER: ${KONG_PG_USER:-kong}<br>
  21. KONG_PG_PASSWORD_FILE: /run/secrets/kong_postgres_password<br>
  22. secrets:<br>
  23. - kong_postgres_password<br>
  24. networks:<br>
  25. - kong-net<br>
  26. restart: on-failure<br>
  27. deploy:<br>
  28. restart_policy:<br>
  29. condition: on-failure<br>
  30. #迁移过程依赖db<br>
  31. kong-migrations-up:<br>
  32. image: "${KONG_DOCKER_TAG:-kong:latest}"<br>
  33. command: kong migrations up && kong migrations finish<br>
  34. depends_on:<br>
  35. - db<br>
  36. environment:<br>
  37. KONG_DATABASE: postgres<br>
  38. KONG_PG_DATABASE: ${KONG_PG_DATABASE:-kong}<br>
  39. KONG_PG_HOST: db<br>
  40. KONG_PG_USER: ${KONG_PG_USER:-kong}<br>
  41. KONG_PG_PASSWORD_FILE: /run/secrets/kong_postgres_password<br>
  42. secrets:<br>
  43. - kong_postgres_password<br>
  44. networks:<br>
  45. - kong-net<br>
  46. restart: on-failure<br>
  47. deploy:<br>
  48. restart_policy:<br>
  49. condition: on-failure<br>
  50. # kong服务<br>
  51. kong:<br>
  52. image: "${KONG_DOCKER_TAG:-kong:latest}"<br>
  53. user: "${KONG_USER:-kong}"<br>
  54. depends_on:<br>
  55. - db<br>
  56. environment:<br>
  57. KONG_ADMIN_ACCESS_LOG: /dev/stdout<br>
  58. KONG_ADMIN_ERROR_LOG: /dev/stderr<br>
  59. KONG_ADMIN_LISTEN: '0.0.0.0:8001'<br>
  60. KONG_CASSANDRA_CONTACT_POINTS: db<br>
  61. KONG_DATABASE: postgres<br>
  62. KONG_PG_DATABASE: ${KONG_PG_DATABASE:-kong}<br>
  63. KONG_PG_HOST: db<br>
  64. KONG_PG_USER: ${KONG_PG_USER:-kong}<br>
  65. KONG_PROXY_ACCESS_LOG: /dev/stdout<br>
  66. KONG_PROXY_ERROR_LOG: /dev/stderr<br>
  67. KONG_PG_PASSWORD_FILE: /run/secrets/kong_postgres_password<br>
  68. secrets:<br>
  69. - kong_postgres_password<br>
  70. networks:<br>
  71. - kong-net<br>
  72. #kong的端口,非https使用8000和8001<br>
  73. ports:<br>
  74. - "8000:8000/tcp"<br>
  75. - "8001:8001/tcp"<br>
  76. - "8443:8443/tcp"<br>
  77. - "8444:8444/tcp"<br>
  78. #健康检查<br>
  79. healthcheck:<br>
  80. test: ["CMD", "kong", "health"]<br>
  81. interval: 10s<br>
  82. timeout: 10s<br>
  83. retries: 10<br>
  84. restart: on-failure<br>
  85. deploy:<br>
  86. restart_policy:<br>
  87. condition: on-failure</p>
  88. <p>#konga可视化界面<br>
  89. konga:<br>
  90. image: pantsel/konga<br>
  91. networks:<br>
  92. - kong-net<br>
  93. depends_on:<br>
  94. - db<br>
  95. ports:<br>
  96. - "1337:1337/tcp"<br>
  97. environment:<br>
  98. TOKEN_SECRET: konga<br>
  99. DB_ADAPTER: postgres<br>
  100. DB_HOST: db<br>
  101. DB_PORT: 5432<br>
  102. DB_USER: kong<br>
  103. DB_PASSWORD: kong<br>
  104. DB_DATABASE: kong<br>
  105. restart: on-failure<br>
  106. deploy:<br>
  107. restart_policy:<br>
  108. condition: on-failure<br>
  109. # postgres数据库<br>
  110. db:<br>
  111. image: postgres:9.6<br>
  112. environment:<br>
  113. POSTGRES_DB: ${KONG_PG_DATABASE:-kong}<br>
  114. POSTGRES_USER: ${KONG_PG_USER:-kong}<br>
  115. POSTGRES_PASSWORD_FILE: /run/secrets/kong_postgres_password<br>
  116. secrets:<br>
  117. - kong_postgres_password<br>
  118. healthcheck:<br>
  119. test: ["CMD", "pg_isready", "-U", "${KONG_PG_USER:-kong}"]<br>
  120. interval: 30s<br>
  121. timeout: 30s<br>
  122. retries: 3<br>
  123. restart: on-failure<br>
  124. deploy:<br>
  125. restart_policy:<br>
  126. condition: on-failure<br>
  127. stdin_open: true<br>
  128. tty: true<br>
  129. ports:<br>
  130. - 5432:5432<br>
  131. networks:<br>
  132. - kong-net<br>
  133. volumes:<br>
  134. - kong_data:/var/lib/postgresql/data</p>
  135. <p># 用文件统一管理数据库密码<br>
  136. secrets:<br>
  137. kong_postgres_password:<br>
  138. file: ./POSTGRES_PASSWORD<br>
  139. </p>
复制代码

通过docker-compose直接运行上面的yaml文件,便可以直接运行一套完整的kong项目,这里在强调一下上面说过GitHub上有官方专门提供的docker-kong仓库,直接Clone便可以直接得到运行Kong的yaml,但是本示例我们加入了Konga,如果需要可直接下载我修改后的包[<a href="https://files.cnblogs.com/files/wucy/kong.zip" target="_blank" rel="noopener">点击下载
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表