转战微服务1年多了,前不久老觉得少了点什么,没错,我需要一个 api gateway,说白了,我需要统一管理我的api,比如我对外开放 沙沙野 的api,这些api需要集中管理,另外我们开发了好几个产品,而用户登陆用户信息也需要统一管理,用户身份需要验证,另外,接口修改后其他产品也得修改,而且无法缓存,比如 沙沙野 首页数据可以缓存下,减少查询,另外还有监控、日志等。今天的主题是 介绍 kong 以及我为什么需要 api 网关。
首先,我希望我的产品只有一套用户系统,这套系统用于用户注册、登陆,以及用户资料的存储(不同app可以不同资料)仅此而已。接着,我需要统一管理我对外的api、比如 沙沙野 可能会开放API,而API地址不应该直接暴露给用户,因为这些可能会更改,那么就需要一个代理,用户访问它,而它访问我们。类似于中间件,也可以叫作路由,而这个路由上又可以做缓存、监控、日志、访问控制、负载均衡。而这些正是微服务网关做的事。
其实,api 网关的选择可能有很多,但是像我这样的情况,没力气再去自己开发,只能用个开源的, kong 是基于 nginx + lua 差不多和 openresty 类似。维护和使用这样一个系统对于我没啥压力,毕竟 Linux 很熟了。最重要的是 kong 可以实现:身份验证、访问控制、监控、日志、缓存等,具体可以看它的 插件 页面。
8000 和 8443 是 Kong用来监听来自客户端的HTTP/HTTPS 请求的,并将此请求转发到您的上游服务,不过 8443 只监听 HTTPS 请求并不会为你转发。比如你把 HTTP 请求发到 8443 那么 Kong 并不会为你将其转发到 8000
8001 和 8444 是管理员用来配置 Kong的 HTTP/HTTPS 端口,配置 Kong,可将请求发至这里。
首先,既然我们玩微服务,那么 docker 是必备的了。我这次用的系统是 Manjaro Linux + docker,安装分两大部分,前面部分是安装 kong 后面是安装 dashboard,现在我们继续。
首先,我们把数据库跑起来,用于存储数据,命令如下:
docker run -d --name kong-database \ --network=host \ -e "POSTGRES_USER=kong" \ -e "POSTGRES_DB=kong" \ postgres:9.6
接着,迁移数据库:
docker run --rm \ --network=host \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=localhost" \ -e "KONG_CASSANDRA_CONTACT_POINTS=localhost" \ kong:latest kong migrations bootstrap
docker run --rm \ --network=host \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=localhost" \ -e "KONG_CASSANDRA_CONTACT_POINTS=localhost" \ kong:latest kong migrations up
最后,我们启动 kong:
docker run -d --name kong \ --network=host \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=localhost" \ -e "KONG_CASSANDRA_CONTACT_POINTS=localhost" \ -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" \ kong:latest
现在,你可以用浏览器访问 http://localhost:8001了,会看到一堆 json 数据,现在安装 dashboard,不过你也可以选择用 konga 来作为gui 管理,具体请看 konga – More than just another GUI to Kong Admin API
docker run --network host --name kong-dashboard -itd pgbi/kong-dashboard start --kong-url http://localhost:8001 --basic-auth user1=password1
现在,你可以用浏览器访问 http://localhost:1991 了,用户名 user1 密码 password1 明天,我们来研究 kong 的身份验证,OAuth 2.0 和 jwt