文档章节

模仿京东使用Openresty+Redis做读服务

翟志军
 翟志军
发布于 2016/10/17 21:01
字数 970
阅读 5435
收藏 162

看了开涛的Nginx+Lua开发教程,很是感兴趣。所以,自己也把环境搭建起来玩。

跟开涛的不同,我使用Vagrant + Ansible来搭建(不要问我为什么不使用Docker)。这样,所有的人只要两条命令就可以搭建好了,而不需要手工一条命令一条命令打。

所谓使用Openresty来做读服务,是指Openresty直接从数据源读数据,然后渲染输出,而不经过应用服务器,比如Tomcat服务器。Openresty 是一个基于Nginx和LuaJIT的动态Web开发平台。我不知道京东是否是直接使用Openresty还是自己编译Nginx + Lua。反正,我直接使用Openresty。

本次文章就是根据开涛的教程,实现使用lua-resty-template 做模块引擎,使用Redis做数据源。我把Openresty和Redis都安装在同一台机器上,以方便做实验,当然,如果你想装在不同的服务器,只需要修改下配置就好了。以下是架构:

openresty_redis

搭建的步骤:

  1. 安装Openresty及其相关的Openresty module: lua-resty-template、lua-resty-redis
  2. 安装Redis,启动Redis
  3. 配置Openresty,启动Openresty
  4. 写页面逻辑代码

整个步骤我都写成了Ansible自动化配置脚本。所以,你已经不需要自己搭建。所有的代码都托管在:http://git.oschina.net/zacker330/openresty-lab

启动方法

启动前,你必须安装Vagrant 和 Ansible 2.0+。

git clone https://git.oschina.net/zacker330/openresty-lab.git
cd openresty-lab
vagrant up 
ansible-playbook ./ansible/playbook.yml -i ./ansible/inventory -u vagrant -k
>> 输入ssh密码 `vagrant`

PS. ansible-playbook需要通过ssh登录上目标机器来执行我们的任务。

接下来,我们解释下代码。

Openresty的配置如下:

## 省去了一些不重要的nginx配置

http {
    default_type  application/octet-stream;
    ## 省去了一些不重要的nginx配置
  
    ## 初始化所需要对象
    init_by_lua '
        require "resty.core"
        redis = require "resty.redis"
        template = require "resty.template"
        template.caching(false); -- you may remove this on production
    ';

   server{
      listen       80;
      server_name  192.168.8.10;
      charset        utf-8;      
  	  ## 指定 模板路径	
      set $template_root "/usr/local/openresty/nginx/html/templates";
      location ~ \.lsp$ {
        default_type text/html;
        content_by_lua 'template.render(ngx.var.uri)'; ## 访问index.lsp,将使用index.lsp模板
      }

	}
}

页面逻辑代码 index.lsp:

    {%

        layout = "layouts/default.lsp" -- 模板

        local  blogid= ngx.var.arg_blogId
        local  title = "博客标题"
        local    author = {name = "fooname", gender = "female", level= 3}
        local    description = "<script>alert(1);</script>"
        local    content = "java8的流式处理极大了简化我们对于集合、数组等结构的操作,让我们可以以函数式的思想去操作,<br/>本篇文章将探讨java8的流式数据处理的基本使用。"
        local    tags = {"life", "lua", "openresty"}
        local    radar = {lua = 90, openresty = 80, nginx = 70}

  		-- 使用nginx的内置变量
        local a = ngx.var.arg_a
        local b = ngx.var.arg_b
        local ip = ngx.var.remote_addr

  	    -- 使用redis读数据源
        local red = redis:new()
        red:set_timeout(1000)
        local ok, err = red:connect("127.0.0.1", 6379)
        if not ok then
           ngx.say("failed to connect: ", err)
           return
        end

        local ok, err = red:lpush("list", a, b)
        local member, err = red:llen("list")

    %}
<div>
 member: {{ member }}<br/>
 remote ip: {{ ip }}

 blogId: {{blogid}}<br/>
 作者: {{author.name}} {{author.gender}} level: {{author.level}}<br/>
 description: {{description}} <br/>
 tags:  {% for i = 1, #tags do %}
     {% if i > 1 then %},{% end %}
     {* tags[i] *}
  {% end %}<br/>
</div>

最终访问效果:http://192.168.8.10/index.lsp?a=12&b=asdfasdf&blogId=111

result

小结

  1. 这种不经过应用服务器的方式,读的速度似乎更快,毕竟省去了中间的Tomcat服务。但是,谁来填充数据给Redis和什么时机填充数据,又是另一回事了。

  2. 开发过程似乎有些麻烦,因为修改nginx配置后,不能像普通的页面开发那样立马看到效果,还要nginx -s reload一下。这个,我想到的解决方案是使用Ruby的guard gem来监控文件变动,然后reload nginx配置,最后使用浏览器的livereload来自刷新页面。https://github.com/guard/guard-livereload 目前还没有时间实现,希望有热心朋友实现提pr。或者开涛能分享下他们的实践。希望他本人能看到这篇博客。:P

参考:

第五章 常用Lua开发库3-模板渲染

lua-resty-template

2016.10 于深圳西丽人民医院

© 著作权归作者所有

共有 人打赏支持
翟志军

翟志军

粉丝 343
博文 76
码字总数 79851
作品 2
深圳
程序员
加载中

评论(11)

MingjunYang
MingjunYang
应用场景就是,招个人进来不要他/她知道Java怎么工作的,不要去弄一套笨重的Java环境,就可以轻松工作了。。

学lua差不多上手就会了,而且lua这么多年没多少变化,稳定轻便。。。
2973901695
2973901695
图图噢噢噢
一曲
一曲
为什么不用docker?
透过玻璃的光
透过玻璃的光

引用来自“简单代码”的评论

比JEE+Tomcat的优势是什么?除了京东这种体量,其他似乎看不出优势吧?等高手解惑!
性能。非京东体量也可以利用openresty去处理一些代理,权限验证,流量限制,缓存等等操作。
在入口层面做这种东西会要求对后端无感,并且不影响正常响应
铂金蛋蛋
铂金蛋蛋
祝 安康
清靜無虞
清靜無虞
住院还不忘写博客啊
简单代码
简单代码
比JEE+Tomcat的优势是什么?除了京东这种体量,其他似乎看不出优势吧?等高手解惑!
tuerqidi
tuerqidi
没有明白使用的场景,请多多讲解!
翟志军
翟志军

引用来自“zhjx922”的评论

lua_code_cache off;
content_by_lua_file 把业务代码放到Lua文件,不需要重启
了解了。多谢。
zhjx922
zhjx922
lua_code_cache off;
content_by_lua_file 把业务代码放到Lua文件,不需要重启
写在《分布式服务架构:原理、设计与实战》印刷量超过一万

《分布式服务架构:原理、设计与实战》自2017年7月份出版以来,到现在已经印刷超过了一万本,深的小伙伴们的好评,有些小伙伴反馈说这是面试经典,读了以后BAT面试通关,而有的小伙伴做了架构...

李艳鹏
02/22
0
0
让我们来谈谈对Linux的认识,值得每一位运维人员深读

Linux系统是使用Linux内核及开源自由软件组成的一套操作系统,是一种类UNIX系统,其内核在1991年10月5日由林纳斯·托瓦兹首次发布。它的主要特性:Linux文件一切皆文件、完全开源免费、支持多...

linux-tao
2017/10/29
0
0
让我们来谈谈对Linux的认识,值得每一位运维人员深读

Linux系统是使用Linux内核及开源自由软件组成的一套操作系统,是一种类UNIX系统,其内核在1991年10月5日由林纳斯·托瓦兹首次发布。它的主要特性:Linux文件一切皆文件、完全开源免费、支持多...

linuxprobe16
2017/10/29
0
0
让我们来谈谈对Linux的认识,值得每一位运维人员深读

Linux系统是使用Linux内核及开源自由软件组成的一套操作系统,是一种类UNIX系统,其内核在1991年10月5日由林纳斯·托瓦兹首次发布。它的主要特性:Linux文件一切皆文件、完全开源免费、支持多...

linuxCool
2017/10/29
0
0
从京东618数据井喷看大数据平台峰值处理制胜关键

作者介绍 京东集团618作战指挥中心,成员来自于京东各个技术体系,包括核心系统架构师、一线运维专家、科研学者等。近200位成员在618时共同努力,确保流量洪峰来临时系统安全、稳定、可靠,致...

博文视点
09/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7安装rsync及两台机器进行文件同步

centos7安装rsync及两台机器进行文件同步 2017年12月21日 11:17:46 码农下的天桥 阅读数:2210 标签: centosrsync同步 更多 个人分类: 后端 所属专栏: 研发模式及运维 版权声明:本文为博...

linjin200
34分钟前
2
0
jpg、jpeg、png... 的区别

jpg、jpeg、png... 的区别 对于做设计这一行的人来说,这几个图片格式是最常用的,也是最常见的,几乎每一天都要与他们打交道。 刚刚入门的新人通常不知道在什么地方如何使用他们或者说如何更...

DemonsI
53分钟前
5
0
白话SpringCloud | 第十章:路由网关(Zuul)进阶:过滤器、异常处理

前言 简单介绍了关于Zuul的一些简单使用以及一些路由规则的简单说明。而对于一个统一网关而言,需要处理各种各类的请求,对不同的url进行拦截,或者对调用服务的异常进行二次处理等等。今天,...

oKong
58分钟前
3
0
Character的static方法

基本类型char的包装类是Character,使用的比较多,大家是比较熟悉的。 我只是觉得里面有很多static方法,平时不怎么用,学习一下怎么实现的,或许日后就用到了。 static int compare(char x,...

woshixin
今天
2
0
正则介绍_sed

10月17日任务 9.4/9.5 sed sed工具 匹配打印 -n 只打印匹配行,不然其他行也会打印出来 p 打印(配合-n使用) [root@centos7 tmp]# sed -n '/root/'p passwd root:x:0:0:root:/root:/bin/ba...

robertt15
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部