Spring boot 部署
Spring boot 部署
miaojiangmin 发表于10个月前
Spring boot 部署
  • 发表于 10个月前
  • 阅读 36
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

最近需要部署一个代码生成程序,而这个程序是用spring boot 写的。那么spring boot 的部署就是一个必修课了。 参考了这篇博客 Spring Boot 部署与服务配置 ####ubuntu中部署 在ubuntu中部署的话 可以在.bashrc添加 alias

alias start_weixin_service='nohup ./weixin-service-1.0.0-SNAPSHOT.jar > weixin-service.log 2>&1 &'
export SPRING_PROFILES_ACTIVE=development

####命令行部署

java -jar demo.jar --spring.config.location=/opt/config/application.properties

####写脚本部署

start.sh

#!/bin/sh

rm -f tpid

nohup java -jar myapp.jar --spring.config.location=application.yml  --spring. profiles.active=production > /dev/null 2>&1 &

echo $! > tpid

echo Start Success!

stop.sh

#!/bin/sh
APP_NAME=myapp

tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Stop Process...'
    kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Kill Process!'
    kill -9 $tpid
else
    echo 'Stop Success!'
fi


#另一种写法是
#!/bin/sh
APP_PORT=20085

kill -9 `lsof -t -i:$APP_PORT`

check.sh

#!/bin/sh
APP_NAME=myapp

tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
        echo 'App is running.'
else
        echo 'App is NOT running.'
fi

kill.sh

#!/bin/sh
APP_NAME=myapp

tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Kill Process!'
    kill -9 $tpid
fi

不过这些文件用vm创建出来后并不能直接运行,因为没有运行的权限

chmod -755 start.sh

####直接用命令来部署

以下两种方法选一种就ok了

#指定激活的profile(推荐)--对于的文件为同目录下的application-development.yml
nohup java -jar myapp.jar   --spring.profiles.active=development > weixin-service.log 2>&1 &
#指定对于的配置文件(不推荐)
nohup java -jar myapp.jar --spring.config.location=application.yml   > weixin-service.log 2>&1 &

关闭

netstat -nltp

kill -9 pid

有时,需要部署的时候配置jvm参数 因为我用的是jdk8的版本,配置上和jdk8以前的版本会有一些差别。看来要好好学习关于jvm,还有监控jvm的学习上了,不然基于jvm的程序如何调优都不知道,只会一脸懵逼。

jdk内存实际是jvm内存,jvm有一个运行时数据区,其实就是对这一部分的大小分配。

运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)

Xss:每个线程的stack大小(栈) Xmx:JAVA HEAP的最大值、默认为物理内存的1/4 Xms:JAVA HEAP的初始值,server端最好Xms与Xmx一样 Xmn:JAVA HEAP young区的大小 XX:PermSize:设定内存的永久保存区域 XX:MaxPermSize:设定最大内存的永久保存区域

在JDK1.8中,取消了PermGen,取而代之的是Metaspace,所以PermSize和MaxPermSize参数失效,取而代之的是

-XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m

修改JDK内存

linux下:在tomcat的bin目录下编辑catalina.sh

cygwin=false上面加入

JAVA_OPTS="-Xms1024m -Xmx2048m -Xss1024K  -XX:MetaspaceSize=512m   
-XX:MaxMetaspaceSize1024m"

这是我本地测试的一个实际例子

java -jar -Xms1024m -Xmx2048m -Xss1024K  -XX:MetaspaceSize=512m  -XX:MaxMetaspaceSize=1024m  -javaagent:/Library/oneApm/OneAPM/oneapm.jar smk-exec.jar

jvm配置常见的组合有

-Xmx128m -Xms64m -Xmn32m -Xss16m

也可以参考这篇文章。JVM参数,启动jar 包以及 启动tomcat的 JVM参数设置 一行命令获取当前JVM所有可设置的参数以及当前默认值

今天用war打包启动的时候会遇到一些问题,

jar war ear

可以参考这篇文章 简述Java命令行参数、JVM、打包Java程序、JAR文件

把原来的项目用spring boot整合的时候,会出现cpu占用率甚至会高到100%以上很高的情况,这点不是很理想,以至于我都不用部署到服务器。即使我调高了jvm配置,还是会有这样的情况。 部署的时候发现发现下面这样的警告。

Unable to add the resource at [/WEB-INF/lib/displaytag-1.2.jar] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache

但是我用了 参看文章 How does Spring Boot control Tomcat cache?

 @Bean
    public TomcatEmbeddedServletContainerFactory tomcatFactory() {
        TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
        tomcatFactory.addContextCustomizers((context) -> {
            StandardRoot standardRoot = new StandardRoot(context);
            standardRoot.setCacheMaxSize(40 * 1024);
        });
        return tomcatFactory;
    }

然而这样的警告还是存在。 后来我用jar包的方式打包,发现比较神奇的是,这个错误不存在了,可能用jar包的方式不会出现这样的问题吧。还有就是cpu的占用率终于下降了。 不过我还不是很确定cpu占用率下降是因为具体哪一个原因。 是换了ThymeLeaf模板,还是修改了jvm参数,还是用jar打包配置上面的配置(猜想是这个原因)。

共有 人打赏支持
粉丝 10
博文 227
码字总数 60954
×
miaojiangmin
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: