文档章节

Springboot 应用部署建议

s
 seal_90
发布于 06/12 15:31
字数 942
阅读 1746
收藏 40
点赞 1
评论 8

简介

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>

安装

# 卸载openjdk,请根据自己情况卸载
# 安装 oracle jdk,请根据自己情况安装,建议 rpm 包安装
#  至于问为何不用 openjdk 我了解到的是 oracle jdk 目前来看,大家都用,并且没问题

# 创建启动用户
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
粉丝 5
博文 4
码字总数 4619
作品 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,效果更佳
电阻学长
电阻学长
这个具备守护进程功能么?开机自启动不
纸醉鑫迷
纸醉鑫迷
并不是,我说有的启动项和配置参数都在shell脚本里,开机启动项只需要引用一下就可以了,何况 shell直接 start -all多棒
h
httpmad
学习了
学习 Spring Boot 知识看这一篇就够了

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

ityouknow ⋅ 05/28 ⋅ 0

springboot开发简单的web应用前篇

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

GeCoder ⋅ 05/04 ⋅ 0

springboot 是如何帮我们省去web.xml配置的

概述 最开始使用原生的springmvc时,总是免不了有如下xml配置 但是,切换到springboot之后,web.xml之类的繁琐的配置基本上都不见了。出于好奇研究了下springboot究竟帮我们做了什么,我们可...

端吉 ⋅ 前天 ⋅ 0

恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年 ⋅ 04/19 ⋅ 0

SpringBoot 入门实例

SpringBoot 是由 pivotal 提供的 Java 开发框架,伴随着 spring 4.0 版本一起发布,旨在简化 Spring 项目的初始化及开发过程,框架本身为开发过程提供了大量的默认配置,当然我们也可以通过简...

Aotian ⋅ 05/29 ⋅ 0

腾讯云安装Docker,并部署Springboot

  最近想在微信公众号中做个小程序出来,供大家日常生活中使用。本来打算直接调阿里api市场中提供的接口的,可是发现其中的接口都是http的,而微信小程序中要求接口必须是https的,因此只能...

u013088062 ⋅ 04/25 ⋅ 0

springboot学习(二)——springmvc配置使用

以下内容,如有问题,烦请指出,谢谢 上一篇讲解了springboot的helloworld部分,这一篇开始讲解如何使用springboot进行实际的应用开发,基本上寻着spring应用的路子来讲,从springmvc以及web...

嘻哈开发者 ⋅ 04/26 ⋅ 0

SpringBoot 2.0 系列001 -- 入门介绍以及相关概念

SpringBoot 2.0 系列001 -- 入门介绍以及相关概念 什么是SpringBoot? 项目地址:http://projects.spring.io/spring-boot/ SpringBoot介绍 Spring Boot使开发独立的,产品级别的基于Spring的...

路上有你0314 ⋅ 05/10 ⋅ 0

使用 Docker 部署 Spring Boot之项目的构建

Docker通常用于如下场景: web应用的自动化打包和发布; 自动化测试和持续集成、发布; 在服务型环境中部署和调整数据库或其他的后台应用; 从头编译或者扩展现有的OpenShift或Cloud Foundry...

qq_28089993 ⋅ 04/21 ⋅ 0

SpringBoot学习【简】

这里有一个不错的专栏,推荐一下 SpringBoot 教程 SpringBoot(四):SpringBoot整合JdbcTemplate SpringBoot(五):SpringBoot整合MyBatis 尤其这两文...

anlve ⋅ 05/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux中的端口大全

1 被LANA定义的端口 端口 名称 描述 1 tcpmux TCP 端口服务多路复用 5 rje 远程作业入口 7 echo Echo 服务 9 discard 用于连接测试的空服务 11 systat 用于列举连接了的端口的系统状态 13 d...

寰宇01 ⋅ 16分钟前 ⋅ 0

Confluence 6 如何备份存储文件和页面信息

备份的 ZIP 文件包含有 entities.xml,这个 XML 文件包含有 Confluence 的所有页面内容和存储附件的目录。 备份 Zip 文件结构 页面的附件是存储在附件存储目录中的,通过页面和附件 ID 进行识...

honeymose ⋅ 18分钟前 ⋅ 0

【每天一个JQuery特效】根据状态确定是否滑入或滑出被选元素

主要效果: 本文主要采用slideToggle()方法实现以一行代码同时实现以展开或收缩的方式显示或隐藏被选元素。 主要代码如下: <!DOCTYPE html><html><head><meta charset="UTF-8">...

Rhymo-Wu ⋅ 22分钟前 ⋅ 0

度量.net framework 迁移到.net core的工作量

把现有的.net framework程序迁移到.net core上,是一个非常复杂的工作,特别是一些API在两个平台上还不能同时支持。两个类库的差异性,通过人工很难识别全。好在微软的工程师们考虑到了我们顾...

李朝强 ⋅ 28分钟前 ⋅ 0

请不要在“微服务”的狂热中迷失自我!

微服务在过去几年一直是一个非常热门的话题(附录1)。何为“微服务的疯狂”,举个例子: 众所周知,Netflix在DevOps上的表现非常棒。Netfix可以做微服务。因此:如果我做微服务,我也将非常...

harries ⋅ 29分钟前 ⋅ 0

oAuth2 升级Spring Cloud Finchley.RELEASE踩坑分享

背景 6.19号,spring团队发布了期待已久的 Spring Cloud Finchley.RELEASE 版本。 重要变化: 基于Spring Boot 2.0.X 不兼容 Spring Boot 1.5.X 期间踩过几个坑,分享出来给大伙,主要是关于...

冷冷gg ⋅ 59分钟前 ⋅ 0

OSChina 周一乱弹 —— 理发师小姐姐的魔法

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @冰冰棒- :分享田馥甄的单曲《My Love》 《My Love》- 田馥甄 手机党少年们想听歌,请使劲儿戳(这里) @Li-Wang :哎,头发又长了。。。又要...

小小编辑 ⋅ 今天 ⋅ 8

Kafka1.0.X_消费者API详解2

偏移量由消费者管理 kafka Consumer Api还提供了自己存储offset的功能,将offset和data做到原子性,可以让消费具有Exactly Once 的语义,比kafka默认的At-least Once更强大 消费者从指定分区...

特拉仔 ⋅ 今天 ⋅ 0

NEO智能合约之发布和升级(二)

接NEO智能合约之发布和升级(一),我们接下来说说智能合约的升级功能。 一 准备工作 合约的升级需要在合约内预先设置好升级接口,以方便在升级时调用。接下来我们对NEO智能合约之发布和升级...

红烧飞鱼 ⋅ 今天 ⋅ 0

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部