背景介绍

游戏经过一段时间的运营,发现了原来的设计缺陷太多,所以决定重新设计架构。使用到nginx作为核心并通过lua+redis设计实现自己的负载分配方案。先看看下面这张简单的架构图吧~

从图上看,结构是非常简单的。主要通过编写lua分配策略使游戏房间内的人数尽量坐满。

技术实现思路

要编写lua插件通常需求编译nginx使其支持,如果嫌麻烦可以直接上手openresty就可以了。我刚开始编译nginx插件模块也费了不少时间,现在使用openresty方便多了。

我们的游戏房间是9个人,产品需要优先坐满一个房间才分配下一个房间;玩家通过websocket连接到咱们的服务器上,为了使nginx记住我们的节点负载情况,我使用redis记录每一个节点的连接数量,并设计一套权重策略依据节点连接数量求9的余数进行排序。当然具体看代码更加容易理解~~

准备工作

假设已经安装好了openresty,可以直接在/usr/local/openresty/nginx/conf下面找到nginx.conf文件,增加下面一行(注意如果已经安装了nginx的其他版本,需要将openresty安装的nginx进行端口重新配置)

...
30 #keepalive_timeout 0;
31 keepalive_timeout 65;
32 include /usr/local/openresty/nginx/conf.d/*.conf;
33 #gzip on;
....

为了方便加载个人的配置,我在nginx下面自己建立了一个conf.d文件目录,存放自己的配置。下面查看nginx具体配置。

server {
listen 9009;
location / {
set $websocket_addr "";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Scheme $scheme;
rewrite_by_lua_file /usr/local/lua/dispatcher.lua;
proxy_pass http://$websocket_addr;
}
}

注意这里刚开始,我使用的是set_by_lua_file来返回一个websocket_add。那样容易理解但是不支持redis,与数据库的访问。所以这里使用了rewrite_by_lua_file方式。在开始出声明了websocket_add全局变量,主要是为了在lua插件里面进行修改。下面看lua插件简单版本为了方便管理,我建立了lua代码目录在/usr/local/lua。文件名取名为dispatcher.lua

local var = ngx.var
hosts = {
"127.0.0.1:8109",
"127.0.0.1:8108",
}
host = hosts[math.random(#hosts)]
ngx.var.websocket_addr = host

这个时候再打开一个websocket服务器,例如我跑了两个tornado的websocket服务器分别运行了8109/8108端口,(websocket服务器简单版在https://github.com/land-pack/tornado-websocket-example/blob/master/app/simple.py)

这时候你最好启动两个,分别监听这两个端口。下面就可以重新启动你的openresty版本的nginx了。

通过chrome的websocket客户端你可以访问到下面这个地址。

可以看到,我们的请求得到了回复。那么这次我只是通过lua的随机数进行的负载分配的,这就是我们的第一步,下一篇我将会介绍如何通过redis来管理分配我们的客户端连接~~

总结

好久没写blog了,最近又学了那么多新玩意,想记录一下~~

openresty使用笔记(一)的更多相关文章

  1. openresty 学习笔记小结:综合应用实例

    openresty 学习笔记小结:综合应用实例 这个综合实验实现的功能其实很简单,用户访问一个页面,显示一个默认页面.输入参数(post或者get都可以),如果参数在数据库查询得到并满足一定条件,根据 ...

  2. openresty 学习笔记六:使用session库

    openresty 学习笔记六:使用session库 lua-resty-session 是一个面向 OpenResty 的安全和灵活的 session 库,它实现了 Secure Cookie Pr ...

  3. openresty 学习笔记番外篇:python的一些扩展库

    openresty 学习笔记番外篇:python的一些扩展库 要写一个可以使用的python程序还需要比如日志输出,读取配置文件,作为守护进程运行等 读取配置文件 使用自带的ConfigParser模 ...

  4. openresty 学习笔记番外篇:python访问RabbitMQ消息队列

    openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...

  5. openresty 学习笔记五:访问RabbitMQ消息队列

    openresty 学习笔记五:访问RabbitMQ消息队列 之前通过比较选择,决定采用RabbitMQ这种消息队列来做中间件,目的舒缓是为了让整个架构的瓶颈环节.这里是做具体实施,用lua访问Rab ...

  6. openresty 学习笔记四:连接mysql和进行相关操作

    openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...

  7. openresty 学习笔记三:连接redis和进行相关操作

    openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...

  8. openresty 学习笔记二:获取请求数据

    openresty 学习笔记二:获取请求数据 openresty 获取POST或者GET的请求参数.这个是要用openresty 做接口必须要做的事情.这里分几种类型:GET,POST(urlenco ...

  9. openresty 学习笔记一:环境安装

    openresty 学习笔记一:环境安装 openresty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭 ...

随机推荐

  1. JS自定义对象,正则表达式,JQuery中的一些知识点

    一:自定义对象 1.基本概念:①对象:包含一系列无序属性和方法的集合.②键值对:对象中的数据是以键值对的形式存在的,以键取值.③属性:描述对象特征的一系列变量.[对象中的变量]④方法:描述对象行为的一 ...

  2. spring学习总结二-----面向切面编程(AOP)思想

    上一篇spring博客简总结了spring控制反转和依赖注入的相关思想知识点,这篇博文对spring的面向切的编程思想进行简单的梳理和总结. 一.面向切面的思想 与面向对象的纵向关系概念不同,面向切面 ...

  3. phpmyadmin 免登陆

    第一步: 打开 phpmyadmin/libraries/plugins/auth/AuthenticationCookie.class.php 找到 authCheck 和 authSetUser ...

  4. static class - 静态类

    通常一个普通类不允许声明为静态的,只有一个内部类才可以.这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类. 如下代码所示: 1 public class StaticCls ...

  5. Activity设置全屏显示的两种方式及系统自带theme属性解析

    转载说明:原贴地址:http://blog.csdn.net/a_running_wolf/article/details/50480386 设置Activity隐藏标题栏.设置Activity全屏显 ...

  6. SSH免密码(日志三)

    上一篇:JDK安装以及安装过程中出现的问题(日志二) 原理,就是RSA加密,含有公钥和私钥,具体言之,用公钥来确认请求人是否是私钥的持有人. 1, 2, 3, 4, ssh免密码过程中遇到的问题:需要 ...

  7. Python输入一个数字打印等腰三角形

    要求 用户输入一个数字,按照数字打印出等腰三角形 思路 1,用户输入的数字为n代表一共有多少行 2,使用一个循环带两个for循环,第一层循环是循环行数,第二层两个平行for循环一个打印空格一个打印*号 ...

  8. [刷题]算法竞赛入门经典(第2版) 5-3/UVa10935 - Throwing cards away I

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa10935 - Throwing cards away I #incl ...

  9. 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩

    百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...

  10. 基于Spring的Appium配置应用

    本文主要是讲述,使用Spring框架,优化Appium的Driver调用,并将写在代码里的大量配置参数定义到配置文件当中,还可灵活的控制调用AndroidDriver还是IOSDriver. Spri ...