kong个人分享(api网关)

# kong简介

## 背景

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

   ![](images/kong_arch.png)

## 简介

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

```bash$ 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

```bashyum install postgresql96-server postgresql96-contrib  ```## 配置

* 配置文件

```bash/etc/kong/kong.conf   /usr/local/kong/nginx.conf/usr/local/kong/nginx-kong.conf```* 模板:

```bashkong_defaults.luanginx.luanginx_kong.lua```

## 表结构

## kong常用命令

* kong

```bashkong --vkong check /etc/kong/kong.confkong health -p /usr/local/kongkong version```* 初始化数据库,插件更新

```bashkong migrations up -c /etc/kong/kong.confkong migrations list -c /etc/kong/kong.confkong migrations reset -c /etc/kong/kong.conf```* 配置

```bashkong start -c /etc/kong/kong.conf -p /usr/local/kong --nginx-conf custom_nginx.template --run-migrations truekong start -c /etc/kong/kong.conf --nginx-conf custom_nginx.templatekong quit -p /usr/local/kongkong stop -p /usr/local/kongkong 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]

* 格式

```bashget:/apis/{name or id}get:/apis/patch:/apis/{name or id}put:/apis/delete:/apis/{name or id}```

* config

``` bashcurl http://localhost:8001/ |jq .curl http://localhost:8001/status |jq .```

* /apis/

``` bashcurl -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-->reloadcurl -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/

``` bashcurl -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

``` bashcurl -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/

``` bash--修改删除只能通过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/

``` bashcurl -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/

``` bashcurl -H "Content-type: application/json" -X POST -d ‘{"cert":"","key":"","snis":""}‘ "http://localhost:8001/apis/demo/certificates/" |jq .``` 

* /snis/

``` bashcurl -H "Content-type: application/json" -X POST -d ‘{"name":"","ssl_certificate_id":""}‘ "http://localhost:8001/apis/demo/snis/" |jq .```

## proxy routing 规则

* 配置多项

``` bash备注:下面是接口响应格式{    "name": "my-api",    "upstream_url": "http://my-api.com",    "hosts": ["example.com", "service.com"],    "uris": ["/foo", "/bar"],    "methods": ["GET"]}```

* 遵循最长匹配优先评估,

``` bash"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

``` bashdb_update_frequency = 5  db_update_propagation = 0db_cache_ttl = 3600  ```

* 0.10版本:通过 Kong 集群,每个节点能够知道其它节点的存在。并且当一个Kong 节点有对数据更新,该节点有责任通知这个变化给集群里的其他节点,通知其其他节点把本地内存中的缓存无效,重新从数据库中获取更新后的数据。

``` bashcluster_listen    通信cluster_listen_rpc 代理通信cluster_advertisecluster_encrypt_key base64编码16字节加密集群通信cluster_keyring_filecluster_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个常用插件

## 编写插件

* 文件结构

``` bash

基本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文件:

```bashbuild = {  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"  }}```

```bashluarocks make --pack-binary-rock my-plugin-addtag-0.1.0-0.rockspec ```

* 修改kong.conf custom_plugins 挂载,重启;

## 测试环境使用情况

```bashhttp://172.16.17.9:5664/#/apis```
时间: 2024-10-07 04:36:27

kong个人分享(api网关)的相关文章

为什么需要API网关?

目录 0:00 微服务与网关(Microservices & API Gateways) 大家好,我叫Macro,今天我们谈论有关微服务和网关的话题.我是Mashape的CTO,也同时是开源网关Kong的开发者之一.Kong是一个API网关,今天我们就来窥探一下它究竟是怎么工作的以及它如何运用到你的微服务架构中去. 0:23 主题(Topics) 为了明白我们为什么需要API网关,我将从单体架构vs微服务架构谈起.这两个有什么不同点呢?然后我会介绍API网关模式以及它是如何适应"面向微服

微服务之API网关 kong 使用场景之路由功能

API网关,在介绍spring cloud的时候我们也曾提到过zuul,并使用zuul做了一个简单的实验证明zuul是可以实现网关的路由功能的,在这篇文章中,我们会同样使用类似简单的例子来验证kong在此种场景下的使用. spring cloud之zuul的类似实现 spring cloud的zuul的类似功能和实现,可参看下文: spring cloud之api网关 https://blog.csdn.net/liumiaocn/article/details/53941354 场景说明 项目

来自京东、唯品会对微服务编排、API网关、持续集成的实践分享(上)

架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第三期:微服务.微服务架构以其高度的弹性.灵活性和效率的巨大提升,快速受到各领域架构师和技术决策者的关注.它的基本理念是将一个肥大的系统拆分成若干小的服务组件,组件之间的通讯采用轻量的协议完成.我们本期小组交流会来探讨一下,现在互联网公司的微服务实践情况. 嘉宾:京东章耿.原唯品会石廷鑫.七牛陈爱珍 本文是对此次交流的整理,分了上下两篇文章. 第一轮:自由交流 京东章耿:大家好,我是京东基础架构部平台中间件的章耿,主要负责京东的

Kong api 网关 安装简单应用

Kong是一个可伸缩的开源API层(也称为API网关或API中间件).Kong最初是由Kong Inc.(前身为Mashape)建造的,用于为其API市场提供超过15000个微服务,每月产生数十亿个请求. 在经过实战检验的NGINX的支持下,该公司专注于高性能,在2015年成为开源平台.在积极的发展下,Kong现在已被用于从创业公司到大型企业和政府部门的数百个组织的生产,包括:<纽约时报> 支持 权限控制,安全,负载均衡,请求分发,监控,限流 等等. github : docker安装 :ht

API网关Kong系列(一)初识

最近工作需要,加上国内Kong的文章相对缺乏(搜来搜去就那么两篇文章),而且官方文档在某些demo上也有一些过时的地方,遂提笔记录下这些,希望能有帮助. 先随大流介绍下KONG(主要参考官网): 官方站点:https://getkong.org 官方描述:Kong is a scalable, open source API Layer (also known as an API Gateway, or API Middleware). Kong runs in front of any RES

Net分布式系统之六:微服务之API网关

本人建立了个人技术.工作经验的分享微信号,计划后续公众号同步更新分享,比在此更多具体.欢迎有兴趣的同学一起加入相互学习.基于上篇微服务架构分享,今天分享其中一个重要的基础组件“API网关”. 一.引言 随着互联网的快速发展,当前以步入移动互联.物联网时代.用户访问系统入口也变得多种方式,由原来单一的PC客户端,变化到PC客户端.各种浏览器.手机移动端及智能终端等.同时系统之间大部分都不是单独运行,经常会涉及与其他系统对接.共享数据的需求.所以系统需要升级框架满足日新月异需求变化,支持业务发展,并

API网关

微服务之API网关 一.引言 随着互联网的快速发展,当前以步入移动互联.物联网时代.用户访问系统入口也变得多种方式,由原来单一的PC客户端,变化到PC客户端.各种浏览器.手机移动端及智能终端等.同时系统之间大部分都不是单独运行,经常会涉及与其他系统对接.共享数据的需求.所以系统需要升级框架满足日新月异需求变化,支持业务发展,并将框架升级为微服务架构."API网关"核心组件是架构用于满足此些需求. 很多互联网平台已基于网关的设计思路,构建自身平台的API网关,国内主要有京东.携程.唯品会

用API网关把API管起来

最开始只是想找个API网关防止API被恶意请求,找了一圈发现基于Nginx的OpenResty(Lua语言)扩展模块Orange挺好(也找了Kong,但是感觉复杂了点没用),还偷懒用Vagrant结合Docker来快速搭建环境,基于别人的Dockerfile把整个实验跑通了,觉得还不错.想着好像CoreOS是专门为Docker服务的,还买了一本<CoreOS实践>花小半天时间看完了,CoreOS在集群环境下确实很牛,但是我的环境还是轻量级点,所以还是基于CentOS来做,就这样研究了两天时间,

买单侠微服务的API网关演化之路

伴随着买单侠业务的快速发展,能够支持独立开发.独立部署.独立扩展的微服务在秦苍得到了广泛应用和蓬勃发展,短短3年左右时间,已经发展到了300+个微服务,并且还在快速增长中. 研发逐渐意识到伴随着微服务规模化的增长,必需要重视微服务的基础设施建设(API网关.服务注册中心.调用链跟踪等)才能保持开发效率和产品的质量. API网关作为访问微服务的大门, 是访问后台服务的入口,作为最常用的基础服务之一,其重要性不言而喻.在买单侠微服务的发展道路上,经过了以下摸索发展阶段,希望能给规模化应用微服务的攻城