kong介绍-个人分享
kong简介
背景
我们在提供api或微服务时,通常借助openresty nginx进行流量转发或者添加一些规则或功能,但是随着服务数量和引用增多,复杂的网络环境,
使维护变得困难,不容易扩展,一些功能也会在多个服务中重复,我们期望有一个工具来集中管理。

简介
Kong 是在客户端和(微)服务间转发API通信的API网关和API服务管理层,通过插件扩展功能。我们可以
可以通过增加更多 Kong Server 机器对 Kong 服务进行水平扩展,通过前置的负载均衡器向这些机器分发请求。
- 官网:https://getkong.org/
- github:https://github.com/Mashape/kong
- kong-dashboard(开源UI):https://www.npmjs.com/package/kong-dashboard
特点
- Kong核心基于OpenResty构建,实现了请求/响应的Lua处理化
- Kong通过Restful API提供了API/API消费者/插件/upstream/sni/证书的管理;
- 数据中心用于存储Kong集群节点信息、API、消费者、插件等信息,目前提供了PostgreSQL和Cassandra支持,如果需要高可用建议使用Cassandra;
- 缓存机制(为了避免每次查询数据库,Kong 在第一次请求之行时,尝试在本地的内存里做尽可能多的数据缓存。)、kong集群使kong具备高性能高可用.
结构
- admin: restful api<-->kong server<-(cache)-->db
- client:port--->[kong server<--(cache)-->db]-->api
安装
- kong:0.11
$ sudo yum install epel-release
$ sudo yum install kong-community-edition-0.11.0.*.noarch.rpm --nogpgcheck
- PostgreSQL 9.4+ and Cassandra 3.x.x
yum install postgresql96-server postgresql96-contrib
配置
- 配置文件
/etc/kong/kong.conf
/usr/local/kong/nginx.conf
/usr/local/kong/nginx-kong.conf
- 模板:
kong_defaults.lua
nginx.lua
nginx_kong.lua
表结构
kong常用命令
- kong
kong --v
kong check /etc/kong/kong.conf
kong health -p /usr/local/kong
kong version
- 初始化数据库,插件更新
kong migrations up -c /etc/kong/kong.conf
kong migrations list -c /etc/kong/kong.conf
kong migrations reset -c /etc/kong/kong.conf
- 配置
kong start -c /etc/kong/kong.conf -p /usr/local/kong --nginx-conf custom_nginx.template --run-migrations true
kong start -c /etc/kong/kong.conf --nginx-conf custom_nginx.template
kong quit -p /usr/local/kong
kong stop -p /usr/local/kong
kong reload -c /etc/kong/kong.conf -p /usr/local/kong --nginx-conf custom_nginx.template
Kong Admin API
method:
[get\patch\put\delete]管理项:[apis\upstreams\plugins\consumers\certificates\snis]
格式
get:/apis/{name or id}
get:/apis/
patch:/apis/{name or id}
put:/apis/
delete:/apis/{name or id}
- config
curl http://localhost:8001/ |jq .
curl http://localhost:8001/status |jq .
- /apis/
curl -H "Content-type: application/json" -X POST -d '{"name":"demo","hosts":"demo.com","upstream_url":"http://www.baidu.com"}' "http://localhost:8001/apis/" | jq .
修改hosts-->reload
curl -H "Content-type: application/json" -X POST -d '{"name":"demo","hosts":"demo.com","upstream_url":"http://structuretest.com","preserve_host":"false"}' "http://localhost:8001/apis/" | jq .
curl -H "Content-type: application/json" -X POST -d '{"name":"demo","hosts":"demo.com","upstream_url":"http://demo.upstream"}' "http://localhost:8001/apis/" | jq .
curl -H "Content-type: application/json" -X PATCH -d '{"strip_uri":"true","preserve_host":"true", "https_only":"false","http_if_terminated":"true"}' "http://localhost:8001/apis/demo" |jq .
curl -H "Content-type: application/json" -X POST -d '{"name":"demo","hosts":"demo.com","upstream_url":"http://demo.upstream"}' "http://localhost:8001/apis/" | jq .
curl -X GET "http://localhost:8001/apis/demo" |jq .
curl -X GET "http://localhost:8001/apis/" |jq .
curl -X DELETE "http://localhost:8001/apis/demo" |jq .
- /upstreams/
curl -H "Content-type: application/json" -X POST -d '{"name":"demo.upstream","slots":10}' "http://localhost:8001/upstreams/" | jq .
curl -X GET "http://localhost:8001/upstreams/demo.upstream" |jq .
curl -X GET "http://localhost:8001/upstreams" |jq .
curl -X DELETE "http://localhost:8001/upstreams/demo.upstream" |jq .
- /upstreams/{name or id}/targets
curl -H "Content-type: application/json" -X POST -d '{"target":"192.168.226.129:8090","weight":1}' "http://localhost:8001/upstreams/demo.upstream/targets" | jq .
curl -X GET "http://localhost:8001/upstreams/test.upstream/targets" |jq .
curl -X GET "http://localhost:8001/upstreams" |jq .
curl -X DELETE "http://localhost:8001/upstreams/test.upstream/targets/target"
- /plugins/
--修改删除只能通过id;
curl -H "Content-type: application/json" -X POST -d '{"name":"key-auth"}' "http://localhost:8001/apis/demo/plugins/" |jq .
curl -H "Content-type: application/json" -X PATCH -d '{"enabled":"true","config.key_names":"apikey"}' "http://localhost:8001/apis/demo/plugins/9a14eea2-731b-48f7-8cb4-949ea9c0f25a" |jq .
curl -X GET "http://localhost:8001/plugins/" |jq .
curl -X GET "http://localhost:8001/apis/demo/plugins/" |jq .
curl -X DELETE "http://localhost:8001/apis/demo/plugins/9a14eea2-731b-48f7-8cb4-949ea9c0f25a" |jq .
- /consumers/
curl -H "Content-type: application/json" -X POST -d '{"username":"demo-user"}' "http://localhost:8001/consumers/" |jq .
curl -X DELETE "http://localhost:8001/consumers/demo-user" |jq .
curl -X GET "http://localhost:8001/consumers/demo-user" |jq .
添加key:
curl -H "Content-type: application/json" -X POST -d '{"key":"api_key"}' "http://localhost:8001/consumers/demo-user/key-auth/" |jq .
- /certificates/
curl -H "Content-type: application/json" -X POST -d '{"cert":"","key":"","snis":""}' "http://localhost:8001/apis/demo/certificates/" |jq .
- /snis/
curl -H "Content-type: application/json" -X POST -d '{"name":"","ssl_certificate_id":""}' "http://localhost:8001/apis/demo/snis/" |jq .
proxy routing 规则
- 配置多项
备注:下面是接口响应格式
{
"name": "my-api",
"upstream_url": "http://my-api.com",
"hosts": ["example.com", "service.com"],
"uris": ["/foo", "/bar"],
"methods": ["GET"]
}
- 遵循最长匹配优先评估,
"uris": ["/version/\d+/status/\d+"]
"uris": ["/version"]
"uris": ["/"]
--请求
GET /version/3/status/3 匹配第一个
GET /version 匹配第二个
GET /version/123 匹配第二个
GET /vs 匹配第三个
Load Balancing reference
DNS based loadbalancing:dns_resolver配置dns ip,解析多个ip后,自动使用基于DNS负载均衡(加权负载均衡器,将做一个简单的循环),当dns_stale_ttl 超时后请求dns;
Ring-balancer:upstream(slots\orderlist)\ target(weight)
集群
- 0.11版本:当一个节点发生更新到数据库后,其他节点需要间隔db_update_frequency后,更新缓存失效字段。在使用Cassandra数据库db_update_propagation(数据节点传播延时)必须配置。
为防止db_update_frequency后错过一个失效事件,db_cache_ttl全量更新cache
db_update_frequency = 5
db_update_propagation = 0
db_cache_ttl = 3600
- 0.10版本:通过 Kong 集群,每个节点能够知道其它节点的存在。并且当一个Kong 节点有对数据更新,该节点有责任通知这个变化给集群里的其他节点,
通知其其他节点把本地内存中的缓存无效,重新从数据库中获取更新后的数据。
cluster_listen 通信
cluster_listen_rpc 代理通信
cluster_advertise
cluster_encrypt_key base64编码16字节加密集群通信
cluster_keyring_file
cluster_ttl_on_failure //失败节点超时后停止被链接;
cluster_profile //local, lan, wan.
--数据库node表来存储节点信息:
node
VM_3_3_centos_0.0.0.0:7946_58b54877bc4a47d884b9986e71f49d8b | 10.100.3.3:7946 | 2017-08-07 04:29:05
VM_3_2_centos_0.0.0.0:7946_e4147c192bcc4401acf698ca6374d59d | 10.100.3.2:7946 | 2017-06-12 10:19:24
常用插件
- 8个常用插件
编写插件
- 文件结构
基本
simple-plugin
├── handler.lua 一个接口来实现。每个函数是由kong一个请求的生命周期所需的时刻。(对应lua模块的生命周期)
└── schema.lua 插件引入参数类型、规则、校验
涉及数据库
complete-plugin
├── api.lua 与kong restful对接
├── daos.lua 数据库操作
├── handler.lua //
├── migrations
│ ├── cassandra.lua
│ └── postgres.lua //kong migrations操作数据初始化
└── schema.lua
- 编写rockspec文件:
build = {
type = "builtin",
modules = {
["kong.plugins.my-plugin-addtag.handler"] = "kong/plugins/my-plugin-addtag/handler.lua",
["kong.plugins.my-plugin-addtag.schema"] = "kong/plugins/my-plugin-addtag/schema.lua"
}
}
luarocks make --pack-binary-rock my-plugin-addtag-0.1.0-0.rockspec
- 修改kong.conf custom_plugins 挂载,重启;
测试环境使用情况
http://***********/#/apis
kong介绍-个人分享的更多相关文章
- HTTP API网关选择之一Kong介绍
为什么需要 API 网关 在微服务架构之下,服务被拆的非常零散,降低了耦合度的同时也给服务的统一管理增加了难度.如上图左所示,在旧的服务治理体系之下,鉴权,限流,日志,监控等通用功能需要在每个服务中单 ...
- 1-Kong文章记录
参考: https://www.cnblogs.com/duanxz/p/9770645.html 系列博客可参考: 开源API网关系统(Kong教程)入门到精通 https://www.cnblog ...
- Android中使用ShareSDK集成分享功能
引言 现在APP开发集成分享功能已经是非常普遍的需求了.其他集成分享技术我没有使用过,今天我就来介绍下使用ShareSDK来进行分享功能开发的一些基本步骤和注意点,帮助朋友们避免一些坑.好了 ...
- 用c#开发微信 (10) JS-SDK 基本用法- 分享接口“发送到朋友”
微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享. ...
- 原创:分享asp.net伪静态成目录形式iis如何设置
服务器租用详解asp.net伪静态成目录形式iis如何设置: 一.首先介绍一下asp.net伪静态成html后缀iis如何设置的 iis6 伪静态 iis配置方法 图解 1.右键点击 要设置网站的网站 ...
- wp8.1 Study13:在WP8.1中分享文件和数据
绪论:不同于windows, 在wp8.1中,如果不止一个程序可以接受其Uri或者文件,shell会提供一个界面让用户选择用哪个程序.而在windows中,用户可以在设置那里设置各种文件和Uri的默认 ...
- 用c#开发微信(10) JSSDK 基本用法 分享接口“发送到朋友”
微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享. ...
- 基于python+appium+yaml安卓UI自动化测试分享
结构介绍 之前分享过一篇安卓UI测试,但是没有实现数据与代码分离,后期维护成本较高,所以最近抽空优化了一下.不想看文章得可以直接去Github,欢迎拍砖大致结构如下: 结构.png testyam ...
- 2019年微服务实践第一课,网易&谐云&蘑菇街&奥思技术大咖深度分享
微服务的概念最早由Martin Fowler与James Lewis于2014年共同提出,核心思想是围绕业务能力组织服务,各个微服务可被独立部署,服务间是松耦合的关系,以及数据和治理的去中心化管理.微 ...
随机推荐
- (转)Centos7 Nginx安装
场景:工作中使用的suse,因为系统可可查资料太少,且系统中一些功能的确实,导致很多集群中功能无法顺利测试通过,在Centos上面进行测试,能够更快的熟悉项目的架构过程! 1 安装准备 首先由于ngi ...
- swift3.0 基础练习-构造对象并按要求进行排序(struct)
struct练手 构造10个学生(要求有学生的姓名.数学成绩.英语成绩),按照学生英语和数学平均分的成绩从小到大输出学生的姓名.数学成绩.英语成绩及平均分 创建一个学生构造体,包含 姓名 name 数 ...
- VerilogHDL可综合设计的注意事项
可综合的语法已经记录得差不多了,剩下一些遗留的问题,在这里记录一下吧. 一.逻辑设计 (1)组合逻辑设计 下面是一些用Verilog进行组合逻辑设计时的一些注意事项: ①组合逻辑可以得到两种常用的RT ...
- (转载) java:IO流学习小结
今天刚刚看完Java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...
- CentOS安装配置MySql数据库
CentOS版本7.2,MySql版本5.7 1.下载MySql安装源 wget https://dev.mysql.com/get/mysql57-community-release-el7 ...
- Redis-消息发布与订阅
redis的消息发布与订阅适合做在线聊天, 消息推送 使用方法: 发布端: publish +频道名称 + 发布内容 订阅端: subscribe + 频道名称 发布端例子: 127.0.0.1:63 ...
- 再起航,我的学习笔记之JavaScript设计模式04
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 上回 ...
- Python 实现排序算法
排序算法 下面算法均是使用Python实现: 插入排序 原理:循环一次就移动一次元素到数组中正确的位置,通常使用在长度较小的数组的情况以及作为其它复杂排序算法的一部分,比如mergesort或quic ...
- RabbitMQ安装以及java使用(二)
上一篇记录了rabbitmq的安装,这一篇记录一下rabbitmq的java客户端的简单使用,当然在项目中我们有更为复杂的应用场景,这里只有最简单的点对点生产者与消费者模式. 1.建立工程 首先建立一 ...
- Quartus16.0如何使用TCL脚本
前言 TCL脚本语言在EDA工具中使用频繁,本文主要介绍使用TCL脚本文件进行引脚分配,避免手动分配以及分配出错: 流程 1.准备好你的TCL脚本文件,举个栗子(脚本文件内容): 2.在Quartus ...