一 API 网关产生背景
在微服务的架构中, 一个大的应用会被拆分成多个小的单一的服务提供出来, 这些小的服务有自己的处理, 有自己的数据库 (也可以共用), 也许语言也是不一样的, 他们可以部署在一个或多个服务器上, 其实也就是对复杂的应用进行了解耦, 那为什么微服务需要 API 网关呢?
首先我们看看微服务后产生的问题:
客户端需要知道多个服务地址
通用的功能怎么处理? 例如鉴权流量控制日志等
以前一个功能可能是一次请求就可以完成, 现在可能要多个服务一起进行才可以, 那如何减少客户端请求的时间呢?
由于以上几点的问题, 所以在所有的服务前面还需要定义一个代理, 即 API 网关, 所有的客户端请求都必须经过 API 网关代理到真实的服务地址, 这也可以有效的避免真实地址的暴露, 同时 API 网关也可以集成鉴权流量控制日志 API 聚合黑白名单等
二 kong 的介绍
Kong 是由 Mashape 开发的并且于 2015 年开源的一款 API 网关框架, 基于 nginx 以及 OpenResty 研发, 主要特点是高性能以及其强大的扩展性, 由于本身是基于 nginx 进行开发, 因此网上很多关于 nginx 的调优等资料都可以用到 kong 的上面, 包括负载均衡或者充当 web 服务器等
kong 的扩展是通过插件机制进行的, 并且也提供了插件的定制示例方法, 插件定义了一个请求从进入到最后反馈到客户端的整个生命周期, 所以可以满足大部分的定制需求, 本身 kong 也已经集成了相当多的插件, 包括 CORS 跨域 logging 限流转发健康检查熔断等, API 聚合功能从 github 上看也已经进入开发阶段
kong 插件介绍地址: https://konghq.com/plugins/.
kong 相关文档地址: https://getkong.org/docs/
三 kong 的安装
本次安装是在 CentOS7.3 下进行
步骤一 pg 数据库安装, 一步步执行如下的脚本
- // 获取下载的 rpm
- yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-3.noarch.rpm
- // 执行安装
- yum install postgresql95-server
- // 初始化数据库
- /usr/pgsql-9.5/bin/postgresql95-setup initdb
- // 设置开机启动
- systemctl enable postgresql-9.5
- // 启动服务
- systemctl start postgresql-9.5
步骤二 pg 数据库远程访问设置 (如果不需要的话, 那也可以不用管)
修改 / var/lib/pgsql/9.5/data/pg_hba.conf, 增加如下配置
修改 / var/lib/pgsql/9.4/data/postgresql.conf, 修改以下配置
步骤三: kong 服务安装
由于官网 repo 仓库的版本才更新到 0.10.4 版本 (估计官方忘记或者太懒了), 所以目前只能用 rpm 包的方式进行安装, rpm 包下载地址: https://bintray.com/kong/kong-community-edition-rpm/download_file?file_path=centos/7/kong-community-edition-0.12.3.el7.noarch.rpm
下载好后, 到文件目录下执行:
- rpm -ivh kong-community-edition-0.12.3.el7.noarch.rpm
- kong version
步骤四数据库配置
kong 连数据库, 需要我们在 pg 上建立密码为 kong 的 kong 用户, 数据库名也为 kong
- su - postgres// 进入数据库
- -bash-4.2$ psql
- postgres=# CREATE USER kong WITH PASSWORD 'kong'; CREATE DATABASE kong OWNER kong;// 建立数据库以及用户
步骤五修改 kong 配置
进入 / usr/local/share/lua/5.1/kong/templates 目录, 修改 kong_defaults.lua 里的 pg_password=kong, 保存
步骤六启动
- kong migrations up// 初始化数据库
- kong start// 启动命令
Kong 在启动后, 一个是 8000, 一个是 8001,8000 端口是请求进入端口, 用户发送请求先到 Kong 项目的 8000 端口, kong 根据配置的规则转发到真实的后台服务地址而 8001 端口则是管理端口, 插件设置 API 的增删改查以及负载均衡等一系列的配置都是通过 8001 端口进行管理
最后浏览器访问 IP:8000, 如果出现 {"message":"no API found with those values"}
注意点: 如果有防火墙的话, 最好先关掉防火墙
四总结
kong 在我看来是可以很好的完成了 API 网关的职责, 基于 nginx 开发, 插件开发方便, 支持负载均衡, 支持日志等, 对于 K8S 也可以轻松部署使用
这次介绍比较简单, 大家如果有不同的建议意见或者问题的话, 可以留言一起讨论, kong 有打算是写成一个系列的, 目前自己也在摸索当中, 可能会不定期更新, 谢谢大家
来源: https://www.cnblogs.com/OMango/p/8576594.html