入门篇
第1章 全面了解Kong网关
Kong
是一款基于OpenResty
(Nginx Lua
模块)编写的高可用、易扩展的开源API
网关,专为云原生和云混合架构而建,并针对微服务和分布式架构进行了特别的优化- 微服务网关具有负载均衡、缓存、路由、访问控制、服务代理、监控、日志等多项功能。
API
网关在微服务架构中正是以微服务网关的身份存在 - 由于企业间信息交流和共享变得日益频繁,企业需要将自身数据、能力等向外开放,通常以接口的方式向外提供,如淘宝开放平台、腾讯的
QQ
开放平台和微信开放平台。开放平台的引入必然涉及客户应用接入、API
权限管理、调用次数管理等多项功能的完善
表16 功能
Kong
服务器的架构设计
- 高扩展性:用户可以通过简单地向
Kong
集群中添加更多服务器实现横向扩展,这意味着用户在面对超大流量时可以轻松应对,整个集群可以保持正常负载,保证整个网关层服务可靠稳定 - 模块化:
Kong
服务器的路由、服务、插件均是基于模块构建的,这些元素可以通过AdminAPI
轻松配置,或者通过Kong
管理GUI
进行可视化管理 - 与运行环境无关:
Kong
服务器理论上可以在任何环境中运行,也就是说,用户可以在云服务器或者内部网络环境中部署Kong
服务器
- 当前主流的开源
Kong
管理GUI
有KongDashboard
和KONGA
,其中KongDashboard
对新版本的Kong
支持不好,建议读者使用KONGA
。图18是KONGA
的界面
- 安装完成后,我们还需要准备两个配置文件,一个是启动项配置文件。用户可以从
https://raw.githubusercontent.com/Kong/kong/master/kong.conf.default
下载配置模块,并更改配置文件名为kong.conf
。修改kong.conf
配置文件内容 - 另一个是
kong.yml
文件,需要使用kongconfiginit
命令生成。该配置文件内容可以为空,但文件本身不可缺失。当一切准备就绪后,使用kongstartckong.conf
命令启动Kong
服务,在浏览器中输入http
://127.0.0.1:8001可以查看服务是否启动成功
程序清单17
config.yml
配置文件
图1-12 引入
Kong
网关之后的请求详情
程序清单110 改造后的
Dockerfile
文件
程序清单111
todolists.conf
文件
第2章 Nginx必备知识
程序清单28
kong.yml
配置文件
- 添加了名为
ratelimiting
和iprestriction
的插件(插件会在第11章做重点介绍),表示只允许访问172.21.0.1(即frontend
地址),且每分钟只能访问3次
图26
Kong
限流效果图一
图27
Kong
限流效果图二
- 响应头中的
XRateLimitLimitMinute
表示限流的次数,即每分钟3次;XRateLimitRemainingMinute
表示限流剩余的次数;RateLimitReset
表示还需要多长时间才能重置限流插件、恢复访问,单位为秒 - 作为
Nginx
与OpenResty
、Kong
的关键连接点,Lua
是学习Kong
网关的必备知识之一
第3章 Lua必备知识
Lua
还有一个同期进行的LuaJIT
项目,即JustInTime
,也就是运行时编译器。LuaJIT
的语法和标准Lua
的语法类似,但是其运行速度比标准Lua
快数十倍Lua
语言是CC
的“王牌搭档”。CC
应用程序与Lua
语言结合完美地平衡了性能和灵活性,这也正是Kong
网关能够提供高性能和高度定制化插件的基础LuaJIT
解释器的执行效率为Lua
解释器执行效率的10倍以上- 程序设计语言中的一等、二等、三等公民
- 一等公民:可以作为参数传递,也可以从子程序中返回,还可以赋值给变量
- 二等公民:可以作为参数传递,但是不能从子程序中返回,也不能赋值给变量
- 三等公民:值作为参数传递都不行
- 此处再多做一下引申,函数为“一等公民”是函数式编程的基础
- 用户数据分为两类:完全用户数据,指由
Lua
管理的内存对应的对象;轻量用户数据,指简单的C
指针 - 在
Lua
中,用户数据除了赋值与相等性判断之外,没有其他预定义操作 - 线程类型表示一个独立的执行序列,用于实现协程。
Lua
线程与操作系统的线程毫无关系。Lua
可以为所有系统,包括那些不支持原生线程的系统,提供协程支持。代码清单35使用Lua
协程实现了经典的生产者消费者示例 - 表是
Lua
中唯一的数据结构,也是非常灵活的数据结构。它可被用于表示普通数组、序列、符号表、集合、字典、图、树等。对于字典,Lua
使用域名作为索引。Lua
语言提供了a.name
这样的语法糖来替代a["name"
]写法
1)表作为数组的使用示例:
2)表作为字典的使用示例:
资料
- 代码:
https://github.com/fossilman/KongInAction