设计方案

使用OpenResty简单开发Nginx分发策略脚本

2020-02-08  本文已影响0人  NealLemon

在上一章 基于OpenResty部署Nginx以及LUA脚本开发 中我们简单的使用OpenResty开发了一个输出 hello world的LUA脚本。这次我们进阶,使用OpenResty 开发一个Nginx 分发脚本。

我们知道Nginx 原生自带 负载均衡策略,但是我们开发业务的时候,很多需要根据业务去做负载分发,比如某些高并发高频的数据,我们可以暂时缓存在Nginx本地,当服务请求过来时,直接在Nginx服务器上拿到缓存数据返回,这样大大的减轻了后端压力。这里我只介绍分发脚本代码,缓存代码兴趣的同学可以自己写写试试。

场景模拟

我们有3台服务器,当客户端发送http请求时,我们可以根据请求附带的某些参数来进行分发。这里我们就简单的使用 http://ip/lua?id= 这个URL来进行分发。

具体分发流程如下图所示

流程图.jpg

前期准备

首先我们需要三台虚拟机或者云服务器,然后分别安装OpenResty,这里可以参照我前一篇文章,因为下面的所有修改都是基于前一篇文章来的。

类库添加

下载 下载http.lua和http_headers.lua库

并且上传到 SERVER-1 服务器的 /usr/local/openresty/lualib/resty 目录下,如图所示

lua-http.jpg

SERVER-1 : 分发层

编写lua脚本

这里我使用了之前的hello.lua脚本,这样少去了很多配置

我们打开hello.lua脚本进行编辑

vi /usr/local/openresty/nginx/lua/hello.lua

将之前的内容去除,填入以下代码

local uri_args = ngx.req.get_uri_args()
local args_id = uri_args["id"]
local host = {"122.51.192.50", "120.92.35.122"}
local hash = ngx.crc32_long(args_id)
hash = (hash % 2) + 1
backend = "http://"..host[hash].."/lua"
local http = require("resty.http")
local httpc = http.new()

local resp, err = httpc:request_uri(backend, {
    method = "GET"
})

if not resp then
    ngx.say("request error :", err)
    return
end

ngx.say(resp.body)

httpc:close()

如图所示

分发层.jpg

保存退出

执行以下命令:

检查命令

/usr/local/openresty/nginx/sbin/nginx -t

更新命令

/usr/local/openresty/nginx/sbin/nginx -s reload

SERVER-2 待分发服务器

待分发的服务器很简单,我们只要按照 基于OpenResty部署Nginx以及LUA脚本开发 安装好即可。安装好后,修改 hello.lua文件

vi /usr/local/openresty/nginx/lua/hello.lua

改为

ngx.say("hello world, I am Iron Man");

保存退出

执行以下命令:

检查命令

/usr/local/openresty/nginx/sbin/nginx -t

更新命令

/usr/local/openresty/nginx/sbin/nginx -s reload

SERVER-3 待分发服务器

如上操作即可,只是将 ngx.say("hello world, I am Iron Man"); 改为 ngx.say("hello world, I am Hulk");

运行测试

我们按照之前的逻辑,将请求 发到 服务层,根据参数id的值不同,看是否可以分发到不同的Nginx服务器上。

SERVER-2.jpg SERVER-3.jpg

分发成功!

小结

其实按照这个思路,我想基于OpenResty 第三方组件,可以做很多事情,只是时间去研究和调试的问题了。

上一篇下一篇

猜你喜欢

热点阅读