静态页面生成架构
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.gztar -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已经配置完成。