博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
openresty使用笔记(一)
阅读量:5170 次
发布时间:2019-06-13

本文共 1910 字,大约阅读时间需要 6 分钟。

背景介绍

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

739685-20170610155937512-951122116.png

从图上看,结构是非常简单的。主要通过编写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.varhosts = {   "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客户端你可以访问到下面这个地址。

739685-20170610162355606-1249795609.png

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

总结

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

转载于:https://www.cnblogs.com/landpack/p/6979122.html

你可能感兴趣的文章
Elasticsearch-sql 用SQL查询Elasticsearch
查看>>
HTML超连接(a标记)
查看>>
servlet学习笔记_2
查看>>
cf(415 A,B)
查看>>
学习资料整合
查看>>
单例设计模式
查看>>
隐私政策
查看>>
raspberrypi 与 arduino 使用 nRF24L01+ 通信 -- arduino为接收端
查看>>
asp.net 利用jquery.form插件上传图片
查看>>
GitHub更新已经fork的项目
查看>>
CNBlog客户端--第一阶段记录
查看>>
man时括号里的数字是啥意思
查看>>
Selenium RC for Java 环境配置
查看>>
看清贬值的真实情况再惊恐
查看>>
jdk_1_8_1
查看>>
Eclipes中AndbaseDemo 手动导入 Android studio
查看>>
Maven聚合与继承
查看>>
【转】VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别
查看>>
Android 蹲坑的疑难杂症集锦一
查看>>
c#Winform程序CPU占用高的原因和解决方法(转载)
查看>>