微服务 API Gateway kong 网关实践及jwt-header插件开发

Docker/容器
433
0
0
2022-04-14
标签   微服务

环境采用官方docker镜像

因为公司用户授权使用jwt,本文是针对jwt做的一些研究

环境这里只写命令不做过多介绍,详细请看 官方文档

#拉取镜像
docker pull kong/kong-gateway:2.3.3.2-alpine
#标记镜像方便使用
docker images
docker tag <IMAGE_ID> kong-ee
#创建kong网关网卡
docker network create kong-ee-net
#启动数据库
docker run -d --name kong-ee-database \
  --network=kong-ee-net \
  -p 5432:5432 \
  -e "POSTGRES_USER=kong" \
  -e "POSTGRES_DB=kong" \
  -e "POSTGRES_PASSWORD=kong" \
  postgres:9.6
#准备Kong数据库
docker run --rm --network=kong-ee-net \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_PG_HOST=kong-ee-database" \
  -e "KONG_PG_PASSWORD=kong" \
  -e "KONG_PASSWORD=<SOMETHING-YOU-KNOW>" \
  kong-ee kong migrations bootstrap
#使用Kong Manager启动网关
docker run -d --name kong-ee --network=kong-ee-net \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_PG_HOST=kong-ee-database" \
  -e "KONG_PG_PASSWORD=kong" \
  -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://<DNSorIP>:8002" \
  -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-ee

到此环境配置完毕,由于使用的是免费版,官方插件库收费的不能使用

检验安装是否正确

curl -i -X GET --url http://<DNSorIP>:8001/services
#HTTP/1.1 200 OK

访问 http://DNSorIP:8002 这是一个可视化界面,不做过多介绍

由于是免费版,我们大部分操作都将是使用kong-admin-api添加配置

如何添加一个服务并代理

要注意端口的使用

kong是nginx+lua实现,api网关本质上是单一入口做代理到各个服务,从而达到对接口的管控如负载均衡,限流,权限等

请求工具这里我采用的是httpie也可使用curl,并且是在mac本地环境

添加服务

  1. http POST :8001/services name=example_service url=’项目地址’
  2. http :8001/services/example_service

ps项目地址可以是http://**.com/**,这样的好处是可以根据接口前缀更细粒度的管控权限

添加代理路由

  • http :8001/services/example_service/routes paths:='["/mock"]' name=mocking

验收成果

访问 http :8000/mock 即为访问 添加服务标签内的项目地址

下面将进入jwt插件的使用

官方jwt详细文档

由于官方文档并不符合我想要的需求,我的需求是,代理到上游的时候头部文件要将jwt:payload_data内如用户id解析出来放入header内,显然需要自定义插件或者修改官方插件两个办法

看官方jwt插件源码

  • claims为jwt:payload_data的解析结果
  • 红框内就是自定义添加header的代码

微服务 API Gateway kong 网关实践及jwt-header插件开发

自定义开发

由于是容器内须注意,docker exec 需指定root用户

使用luarocks开发lua组件包

github.com/luarocks/luarocks/wiki/...

luarocks组件库的jwt-header实例

github.com/yesinteractive/kong-jwt...

调试可在容器内运行kong reload,通过请求查看,暂未找到简易的调试办法

有待完善,尽作为笔记使用,可互相交流