静态页面生成架构
1 需求说明
- 下面三类页面需要生成静态页:首页、商品页、帮助页
- 当楼层信息变化时需要自动生成首页
- 当商品页变化时要生成相应的商品页,如果首页数据包含该商品则要生成首页
- 可以在后台手工生成上述的全部或部分页面
2 开发说明
2.1 思路说明
- 页面的生成需要通过AMQP消息来传递
- 当楼层变化时传递首页变化消息
- 当商品变化时传递商品变化消息
- 当文章变化时传递文章变化消息
- 将页面存储在redis中
- 通过nginx读取redis完成页面的展示
- 在javashop-web运行时产生变化消息
- 在javashop-consumer运行时消费消息并执行生成的动作
2.2 工程和包概览
2.3 页面内容获取和推送至redis
生成和推送:
消费者
页面生成时序图,以商品变化举例:
其它消息类似,要按相应的业务逻辑来处理:
- 商品变化,生成相应的商品页,如果首页含有此商品则同时生成首页
- 首页变化,生成相应的首页
- 帮助页面变化,生成相应的帮助页
- 收到页面生成的消息,生成相应的页面。
- 在生成时要对进度进行更新
 这部分要使用进度模块的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已经配置完成。