研究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