Kong 网关
官网:https://konghq.com/
文档:https://docs.konghq.com/
Kong Gateway 是一个轻量级、快速、灵活的云原生 API 网关。API 网关是一种反向代理,可让您管理、配置请求并将请求路由到您的 API。
Kong Gateway 在任何 RESTful API 之前运行,可以通过模块和插件进行扩展。它旨在在分散式架构上运行,包括混合云和多云部署。
使用 Kong Gateway,用户可以:
- 利用工作流自动化和现代 GitOps 实践
- 分散应用程序/服务并过渡到微服务
- 打造 API 开发者生态系统
- 主动识别与 API 相关的异常和威胁
- 保护和管理 API/服务,并提高 API 在整个组织中的可见性。
扩展 Kong 网关
Kong Gateway 是一个运行在 Nginx 中的 Lua 应用程序。Kong Gateway 与OpenResty一起分发,OpenResty是一组扩展lua-nginx-module 的模块。
这为模块化架构奠定了基础,插件可以在运行时启用和执行。Kong Gateway 的核心是实现数据库抽象、路由和插件管理。插件可以存在于单独的代码库中,并可以注入到请求生命周期的任何地方,只需几行代码。
Kong 提供了许多插件供您在网关部署中使用。您还可以创建自己的自定义插件。
业务网关与流量网关
业务网关
:对于具体的后端业务应用或者是服务和业务有一定关联性的策略网关就是上图左边的架构模型,业务网关针对具体的业务需要提供特定的流控策略、缓存策略、鉴权认证策略等等。流量网关
:与业务网关相反,定义全局性的、跟具体的后端业务应用和服务完全无关的策略网关就是上图右边所示的架构模型,流量网关通常只专注于全局的Api管理策略,比如全局流量监控、日志记录、全局限流、黑白名单控制、接入请求到业务系统的负载均衡等,有点类似防火墙。Kong 就是典型的流量网关。
业务网关
一般部署在流量网关
之后,在各业务系统
之前,比流量网关
更靠近业务系统
。通常API网关指的是业务网关
。 有时候我们也会模糊流量网关和业务网关,让一个网关承担所有的工作,所以这两者之间并没有严格的界线。
Kong 架构
请求流程
每个客户请求都会先到达Kong 网关,然后再代理到最终的API。在请求和响应之间,Kong将执行已安装配置的插件,从而扩展AP的I功能集。
Kong 安装
使用docker 安装以及简单配置。安装PostgreSQL数据库设置Kong Gateway容器来存储Kong配置
安装数据库
- 创建自定义 Docker 网络以允许容器相互发现和通信:
docker network create kong-net
- 启动一个 PostgreSQL 容器:
docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kongpass" \
postgres:9.6
- POSTGRES_USER和POSTGRES_DB:将这些值设置为kong。这是 Kong Gateway 期望的默认值。
- POSTGRES_PASSWORD: 设置数据库密码为任意字符串。
- 初始化Kong数据库
Kong Gateway 数据库初始化
docker run --rm --network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kongpass" \
-e "KONG_PASSWORD=test" \
kong/kong-gateway:3.1.1.1 kong migrations bootstrap
-e “KONG_PG_HOST=postgres”:kong-net 上一步中通过网络通信的 Postgres Docker 容器的名称
-e “KONG_DATABASE=postgres”: 指定当前kong使用的数据库类型,这里就是postgres
-e “KONG_PG_PASSWORD=kong” : 数据库密码
-e “KONG_PASSWORD=kong”:数据库用户名
安装并启动Kong
docker run -d --name kong-gateway \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kongpass" \
-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" \
-e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
-e KONG_LICENSE_DATA \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
-p 8002:8002 \
-p 8445:8445 \
-p 8003:8003 \
-p 8004:8004 \
kong/kong-gateway:3.1.1.1
验证是否启动成功
curl -i -X GET --url http://127.0.0.1:8001/services
kong有5个端口需要对外暴露
- 8000:对应的http请求代理端口,后面配置代理时,需要用到它,这里对外暴露端口改成了9000
- 8001: http接口的管理端口
- 8443: 对应的https请求的代理端口
- 8444: https接口的管理端口
- 8002: 对api做了一些数据分析
安装Konga 管理界面
初始化konga数据库
docker run --rm
--network=kong-net \
pantsel/konga:latest \
-c prepare -a postgres -u postgres://kong:kong@kong-ee-database:5432/kong
启动konga
docker run --name konga \
--network kong-net \
-p 1337:1337 \
-e "DB_ADAPTER=postgres" \
-e "DB_URI=postgres://kong:kong@kong-ee-database:5432/kong" \
-e "DB_PASSWORD=kong" \
-e "NODE_ENV=production" \
pantsel/konga
显示UI界面,则Konga安装成功
输入Kong地址连接到节点
Name: Kong
Kong Admin URL:
http://主机ip地址:8001成功进入dashboard,konga可正常使用
- 创建Upstreams
- 添加的upstream点击DETAILS添加targets,然后点击ADD TARGET输入target(ip+port)后点击SUBMIT TARGET即可,ip为对外ip保证kong容器内可访问,端口为本地
应用服务端口
。 - 起一个简单的springboot服务,上面配置的ip + 端口,可直接访问这个springboot服务
- 配置services和routes 输入name、host(可以与前面Upstreams的name保持一致,也可以跟前面配置的ip保持一致)protocol(协议类型,这里是http)
port这里是8000,kong启动之后,http的代理端口是8000,启动时做了对外映射8000 - service保存后,点击service name进入详情页面,然后点击Routes添加路由规则,点击ADD ROUTE输入name、paths(输入转发规则需按回车才生效),Strip Path(是否把匹配成功的paths删除后在转发后端服务器.),Preserve Host(转发后端是否带host参数,默认不带,Protocols 只保留http即可,最后点击SUBMIT ROUTE
- api 为Kong配置的匹配路径