BigPipe 是一个重新设计的基础动态网页服务体系。大体思路是,分解网页成叫做
Pagelets 的小块,然后通过 Web 服务器和浏览器建立管道并管理他们在不同阶段的运行。这是类似于大多数现代微处理器的流水线执行过程:多重指令管线通过不同的处理器执行单元,以达到性能的最佳。虽然 BigPipe 是对现有的服务网络基础过程的重新设计,但它却不需要改变现有的网络浏览器或服务器,它完全使用服务端和 JavaScript 来实现。
随着互联网数据的扩大,大数据的处理与响应总是需要花上些许时间的。
为了提高用户的体验,Facebook 研发了 BigPipe,使页面响应速度提高了N倍。
此次本人封装了一个BigPipe,并对该实现做了改动,由 java 服务端完全实现该功能。
首先看下流程图:
封装简介:
以网站首页为例,将页面拆分为ABC三块区域(接下来以“模板”称呼),每一个区域定义一个模板文件,访问该页面时,定义一个集合,顺序添加3个模板,调用核心逻辑,启动3个线程分别处理ABC模板的内容:读取模版文件,查询数据,与模板组装,输出 html 内容;此处将记录模块顺序,按顺序输出,组成一个完整的页面。
一个请求,分多个片段输出,并组成一个完整 html 首页,其中 css 资源放在第一个模板内,js 放入最后一个模板内。
具体实现以及详细逻辑将在下文展示,有可优化点,可自行优化。
有以下内容:
使用到的对象
工具类
业务处理(多线程)
使用方法
使用到的对象
PageInfoBean——用于存储模板处理结果
此对象很重要,主要用户存储模板处理结果,并按顺序输出模板内容。
Pagelet——模板处理线程
此对象用于处理模板数据的获取与模板内容的读取,并将两者结合,再返回数据。
Renderer——模板处理
此对象用与处理模板内容,返回html内容。
BigPipeProperties——配置的参数
包含了一些配置内容:模版地址,模版名称,线程数量,超时时间,静态资源版本号。可自行扩展。
工具类
FreeMarkerLoader——读取文件流
SpringContextUtil——获取容器,获取容器管理的对象实例
以上提到的反射获取对象实例无注入参数的问题,从容器内获取对象。
将配置内容静态化
:此注解标注的方法在服务启动时,将会运行一次。
业务处理
提供Service调用类以及运行方法
页面组装
使用方式
简单吧,只要组装好list,直接可以调用了。
参数初始化:
若只输出页面,无参数传递,那么init方法都可省略。
以上,插件功能结束。坑与探索
首先关于多线程:newCached 将会不计成本不计性能的创建线程,所以在300个并发下的性能测试的时候,服务将会崩溃。所以后期改为了newFixed 固定线程数量。
关于可执行文件发布:在使用java -jar启动SpringBoot打的包后,读取模版文件失败,各种地址以及读取方式尝试都失败,最后了解到只能已流的方式读取。
关于启动方式:使用java -jar启动后,关闭窗口服务就停止了,所以使用了nohup java -jar。
关于封装:尽可能的让使用者少传参数,能配置的放入配置文件,公用的提取出来。
关于类实例的获取:若需要获取某个对象的实例,如果对象内有注入的参数,那么就不能用反射了,可以从Spring容器内获取。通过反射调用方法。
将插件打包后安装maven库:mvn install:install-file -Dfile=C:\bigpipe-1.0.0.jar -DgroupId=com.cn.bigpipe -DartifactId=cn-bigpipe -Dversion=1.0.0 -Dpackaging=jar
更多的坑与未知可在实际操作中发现,大家一起交流
领取专属 10元无门槛券
私享最新 技术干货