文档章节

SpringBoot之部署以及Maven打包切换环境

wncode
 wncode
发布于 2016/07/19 21:32
字数 1264
阅读 7861
收藏 28

前言:之前一直用的  Java-jar 运行的,但是部署的时候得停止服务 通过端口kill 掉的,最近在推酷上发现一个安全关闭springboot的博客 ,所以自己整理(搬运)一下。主要是英语有点差,最近也比较忙就没有关注springboot更新的文档。、

方式一:通过shell命令启动 关闭

1.1 后台运行

BUILD_ID=dontKillMe nohup java -jar 文件名.jar  --spring.profiles.active=prod >output 2>&1  &

1.2 关闭服务

#!/bin/bash
PID=$(ps -ef | grep 文件名.jar | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]
then
    echo 服务已关闭
else
    echo 关闭服务中 $PID
    kill $PID
fi

目前我们公司项目都是通过jenkins执行的git maven打包并执行sh命令启动的。

 

方式二:通过 HTTP 发送 shutdown 信号

该方式主要依赖 Spring Boot Actuator 的 endpoint 特性,具体步骤如下:

2.1  在 pom.xml 中引入 actuator 依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.2  开启 shutdown endpoint

Spring Boot Actuator 的 shutdown endpoin t默认是关闭的,因此在 application.properties 中开启 shutdown endpoint :

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.3  发送 shutdown 信号

shutdown 的默认 url 为 host:port/shutdown ,当需要停止服务时,向服务器post 该请求即可,如:

curl -X POST host:port/shutdown 

将得到形如 {"message":"Shutting down, bye..."} 的响应

2.4  安全设置

可以看出,使用该方法可以非常方便的进行远程操作,但是需要注意的是,正式使用时,必须对该请求进行必要的安全设置,比如借助 spring-boot-starter-security 进行身份认证:

pom.xml添加security依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

开启安全验证

在 application.properties 中变更配置,并

#开启shutdown的安全验证
endpoints.shutdown.sensitive=true
#验证用户名
security.user.name=admin
#验证密码
security.user.password=secret
#角色
management.security.role=SUPERUSER

方式三:部署为Unix/Linux Service

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

3.1  在 pom.xml 中引入插件

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <executable>true</executable>
  </configuration>
</plugin>

3.2  设置为系统服务

将你的应用打成jar包,部署到服务器,假设部署路径为/var/app,包名为app.jar,通过如下方式将应该设置为一个系统服务:

sudo ln -s /var/app/app.jar /etc/init.d/app

3.3 赋予可执行权限:

chmod u+x app.jar

3.4  以系统服务的方式管理

接下来,就可以使用我们熟悉的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

安全设置

作为应用服务,安全性是一个不能忽略的问题,如下一些操作可以作为部分基础设置参考:

为服务创建一个独立的用户,同时最好将该用户的shell绑定为/usr/sbin/nologin
赋予最小范围权限: chmod 500 app.jar
阻止修改: sudo chattr +i app.jar
对.conf文件做类似的工作: chmod 400 app.conf , sudo chown root:root a
两种方式,我都弄了一下,第一种HTTP方式我发现在jenkins中想批处理停掉服务并启动有点麻烦,如果直接执行curl -X POST host:port/shutdown命令的话安全性就有问题,所以得集成 security,需要验证通过才能执行。每次部署前手动停掉感觉会多此一举,所以我选择了第二种方式。第二种方式的话需要设置 <configuration><executable>true</executable></configuration>,在这个环节居然与我集成的mybatis有关系(我之前xml只需要写相对的类名就行了,不需要写完整的路径,方便之后的改实体类的包路径),所以花了好大一会时间修改所有的xml的包路径。

以上的官方文档地址:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#deployment-install

附:通过maven打包

   

<profiles>
        <profile>
            <id>dev</id>
            <!--<activation>-->
                <!--<activeByDefault>true</activeByDefault>-->
            <!--</activation>-->
            <properties>
                <environment>dev</environment>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <environment>test</environment>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <environment>prod</environment>
            </properties>
        </profile>

    </profiles>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <executable>true</executable>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>application-dev.properties</exclude>
                    <exclude>application-test.properties</exclude>
                    <exclude>application-prod.properties</exclude>
                    <exclude>application.properties</exclude>
                </excludes>
            </resource>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources</directory>
                <includes>
                    <include>application-${environment}.properties</include>
                    <include>application.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

在application.properties配置

## dev | prod | test
spring.profiles.active=@environment@

博客地址:http://my.oschina.net/wangnian

© 著作权归作者所有

wncode
粉丝 196
博文 118
码字总数 90639
作品 0
浦东
程序员
私信 提问
基于Maven,优雅的控制SpringBoot配置文件

背景 众所周知,在软件开发过程中,我们一般会有生产环境,开发环境,测试环境等等,针对这些环境,我们需要在配置文件对相同的参数,设置不同的值,那么,如何做到简单、优雅、快速的进行切...

EasyProgramming
04/22
166
0
玩转阿里云函数计算(二)----Java Http 触发器极速迁移传统 SpringBoot 应用

前言 阿里云函数计算 Function Compute(FC) 本文介绍如何使用 Java HTTP 触发器来快速迁移 SpringBoot 应用 demo-springboot-hello,并使用函数计算提供的 fun 工具 来快速部署和测试。 继续...

santihyt
05/21
0
0
SpringBoot多模块项目实践(Multi-Module)

序言: 比起传统复杂的单体工程,使用Maven的多模块配置,可以帮助项目划分模块,鼓励重用,防止POM变得过于庞大,方便某个模块的构建,而不用每次都构建整个项目,并且使得针对某个模块的特...

覃光林
07/03
154
0
补习系列-springboot项目基础搭建课

目录 前言 一、基础结构 二、添加代码 三、应用配置 四、日志配置 五、打包部署 小结 前言 springboot 最近火的不行,目前几乎已经是 spring 家族最耀眼的项目了。抛开微服务、技术社区这些推...

美码师
2018/07/07
0
0
关于springboot + dubbo 部署启动方式(Windows版)

项目结构 注:项目构建通过: http://start.spring.io/ 快速构建web 项目, 具体操作可以参考《SpringBoot使用SpringDataJPA完成数据查询 -Demo》。 本次项目搭建应用的组件是springboot + du...

摘星族
01/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你知道多少this,new,bind,call,apply?那我告诉你

那么什么是this,new,bind,call,apply呢?这些你都用过吗?掌握这些内容都是基础中的基础了。如果你不了解,那还不赶快去复习复习,上网查阅资料啥的! 通过call,apply,bind可以改变thi...

达达前端小酒馆
今天
4
0
设计模式之命令模式

命令模式的类图 其中的角色有: Client 客户端。只依赖于调用者Invoker、接收者Receiver、以及Command(网上找的图片这里没有画出来),不用关注接收者如何执行命令,只需要告诉调用者需要执行...

陈年之后是青葱
今天
7
0
2. 彤哥说netty系列之IO的五种模型

你好,我是彤哥,本篇是netty系列的第二篇。 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。 简介 本文将介绍linux中的五种IO模型,同时也会介绍阻塞/非阻塞与同步/异步的区别。 何...

彤哥读源码
今天
5
0
OSChina 周四乱弹 —— 喵的波粒二象性

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 小小编辑推荐:《水墨兰亭》- 李志辉 《水墨兰亭》- 李志辉 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪维 :卧室里采光要足够好,这样...

小小编辑
今天
34
1
前后端分离接口规范

最近在开发,遇到前后端关于Boolean类型的参数传参和接收的问题: 场景:后台会根据用户是否出车/是否出司机(Boolean类型)来决定后端的业务逻辑(比如费用的计算),前端使用JSON字符串类型...

code-ortaerc
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部