跳到主要内容

静态页面生成架构

1 需求说明

  1. 下面三类页面需要生成静态页:首页、商品页、帮助页
  2. 当楼层信息变化时需要自动生成首页
  3. 当商品页变化时要生成相应的商品页,如果首页数据包含该商品则要生成首页
  4. 可以在后台手工生成上述的全部或部分页面

2 开发说明

2.1 思路说明

  1. 页面的生成需要通过AMQP消息来传递
  2. 当楼层变化时传递首页变化消息
  3. 当商品变化时传递商品变化消息
  4. 当文章变化时传递文章变化消息
  5. 将页面存储在redis中
  6. 通过nginx读取redis完成页面的展示
  7. 在javashop-web运行时产生变化消息
  8. 在javashop-consumer运行时消费消息并执行生成的动作

2.2 工程和包概览

![](image/pagecreatePackagepng)

2.3 页面内容获取和推送至redis

生成和推送:

点击查看大图

消费者

点击查看大图

页面生成时序图,以商品变化举例:

点击查看大图

其它消息类似,要按相应的业务逻辑来处理:

  1. 商品变化,生成相应的商品页,如果首页含有此商品则同时生成首页
  2. 首页变化,生成相应的首页
  3. 帮助页面变化,生成相应的帮助页
  4. 收到页面生成的消息,生成相应的页面。
  5. 在生成时要对进度进行更新
    这部分要使用进度模块的ProgresssManager接口的putProgress方法

2.4各业务发送消息交换器对照表:

PC_INDEX_CHANGE("PC首页变化消息"),
MOBILE_INDEX_CHANGE("移动端首页变化消息"),
GOODS_CHANGE("商品变化消息"),
HELP_CHANGE("帮助变化消息"),
PAGE_CREATE("页面生成消息");

需要使用枚举:
com.enation.app.base.AmqpExchange

2.5页面生成任务的下达

在后台可以手动生成首页、商品页或帮助页面

2.5.1 类图

时序图

点击查看大图

比较简单,直接传递消息即可。

3.静态页输出部署说明

javashop-6.4版本中将访问量比较高的页面(商城首页、商品详情页面、帮助中心)生成静态页时生成到redis缓存中,当访问这些页面的时候将会直接在redis中读取这些页面,这样做大大减轻了服务器的负担。所以,为了配合此功能的实现,需要在nginx中引入redis、lua等模块。

1 搭建nginx+lua+redis

javashop提供相关的压缩包,请使用下面链接自行下载。(链接: https://pan.baidu.com/s/1jHPVWEE 密码: q3cz)

  • 安装nginx,安装至目录/usr/local/nginx。具体安装说明不做过多解释

  • 将所有压缩文件放置 /home/root 目录

  • 跳转到压缩包目录:cd /home/root

  • 解压pcre:
    gzip pcre-8.32.tar
    tar -xvf pcre-8.32.tar.gz

  • 解压 openresty:
    tar -zxvf openresty-1.11.2.4.tar.gz

  • 安装openresty
    cd openresty-1.11.2.4
    ./configure --with-pcre=/home/root/pcre-8.32/
    gmake && gmake install

  • 安装LuaJIT
    cd /home/root
    tar zxvf LuaJIT-2.0.4.tar.gz
    cd LuaJIT-2.0.4
    make && sudo make install

  • 编译/安装 nginx
    cd /home/root
    tar -zxvf redis2-nginx-module-0.14.tar.gz
    tar -zxvf nginx-1.11.2.tar.gz
    tar -zxvf v0.28.tar.gz
    tar -zxvf v0.3.0rc1.tar.gz
    tar -zxvf v0.10.2.tar.gz

    tar -zxvf ngx\_http\_redis-0.3.8.tar.gz

    cd nginx-1.11.2

./configure --prefix=/usr/local/nginx --add-dynamic-module=/home/root/redis2-nginx-module-0.14 --add-module=/home/root/ngx_devel_kit-0.3.0rc1 --add-module=/home/root/set-misc-nginx-module-0.28 --add-module=/home/root/lua-nginx-module-0.10.2 --add-module=/home/root/ngx_http_redis-0.3.8

make && make install

  • 备份nginx.conf,使用我写好的nginx.conf

    cd /home/root/

    cp nginx.conf /usr/local/nginx/conf/

  • 倒入lua脚本

    cd /home/root/lua

    mkdir /usr/local/nginx/lua

    mv rediscluster.lua /usr/local/nginx/lua/

  • 搭建完成之后正确的nginx安装目录下的目录如图:

至此lua+redis+nginx已经搭建完成(如果没有temp结尾的5个文件夹是因为nginx没有启动引起的,nginx启动自动创建)。

2 配置相关的参数

修改nginx配置文件,使之匹配自己的服务(nginx/lua)

vi /usr/local/nginx/conf/nginx.conf

主要替换内容:

a.这里代表每一个redis集群的节点需自行修改(修改成自己的redis信息,数量不限制,这里实例配置3个redis)

upstream redis-a{
server 192.168.1.190:6379;
}

注意:

b.修改nginx的转发

server {
listen 80;

server\_name localhost; \#配置域名的位置
\#charset koi8-r;
\#access\_log logs/host.access.log main;

location /redis { #redis固有模块,请勿修改
internal;
set_unescape_uri $query $arg_query;
redis2_query get $query;
redis2_pass $arg_backend;
}

#这里代表使用lua响应内容。javashop是将商品页面(goods-*.html)、帮助中心(help-*-*.html)、 首页(index.html)生
#成静态页到redis缓存中,所以当url中访问这些页面的时候,将会通过nginx+lua+redis读取缓存中的静态页。
location ~* goods-(\d+).html|index.html|help-(\d+)-(\d+).html {
default_type text/html;
content_by_lua_file "/usr/local/nginx/lua/rediscluster.lua";#此为lua脚本
}

#这里表示将请求中的静态信息转发到指定目录。注意:要将项目中的selector/statics/themes/ueditor,文件夹放到任一目录,这里放到了/home/javamall/
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /home/javamall/;
}

#如果不是静态页的话,交由tomcat进行转发处理。
location /{
proxy_pass http://47.93.97.90:8089;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;

}
}
  • 编辑lua脚本
vi /usr/local/nginx/lua/rediscluster.lua

--这里与上方的nginx配置文件中的redis信息一一对应。
redis_servers = {}
redis_servers["123.56.50.239:6379"]="redis-a"
redis_servers["192.168.1.198:6391"]="redis-b"
redis_servers["192.168.1.198:6396"]="redis-c"
--修改服务数组'redis-a', 'redis-b','redis-c',都是之前nginx配置中的upstream

local servers = {'redis-a', 'redis-b','redis-c'}
  • 启动nginx

    /usr/local/nginx/sbin/nginx

    注意:如果报错:
    ./sbin/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

    执行:

    ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

至此lua+redis+nginx已经配置完成。