[背景]
服务器扩容的要求
目前分布式扩容方案主要分为2种, 1基于容器 2基于服务器
1基于容器 在并发量高时启动新的容器,在并发量低时关闭容器, 比较主流 缺点时服务器不能关机,仍然需要缴纳电费
2基于服务器 在并发量高时远程唤醒服务器,在并发量低时远程关闭服务器,非主流,但是省电
[需求]
基于服务器扩容,要求服务器从开机到程序启动成功不能操作2s 即服务器启动0.7s,将程序服复制到服务器上0.6s,程序启动0.6s
服务器启动0.7s 已经实现
1.bios采用EFI BIOS,没有post上电自检时间
2.将gur启动设置为0s
3.裁剪linux,取消无用模块,取消显示驱动,实际中不需要显示驱动,ssh可以搞定一切
实际测试 0.6s
将程序服复制到服务器上0.6s
在千兆网络下测试 0.5s
程序启动0.6s 也已经实现
有2种方法
1.使用方舟编译器编译成二进制文件,测试结果 方舟编译器的运行库没有开源,放弃
测试视频
https://www.bilibili.com/video/bv1Qt4y1i7MT
2.使用graal vm+native-image组合 测试成功
测试视频
https://www.bilibili.com/video/bv1AV411m7yk
[spring-boot]
github地址
https://github.com/jonashackt/spring-boot-graalvm
这是1个spring-boot和graal vm的组合,jonashackt测试启动时间时0.7s,但是我却始终测试不成功,学习相关知识后,我决定使用
[jfinal]
graal vm+native image+jfinal的组合,并且测试成功了 如果jfinal仅仅只有1个hello接口,启动时间是0.6s,加入微服务的相关组件,预计启动时间不会超过0.7s
打包和启动jfinal的具体项目如下
#jfinal项目通常生成一个tar.gz的包
ee-jfinal-4.9-hello-1.0-release.tar.gz
#解压查看目录结构
tar -xf ee-jfinal-4.9-hello-1.0-release.tar.gz
cd ee-jfinal-4.9-hello-1.0/
#tree #结构十分精简,因为这是我写一个测试项目
├── jfinal.sh └── lib ├── ee-jfinal-4.9-hello-1.0.jar ├── javax.servlet-api-4.0.1.jar ├── jboss-logging-3.3.2.Final.jar ├── jfinal-4.2.jar ├── jfinal-undertow-1.6.jar ├── undertow-core-2.0.19.Final.jar ├── undertow-servlet-2.0.19.Final.jar ├── xnio-api-3.3.8.Final.jar └── xnio-nio-3.3.8.Final.jar
#获取cp
CP=`find lib | tr '\n' ':'`
#获取GRAALVM_VERSION
GRAALVM_VERSION=`native-image --version`
echo "[-->] Compiling Spring Boot App '$ARTIFACT' with $GRAALVM_VERSION"
#设置ARTIFACT
ARTIFACT=ee-jfinal-4.9-hello-1.0
#指定MAINCLASS
MAINCLASS=demo.DemoConfig
#测试启动
java -cp $CP $MAINCLASS
打包
native-image \ -J-Xmx4G \ -H:+TraceClassInitialization \ -H:Name=$ARTIFACT \ -H:+ReportExceptionStackTraces \ -Dspring.native.remove-unused-autoconfig=true \ -Dspring.native.remove-yaml-support=true \ -cp $CP $MAINCLASS;
启动,启动时间是0.6s
./ee-jfinal-4.9-hello-1.0
测试启动时间 是0.6s,在真是的服务器上测试,启动时间或许更短
如此以来,基于服务器扩容方案骨架就已经有了