Kong API Gateway (8) 发送http请求

Submitted by Lizhe on Wed, 11/28/2018 - 10:29

上一章里我们做了一个简单的校验token是否存在的内容

一般情况下的校验没有这么简单, 可能需要连接到一个RoleManager服务器来完成操作, 那么我们现在就来看一下如何在plugin中发送http请求

网上通过lua来发送http请求一般有两种方式, 使用 socket.http 或者 resty.http 

这里直接选择resty.http, 因为 socket库 需要make install 而且拿不到header信息

安装

1. 下载 https://github.com/pintsized/lua-resty-http

2. 把 http_headers.lua 和 http.lua 拷贝到 lua lib 指定目录下
 

具体步骤

还记得下面这个路径么, 就是这个lua_package_path指定的目录

在/etc/kong/kong.conf文件中加入过对应的模块存放文件夹路径

Kong API Gateway (7) Plugin Development Kit

Submitted by Lizhe on Tue, 11/27/2018 - 11:55

上一章里我们讨论了如何创建一个自定义api

这次我们来看看kong提供了哪些函数库可以用来编写自定义api

https://docs.konghq.com/0.14.x/pdk/

先看一个简单例子

在handler.lua的 function CustomHandler:access(config) 方法中加入下面代码

function CustomHandler:access(config)

-- Eventually, execute the parent implementation

-- (will log that your plugin is entering this context)

CustomHandler.super.access(self)

 

kong.response.set_header("client_get_host", kong.request.get_host())

lua 入门(2)

Submitted by Lizhe on Mon, 11/26/2018 - 17:01

在Lua语言中, 函数是对语句和表达式进行抽象的主要方式.

函数调用时, 都需要使用一对圆括号把参数列表括起来. 即使被调用的函数不需要参数, 也需要一对空括号 ()

但是有一个例外, 当函数只有一个参数, 而且该参数是字符串或者是表构造器, 括号可以省略

print "hello world"  等价于  print("hello world")

f{ x=10,  y=20}  等价于  f({x=10, y=20})

一个简单的add函数

20181126053530

lua 支持多个返回值

lua 入门(1)

Submitted by Lizhe on Mon, 11/26/2018 - 11:11

在正式开始学习kong插件之前我觉得有必要系统的学习一下lua

这种小巧的胶水语言似乎在游戏脚本领域混得不错, 不过对于我这种企业应用程序员来说似乎没什么吸引力, 不过好在它确实挺容易学的

首先是安装, 从源码编译很方便的, 不用什么rpm包, 而且实际上centos7本身自带了5.1版本的lua

首先准备编译环境

yum -y install gcc automake autoconf libtool make

yum install readline-devel

然后下载源码包

http://www.lua.org/download.html

tar zxf lua-5.3.5.tar.gz

cd lua-5.3.5

进行编译安装

make linux test

make install

这个时候如果你查看lua版本 lua -v 出现还是5.1版本, 是因为/usr/bin目录下的旧版本文件没有被替换, 去搞个软连接就ok了

cd /usr/bin

mv lua lua.bak

mv luac luac.bak

Kong API Gateway (6) Plugin 自定义plugin

Submitted by Lizhe on Fri, 11/23/2018 - 16:33

在网上找了好长时间, 居然都没有一个完整的手顺可以写一个kong api gateway 的自定义plugin , 有的都是一些解释和片段

所以只能自己动手查官方文档了, 下面这个例子是我自己按照官方文档整理的, 因为lua脚本和相关api都不是很熟, 所以最后内容方面只写了一个空的

关于目录结构:

目录结构是这种, 下面两个是必须有的module, 我假设你跟我一样没有太多的lua背景知识, handler.lua 和 schema.lua 是两个module的名字, 也是两个文件, 文件夹是 simple-plugin

20181123043924

复杂一点的可能像这样

Kong API Gateway (5) Plugin 作用域

Submitted by Lizhe on Fri, 11/23/2018 - 11:24

 

Route是请求的转发规则,按照Hostname和PATH,将请求转发给Service,Kubernetes的Ingress中每个path对应一个Route。

Services是多个Upstream的集合,是Route的转发目标。

Consumer是API的用户,里面记录用户的一些信息。

Plugin是插件,plugin可以是全局的,绑定到Service,绑定到Router,绑定到Consumer。

Certificate是https证书。

 

通过consumer_id、route_id、service_id限定插件的作用范围

Kong API Gateway (4) Proxy Reference

Submitted by Lizhe on Thu, 11/22/2018 - 16:01
  • proxy_listen, which defines a list of addresses/ports on which Kong will accept public traffic from clients and proxy it to your upstream services (8000 by default).
  • admin_listen, which also defines a list of addresses and ports, but those should be restricted to only be accessed by administrators, as they expose Kong’s configuration capabilities: the Admin API (8001by default).

 

默认情况下kong会使用8000端口作为访问代理端口, 正如之前我们在例子中所作的, 访问 10.10.8.245:8000/users 

Kong API Gateway (3) Configuration Reference

Submitted by Lizhe on Thu, 11/22/2018 - 15:17

kong自带的配置文件sample存放在

/etc/kong/kong.conf.default

安装之后你需要重命名该文件, 去掉default后缀

cp /etc/kong/kong.conf.default /etc/kong/kong.conf

kong会在以下两个路径下查找配置文件

/etc/kong/kong.conf /etc/kong.conf

你也可以在启动的时候通过CLI参数来指定配置文件的位置

kong start --conf /path/to/kong.conf

检查配置文件内容是否合法

kong check <path/to/kong.conf>

configuration at <path/to/kong.conf> is valid

CLI debug 模式可以帮助确认配置文件的问题

kong start -c <kong.conf> --vv

Kong API Gateway (2) Plugins

Submitted by Lizhe on Thu, 11/22/2018 - 11:56

本章主要讨论plugin, 我将参考官方例子

Kong 自带的插件一般分为以下几类:

身份校验, 安全性控制, 流量控制, 格式转换, 监控和日志 https://getkong.org/plugins/

[root@localhost ~]# curl -X POST http://localhost:8001/apis/users/plugins -d "name=key-auth"

{"created_at":1542865365000,"config":{"key_in_body":false,"run_on_preflight":true,"anonymous":"","hide_credentials":false,"key_names":["apikey"]},"id":"54df9560-66a1-494e-86d2-3aeed7f08d1c","name":"key-auth","api_id":"5fe148b3-acfa-46c3-b127-08207420f2f5","enabled":true}