1、spring boot內置web
spring boot 其默認是集成web容器的,啟動方式由像普通java程序一樣,main函數入口啟動。其內置tomcat容器或jetty容器,具體由配置來決定(默認tomcat)。當然你也可以將項目打包成war包,放到獨立的web容器中(tomcat、weblogic等等),當然在此之前你要對程序入口做簡單調整。
對server的幾個常用的配置做個簡單說明:
1
2
3
4
5
6
7
8
9
10
|
# 項目contextpath,一般在正式發布版本中,我們不配置 server.context-path=/myspringboot # 錯誤頁,指定發生錯誤時,跳轉的url。請查看basicerrorcontroller源碼便知 server.error.path=/error # 服務端口 server.port= 9090 # session最大超時時間(分鐘),默認為 30 server.session-timeout= 60 # 該服務綁定ip地址,啟動服務器時如本機不是該ip地址則拋出異常啟動失敗,只有特殊需求的情況下才配置 # server.address= 192.168 . 16.11 |
tomcat
tomcat為spring boot的默認容器,下面是幾個常用配置:
pom.xml依賴配置:
1
2
3
4
5
|
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-tomcat</artifactid> <!--<scope>provided</scope>--> </dependency> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# tomcat最大線程數,默認為 200 server.tomcat.max-threads= 800 # tomcat的uri編碼 server.tomcat.uri-encoding=utf- 8 # 存放tomcat的日志、dump等文件的臨時文件夾,默認為系統的tmp文件夾(如:c:\users\shanhy\appdata\local\temp) server.tomcat.basedir=h:/springboot-tomcat-tmp # 打開tomcat的access日志,并可以設置日志格式的方法: #server.tomcat.access-log-enabled= true #server.tomcat.access-log-pattern= # accesslog目錄,默認在basedir/logs #server.tomcat.accesslog.directory= # 日志文件目錄 logging.path=h:/springboot-tomcat-tmp # 日志文件名稱,默認為spring.log logging.file=myapp.log |
jetty
如果你要選擇jetty,也非常簡單,就是把pom中的tomcat依賴排除,并加入jetty容器的依賴,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<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> |
項目構建我們使用maven或gradle,這將使項目依賴、jar包管理、以及打包部署變的非常方便。
2、maven構建spring boot框架的可執行jar包
在spring boot里,很吸引人的一個特性是可以直接把應用打包成為一個jar/war,然后這個jar/war是可以直接啟動的,不需要另外配置一個web server。單獨的jar包,然后通過java -jar <name>.jar命令運行。
1.1 maven
springbootmaven插件為maven提供springboot支持,它允許你打包可執行jar或war存檔,然后就地運行應用。為了使用
它,你需要使用maven 3.2(或更高版本)。
maven用戶可以繼承spring-boot-starter-parent項目來獲取合適的默認設置。該父項目提供以下特性:
1、默認編譯級別為java 1.6
2、源碼編碼為utf-8
3、一個依賴管理節點,允許你省略普通依賴的 <version>標簽,繼承自 spring-boot-dependenciespom。
4、合適的插件配置(exec插件,surefire,git commitid,shade)
5、針對 application.properties和application.yml 的資源過濾
6、最后一點:由于默認配置文件接收spring風格的占位符( ${...} ),maven filtering改用@..@ 占位符(你可以使用maven屬性 resource.delimiter來覆蓋它)。
1.2繼承starter parent
想配置你的項目繼承 spring-boot-starter-parent 只需要簡單地設置parent為:
1
2
3
4
5
6
|
<!-- inherit defaults from spring boot --> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version> 1.3 . 0 .build-snapshot</version> </parent> |
注:你應該只需要在該依賴上指定spring boot版本。如他的starters,你可以放心的省略版本號。
1.3使用沒有父pom的springboot
不是每個人都喜歡繼承spring-boot-starter-parentpom。你可能需要使用公司標準parent,或你可能傾向于顯式聲明所有
maven配置。
如果你不使用 spring-boot-starter-parent ,通過使用一個scope=import 的依賴,你仍能獲取到依賴管理的好處:
1
2
3
4
5
6
7
8
9
10
11
12
|
<dependencymanagement> <dependencies> <dependency> <!-- import dependency management from spring boot --> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-dependencies</artifactid> <version> 1.3 . 0 .build-snapshot</version> <type>pom</type> <scope> import </scope> </dependency> </dependencies> </dependencymanagement> |
1.4改變java版本
spring-boot-starter-parent選擇相當保守的java兼容策略。如果你遵循我們的建議,使用最新的java版本,你可以添加一
個 java.version屬性:
1
2
3
|
<properties> <java.version> 1.8 </java.version> </properties> |
1.5 使用spring boot maven插件
springboot包含一個maven插件,它可以將項目打包成一個可執行jar。如果想使用它,你可以將該插件添加到<plugins>節
點處:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?xml version= "1.0" encoding= "utf-8" ?> <project xmlns= "http://maven.apache.org/pom/4.0.0" xmlns:xsi= "http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation= "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelversion> 4.0 . 0 </modelversion> <!-- ... --> <build> <plugins> <plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> <version> 1.3 . 0 .build-snapshot</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> |
注:如果使用spring-boot-tarter-parent pom,你只需要添加該插件而無需配置它,除非你想改變定義在partent中的設置。
該配置會在maven生命周期的 package階段重新打包一個jar或war。下面的示例顯示在target目錄下既有重新打包后的jar,
也有原始的jar:
1.6 linux下打包方法:
使用 mvn clean package 命令打包
如果還沒有安裝maven :
1
|
yum -y install apache-maven |
或者單獨下載安裝:
1
2
|
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 |
設置環境變量:
1
2
|
mvn_home=/usr/local/app/apache-maven- 3.3 . 9 export path=$path:$mvn_home/bin |
然后可以使用以下命令編譯:
1
|
mvn clean package |
可以追加參數 -dmaven.test.skip=true 跳過測試。
1
2
|
$mvn package $ls target/*.ja |
target/myproject-1.0.0.jartarget/myproject-1.0.0.jar.original
1.6 使用eclipse下打包方法:
打開maven插件的maven package,就可以打包了:
打包出來的文件:
如果不包含像上面那樣的<execution/>,你可以自己運行該插件(但只有在package目標也被使用的情況)。例如:
1
2
|
$ mvn package spring-boot:repackage $ ls target/*.jar |
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
如果使用一個里程碑或快照版本,你還需要添加正確的pluginrepository元素:
1
2
3
4
5
6
7
8
9
10
|
<pluginrepositories> <pluginrepository> <id>spring-snapshots</id> <url>http: //repo.spring.io/snapshot</url> </pluginrepository> <pluginrepository> <id>spring-milestones</id> <url>http: //repo.spring.io/milestone</url> </pluginrepository> </pluginrepositories> |
打包可執行jar和war文件
一旦spring-boot-maven-plugin被包含到你的pom.xml中,它就會自動嘗試使用spring-boot:repackage目標重寫存檔以使它們能夠執行。為了構建一個jar或war,你應該使用常規的packaging元素配置你的項目:
1
2
3
4
5
6
7
|
<?xml version= "1.0" encoding= "utf-8" ?> <project xmlns= "http://maven.apache.org/pom/4.0.0" xmlns:xsi= "http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation= "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <!-- ... --> <packaging>jar</packaging> <!-- ... --> </project> |
生成的存檔在 package 階段會被springboot增強。你想啟動的main類即可以通過指定一個配置選項,也可以通過為manifest添加一個main-class屬性這種常規的方式實現。如果你沒有指定一個main類,該插件會搜索帶有publicstaticvoidmain(string[]args)方法的類。
為了構建和運行一個項目的artifact,你可以輸入以下命令:
1
2
|
$ mvn package $ java -jar target/spring-boot01- 1.0 -snapshot.jar |
這種方式,只要控制臺關閉,服務就不能訪問了。下面我們使得 jar 包在后臺運行:
java -jar spring-boot01-1.0-snapshot.jar > log.file 2>&1 &
為了構建一個即是可執行的,又能部署到一個外部容器的war文件,你需要標記內嵌容器依賴為"provided",例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?xml version= "1.0" encoding= "utf-8" ?> <project xmlns= "http://maven.apache.org/pom/4.0.0" xmlns:xsi= "http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation= "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <!-- ... --> <packaging>war</packaging> <!-- ... --> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-tomcat</artifactid> <scope>provided</scope> </dependency> <!-- ... --> </dependencies> </project> |
4、打包為單個jar時,spring boot的啟動方式
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打好的包的目錄結構(不重要的省略掉):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
├── meta-inf │ ├── manifest.mf ├── application.properties ├── com │ └── example │ └── springbootdemoapplication. class ├── lib │ ├── aopalliance- 1.0 .jar │ ├── spring-beans- 4.2 . 3 .release.jar │ ├── ... └── org └── springframework └── boot └── loader ├── executablearchivelauncher. class ├── jarlauncher. class ├── javaagentdetector. class ├── launchedurlclassloader. class ├── launcher. class ├── mainmethodrunner. class ├── ... |
依次來看下這些內容。
manifest.mf
1
2
3
4
5
6
7
8
|
manifest-version: 1.0 start- class : com.example.springbootdemoapplication implementation-vendor-id: com.example spring-boot-version: 1.3 . 0 .release created-by: apache maven 3.3 . 3 build-jdk: 1.8 .0_60 implementation-vendor: pivotal software, inc. main- class : org.springframework.boot.loader.jarlauncher |
可以看到有main-class是org.springframework.boot.loader.jarlauncher ,這個是jar啟動的main函數。
還有一個start-class是com.example.springbootdemoapplication,這個是我們應用自己的main函數
1
2
3
4
5
6
7
|
@springbootapplication public class springbootdemoapplication { public static void main(string[] args) { springapplication.run(springbootdemoapplication. class , args); } } |
com/example 目錄
這下面放的是應用的.class文件。
lib目錄
這里存放的是應用的maven依賴的jar包文件。
比如spring-beans,spring-mvc等jar。
org/springframework/boot/loader 目錄
這下面存放的是spring boot loader的.class文件。
啟動:
我們直接啟動:java -jar demo-0.0.1-snapshot.jar
5、maven添加本地jar包
我們有時候項目依賴外部的jar,我們使用eclipse開發的時候我們直接通過build path添加jar就可以,但是使用mvn 打包的時候就會缺少這個包。
1. 使用system scope
我們直接引入rabbitmq-client.jar。這個方式比較靈活,到新的服務器上,無需做額外的操作。
1
2
3
4
5
6
7
|
<dependency> <groupid>rabbitmq.client</groupid> <artifactid>rabbitmq.client</artifactid> <version> 3.0 </version> <scope>system</scope> <systempath>${basedir}/src/main/web-inf/lib/rabbitmq-client.jar</systempath> </dependency> |
1、groupid和artifactid以及version都是可以隨便填寫的 ,scope必須填寫為system,而systempath我們現在我們jar包的目錄地址就可以了
2、${basedir}就是項目根目錄
2. 將jar包安裝到本地repository中
這個需要在新機器上執行mvn install:install-file命令。
1
2
3
4
5
6
7
|
mvn install:install-file -dfile= jar文件所存放的地址 -dgroupid= jar文件所屬的group:包名 -dartifactid= jar的項目名 名稱,一般就是去掉后綴的文件名 -dversion=版本號 -dpackaging=jar:此包的打包形式,就是jar -dgeneratepom= true |
例如執行命令:
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
在項目中引用:
1
2
3
4
5
|
<dependency> <groupid>com.rabbitmq</groupid> <artifactid>client</artifactid> <version> 3.5 . 0 </version> </dependency> |
3、添加 in project repository
設置項目的庫目錄
1
2
3
4
5
6
7
8
9
|
<repository> <id>in-project</id> <name>in project repo</name> <url>file: //${project.basedir}/lib</url> </repository> |
添加依賴:
1
2
3
4
5
6
7
8
9
|
<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
6、部署到javaee容器
修改啟動類,繼承 springbootservletinitializer 并重寫 configure 方法
1
2
3
4
5
6
7
8
9
10
|
public class springbootsampleapplication extends springbootservletinitializer{ private static final logger logger = loggerfactory.getlogger(springbootsampleapplication. class ); @override protected springapplicationbuilder configure(springapplicationbuilder builder) { return builder.sources( this .getclass()); } } |
修改pom文件中jar 為 war
1
2
|
<!-- <packaging>jar</packaging> --> <packaging>war</packaging> |
修改pom,排除tomcat插件
1
2
3
4
5
6
7
8
9
10
|
<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> |
打包部署到容器
7、熱部署
在我們開發過程中,我們需要經常修改,為了避免重復啟動項目,我們可以啟用熱部署。
spring-loaded項目提供了強大的熱部署功能,添加/刪除/修改 方法/字段/接口/枚舉 等代碼的時候都可以熱部署,速度很快,很方便。
想在spring boot中使用該功能非常簡單,就是在spring-boot-maven-plugin插件下面添加依賴:
1
2
3
4
5
6
7
|
<dependencies> <dependency> <groupid>org.springframework</groupid> <artifactid>springloaded</artifactid> <version> 1.2 . 5 .release</version> </dependency> </dependencies> |
添加以后,通過mvn spring-boot:run啟動就支持熱部署了。
注意:使用熱部署的時候,需要ide編譯類后才能生效,你可以打開自動編譯功能,這樣在你保存修改的時候,類就自動重新加載了。
8、使用profile區分環境
application.properties區分環境
spring boot 可以在 “配置文件”、“java代碼類”、“日志配置” 中來配置profile區分不同環境執行不同的結果
1、配置文件
使用配置文件application.yml 和 application.properties 有所區別
以application.properties 為例,通過文件名來區分環境 application-{profile}.properties
1
2
3
4
5
6
7
8
9
10
11
|
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定義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環境的打包。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<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> |
9、創建一個linux 應用的sh腳本
下面幾個腳本僅供參考:
打包:clean.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 0 、check user time_stamp=`date +%y%m%d%h%m` who=`whoami` if [ "$who" != 'www' ]; then echo 'current user is not www' echo 'exit' exit fi code_home=/home/www/app projectname=qrealtime cd $code_home/$projectname git pull mvn clean package pid=`ps -ef |grep $projectname |grep -v "grep" |awk '{print $2}' ` if [ $pid != "" ]; then echo "app is running and pid=$pid" else echo "app is not running." fi |
start.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 0 、check user time_stamp=`date +%y%m%d%h%m` who=`whoami` if [ "$who" != 'www' ]; then echo 'current user is not www' echo 'exit' exit fi code_home=/home/www/app projectname=qrealtime cd $code_home/$projectname pid=`ps -ef |grep $projectname |grep -v "grep" |awk '{print $2}' ` if [ $pid ]; then echo "app is running and pid=$pid" else nohup java -jar $code_home/$projectname/target/$<span style= "font-family: 'microsoft yahei';" >projectname</span><span style= "font-family: 'microsoft yahei';" >- 0.0 . 1 -snapshot.jar > /dev/ null 2 >& 1 &</span> fi |
stop.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 0 、check user time_stamp=`date +%y%m%d%h%m` who=`whoami` if [ "$who" != 'www' ]; then echo 'current user is not www' echo 'exit' exit fi code_home=/home/www/app projectname=qrealtime cd $code_home/$projectname pid=`ps -ef |grep $projectname |grep -v "grep" |awk '{print $2}' ` if [ $pid ]; then echo "app is running and pid=$pid" kill - 9 $pid if [[ $? -eq 0 ]];then echo "sucess to stop $projectname " else echo "fail to stop $projectname " fi fi |
restart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 0 、check user time_stamp=`date +%y%m%d%h%m` who=`whoami` if [ "$who" != 'www' ]; then echo 'current user is not www' echo 'exit' exit fi code_home=/home/www/app projectname=qrealtime cd $code_home/$projectname pid=`ps -ef |grep $projectname |grep -v "grep" |awk '{print $2}' ` if [ $pid ]; then echo "app is running and pid=$pid" kill - 9 $pid fi nohup java -jar $code_home/$projectname/target/$projectname- 0.0 . 1 -snapshot.jar > /dev/ null 2 >& 1 & |
10、spring boot應用的docker化
首先看spring boot應用程序的docker化,由于spring boot內嵌了tomcat、jetty等容器,因此我們對docker鏡像的要求就是需要java運行環境。我的應用代碼的的dockerfile文件如下:
1
2
3
4
5
6
7
8
9
10
|
#基礎鏡像:倉庫是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就自動構建并測試剛提交的代碼,這就是我理解的持續交付。
11、守護進程啟動
使用java命令運行應用非常簡單,但是通常我們都是通過ssh命令連接到服務器并運行它,一旦ssh連接斷開,那么由它fork的java子進程也就隨之銷毀了。所以我們必須借助工具將應用作為服務運行在服務器上:
systemd
systemd 是linux 下的一款系統和服務管理器。可以為spring boot應用編寫啟動腳本:
1
2
3
4
5
6
7
8
9
|
[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配置:
1
2
3
4
5
6
7
|
[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 |
12、生產環境運維支持
與開發和測試環境不同的是,當應用部署到生產環境時,需要各種運維相關的功能的支持,包括性能指標、運行信息和應用管理等。所有這些功能都有很多技術和開源庫可以實現。spring boot 對這些運維相關的功能進行了整合,形成了一個功能完備和可定制的功能集,稱之為 actuator。只需要在 pom 文件中增加對 “org.springframe.boot:spring-boot-starter-actuator” 的依賴就可以添加 actuator。actuator 在添加之后,會自動暴露一些 http 服務來提供這些信息。這些 http 服務的說明如表 2。
spring boot actuator 所提供的 http 服務
名稱 | 說明 | 是否包含敏感信息 |
---|---|---|
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。下面對幾個重要的服務進行介紹。
health 服務
spring boot 默認提供了對應用本身、關系數據庫連接、mongodb、redis 和 rabbit mq 的健康狀態的檢測功能。當應用中添加了 datasource 類型的 bean 時,spring boot 會自動在 health 服務中暴露數據庫連接的信息。應用也可以提供自己的健康狀態信息,如代碼清單 7 所示。
health 服務
1
2
3
4
5
6
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.”開頭的配置參數會被自動的由 info 服務來暴露。只需要往 application.properties 中添加以“info.”開頭的參數即可,如:
1
2
|
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 服務
當訪問 metrics 服務時,可以看到 spring boot 通過 systempublicmetrics 默認提供的一些系統的性能參數值,包括內存、cpu、java 類加載和線程等的基本信息。應用可以記錄其他所需要的信息。spring boot 默認提供了兩種類型的性能指標記錄方式:gauge 和 counter。gauge 用來記錄單個絕對數值,counter 用來記錄增量或減量值。比如在一個 web 應用中,可以用 counter 來記錄當前在線的用戶數量。當用戶登錄時,把 counter 的值加 1;當用戶退出時,把 counter 的值減 1。
示例:
1
2
3
4
5
6
7
8
9
10
|
@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 來記錄絕對值。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/hguisu/article/details/51072683