摘自: http://blog.csdn.net/hguisu/article/details/51072683html
spring Boot 其默认是集成web容器的,启动方式由像普通Java程序同样,main函数入口启动。其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat)。固然你也能够将项目打包成war包,放到独立的web容器中(Tomcat、weblogic等等),固然在此以前你要对程序入口作简单调整。java
对server的几个经常使用的配置作个简单说明:mysql
Tomcat
Tomcat为Spring Boot的默认容器,下面是几个经常使用配置:linux
pom.xml依赖配置:git
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>web
Jetty
若是你要选择Jetty,也很是简单,就是把pom中的tomcat依赖排除,并加入Jetty容器的依赖,以下:redis
项目构建咱们使用Maven或Gradle,这将使项目依赖、jar包管理、以及打包部署变的很是方便。spring
在spring boot里,很吸引人的一个特性是能够直接把应用打包成为一个jar/war,而后这个jar/war是能够直接启动的,不须要另外配置一个Web Server。单独的JAR包,而后经过Java -jar <name>.jar
命令运行。sql
1.1 Mavenmongodb
SpringBootMaven插件为Maven提供SpringBoot支持,它容许你打包可执行jar或war存档,而后就地运行应用。为了使用
它,你须要使用Maven 3.2(或更高版本)。
1.4改变Java版本
spring-boot-starter-parent选择至关保守的Java兼容策略。若是你遵循咱们的建议,使用最新的Java版本,你能够添加一
个 java.version属性:
<properties>
<java.version>1.8</java.version>
</properties>
1.5 使用Spring Boot Maven插件
SpringBoot包含一个Maven插件,它能够将项目打包成一个可执行jar。若是想使用它,你能够将该插件添加到<plugins>节
点处:
注:若是使用Spring-Boot-tarter-parent pom,你只须要添加该插件而无需配置它,除非你想改变定义在partent中的设置。
该配置会在Maven生命周期的 package阶段从新打包一个jar或war。下面的示例显示在target目录下既有从新打包后的jar,
也有原始的jar:
1.6 Linux下打包方法:
使用 mvn clean package 命令打包
若是尚未安装maven :
yum -y install apache-maven
或者单独下载安装:
wget http://apache.fayea.com/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
tar zxvf apache-maven-3.3.9-bin.tar.gz
设置环境变量:
MVN_HOME=/usr/local/app/apache-maven-3.3.9
export PATH=$PATH:$MVN_HOME/bin
而后可使用如下命令编译:
mvn clean package
能够追加参数 -Dmaven.test.skip=true 跳过测试。
target/myproject-1.0.0.jartarget/myproject-1.0.0.jar.original
1.6 使用Eclipse下打包方法:
打开maven插件的maven package,就能够打包了:
打包出来的文件:
若是不包含像上面那样的<execution/>,你能够本身运行该插件(但只有在package目标也被使用的状况)。例如:
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
若是使用一个里程碑或快照版本,你还须要添加正确的pluginRepository元素:
打包可执行jar和war文件
一旦spring-boot-maven-plugin被包含到你的pom.xml中,它就会自动尝试使用spring-boot:repackage目标重写存档以使它们可以执行。为了构建一个jar或war,你应该使用常规的packaging元素配置你的项目:
生成的存档在 package 阶段会被SpringBoot加强。你想启动的main类便可以经过指定一个配置选项,也能够经过为manifest添加一个Main-Class属性这种常规的方式实现。若是你没有指定一个main类,该插件会搜索带有publicstaticvoidmain(String[]args)方法的类。
为了构建和运行一个项目的artifact,你能够输入如下命令:
这种方式,只要控制台关闭,服务就不能访问了。下面咱们使得 jar 包在后台运行:
java -jar spring-boot01-1.0-SNAPSHOT.jar > log.file 2>&1 &
为了构建一个便是可执行的,又能部署到一个外部容器的war文件,你须要标记内嵌容器依赖为"provided",例如:
maven打包以后,会生成两个jar文件:
demo-0.0.1-SNAPSHOT.jar
demo-0.0.1-SNAPSHOT.jar.original
其中demo-0.0.1-SNAPSHOT.jar.original是默认的maven-jar-plugin生成的包。
demo-0.0.1-SNAPSHOT.jar是spring boot maven插件生成的jar包,里面包含了应用的依赖,以及spring boot相关的类。下面称之为fat jar。
先来查看spring boot打好的包的目录结构(不重要的省略掉):
依次来看下这些内容。
能够看到有Main-Class是org.springframework.boot.loader.JarLauncher ,这个是jar启动的Main函数。
还有一个Start-Class是com.example.SpringBootDemoApplication,这个是咱们应用本身的Main函数
这下面放的是应用的.class文件。
这里存放的是应用的Maven依赖的jar包文件。
好比spring-beans,spring-mvc等jar。
这下面存放的是Spring boot loader的.class文件。
启动:
咱们直接启动:java -jar demo-0.0.1-SNAPSHOT.jar
咱们有时候项目依赖外部的jar,咱们使用Eclipse开发的时候咱们直接经过build path添加jar就能够,可是使用mvn 打包的时候就会缺乏这个包。
1. 使用system scope
咱们直接引入rabbitmq-client.jar。这个方式比较灵活,到新的服务器上,无需作额外的操做。
一、groupId和artifactId以及version都是能够随便填写的 ,scope必须填写为system,而systemPath咱们如今咱们jar包的目录地址就能够了
二、${basedir}就是项目根目录
2. 将jar包安装到本地repository中
这个须要在新机器上执行mvn install:install-file命令。
例如执行命令:
mvn install:install-file -Dfile=D:\JAR_LIB\rabbitmq-client.jar -DgroupId=com.rabbitmq -DartifactId=client -Dversion=3.5.0 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true
在项目中引用:
三、添加 in project repository
设置项目的库目录
<repository>
<id>in-project</id>
<name>In Project Repo</name>
<url>file://${project.basedir}/lib</url>
</repository>
添加依赖:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>client</artifactId>
<version>3.5.0</version>
</dependency>
jar包及路径必须严格遵循格式:
/groupId/artifactId/version/artifactId-verion.jar
本例中: lib/com/rabbitmq/client/3.5.0/rabbitmq-client-3.5.0.jar
在咱们开发过程当中,咱们须要常常修改,为了不重复启动项目,咱们能够启用热部署。
Spring-Loaded项目提供了强大的热部署功能,添加/删除/修改 方法/字段/接口/枚举 等代码的时候均可以热部署,速度很快,很方便。
想在Spring Boot中使用该功能很是简单,就是在spring-boot-maven-plugin插件下面添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>
添加之后,经过mvn spring-boot:run启动就支持热部署了。
注意:使用热部署的时候,须要IDE编译类后才能生效,你能够打开自动编译功能,这样在你保存修改的时候,类就自动从新加载了。
application.properties区分环境
spring boot 能够在 “配置文件”、“Java代码类”、“日志配置” 中来配置profile区分不一样环境执行不一样的结果
一、配置文件
使用配置文件application.yml 和 application.properties 有所区别
以application.properties 为例,经过文件名来区分环境 application-{profile}.properties
application.properties
app.name=MyApp
server.port=8080
spring.profiles.active=dev
application-dev.properties
server.port=8081
application-stg.properties
server.port=8082
在启动程序的时候经过添加 –spring.profiles.active={profile} 来指定具体使用的配置
例如咱们执行 java -jar demo.jar –spring.profiles.active=dev 那么上面3个文件中的内容将被如何应用?
Spring Boot 会先加载默认的配置文件,而后使用具体指定的profile中的配置去覆盖默认配置。
app.name 只存在于默认配置文件 application.properties 中,由于指定环境中不存在一样的配置,因此该值不会被覆盖
server.port 默认为8080,可是咱们指定了环境后,将会被覆盖。若是指定stg环境,server.port 则为 8082
spring.profiles.active 默认指定dev环境,若是咱们在运行时指定 –spring.profiles.active=stg 那么将应用stg环境,最终 server.port 的值为8082
Maven环境配置
项目工程统一使用maven的profile插件定义不一样的项目构建环境(dev, alpha, beta, prod),经过filter插件为不一样环境下的配置项注入对应的参数值来实现动态配置目标。
2.3.1定义profile
在POM.xml中配置四个profile,对应项目所处的四个不一样的环境-dev, alpha, beta, prod, profile的id属性即为每一个环境赋予一个惟一的标示,元素的内容则是以key-value的形式出现的键值对,如咱们定义了一个变量,其值在不一样的环境下(不一样id)被赋予了不一样的值(dev, test, pre-prod, prod),要激活不一样的环境打包,咱们能够在命令行经过mvn package –P${profileId}来让其运行,为了开发便利,默认激活的是dev开发环境,即开发人员不须要经过命令行手动输入-p参数也能运行dev环境的打包。
<profile>
<!-- 本地参数 -->
<id>dev</id>
<properties>
<server.port>8081</server.port>
<server.address>0.0.0.0</server.address>
<profileActive>dev</profileActive>
</properties>
<build>
<filters>
<filter>
<groupId>${basedir}/src/main/resources/dev.properties</groupId>
</filter>
</profile>
下面几个脚本仅供参考:
打包:clean.sh
start.sh
stop.sh
restart
首先看Spring Boot应用程序的Docker化,因为Spring Boot内嵌了tomcat、Jetty等容器,所以咱们对docker镜像的要求就是须要java运行环境。个人应用代码的的Dockerfile文件以下:
#基础镜像:仓库是java,标签用8u66-jdk FROM java:8u66-jdk #当前镜像的维护者和联系方式 MAINTAINER duqi duqi@example.com #将打包好的spring程序拷贝到容器中的指定位置 ADD target/bookpub-0.0.1-SNAPSHOT.jar /opt/bookpub-0.0.1-SNAPSHOT.jar #容器对外暴露8080端口 EXPOSE 8080 #容器启动后须要执行的命令 CMD java -Djava.security.egd=file:/dev/./urandom -jar /opt/bookpub-0.0.1-SNAPSHOT.jar
由于目前的示例程序比较简单,这个dockerfile并无在将应用程序的数据存放在宿主机上。若是你的应用程序须要写文件系统,例如日志,最好利用VOLUME /tmp
命令,这个命令的效果是:在宿主机的/var/lib/docker目录下建立一个临时文件并把它连接到容器中的/tmp目录。
把这个Dockerfile放在项目的根目录下便可,后续经过docker-compose build
统一构建:基础镜像是只读的,而后会在该基础镜像上增长新的可写层来供咱们使用,所以java镜像只须要下载一次。
docker-compose是用来作docker服务编排,参看《Docker从入门到实践》中的解释:
Compose 项目目前在 Github 上进行维护,目前最新版本是 1.2.0。Compose 定位是“defining and running complex applications with Docker”,前身是 Fig,兼容 Fig 的模板文件。
Dockerfile 可让用户管理一个单独的应用容器;而 Compose 则容许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
单个docker用起来确实没什么用,docker技术的关键在于持续交付,经过与jekins的结合,能够实现这样的效果:开发人员提交push,而后jekins就自动构建并测试刚提交的代码,这就是我理解的持续交付。
使用java命令运行应用很是简单,可是一般咱们都是经过ssh命令链接到服务器并运行它,一旦ssh链接断开,那么由它fork的java子进程也就随之销毁了。因此咱们必须借助工具将应用做为服务运行在服务器上:
systemd 是Linux 下的一款系统和服务管理器。能够为Spring Boot应用编写启动脚本:
Supervisord配置:
与开发和测试环境不一样的是,当应用部署到生产环境时,须要各类运维相关的功能的支持,包括性能指标、运行信息和应用管理等。全部这些功能都有不少技术和开源库能够实现。Spring Boot 对这些运维相关的功能进行了整合,造成了一个功能完备和可定制的功能集,称之为 Actuator。只须要在 POM 文件中增长对 “org.springframe.boot:spring-boot-starter-actuator” 的依赖就能够添加 Actuator。Actuator 在添加以后,会自动暴露一些 HTTP 服务来提供这些信息。这些 HTTP 服务的说明如表 2。
名称 | 说明 | 是否包含敏感信息 |
---|---|---|
autoconfig | 显示 Spring Boot 自动配置的信息。 | 是 |
beans | 显示应用中包含的 Spring bean 的信息。 | 是 |
configprops | 显示应用中的配置参数的实际值。 | 是 |
dump | 生成一个 thread dump。 | 是 |
env | 显示从 ConfigurableEnvironment 获得的环境配置信息。 | 是 |
health | 显示应用的健康状态信息。 | 否 |
info | 显示应用的基本信息。 | 否 |
metrics | 显示应用的性能指标。 | 是 |
mappings | 显示 Spring MVC 应用中经过“ @RequestMapping”添加的路径映射。 |
是 |
shutdown | 关闭应用。 | 是 |
trace | 显示应用相关的跟踪(trace)信息。 | 是 |
对于表中的每一个服务,经过访问名称对应的 URL 就能够获取到相关的信息。如访问“/info”就能够获取到 info 服务对应的信息。服务是否包含敏感信息说明了该服务暴露出来的信息是否包含一些比较敏感的信息,从而肯定是否须要添加相应的访问控制,而不是对全部人都公开。全部的这些服务都是能够配置的,好比经过改变名称来改变相应的 URL。下面对几个重要的服务进行介绍。
Spring Boot 默认提供了对应用自己、关系数据库链接、MongoDB、Redis 和 Rabbit MQ 的健康状态的检测功能。当应用中添加了 DataSource 类型的 bean 时,Spring Boot 会自动在 health 服务中暴露数据库链接的信息。应用也能够提供本身的健康状态信息,如代码清单 7 所示。
@Component public class AppHealthIndicator implements HealthIndicator { @Override public Health health() { return Health.up().build(); } }
应用只须要实现 org.springframework.boot.actuate.health.HealthIndicator 接口,并返回一个 org.springframework.boot.actuate.health.Health 对象,就能够经过 health 服务来获取所暴露的信息。health 服务返回的结果
{"status":"UP","app":{"status":"UP"},"db":{"status":"UP","database":"HSQL Database Engine","hello":1}}
info 服务所暴露的信息是彻底由应用来肯定的。应用中任何以“info.”开头的配置参数会被自动的由 info 服务来暴露。只须要往 application.properties 中添加以“info.”开头的参数便可,如:
info.app_name=My First Spring Boot Application info.app_version=1.0.0
当访问“/info”时,访问的 JSON 数据:
{"app_name":"My First Spring Boot Application","app_version":"1.0.0"}
当访问 metrics 服务时,能够看到 Spring Boot 经过 SystemPublicMetrics 默认提供的一些系统的性能参数值,包括内存、CPU、Java 类加载和线程等的基本信息。应用能够记录其余所须要的信息。Spring Boot 默认提供了两种类型的性能指标记录方式:gauge 和 counter。gauge 用来记录单个绝对数值,counter 用来记录增量或减量值。好比在一个 Web 应用中,能够用 counter 来记录当前在线的用户数量。当用户登陆时,把 counter 的值加 1;当用户退出时,把 counter 的值减 1。
示例:
@RestController public class GreetingsController { @Autowired private CounterService counterService; @RequestMapping("/greet") public String greet() { counterService.increment("myapp.greet.count"); return "Hello!"; } }
上面代码添加了对 Spring Boot 提供的 CounterService 的依赖。当 greet 方法被调用时,会把名称为“myapp.greet.count”的计数器的值加 1。也就是当用户每次访问“/greet”时,该计算器就会被加 1。除了 CounterService 以外,还可使用 GaugeService 来记录绝对值。