文档章节

Springboot 应用部署建议

s
 seal_90
发布于 06/12 15:31
字数 939
阅读 1827
收藏 43

简介

springboot应用的人越来越多,看到许多人在部署的时候依旧热衷于使用 nohup,& 等手段(可在 https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 查看更多手段,developerWorks 有人说是IBM 的一大彩蛋,确实不少好文章)来运行程序,问题都很明显,系统重启后不会自动启动,为何我们的应用不能像 nginx,haproxy,redis 等应用一样,注册为服务呢!查看springboot官网也有提到如何注册为服务启动,地址为 https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#deployment-service ,在参考其安装过程中遇到一些问题,并有一些自己想法,故写篇文章记录下。下面是为了说明问题使用命令,在生产上建议不要使用shell脚本执行,而要使用ansible脚本执行安装过程。

环境准备

  • 主机一台,系统centos7 以上
  • 应用一个 seal-app-1.0.1.jar

安装规划

  • 应用启动用户,家目录 tomcat:tomcat /var/lib/tomcat
  • 应用放置目录 /var/lib/tomcat/app
  • 应用日志目录 /var/log/tomcat

应用打包

  <!-- 切记一定要添加 executable -->
  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
    	<executable>true</executable>
    </configuration>
  </plugin>

安装


# 创建启动用户
useradd -m -d /var/lib/tomcat -s /sbin/nologin tomcat
# 创建 app存储目录
mkdir /var/lib/tomcat/app
# 将 seal-app-1.0.1.jar 移动到 /var/lib/tomcat/app 中,并改变属主属组
chown tomcat:tomcat -R /var/lib/tomcat/app/seal-app-1.0.1.jar
chmod 500 /var/lib/tomcat/app/seal-app-1.0.1.jar
# 若想保存历史版本,则创建硬连接,否则重命名此文件
ln /var/lib/tomcat/app/seal-app-1.0.1.jar /var/lib/tomcat/app/seal-app.jar
# 创建软链接,放到 /usr/bin 目录下供 service 配置文件使用。
ln -sv /var/lib/tomcat/app/seal-app.jar /usr/bin/seal-app.jar
# 注意 此处做两次链接的原因。
#  1 启动文件大多放在 /usr/bin 目录下
#  2 springboot 在启动时可以加载一个配置文件,来影响tomcat及自己应用的配置。其规则为
#     1 springboot 默认会在和启动应用的同目录下,找一个同名且后缀名为 .conf 配置文件
#     2 springboot 会在启动的时候将软连接解析为对应真实地址
#     3 springboot 会从环境变量中读取 CONF_FOLDER 指定的路径
#    根据以上规则,springboot 默认会解析到 /var/lib/tomcat/app/seal-app.jar,
#      并且会找 /var/lib/tomcat/app/seal-app.conf 配置文件
#  所以一定要保证硬链接的名为 seal-app.jar

# 禁止改动 jar 文件
chattr +i /var/lib/tomcat/app/seal-app.jar
# 注意 更新程序需要如下操作
---------
# 允许修改 jar 文件
chattr -i /var/lib/tomcat/app/seal-app.jar
# 删除文件
rm /var/lib/tomcat/app/seal-app.jar
# 更新 jar 文件
ln /var/lib/tomcat/app/seal-app-${NEW_VERSION}-exec.jar /var/lib/tomcat/app/seal-app.jar
# 禁止改动 jar 文件
chattr +i /var/lib/tomcat/app/seal-app.jar
-------

# 创建日志目录
mkdir /var/log/tomcat
chown tomcat:tomcat /var/log/tomcat

# 创建配置文件目录,因操作用户为 root,则下面目录若不修改都是 root用户的
mkdir /etc/tomcat
chmod 755 /etc/tomcat
# 配置文件
vim /etc/tomcat/seal-app.conf
---------------------
JAVA_OPTS=-Xms1024M -Xmx1024M
---------------------
# 设置为 tomcat 只读
chmod 644 /etc/tomcat/seal-app.conf
# 配置启动文件,注意此处 CONF_FOLDER=/etc/tomcat
vim /etc/systemd/system/seal-app.service
------------
[Unit]
Description=seal-app
After=syslog.target

[Service]
User=tomcat
Environment="CONF_FOLDER=/etc/tomcat"
ExecStart=/usr/bin/seal-app.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
------------
systemctl daemon-reload
systemctl enable seal-app
systemctl start seal-app

后记

这样实现的部署感觉更符合linxu系统的规划,写成这样我想 ansible 脚本应该不难实现了吧。当然容器化目前看是未来,而 kubernetes 实现了完整的运维环境,要比人肉运维好多了。

© 著作权归作者所有

共有 人打赏支持
s
粉丝 6
博文 10
码字总数 11017
作品 0
济南
加载中

评论(8)

i
ice_stream
为什么不用java wrapper service
s
seal_90

引用来自“荭署”的评论

并不是,我说有的启动项和配置参数都在shell脚本里,开机启动项只需要引用一下就可以了,何况 shell直接 start -all多棒
1 linux 不同目录应该存放不同类型的文件
2 若是进程出问题后,linux init软件去维护就死掉不能再启动
若是非容器化使用这个方式还是有很多优势的
s
seal_90

引用来自“电阻学长”的评论

这个具备守护进程功能么?开机自启动不
这样配置就和nginx等软件一样了,启动为服务
s
seal_90

引用来自“MockMan”的评论

配合使用docker,效果更佳
docker 单调了点,用上k8s效果才会更明显
MockMan
MockMan
配合使用docker,效果更佳
电阻学长
电阻学长
这个具备守护进程功能么?开机自启动不
xiaour
xiaour
并不是,我说有的启动项和配置参数都在shell脚本里,开机启动项只需要引用一下就可以了,何况 shell直接 start -all多棒
h
httpmad
学习了
springboot 开发入门,及问题汇总

1 . springboot简单介绍(http://projects.spring.io/spring-boot/) 现在的web项目几乎都会用到spring框架,而要使用spring难免需要配置大量的xml配置文件,而springboot的出现解 决了这一问...

崔江昆
2015/03/18
0
30
学习 Spring Boot 知识看这一篇就够了

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

ityouknow
05/28
0
0
【SpringBoot专题】快速体验

前言 在Spring 4推出来之前,我们的编码是存在一些问题,比如:大量的xml配置存在项目中,配置相当繁琐;整合第三方框架非常麻烦;开发效率和部署效率不高等问题。正是因为这些问题,Spring开...

张丰哲
08/05
0
0
springboot开发简单的web应用前篇

你已经会spring了,也非常熟悉springmvc的开发,平时你搭建个web应用简单吗?好像也不难!那么今天我来试试用springboot来开发个简单的web应用来试试。 在正式讲解springboot开发web应用之前...

GeCoder
05/04
0
0
springboot情操陶冶-初识springboot

前言:springboot由于其轻便和去配置化等的特性已经被广泛应用,基于时代潮流以及不被鄙视,笔者于是开辟此篇开始认识springboot 前话 springboot是基于spring而开发的轻量级框架,所以在学习...

南柯问天
07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
0
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
5
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
33
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部