文档章节

Spring boot 部署

miaojiangmin
 miaojiangmin
发布于 2017/02/17 15:12
字数 2233
阅读 60
收藏 1
点赞 0
评论 0

最近需要部署一个代码生成程序,而这个程序是用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打包配置上面的配置(猜想是这个原因)。

Spring Boot & Spring Cloud应用内存管理

设置为系统服务

参考了这篇文章

正确、安全地停止SpringBoot应用服务

该方式主要借助官方的spring-boot-maven-plugin创建"Fully executable" jar ,这中jar包内置一个shell脚本,可以方便的将该应用设置为Unix/Linux的系统服务(init.d service),官方对该功能在CentOS和Ubuntu进行了测试,对于OS X和FreeBSD,可能需要自定义。具体步骤如下:

  1. 在pom.xml中引入插件:
 <plugin> 
    <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration>
         <executable>true</executable>
   </configuration>
 </plugin>
  1. 设置为系统服务 将你的应用打成jar包,部署到服务器,假设部署路径为/var/app,包名为app.jar,通过如下方式将应该设置为一个系统服务:
sudo ln -s /var/app/app.jar /etc/init.d/app
  1. 赋予可执行权限:
chmod u+x app.jar
  1. 以系统服务的方式管理
接下来,就可以使用我们熟悉的service foo start|stop|restart来对应用进行启停等管理了
sudo service app start|stop
命令将得到形如Started|Stopped [PID]的结果反馈

默认PID文件路径:/var/run/appname/appname.pid
默认日志文件路径:/var/log/appname.log

这可能是我们更熟悉也更常用的管理方式。

还有就是需要让这个系统服务可以自动启动起来

自定义参数

在这种方式下,我们还可以使用自定义的.conf文件来变更默认配置,方法如下:

在jar包相同路径下创建一个.conf文件,名称应该与.jar的名称相同,如appname.conf 在其中配置相关变量,如:

JAVA_HOME=/usr/local/jdk
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log

LINUX环境下

与Spring Boot项目同路径下新建一同名配置文件。

例如:当前项目为demo.jar,那么新建一文件demo.conf,内容如下:

JAVA_OPTS="-Xms1024M -Xmx2048M"  //jvm运行参数
RUN_ARGS="--server.port=8081 --logging.level=INFO --spring.thymeleaf.cache=true --logging.file=/var/log/demo.log"  //项目运行参数

正确、安全地停止SpringBoot应用服务

Linux环境下Spring Boot项目内置Tomcat参数配置

与Spring Boot项目同路径下新建一同名配置文件

项目为boot.jar,新建文件boot.conf,项目启动之后默认读取该配置文件

1、jvm运行参数

JAVA_OPTS="-Xms2048m -Xmx2048m -Xss512k"
-Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:Java heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间
提示:此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。

2、项目运行参数

RUN_ARGS="--server.port=8081 --logging.level=INFO --spring.thymeleaf.cache=true --logging.file=/var/log/demo.log"

####上面的脚本,需要部署两个一个start.sh 一个stop.sh 其实可以考虑把这两个合并起来。

#!/bin/bash
Tag="Application"
MainClass="com.test.Application"
Lib="/testboot/test/lib/"
Log="/testboot/test/run.log"
JVM="-server -Xms128m -Xmx128m -XX:PermSize=32M -XX:MaxNewSize=64m -XX:MaxPermSize=64m -Djava.awt.headless=true -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
echo $Tag
RETVAL="0"

# See how we were called.
function start() {
    echo  $Log 
    if [ ! -f $Log ]; then
        touch $Log
    fi
    nohup java $JVM -Dappliction=$Tag -Djava.ext.dirs=$Lib":${JAVA_HOME}/jre/lib/ext" $MainClass > $Log 2>&1 &  
    tailf $Log
}


function stop() {
    pid=$(ps -ef | grep -v 'grep' | egrep $Tag| awk '{printf $2 " "}')
    if [ "$pid" != "" ]; then      
        echo -n "boot ( pid $pid) is running" 
        echo 
        echo -n $"Shutting down boot: "
        pid=$(ps -ef | grep -v 'grep' | egrep $Tag| awk '{printf $2 " "}')
        if [ "$pid" != "" ]; then
            echo "kill boot process"
            kill -9 "$pid"
        fi
        else 
             echo "boot is stopped" 
        fi

    status
}

function status()
{
    pid=$(ps -ef | grep -v 'grep' | egrep $Tag| awk '{printf $2 " "}')
    #echo "$pid"
    if [ "$pid" != "" ]; then
        echo "boot is running,pid is $pid"
    else
        echo "boot is stopped"
    fi
}



function usage()
{
   echo "Usage: $0 {start|stop|restart|status}"
   RETVAL="2"
}

# See how we were called.
RETVAL="0"
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    reload)
        RETVAL="3"
        ;;
    status)
        status
        ;;
    *)
      usage
      ;;
esac

exit $RETVAL

参考 shell 管理SpringBoot 生产环境服务 (配置JVM)

SpringBoot 启动参数设置环境变量、JVM参数、tomcat远程调试

© 著作权归作者所有

共有 人打赏支持
miaojiangmin
粉丝 9
博文 307
码字总数 83121
作品 0
宁波
程序员
Spring Boot发布与部署 - 开发热部署

Spring Boot 支持页面与类文件的热部署。 spring-boot-devtools 实现热部署 spring-boot-devtools 最重要的功能就是热部署。它会监听 classpath 下的文件变动,并且会立即重启应用。 值得注意...

yzbty23 ⋅ 04/27 ⋅ 0

第一章:Spring Boot 解决了什么问题?

spring4推出前存在的问题: 1、大量的xml文件,配置相当繁琐 2、整合第三方框架的配置问题 3、低效的开发效率和部署效率等问题 Spring Boot是什么? Spring Boot 伴随spring4.0诞生 Spring B...

刘祖鹏 ⋅ 05/15 ⋅ 0

学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow ⋅ 05/28 ⋅ 0

给大家聊一聊云收藏从 Spring Boot 1.0 升级到 2.0 所踩的坑

先给大家晒一下云收藏的几个数据,作为一个 Spring Boot 的开源项目(https://github.com/cloudfavorites/favorites-web)目前在 Github 上面已经有1600多个 Star,如果按照 SpringBoot 标签...

纯洁微笑 ⋅ 06/04 ⋅ 0

spring session整合

花了大半天时间,解决了springMVC项目增加spring-session共享session报了异常 前情 项目做了前后端分离,springMVC项目部署在三台tomcat上,前端部署在另三台tomcat上,然后HA做了分发处理,...

jia程序员 ⋅ 05/23 ⋅ 0

Spring Boot在开发时实现热部署(开发时修改文件保存后自动重启应用)(spring-boot-devtools)

热部署是什么 大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的Class文件,这个文件里记录着...

easonjim ⋅ 2017/09/29 ⋅ 0

Spring Boot集成spring-boot-devtools开发时实现热部署

Spring Boot集成spring-boot-devtools开发时实现热部署 Harries Blog™2018-05-130 阅读 httpHTMLSpringAppcachecatbuild...

Harries Blog™ ⋅ 05/13 ⋅ 0

“Spring三剑客”,助你快速从月入过万的程序员到年薪百万的架构师

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 Spring作为Java开发的事实开发框架,一直以来都被开发者誉为杀手级...

异步社区 ⋅ 05/10 ⋅ 0

微服务架构 spring boot 那些最基础的知识点

一、创建SpringBoot项目 概念 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再...

烂猪皮 ⋅ 05/09 ⋅ 0

Spring Boot干货系列:(十)开发常用的热部署方式汇总

文章来源:点击打开链接 前言 平时开发Sprig Boot的时候,经常改动个小小的地方就要重新启动项目,这无疑是一种很差的体验。在此,博主收集了3种热部署的方案供大家选择。 正文 目前博主用过...

u012843873 ⋅ 05/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【elasticsearch】 随笔 Date datatype

一。时间类型的本质 首先json是没有时间类型的,对于es来说,时间类型的标示可以是下面三种情况 1.一个时间格式的字符串,如:"2014-11-27T08:05:32Z","2015-01-01" or "2015/01/01 12:10:3...

xiaomin0322 ⋅ 26分钟前 ⋅ 0

阿里云资源编排ROS使用教程

阿里云资源编排ROS详细内容: 阿里云资源编排ROS使用教程 资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、...

mcy0425 ⋅ 28分钟前 ⋅ 0

适配器设计模式

1、适配器模式 把一个类的接口变换成客户端所期待的另一种接口 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 分为类的适配器模式和对象的适配器模式 2、类适配器模式 类的适配...

职业搬砖20年 ⋅ 33分钟前 ⋅ 0

npm操作报错 _stream_writable.js:61

有一天 不知道什么原因(估计和node的版本有关),无论你做什么npm的操作 都会报错/usr/local/lib/node_modules/npm/node_modules/readable-stream/lib/_stream_writable.js:61 这时候只要执...

lilugirl ⋅ 36分钟前 ⋅ 0

Eclipse安装插件的几种方式

Eclipse魅力之一就是支持可扩展的插件,来丰富自身的功能,这种方式也是建立在开源思想之上的。具体使用什么方式去安装插件,要看我们拿到的是什么。 1. 拿到的是一串URL,如http://subclips...

GordonNemo ⋅ 39分钟前 ⋅ 0

div图片叠加

css实现代码如下: <div style="position: relative;"><!--这个层为外面的父层,需设置相对位置样式--> <div style="position: absolute;"><!--子层,需设置绝对位置样式--> <i......

niithub ⋅ 40分钟前 ⋅ 0

作用域slot

如果父组件需要使用子组件中的内容怎么办,比如父组件需要控制子组件的显示 <div id="root"><child><template slot-scope="props"><h1>{{props.item}} <div>编辑</div></h1><......

金于虎 ⋅ 43分钟前 ⋅ 1

HongHu commonservice-eureka 项目构建过程

上一篇我们回顾了关于 spring cloud eureka的相关基础知识,现在我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家...

明理萝 ⋅ 46分钟前 ⋅ 1

xml和对象的相互转化

@Data//setter和getter方法,toString和equals,hashcode方法@EqualsAndHashCode//代表重写equals和hashcode方法@XmlAccessorType(XmlAccessType.FIELD)public class Classroom {@X......

拐美人 ⋅ 46分钟前 ⋅ 0

tableView cell的高度 分组头部尾部的高度 自适应

@property (nonatomic) CGFloat rowHeight; // default is UITableViewAutomaticDimension@property (nonatomic) CGFloat sectionHeaderHeight; // default is UITableViewA......

娜一片蓝色星海 ⋅ 47分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部