kong 和konga网关部署及使用

Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。

Kong主要有三个组件:

Kong Server :基于nginx的服务器,用来接收API请求。

Apache Cassandra/PostgreSQL :用来存储操作数据。

Kong dashboard:官方推荐UI管理工具,当然,也可以使用 restfull 方式 管理admin api。

Kong采用插件机制进行功能定制,插件集(可以是0或N个)在API请求响应循环的生命周期中被执行。插件使用Lua编写,目前已有几个基础功能:HTTP基本认证、密钥认证、CORS(Cross-Origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API请求限流、请求转发以及Nginx监控。

1.docker 安装kong

复制代码
docker pull kong:3.0

2.docker 下载postgres

复制代码
docker network create kong-net    ##创建网络
docker pull postgres:9.6

注意:postgres的版本最好是9.6.x以下的。

3.启动postgres

复制代码
docker run --privileged=true --name kong-database -e "POSTGRES_USER=kong" -e POSTGRES_PASSWORD=kong  --network=kong-net -p 5432:5432 -v /my/local/path:/var/lib/postgresql/data -d postgres:9.6

然后使用docker ps查看是否启动成功

4.启动Kong

4.1 准备数据库

复制代码
docker run --rm --network=kong-net  -e "KONG_LOG_LEVEL=debug" -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database"  -e "KONG_PG_PASSWORD=kong" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database"  kong:3.0 kong migrations bootstrap

4.2 启动kong

复制代码
docker run -d --name kong --network=kong-net   -e "KONG_DATABASE=postgres"    -e "KONG_PG_HOST=kong-database"     -e "KONG_PG_PORT=5432" -e "KONG_PG_PASSWORD=kong"    -e "KONG_PG_DATABASE=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"  -e "KONG_ADMIN_LISTEN_SSL=0.0.0.0:8444"  -p 8000:8000   -p 8443:8443    -p 8001:8001     -p 8444:8444     kong:3.0
 
8000:对应的http请求代理端口
8001:  http接口的管理端口
8443:  对应的https请求的代理端口
8444:  https接口的管理端口

然后根据docker ps命令查看kong是否启动成功。

5.验证是否成功启动

复制代码
 curl -i http://localhost:8001

6.安装Konga可视化

复制代码
docker pull pantsel/konga
 
docker run  -d -p 1337:1337 \
        --network kong-net \
        --name konga \
        -e "DB_ADAPTER=postgres" \
        -e "DB_URI=postgresql://kong:kong@kong-database/kong" \
        pantsel/konga

konga默认端口是1337,这里也需要对外暴露

启动成功之后,输入http://ip:1337/register,检查konga是否安装成功

首先注册一个账号。

  1. Kong应用
    7.1创建连接点

默认的端口是8001当然可以在启动kong的时候自己创建映射端口。

7.2 创建Upstreams

输入name,然后提交

点击刚添加的upstream点击DETAILS添加targets,然后点击ADD TARGET输入target(ip+port)后点击SUBMIT TARGET即可,ip为本地电脑ip保证kong容器内可访问,端口为本地服务端口,这个地方可以理解为你的springboot服务的ip+端口




7.3 配置对应的services和routes

输入name、host(可以与前面Upstreams的name保持一致)

protocol(协议类型,这里是http)

port这里是8000,kong启动之后,http的代理端口是8000

service保存后,点击service name进入详情页面,然后点击Routes添加路由规则

点击ADD ROUTE输入name、paths(输入转发规则需按回车才生效),Strip Path(是否把匹配成功的paths删除后在转发后端服务器.),Preserve Host(转发后端是否带host参数,默认不带,Protocols 只保留http即可,最后点击SUBMIT ROUTE



8.测试网关是否可用

配置网关前

配置网关后

9.命令行创建upstream、target、service、route

9.1配置 upstream

复制代码
curl -X POST http://localhost:8001/upstreams --data "name=helloUpstream"

9.2 配置 target

复制代码
curl -X POST http://localhost:8001/upstreams/helloUpstream/targets --data "target=后端微服务ip:端口" --data "weight=100"

9.3 配置service

复制代码
curl -X POST http://localhost:8001/services --data "name=hello" --data "host=helloUpstream" --data "port=8000" --data "protocol=http"

9.4 配置route

复制代码
以service id作为标识
curl -X POST http://localhost:8001/routes --data "paths[]=/hello" --data "service.id=3650cc19-f314-4b87-a7e4-b07c63ad434e"
也可以后面加参数命名
curl -X POST http://localhost:8001/routes --data "paths[]=/hello" --data "service.id=3650cc19-f314-4b87-a7e4-b07c63ad434e" --data "name=dsds"
相关推荐
RainbowSea10 小时前
12. LangChain4j + 向量数据库操作详细说明
java·langchain·ai编程
RainbowSea11 小时前
11. LangChain4j + Tools(Function Calling)的使用详细说明
java·langchain·ai编程
考虑考虑14 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613515 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊16 小时前
Java学习第22天 - 云原生与容器化
java
渣哥18 小时前
原来 Java 里线程安全集合有这么多种
java
间彧18 小时前
Spring Boot集成Spring Security完整指南
java
间彧18 小时前
Spring Secutiy基本原理及工作流程
java
Java水解19 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆21 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试