apigateway-kong(一)简介及部署
最近搭建一个api-gateway服务,随着后端restful api不断增加, 权限控制,安全,负载均衡,请求分发,监控等都成了问题
为什么使用API-Gateway
1. 方便客户端维护-- 每个请求方不用管理多个api url,统一访问api-gateway即可
2. 接口重构时调用方不须了解接口本身等拆分和聚合
3. 客户端无须关心接口协议
4. 统一权限控制、接口请求访问日志统计
5. 安全,是保护内部服务而设计的一道屏障
5. 开源-最大好处
当然也有一个很大的缺点,api-gw很可能成为性能瓶颈,因为所有的请求都经过这里,可以通过横向扩展和限流解决这个问题。
在众多API GATEWAY框架中,Mashape开源的高性能高可用API网关和API服务管理层——KONG(基于NGINX)特点尤为突出,它可以通过插件扩展已有功能,这些插件(使用lua编写)在API请求响应循环的生命周期中被执行。于此同时,KONG本身提供包括HTTP基本认证、密钥认证、CORS、TCP、UDP、文件日志、API请求限流、请求转发及NGINX监控等基本功能。目前,Kong在Mashape管理了超过15,000个API,为200,000开发者提供了每月数十亿的请求支持。
Kong是一款基于Nginx_Lua模块写的高可用,由于Kong是基于Nginx的,所以可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。
Kong主要有三个组件:
- Kong Server :基于nginx的服务器,用来接收API请求。
- Cassandra/PostgreSQL :用来存储操作数据。
- Kong dashboard:官方推荐UI管理工具,当然,也可以使用 restfull 方式 管理admin api
以下实践环境:
操作系统:macOS
kong版本:0.13.x
PostgreSQL:10.3
npm版本:5.6.0 , node : 6.0.0+ (用于部署kong-dashboard,也可以通过docker部署)
kong-dashboard:3.3.x
安装/部署kong
安装postgresql
简介
kong将其所有数据(如API,用户和插件)存储在Cassandra或PostgreSQL中。 属于同一集群的所有Kong节点必须连接到同一个数据库。
database:配置此节点来指定KONG使用哪个数据库(PostgreSQL或Cassandra)作为其数据存储。可选的数据库只有postgres和cassandra,默认为 postgres。
Postgres的设置:
pg_host:Postgres的服务器的主机地址
pg_port:Postgres的服务器的端口
pg_user:Postgres用户名
pg_password:Postgres的用户密码
pg_database:要连接的数据库实例名,必须存在
pg_ssl:是否启用与服务器的SSL连接
pg_ssl_verify:如果启用了pg_ssl,则切换服务器证书验证。请参阅lua_ssl_trusted_certificate设置。
安装postgresql
#安装
- brew install postgresql
#查看是否安装成功
- #查看安装路径
- MacBook-Pro:~$ which psql
- /usr/local/bin/psql
- #查看pg 版本
- MacBook-Pro:~$ pg_ctl -V
- pg_ctl (PostgreSQL) 10.3
#设置配置文件
- vim /usr/local/var/postgres/postgresql.conf
- #设置host和port,其他使用默认值
- # - Connection Settings -
- listen_addresses = 'localhost' # what IP address(es) to listen on;
- # comma-separated list of addresses;
- # defaults to 'localhost'; use '*' for all
- # (change requires restart)
- port = # (change requires restart)
- max_connections = # (change requires restart)
- #superuser_reserved_connections = # (change requires restart)
#启动pg数据库
- pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
#查看数据库访问日志
- cat /usr/local/var/postgres/server.log
#查看数据库运行状态
- pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log status
#停止数据库服务
- pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log stop -s -m fast
#查看数据库运行进程
- ps -ef |grep postgres 或 ps auxwww | grep postgres
数据库运行正常后,开始创建kong账号和数据库,可以通过pg命令创建db和user,也可以通过psql命令进入数据库后创建
# 命令行创建kong数据库和用户
- #创建数据库用户-kong
- createuser kong -P
- #创建数据库/密码-kong/kong
- createdb kong -O kong -E UTF8 -e
然后就可以通过navicat图形化连接pg数据库kong
#也可以连接到数据库后创建数据库,但用户要先创建好
- MacBook-Pro:~$ psql -h localhost -p -U kong -W kong
- Password for user kong:
- psql (10.3)
- Type "help" for help.
- kong=> select * from test;
- id | name
- ----+------
- ( rows)
到此,数据库就配置好了,然后安装kong,需要将postgresql的配置加入到kong配置中
其它
# 数据导出和导入,和mysql类似
- #远程导出表结构和数据:
- pg_dump -h REMOTE_IP kong -U kong -p -f kong.dump
- #远程导出表结构,不带数据
- pg_dump -s -h REMOTE_IP kong -U kong -p -f kong.dump
- 导入本地数据库:
- psql -h localhost kong -U kong -p -f kong.dump
# navicat图形化连接,此时数据表还没有,配置好kong.conf后执行初始化配置后会自动生成相关kong数据表
安装kong
安装
Mac版安装参考官网,
#安装
- $ brew tap kong/kong
- $ brew install kong
#数据库准备
按照上述postgresql安装,已经准备好存储,现在需要执行kong migrations来初始化数据库表
- $ kong migrations up
这里我没有指定配置文件,使用的都是kong默认的配置,也可以指定自定义配置文件
- #kong.conf的路径,默认是/etc/kong/kong.conf
- $ kong migrations up [-c /path/to/kong.conf]
也不知道为啥,官网说默认会在/etc/kong/下自动生成配置文件kong.conf,但我本机没有在这个目录生成,在这个目录下/usr/local/opt/kong,anyway,目前还没有影响
执行好后,数据库会生成很多表,这些是默认但kong数据表,后续可以自定义插件,重新migrations,会生成自定义表
最常用的是apis、ratelimiting_metrics表,也有自带的keyauth,oauth认证插件,后续篇章再做演示说明
#默认kong插件在如下目录,自定义插件后续加在这里
- cd /usr/local/share/lua/5.1/kong/plugins/
#启动kong,这里没有用到nginx-kong.conf
- $ kong start [-c /path/to/kong.conf]
#停止kong
- $ kong stop
- Kong stopped
- $ kong start
- Kong started
- $
#使用kong
- curl -i http://localhost:8001/
成功启动后访问:http://localhost:8001/ 会出现kong的admin-api json
默认情况下,KONG监听的端口为:
· 8000:此端口是KONG用来监听来自客户端传入的HTTP请求,并将此请求转发到上有服务器;
· 8443:此端口是KONG用来监听来自客户端传入的HTTP请求的。它跟8000端口的功能类似,但是它只是用来监听HTTP请求的,没有转发功能。可以通过修改配置文件来禁止它;
· 8001:Admin API,通过此端口,管理者可以对KONG的监听服务进行配置;
· 8444:通过此端口,管理者可以对HTTP请求进行监控.
接口接入kong测试
# 原接口
访问上海天气预报的接口 :https://www.sojson.com/open/api/weather/json.shtml?city=%E4%B8%8A%E6%B5%B7
- $ curl -i -X GET 'https://www.sojson.com/open/api/weather/json.shtml?city=%E4%B8%8A%E6%B5%B7'
- HTTP/
- server: marco/2.2
- date: Tue, May :: GMT
- content-type: application/json;charset=UTF-
- vary: Accept-Encoding
- x-source: C/
- content-disposition: inline;filename=f.txt
- cache-control: no-cache, no-store, must-revalidate
- pragma: no-cache
- expires: Sat, Mar :: GMT
- accept-ranges: bytes
- x-request-id: ff9f2b7ad8dd595cb1690e2c5bab92cd
- via: S.mix-sd-dst-, T..-, V.mix-sd-dst-, T..-, M.cun-he-tvs2-
- {"date":"","message":"Success !","status":,"city":"上海","count":,"data":{"shidu":"92%","pm25":22.0,"pm10":42.0,"quality":"优","wendu":"","ganmao":"各类人群可自由活动","yesterday":{"date":"21日星期一","sunrise":"04:56","high":"高温 22.0℃","low":"低温 19.0℃","sunset":"18:46","aqi":44.0,"fx":"东风","fl":"<3级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},"forecast":[{"date":"22日星期二","sunrise":"04:55","high":"高温 25.0℃","low":"低温 18.0℃","sunset":"18:47","aqi":50.0,"fx":"东南风","fl":"3-4级","type":"中雨","notice":"记得随身携带雨伞哦"},{"date":"23日星期三","sunrise":"04:55","high":"高温 26.0℃","low":"低温 17.0℃","sunset":"18:47","aqi":65.0,"fx":"无持续风向","fl":"3-4级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"24日星期四","sunrise":"04:54","high":"高温 26.0℃","low":"低温 20.0℃","sunset":"18:48","aqi":82.0,"fx":"东南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"25日星期五","sunrise":"04:54","high":"高温 29.0℃","low":"低温 23.0℃","sunset":"18:49","aqi":101.0,"fx":"东南风","fl":"<3级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},{"date":"26日星期六","sunrise":"04:53","high":"高温 28.0℃","low":"低温 22.0℃","sunset":"18:49","aqi":118.0,"fx":"西风","fl":"<3级","type":"小雨","notice":"雨虽小,注意保暖别感冒"}]}}
- $
- $
#接口注册kong
- curl -i -X POST \
- --url http://localhost:8001/apis/ \
- --data 'name=weather-api' \
- --data 'hosts=www.sojson.com' \
- --data 'upstream_url=https://www.sojson.com/open/api/weather/json.shtml'
name是全局唯一,后续对注册接口的插件修改都可以用到,host放在header里指定,upstream_url是转发的真实的上游接口
注册成功,则pg数据库的apis表会添加一条记录
#通过kong访问此天气接口
- curl -i -X GET \
- --url http://localhost:8000?city=上海 \
- --header 'Host: www.sojson.com'
kong完美的实现了接口转发~
注意注册时,'hosts', 'uris' or 'methods'三个参数至少有一个必须指定
安装kong-dashboard
kong已经提供了非常友好的restful api,但还是看起来不直观,其实如果很闲的话可以自己根据这些kong API写个前端,不然就要使用懒人必备kong-dashboard,搭建起来非常简单.
作为nodejs常用开发者,npm包必不可少,使用npm全局安装kong-dashboard
- # Install Kong Dashboard
- npm install -g kong-dashboard
- # Start Kong Dashboard
- kong-dashboard start --kong-url http://kong:8001
- # 使用自定义端口启动kong-dashboard
- kong-dashboard start \
- --kong-url http://localhost:8001 \
- --port
- $ kong-dashboard start \
- > --kong-url http://localhost:8001 \
- > --port
- Connecting to Kong on http://localhost:8001 ...
- Connected to Kong on http://localhost:8001.
- Kong version is 0.13.
- Starting Kong Dashboard on port
- Kong Dashboard has started on port
#启动好后访问 localhost:8088 进入kong-dashboard首页
kong还有一个比较知名的API管理的GUI -KONGA,下面也来简单部署一下
KONGA -ADMIN API GUI
kongA也是依赖nodejs和npm启动的
- $ git clone https://github.com/pantsel/konga.git
- $ cd konga
- $ npm install
更改数据库配置
- cp /config/local_example.js /config/local.js
- #更改数据库连接配置
- connections: {
- host: 'localhost',
- port: ,
- schema: false,
- ssl: false,
- adapter: 'postgres',
- user: 'kong',
- password: 'kong',
- database: 'kong',
- identity: 'postgres'
- },
- models: {
- connection: process.env.DB_ADAPTER || 'postgres'
- }
启动
- npm start
启动后访问: http://localhost:1338/
konga部署起来比kong-dashboard要复杂~
kong部署和安装到此为止,下面顺便介绍下kong命令行
KONG CLI
全局参数
即所有命令都可加下面都参数
--help 帮助命令
--v 开启详细信息模式
--vv 开启debug模式
命令行
kong check
检查kong.conf有效性
- 用法: kong check [conf]
- [conf] (默认check /etc/kong.conf or /etc/kong/kong.conf)
kong prepare
准备kong的前置文件夹和子文件夹和文件---讲真,我不清楚这个命令的用处,反正我没用到过
- 用法: kong prepare [OPTIONS]
- 此命令可从nginx中启动kong代替kong start
- 示例: sudo kong prepare -p /usr/local/opt/kong -c /etc/kong/kong.conf && kong migrations up && nginx -p /usr/local/opt/kong -c nginx.conf
- Options:
- -c,--conf (optional string) configuration file
- -p,--prefix (optional string) override prefix directory
- --nginx-conf (optional string) custom Nginx configuration template
kong health
检查kong 节点健康状况
- Usage: kong health [OPTIONS]
- Options:
- -p,--prefix (optional string) prefix at which Kong should be running
- $ kong health
- nginx.......running
- Kong is healthy at /usr/local/opt/kong
kong migrations
管理kong数据库
- 用法: kong migrations COMMAND [OPTIONS]
- 可用的参数:
- list #列出迁移的数据列表
- up #执行所有丢失的迁移到最新版本,初始化即执行这个
- reset #重置数据库,不可逆,执行完即删除kong数据表,亲测,谨慎操作 (irreversible).
- Options:
- -c,--conf (optional string) configuration file
kong quit
从一个运行到kong节点中退出
- 用法: kong quit [OPTIONS]
- 此命令发送一个SIGQUIT信号给nginx,表示所有到请求都要结束在服务关闭前,如果指定的timeout时间到,则立即强制退出
- Options:
- -p,--prefix (optional string) prefix Kong is running at
- -t,--timeout (default ) timeout before forced shutdown
kong reload
kong restart
kong start
Start Kong (Nginx and other configured services) in the configured
prefix directory.
- 用法: kong start [OPTIONS]
- 示例:kong start -c /etc/kong/kong.conf --nginx-conf=/etc/kong/nginx.conf --vv
- Options:
- -c,--conf (optional string) kong.conf
- -p,--prefix (optional string) kong前置目录
- --nginx-conf (optional string) 自定义nginx模版
- --run-migrations (optional boolean) optionally run migrations on the DB
kong stop
停止kong服务
- Usage: kong stop [OPTIONS]
- Stop a running Kong node (Nginx and other configured services) in given
- prefix directory.
- This command sends a SIGTERM signal to Nginx.
- Options:
- -p,--prefix (optional string) prefix Kong is running at
kong version
查看kong版本
- $ kong version -a
- Kong: 0.13.
- ngx_lua:
- nginx:
- Lua: LuaJIT 2.1.-beta3
reference:
http://www.cnblogs.com/SummerinShire/p/6386086.html
apigateway-kong(一)简介及部署的更多相关文章
- 深入详解美团点评CAT跨语言服务监控(一) CAT简介与部署
前言: CAT是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,除了与点评RPC组件融合的很好之外,他将会能与Spring.MyBatis.Dubbo 等框架以及Log4j 等结合,支持P ...
- API网关之Kong网关简介
1. Kong简介 那么,Kong是一个什么东东呢?它是一个开源的API网关,或者你可以认为它是一个针对API的一个管理工具.你可以在那些上游service之上,额外去实现一些功能.Kong是开源的, ...
- LAMP简介与部署
lamp简介 lamp,是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一组动态网站或者服务器的开源软件,除Linux外其它各部件本身都是各自独立的程序,但是 ...
- dubbo + zookeeper 简介和部署
Dubbo简介: Dubbo 是阿里巴巴公司开源(以前不开源)的一个高性能优秀的服务框架, 使得应用可通过高性能的 RPC 实现服务的输入和输出功能, 可以和spring框架无缝集成. 那么这里, 啥 ...
- Shark简介、部署及编译小结
http://blog.csdn.net/pelick/article/details/11964291 Shark简介 Shark即Hive on Spark,本质上是通过Hive的HQL解析,把H ...
- Hadoop入门第五篇:Hive简介以及部署
标签(空格分隔): Hadoop Hive hwi 1.Hive简介 之前我一直在Maxcompute上进行大数据开发,所以对数仓这块还算比较了解,在接受Hive的时候基本上没什么大的障碍.所以, ...
- 【原创】Airflow 简介&如何部署一个健壮的 apache-airflow 调度系统
声明 本文摘录了很多前辈的文章,原文如下: https://www.jianshu.com/p/2ecef979c606 Airflow 简介 Airflow是一个可编程,调度和监控的工作流平台,基于 ...
- Docker 容器简介与部署
关于Docker容器技术 参考文献:<docker 从入门到精通> Docker容器简介 Docker的构想是要实现 "Build,Ship and Run Any App,An ...
- 01 . 分布式存储之FastDFS简介及部署
分布式存储简介 现代的互联网已经进入大数据时代,每天都有数以万计的数据产生,这些数据的规模轻轻松松地可以达到几P的级别,传统的的单机存储早已捉襟见肘,根本无法满足大数据对存储系统的要求.这时,各种分布 ...
随机推荐
- web报表工具FineReport常用函数的用法总结(数学和三角函数)
最后一次抛砖引玉了,至此finereport所有的常见函数就分享完了,期待能对大家有些许帮助. ABS ABS(number):返回指定数字的绝对值.绝对值是指没有正负符号的数值. Number:需要 ...
- LeetCode之旅(17)-Ugly Number
题目: Write a program to check whether a given number is an ugly number. Ugly numbers are positive num ...
- 演进之美,越来越美:三分钟看尽 iOS 1 ~ iOS 8 的进化史
演进之美,越来越美:三分钟看尽 iOS 1 ~ iOS 8 的进化史 原文出处: 少数派 9 月 18 日苹果就将推出 iOS 8 正式版了,从 2007 年发布第一代 iPhone 时搭载在 iPh ...
- springboot2 webflux 响应式编程学习路径
springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑问将会成为未来技术的趋势,是必学 ...
- Day6_time模块
TIME模块: print(time.time()) #指的是从1970年到现在的秒数 print(time.strftime('%Y-%m-%d %X')) #指定特定的格式输出时间 print( ...
- Linux 命令行输入
这几天刚刚接触到Linux,在windows上安装的VMWare虚拟机,Centos7.安装什么都是贾爷和办公室的同事帮忙搞定的. 在虚拟机界面,按快捷键Ctrl+Alt+Enter,可以全屏显示Li ...
- JavaScript引用类型-Object类型
创建Object的方式有两种: 第一种:使用new操作符后跟Object操作函数. var person = new Object(); person.name = "wang"; ...
- 学习了解CyclicBarrier
CyclicBarrier我的理解就是一个线程等待器,用途就是将注册了这个barrier的线程卡在同一个位置,直到注册这个barrier的所有线程都完成之后,继续执行.下面是一个学习过程中采用的示例, ...
- 从javascript发展说到vue
Vue是基于javascript的一套MVVC前端框架,在介绍vue之前有必要先大体介绍下javascript产生背景及发展的历史痕迹.前端MVVC模式等,以便于大家更好的理解为什么会有vue/rea ...
- 分布式消息队列XXL-MQ
<分布式消息队列XXL-MQ> 一.简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持串行.并行和广播等多种消息模型.现已开放源代码,开箱即用. 支持三种消息模式: ...