BigPipe-java服务端实现

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

更多的坑与未知可在实际操作中发现,大家一起交流

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180126G0Z2U000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券