转载 李亚飞 大佬的文章:https://www.lyafei.com/

背景

我们有批设备卖给了海外的服务商,老外请了第三方检测机构,检测设备与我们系统的安全性,结果找到了近 40+ 的安全漏洞,有很大一部分的安全漏洞提炼出来,其实可以统一解决掉,因为涉及服务和安卓组件太多,如果一个一个修改,不管是时间还是人力投入都很巨大,那快速并且改动最小的方法就是从网关上解决这些问题。

网关是微服务中不可或缺的一部分,它承载了所有请求流量入口,参数验证拦截,用户权限验证等,但是除了 JAVA 的 spring cloud 之外,公共网关屈指可数,其中最受关注的就是 Kong 了,在这里给大家分享一下 kong 网关的基本情况以及使用安装的方式。

Kong 是在客户端和(微)服务间转发 API 通信的 API 网关,通过插件扩展功能。Kong 有两个主要组件:

  1. Kong Server :基于 nginx 的服务器,用来接收 API 请求
  2. Apache Cassandra:用来存储操作数据

你可以通过增加更多 Kong Server 机器对 Kong 服务进行水平扩展,通过前置的负载均衡器向这些机器分发请求。根据文档描述,两个 Cassandra 节点就足以支撑绝大多数情况,但如果网络非常拥挤,可以考虑适当增加更多节点。

对于开源社区来说,Kong 中最诱人的一个特性是可以通过插件扩展已有功能,这些插件在 API 请求响应循环的生命周期中被执行。插件使用 Lua 编写,而且 Kong 还有如下几个基础功能:HTTP 基本认证、密钥认证、CORS( Cross-origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API 请求限流、请求转发以及 nginx 监控。

附上:
Kong 官网:https://konghq.com/
Kong GitHub地址:https://github.com/kong/kong

Why Kong?

if you are building for the web, mobile, or IoT (Internet of Things) you will likely end up needing common functionality to run your actual software. Kong can help by acting as a gateway (or a sidecar) for microservices requests while providing load balancing, logging, authentication, rate-limiting, transformations, and more through plugins.

以上是官网的解释,在网上搜索总结了下 Kong 的主要优势:

  • 插件市场丰富,很多插件可以降低开发成本
  • 可扩展性,可以编写 lua 脚本来定制自己的参数验证权限验证等操作
  • 基于 openResty,openResty 基于 Nginx 保障了强劲的性能
  • 便捷性能扩容,只需要水平增加服务器资源性能就能提升
  • 负载均衡健康检查

Docker安装Kong

本文使用的是 Kong 最新版本
postgreSql 数据库版本必须 > 9.4

有关如何在 Docker 中使用 Kong 的详细信息,可以在托管该映像的 DockerHub 存储库中找到:kong。并且还有一个具有内置编排和可伸缩性的 Docker Compose 模板。

数据库模式

创建一个Docker网络

因为不是通过 docker-composer 启动的容器需要互相访问需要在同一个网络名下才可以互相访问,所以需要创建一个自定义网络,以使容器能够发现彼此并进行通信。在本文示例中 kong-net 为网络名称,你可以使用任何名称

[root@izbp12g2yvanoh4aaqyse0z ~]# docker network create kong-net
30c81260684556d5e9dec685cdb948dde8235875d84c93ad33c411ee6379eaa4
启动数据库

这里提供了 Kong 容器连接到 Cassandra 或 PostgreSQL 容器,两种方式
如果你想使用 Cassandra 容器:

docker run -d --name kong-database \--network=kong-net \-p 9042:9042 \cassandra:3

如果你想使用 PostgreSQL 容器:

docker run -d --name kong-database \--network=kong-net \-p 5432:5432 \-e "POSTGRES_USER=kong" \-e "POSTGRES_DB=kong" \-e "POSTGRES_PASSWORD=kong" \postgres:9.6

在这里我选择使用 PostgreSQL 数据库

[root@izbp12g2yvanoh4aaqyse0z ~]# docker run -d --name kong-database \
>                --network=kong-net \
>                -p 5432:5432 \
>                -e "POSTGRES_USER=kong" \
>                -e "POSTGRES_DB=kong" \
>                -e "POSTGRES_PASSWORD=kong" \
>                postgres:9.6
Unable to find image 'postgres:9.6' locally
9.6: Pulling from library/postgres
b248fa9f6d2a: Pull complete
8ce5aee1dc0e: Pull complete
......
......
db910e83d79a: Pull complete
03cde239cd9d: Pull complete
Digest: sha256:5c5e70504814776a669b154ed563ea63566425a5c1d61ed985b7c3fe8103412a
Status: Downloaded newer image for postgres:9.6
9f992ef6ed452190e6f514e4761bd959f20bb844dd0156df826f2a3f4e2f4da0
准备数据库

使用临时 Kong 容器运行迁移:

docker run --rm \--network=kong-net \-e "KONG_DATABASE=postgres" \-e "KONG_PG_HOST=kong-database" \-e "KONG_PG_PASSWORD=kong" \-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \kong:latest kong migrations bootstrap

Kong < 0.15的注意事项:Kong 版本低于 0.15(最大0.14)时,请使用 up 子命令代替 bootstrap。还要注意,Kong < 0.15时,永远不要同时运行迁移。一次只能有一个 Kong 节点执行迁移。对于 0.15、1.0 及更高版本,此限制被取消。

[root@izbp12g2yvanoh4aaqyse0z ~]# docker run --rm \
>      --network=kong-net \
>      -e "KONG_DATABASE=postgres" \
>      -e "KONG_PG_HOST=kong-database" \
>      -e "KONG_PG_PASSWORD=kong" \
>      -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
>      kong:latest kong migrations bootstrap
Unable to find image 'kong:latest' locally
latest: Pulling from library/kong
4167d3e14976: Pull complete
691048dd26e3: Pull complete
e71040f3ce48: Pull complete
Digest: sha256:f7a2bb6ae3baf60e3ca0d6ba5f83ebe3caf64fe8b6aa8dd6a5d3df16a22775c2
Status: Downloaded newer image for kong:latest
Bootstrapping database...
migrating core on database 'kong'...
core migrated up to: 000_base (executed)
core migrated up to: 003_100_to_110 (executed)
core migrated up to: 004_110_to_120 (executed)
core migrated up to: 005_120_to_130 (executed)
core migrated up to: 006_130_to_140 (executed)
core migrated up to: 007_140_to_150 (executed)
core migrated up to: 008_150_to_200 (executed)
migrating hmac-auth on database 'kong'...
hmac-auth migrated up to: 000_base_hmac_auth (executed)
hmac-auth migrated up to: 002_130_to_140 (executed)
migrating oauth2 on database 'kong'...
oauth2 migrated up to: 000_base_oauth2 (executed)
oauth2 migrated up to: 003_130_to_140 (executed)
migrating jwt on database 'kong'...
jwt migrated up to: 000_base_jwt (executed)
jwt migrated up to: 002_130_to_140 (executed)
migrating basic-auth on database 'kong'...
basic-auth migrated up to: 000_base_basic_auth (executed)
basic-auth migrated up to: 002_130_to_140 (executed)
migrating key-auth on database 'kong'...
key-auth migrated up to: 000_base_key_auth (executed)
key-auth migrated up to: 002_130_to_140 (executed)
migrating rate-limiting on database 'kong'...
rate-limiting migrated up to: 000_base_rate_limiting (executed)
rate-limiting migrated up to: 003_10_to_112 (executed)
migrating acl on database 'kong'...
acl migrated up to: 000_base_acl (executed)
acl migrated up to: 002_130_to_140 (executed)
migrating acme on database 'kong'...
acme migrated up to: 000_base_acme (executed)
migrating response-ratelimiting on database 'kong'...
response-ratelimiting migrated up to: 000_base_response_rate_limiting (executed)
migrating session on database 'kong'...
session migrated up to: 000_base_session (executed)
24 migrations processed
24 executed
Database is up-to-date
启动kong-service

运行迁移并准备好数据库后,启动将连接到数据库容器的 Kong 容器,就像临时迁移容器一样:

docker run -d --name kong \--network=kong-net \-e "KONG_DATABASE=postgres" \-e "KONG_PG_HOST=kong-database" \-e "KONG_PG_PASSWORD=kong" \-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \-p 8000:8000 \-p 8443:8443 \-p 127.0.0.1:8001:8001 \-p 127.0.0.1:8444:8444 \kong:latest

8000,监听来自客户端的 HTTP 流量,转发到你的 upstream 服务上
8443,监听 HTTPS 的流量,功能跟 8000 一样。可以通过配置文件禁止
8001,Kong的HTTP监听的api管理接口
8444,Kong的HTTPS监听的API管理接口

[root@izbp12g2yvanoh4aaqyse0z ~]# docker run -d --name kong \
>      --network=kong-net \
>      -e "KONG_DATABASE=postgres" \
>      -e "KONG_PG_HOST=kong-database" \
>      -e "KONG_PG_PASSWORD=kong" \
>      -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
>      -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
>      -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
>      -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
>      -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
>      -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
>      -p 8000:8000 \
>      -p 8443:8443 \
>      -p 127.0.0.1:8001:8001 \
>      -p 127.0.0.1:8444:8444 \
>      kong:latest
aaff8bde816bdb5f853b48e813e03e6512ed1c4f9c7595daa0bacc0118f7a6a2

使用Kong

调用一下地址有输出即可

curl -i http://localhost:8001/

无数据库模式

在无数据库模式下启动 Kong 的步骤如下:

创建一个Docker网络

这与上面数据库模式相同。也使用 kong-net 网络名称,也可以将其更改为其他名称。

docker network create kong-net

在无数据库模式下运行 Kong 并非必须严格执行此步骤,但是如果你将来要添加其他内容(例如由 Redis集群备份的限速插件),则这是一个很好的预防措施。

创建一个Docker卷

Docker Volume 是主机内部的一个文件夹,可以映射到容器中的文件夹。数据卷有一个名称。在这种情况下,命名为 kong-vol

docker volume create kong-vol

查看该数据卷是否存在

docker volume inspect kong-vol

会返回一个 json,类似以下内容

[{"CreatedAt": "2020-04-24T15:40:09Z","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/kong-vol/_data","Name": "kong-vol","Options": {},"Scope": "local"}]

注意 MountPoint 目录。下一步,我们需要该路径。

准备声明性配置文件

语法和属性在 Kong 官网的 “声明性配置格式” 说明中描述。

在此添加你需要的任何核心实体(服务,路由,插件,使用者等)。

假设为它命名 kong.yml,将其保存 MountPoint 目录下:/var/lib/docker/volumes/kong-vol/_data/kong.yml

无数据库模式下启动Kong

尽管可以修改参数 KONG_DATABASE = off 来启动 Kong 容器,但通常还是希望通过 KONG_DECLARATIVE_CONFIG 变量名将声明性配置文件作为参数包括在内。为此,我们需要使文件在容器内“可见”。我们使用 -v 标志来实现这一点,该标志将 kong-vol 卷映射到 /usr/local/kong/declarative 容器中的文件夹。

docker run -d --name kong \--network=kong-net \-v "kong-vol:/usr/local/kong/declarative" \-e "KONG_DATABASE=off" \-e "KONG_DECLARATIVE_CONFIG=/usr/local/kong/declarative/kong.yml" \-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \-p 8000:8000 \-p 8443:8443 \-p 127.0.0.1:8001:8001 \-p 127.0.0.1:8444:8444 \kong:latest

使用Kong

Kong 应该正在运行,并且应该包含 kong.yml 中添加的一些实体:

curl -i http://localhost:8001/

例如,获取服务列表:

curl -i http://localhost:8001/services

Kong网关简介安装相关推荐

  1. API网关之Kong网关简介

    1. Kong简介 Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用.易扩展的,由Mashape公司开源的API Gateway项目.Kong是基于NGINX和Apach ...

  2. KONG网关 — 介绍安装

    网关是微服务中不可或缺的一部分,它承载了所有请求流量入口,参数验证拦截,用户权限验证,但是除了JAVA的spring cloud之外,公共网关屈指可数,其中最受关注的就是KONG了,笔者半年前就已经在 ...

  3. Kong 网关API安装部署以及应用实例----------腾云驾雾

    背景介绍 之前项目上api的接口用的是自己nginx搭建的反向代理接口,觉得功能性比较查差,故而另辟蹊径找到了kong作为接口网关服务. 工作原理 kong会把所有的后端接口对应的数据放到cassan ...

  4. centos6.5 安装 kong 网关

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 最近要求了解下kong网关,然后在网上一顿找,说实话,度娘的力量还是不行啊,找出来的那些跟着配置,不 ...

  5. 以Docker方式安装和配置Kong网关和Konga控制台

    文章目录 以Docker方式安装和配置Kong网关和Konga控制台 前言 安装Kong 创建容器网络 启动PostgreSQL数据库 初始化数据 对Kong Admin API作安全防护 启动Kon ...

  6. kong java_KONG网关 — 介绍安装

    网关是微服务中不可或缺的一部分,它承载了所有请求流量入口,参数验证拦截,用户权限验证,但是除了JAVA的spring cloud之外,公共网关屈指可数,其中最受关注的就是KONG了,笔者半年前就已经在 ...

  7. kong 网关日志格式修改

    kong 网关日志格式修改 kong网关默认日志在/usr/local/kong/logs,主要有access.log,admin_access.log,error.log,access.log和ng ...

  8. kong 网关教程入门

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 为什么使用API-Gateway 1. 方便客户端维护-- 每个请求方不用管理多个api url,统一访问api-gateway即可 2. 接口重构时 ...

  9. 在K3s上使用Kong网关插件,开启K3s的无限可能!

    我的工作中很重要的一部分是参加各种各样的技术会议.最近参加的是去年11月的北美KubeCon,在会议的最后一天,所有人都焦头烂额,我也一直机械地向不同的人重复我的自我介绍.后来,我已经十分烦躁,决定逃 ...

最新文章

  1. Bzoj1312 / POJ3155 Neerc2006 Hard Life
  2. ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程
  3. hdu 2489 Minimal Ratio Tree
  4. [VOSViewer] 合并同义词、删除指定词语
  5. Navicat15 安装激活
  6. ECharts柱状图常见效果
  7. ISO七层协议与功能
  8. u盘如何在计算机应用内存,u盘扩大内存,小编教你如何用U盘扩展内存
  9. CentOS官网下载所需版本的CentOS版本方法
  10. PS小白怎么学会更换材质效果
  11. 京东 Android 客户端样式的级联地址选择器
  12. 构建高并发高可用的电商平台架构实践(一)
  13. 百度红包架构分析与推测
  14. 咸鱼前端—CSS选择器
  15. 怎么做HTML焦点图+实例练习
  16. Linux入门+环境搭建云服务器
  17. 数据库、表、基本增删改查
  18. 解决IDEA里提示“Spring Configuration Check“ “Unmapped Spring configuration files found.“的问题
  19. 红帽Linux挑战赛
  20. 音乐在不同HTML页面的连续播放问题

热门文章

  1. linux下通过bin文件来制作img镜像文件
  2. 【Datawhale第25期组队学习】Task03:基于线性模型的异常检测
  3. 全世界最像人的「机器人」,本身就是人
  4. mimikatz工具使用
  5. DSMP规范定义的错误码 2012-12-14 09:02阅读(0)
  6. 嵌入式软件开发调试问题常用方法及案例分析
  7. 用python实现在一组数据中,寻找到最大数和最小数并输出最大数和最小数所在的位置
  8. win 程序32位或者64程序如何区分
  9. 富文本编辑器实现微信公众号内容自动上传
  10. 动态壁纸安卓_兼容所有安卓手机,MIUI12的超级壁纸独立安装教程来了