在开发spring Boot应用的过程中,Spring Boot直接执行public static void main()函数并启动一个内嵌的应用服务器(取决于类路径上的以来是Tomcat还是jetty)来处理应用请求。对于生产环境,这样的部署方式同样有效,同时Spring Boot也支持传统的部署方式——将war包放入应用服务器中启动运行。

内嵌应用服务器

在使用Maven或Gradle构建Spring Boot应用的过程中,Spring Boot插件提供了巨大的帮助,除了生命各类预定义的依赖,它还能够构建可以直接运行的jar包——包含了所有的依赖以及内嵌应用服务器。应用的分发也就变得非常简单,任何人拿到了这个jar包,只需要简单运行Java -jar your.jar就可以启动应用,无需任何构建工具、安装过程以及应用服务器。

内嵌应用服务器配置

在生产环境中,应用服务器需要各类配置,Spring Boot本身提供了一种非常简单的配置机制——application.properties

server.port=8080 # 监听端口
server.address= # 绑定的地址
server.session-timeout= #session有效时长
server.context-path= #默认为/
server.ssl.* #ssl相关配置

Tomcat

默认情况下,Spring Boot启动的内嵌容器就是Tomcat,对于Tomcat有几个非常重要的配置:

server.tomcat.basedir=/tmp

tomcat的baseDir,日志、dump等文件都存在于这个目录中,一般是系统的临时文件夹/tmp,但也可以按照自己的需求变更位置。

server.tomcat.access-log-pattern= # log pattern of the access log
server.tomcat.access-log-enabled=false # is access logging enabled

这两个配置打开Tomcat的Access日志,并可以设置日志格式。

Jetty

如果你不喜欢Tomcat,Jetty也是一个非常不错的选择。使用Jetty的方式也非常简单——把tomcat依赖从Maven或Gradle中移除,加入Jetty内嵌容器的依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
      <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
  </dependency>
<dependencies>

Java EE应用服务器

除了内嵌容器的部署模式,Spring Boot也支持将应用部署至已有的Tomcat容器, 或JBoss, WebLogic等传统Java EE应用服务器。

以Maven为例,首先需要将<packaging>jar改成war,然后取消spring-boot-maven-plugin,然后修改Application.java

package demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer {    public static void main(String[] args) {        SpringApplication.run(applicationClass, args);
    }    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {        return application.sources(applicationClass);
    }    private static Class<Application> applicationClass = Application.class;
}

接下来打包应用,将生成的war包放入应用服务器目录即可。

使用外部配置文件

在应用程序中有很多配置项,例如数据库连接地址、日志文件位置、应用服务器配置等等。为了安全与灵活性,我们推荐将Spring Boot的配置文件放在生产环境的服务器上,并严格控制访问权限。在运行应用时可以通过命令行参数指定配置文件:

java -jar location_of_your_jar_file.jar --spring.config.location=location_of_your_config_file.properties

这样做的好处是:

  • 配置位于生产环境中,数据库连接等私密信息不容易泄露
  • 灵活性强,同一份代码(包括构建的jar包)可以应用于不同的环境配置(开发、测试、生产)

使用Profile区分环境

在某些情况下,应用的某些业务逻辑可能需要有不同的实现。例如邮件服务,假设EmailService中包含的send(String email)方法向指定地址发送电子邮件,但是我们仅仅希望在生产环境中才执行真正发送邮件的代码,而开发环境里则不发送以免向用户发送无意义的垃圾邮件。

我们可以借助Spring的注解@Profile实现这样的功能,这样需要定义两个实现EmailService借口的类:

@Service
@Profile("dev")
class DevEmailService implements EmailService {    public void send(String email) {        //Do Nothing
    }
}@Service
@Profile("prod")
class ProdEmailService implements EmailService {    public void send(String email) {        //Real Email Service Logic
    }
}

@Profile("dev")表明只有Spring定义的Profile为dev时才会实例化DevEmailService这个类。那么如何设置Profile呢?

在配置文件中指定

application.properties中加入:

spring.profiles.active=dev

通过命令行参数

java -jar app.jar --spring.profiles.active=dev

以服务的形式运行应用

使用java命令运行应用非常简单,但是通常我们都是通过ssh命令连接到服务器并运行它,一旦ssh连接断开,那么由它fork的java子进程也就随之销毁了。所以我们必须借助工具将应用作为服务运行在服务器上:

Systemd

systemd 是Linux 下的一款系统和服务管理器。可以为Spring Boot应用编写启动脚本:

[Unit]
Description=Spring Boot Application[Service]
ExecStart=/usr/bin/java -jar location_of_jar_file.jar --spring.config.location=location_of_config.properties --spring.profiles.active=profile
User=${your expected user}[Install]
WantedBy=multi-user.target

Supervisord

Supervisord是用Python实现的一款非常实用的进程管理工具。可以为Spring Boot应用编写:

[program:app]
command=/usr/bin/java -jar location_of_jar_file.jar --spring.config.location=location_of_config.properties --spring.profiles.active=profile
user=${your expected user}
autostart=true
autorestart=true
startsecs=10
startretries=3

转载于:https://www.cnblogs.com/weiyinfu/p/5841493.html

SpringBoot应用部署[转]相关推荐

  1. 常用注解[spring 的 java 配置] ||springboot 热部署

    常用注解[spring 的 java 配置] 回顾学过的 spring 的注解 @Controller @RestController @Service @Repository @Component ...

  2. filezilla 设置服务器_java项目部署到linux服务器,微信小程序后台springboot项目部署到腾讯云服务器(图文详解)...

    前面给大家讲了一个点餐系统的开发,包括java点餐后台和微信点餐小程序.可是都是教大家如何在本地把项目跑起来.今天就来教大家如何把这个点餐系统部署到服务器,实现商用. 传送门 点餐系统的开发,java ...

  3. springboot 项目部署为war项目

    2019独角兽企业重金招聘Python工程师标准>>> 喜欢springboot的一点就是,既可以用jar包发布,也可以用war包发布.用jar包发布更加方便,用war包发布,放在同 ...

  4. SpringBoot 热部署

    SpringBoot 热部署 最近在讲springcloud微服务,中间使用到springboot开发代码时,经常因为一点小的改动就需要重启,虽然重启也很快.于是就开始折腾热部署,下面记录如下: 一. ...

  5. springboot 获取登录浏览器_java项目部署到linux服务器,微信小程序后台springboot项目部署到云服务器(图文详解)...

    前面给大家讲了一个点餐系统的开发,包括java点餐后台和微信点餐小程序.可是都是教大家如何在本地把项目跑起来.今天就来教大家如何把这个点餐系统部署到服务器,实现商用. 传送门 点餐系统的开发,java ...

  6. SpringBoot热部署加持

    概述 进行SpringBoot的Web开发过程中,我们很多时候经常需要重启Web服务器才能保证修改的 源代码文件.或者一些诸如xml的配置文件.以及一些静态文件生效,这样耗时又低效.所谓的热部署指的是 ...

  7. 超详细springboot热部署

    超详细springboot热部署 ①修改依赖 <!--热部署--> <dependency><groupId>org.springframework.boot< ...

  8. SpringBoot热部署环境搭建和原理分析

    SpringBoot热部署环境搭建 插件会监控 classpath的资源变化 对类加载采用了两种类加载器(只重启开发人员编写的代码部分) 一. 现象 开发项目过程中,修改了某些代码后需要本地验证时,需 ...

  9. idea中配置Springboot热部署

    idea中配置Springboot热部署 1 pom.xml文件 注:热部署功能spring-boot-1.3开始有的 <!--添加依赖--> <dependency>< ...

  10. k8s springboot 文件_30分钟无痛上云——springboot项目部署到kubernetes

    最近学习kubernetes,看书千言,不如一行.还是直接上手把一个项目迁移过去操作一下感觉深刻一点.废话少说,言归正传. 一.环境准备 操作系统版本 mac Mojove 10.14.5.docke ...

最新文章

  1. osg中实现HUD(OSG初级篇1)
  2. cufflinks基于QuantFig绘制高级金融图
  3. JavaScript工作原理(二):V8引擎和5招高效代码
  4. eltable 无数据文案修改_有哪些适合十二月发的文艺文案?记录文案用这款图片便签...
  5. WeakMap 本身释放,而 keyObject 没有释放的情况下,value 会释放吗?
  6. 第96:SVM简介与简单应用
  7. [原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?
  8. 论文阅读丨神经清洁: 神经网络中的后门攻击识别与缓解
  9. UI图标设计素材|风格多样的图标
  10. 父亲购房后去世,房产证还没办,后妈和父亲没结婚,户口簿上有父亲,儿子,妹妹,那房产证应该写谁的名字?
  11. python迭代器学习与简单的实践
  12. 项目总结13:Jav文件压缩-InputStream转化为base64-Base64解码并生成图片
  13. NHibernate N+1问题实例分析和优化
  14. 3DMax如何安装?3DMax2018软件安装图文教程全解
  15. division by zero_MySQL5.7 group_by报错问题解决办法,大部分程序员都收藏了
  16. Android 获取蓝牙设备类型
  17. SSLOJ 1323.交流
  18. java基于Springboot+vue的球鞋销售商城网站 elementui
  19. Candence学习篇(7)allegro pcb editor 17.2如何打开旧版本.brd和.dra文件等
  20. p5.js 实现动态互动画板

热门文章

  1. 20151209小问题
  2. [转载]EmitMapper,AutoMapper,NLiteMapper和手工映射性能大比拼
  3. 今天去看招聘会了~~
  4. 【恋上数据结构】排序算法前置知识及代码环境准备
  5. 我只是bug的搬运工之idea的Cannot run program git.exe: CreateProcess error=2
  6. 渗透测试攻击(二)——wireshark过滤数据包语法详解
  7. 使用shell脚本 控制 python挂掉后自动重启
  8. gcc,make和cmake
  9. 从数据平台到报表开发,我靠这个零代码报表工具,转行后月薪3W
  10. 报表性能优化方案之单数据集分页SQL实现层式报表