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"
相关推荐
Java中文社群1 小时前
AI实战:一键生成数字人视频!
java·人工智能·后端
王中阳Go1 小时前
从超市收银到航空调度:贪心算法如何破解生活中的最优决策谜题?
java·后端·算法
shepherd1111 小时前
谈谈TransmittableThreadLocal实现原理和在日志收集记录系统上下文实战应用
java·后端·开源
维基框架1 小时前
Spring Boot 项目整合Spring Security 进行身份验证
java·架构
日月星辰Ace3 小时前
Java JVM 垃圾回收器(四):现代垃圾回收器 之 Shenandoah GC
java·jvm
天天摸鱼的java工程师3 小时前
商品详情页 QPS 达 10 万,如何设计缓存架构降低数据库压力?
java·后端·面试
天天摸鱼的java工程师3 小时前
设计一个分布式 ID 生成器,要求全局唯一、趋势递增、支持每秒 10 万次生成,如何实现?
java·后端·面试
阿杆4 小时前
一个看似普通的定时任务,如何优雅地毁掉整台服务器
java·后端·代码规范
粟悟饭&龟波功4 小时前
Java—— ArrayList 和 LinkedList 详解
java·开发语言
冷雨夜中漫步4 小时前
Java中如何使用lambda表达式分类groupby
java·开发语言·windows·llama