研究Python和Golang和双语言微服务架构体系有一年多的时间了,这一年多的时间里,利用偶尔的业余时间,开发了一系列的微服务开源组件,并写了很多的示例,进行了实践。


如果大家感兴趣,后面我会在公众号“张大鹏520”里发布一系列的教学文章,欢迎大家关注。


今天要给大家介绍的是Kong这个开源工具,使用它作为Python和Golang的API网关。


那么,什么是API网关呢?


API网关,指的是将各个HTTP类型的微服务进行聚合,由同一个域名进行统一入口访问的服务。


比如,我们开发了用户微服务和商品微服务,如果单独访问,那么就是两个域名,这样不便于前端处理。还有个问题就是需要每个微服务单独实现安全校验等功能,会有很多重复性的冗余设计。


API网关还有一个非常大的作用,就是负载均衡。同一个微服务,是可能要部署多个实例的,而且这种可能性极大。如果不使用API网关,那么,对于每个实例,我们都需要记住期IP和端口进行访问,还要自己实现一套负载均衡的算法,让每个实例都能够被按需访问。有了API网关以后,这些功能可以集成在API网关中,提供了极大的方便。


Kong是一个非常好用的API网关,天然支持负载均衡的方式接入consul的服务。


今天,给大家分享一下如何搭建Kong,采用的方式是Docker。


下载镜像

docker pull postgres:9.6docker pull kong docker pull pantsel/konga


创建网络

docker network create kong


启动PostgresSQL数据库

mkdir -p /data/docker/kong_postgres/datadocker run -d --restart=always --name kong_postgres \       --network=kong \       -p 5432:5432 \       -e "POSTGRES_USER=kong" \       -e "POSTGRES_PASSWORD=kong" \       -e "POSTGRES_DB=kong" \       -v /data/docker/kong_postgres/data:/var/lib/postgresql/data \postgres:9.6

kong迁移数据库到PostgreSQL数据库,这里的`192.168.33.10`是我的虚拟机IP地址

docker run --rm \     --network=kong \     -e "KONG_DATABASE=postgres" \     -e "KONG_PG_HOST=192.168.33.10" \     -e "KONG_PG_USER=kong" \     -e "KONG_PG_PASSWORD=kong" \     -e "KONG_CASSANDRA_CONTACT_POINTS=kong_postgres" \     docker.io/kong:latest kong migrations bootstrap


启动kong容器,端口映射为8000

docker run -d --restart=always --name kong \    --network=kong \    -e "KONG_DATABASE=postgres" \    -e "KONG_PG_HOST=192.168.33.10" \    -e "KONG_PG_PASSWORD=kong" \    -e "KONG_CASSANDRA_CONTACT_POINTS=kong_postgres" \    -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 28000:8000 \    -p 28443:8443 \    -p 28001:8001 \    -p 28444:8444 \    docker.io/kong:latest


迁移konga数据

docker run --network=kong --rm docker.io/pantsel/konga -c prepare -a postgres -u postgresql://kong:kong@192.168.33.10:5432/konga


启动konga容器,端口映射为1337

docker run --network=kong -d -p 1337:1337 -e "DB_ADAPTER=postgres" -e "DB_URI=postgres://kong:kong@192.168.33.10:5432/konga" -e "NODE_ENV=production" --name konga docker.io/pantsel/konga