1 案例介绍
商品详情页系统架构
主要帮助对http请求取参、取header头、输出等
命令 | 描述 |
ngx.arg | 指令参数,如跟在content_by_lua_file后面的参数 |
ngx.var | request变量,ngx.var.VARIABLE引用某个变量,lua使用nginx内置的绑定变量. ngx.var.remote_addr 为获取远程的地址, |
ngx.ctx | 请求的lua上下文,每次请求的上下文,可以在ctx里记录,每次请求上下文的一些信息,例如:request_id , access_key 等等 |
ngx.header | 响应头,ngx.header.HEADER引用某个头 |
ngx.status | 响应码 |
ngx.log | 输出到error.log |
ngx.send_headers | 发送响应头 |
ngx.headers_sent | 响应头是否已发送 |
ngx.resp.get_headers | 获取响应头 |
ngx.is_subrequest | 当前请求是否是子请求 |
ngx.location.capture | 发布一个子请求 |
ngx.location.capture_multi | 发布多个子请求 |
ngx.print | 输出响应 |
ngx.say | 输出响应,自动添加‘\n‘ |
ngx.flush | 刷新响应 |
ngx.exit | 结束请求 |
商品详情页架构的要求,高可用,高性能,高并发 ;一般来说 业界分为两种主流的方案
2 中小公司的详情页方案
很多中小型 电商的商品详情页 可能一分钟都没有一个访问,这种的话,就谈不上并发设计,一个tomcat 就能搞定
还有一种中小型公司呢?虽然说公司不大,但是也是有几十万日活,然后几百万用户,他们的商品详情用,采取的方案可能是全局的一个静态页面这样子
就是我们有把商品详情页直接做成一个静态页面,然后这样子每次全量的更新,把数据全部静态放到`redis`里面,每次数据变化的时候,我们就通过一个Java服务去渲染这个数据,然后把这个静态页面推送到到文件服务器
2.1 缺点
- 这种方案的缺点,如果商品很多,那么渲染的时间会很长,达不到实时的效果
- 文件服务器性能高,tomcat性能差,压力都在Tomcat服务器了
- 只能处理一些静态的东西,如果动态数据很多,比如有库存的,你不可能说每次去渲染,然后推送到文件服务器,那不是更加慢?
3 大型公司的商品详情页的核心思想
下面这张图就是整体的思路
上图展示了核心思想主要有以下五步来完成
3.1 生成静态页
添加修改页面的时候生成静态页,这个地方生成的是一个通用的静态页,敏感数据比如 价格,商品名称等,通过占位符来替换,然后将生成的静态页的链接,以及敏感数据同步到redis中,如果只修改价格不需要重新生成静态页,只需要修改redis敏感数据即可。
3.2 推送到文件服务器
这个的文件服务器泛指能够提供静态文件处理的文件服务器,nginx代理静态文件,tomcat,以及OSS等都算静态文件服务器,生成完静态文件后将文件推送到文件服务器,并将请求连接存放进redis中
3.3 布隆过滤器过滤请求
Redis和nginx的速度很快,但是如果有人恶意请求不存在的请求会造成redis很大的开销,那么可以采用布隆过滤器将不存在的请求过滤出去。
3.4 lua直连Redis读取数据
因为java连接Reids进行操作并发性能很弱,相对于OpenResty来说性能差距很大,这里使用OpenResty,读取Redis中存放的URL以及敏感数据。
3.5 OpenResty 渲染数据
从Redis获取到URL后lua脚本抓取模板页面内容,然后通过redis里面的敏感数据进行渲染然后返回前端,因为都是lua脚本操作性能会很高
4 环境准备
下面我们就基于这个架构来安装和搭建所需要的环境
4.1 配置文件服务器
我们的的文件服务器页面在nginx-server
的代码中可以通过http://IP/template.html
访问
4.2 配置资源反向代理
通过nginx来配置资源服务器
upstream dynamicserver { server 192.168.64.1:9001 fail_timeout=60s max_fails=3; server 192.168.64.1:9002 fail_timeout=60s max_fails=3; keepalive 256; } server { server_name www.resources.com 127.0.0.1; default_type text/html; charset utf-8; location ~ .*$ { index index.jsp index.html; proxy_pass http://dynamicserver; # 表示重试超时时间是3s proxy_connect_timeout 30; proxy_send_timeout 10; proxy_read_timeout 10; #表示在 6 秒内允许重试 3 次,只要超过其中任意一个设置,Nginx 会结束重试并返回客户端响应 proxy_next_upstream_timeout 60s; proxy_next_upstream_tries 3; } }
4.3 访问测试
可以通过访问
www.resources.com/template.html
访问测试