暮夏八月是一年中最好的時節,近近地看到了涼爽的但願,卻還能享用暖熱的餘溫。距離Phil Webb發佈Spring Boot已經4
年有餘,咱們嘗試在這個夏天把這隻已經獨自在外遊蕩了19
年的野貓Tomcat裝入春天的長靴。java
從零開始安裝Spring Boot
項目,使用內嵌的Tomcat
引擎是比較容易的事情,各類中文教程已經數不勝數,那不是咱們要談論的話題。在這裏咱們要作的是以最小的代價把一個已有的Tomcat
項目改造爲Spring Boot
項目,以實現咱們微服務改造的第一步。git
通常來講,在每個pom.xml
的結尾,都會有一個build
段落,在這裏添加spring-boot-maven-plugin
是必經的第一個步驟,添加完以後的完整段落以下:github
<build> <finalName>my-app</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>-Xmx64m</jvmArguments> </configuration> </plugin> </plugins> </build>
在這裏,咱們特別添加了一個configuration
段落,設置-Xmx
爲64m
,這是由於Tomcat
缺省會分配物理內存的1/4
爲堆內存,這樣咱們一臺電腦最多隻能運行4
個Tomcat
服務,內存就不夠用了。在這裏咱們把heap size
的最大尺寸設置爲只用64m
,能夠有效節省內存,最多會引發垃圾回收頻繁一些而已,這之間的平衡能夠本身掌握。web
Spring Boot
是一個很是獨立的父母,它認爲全部與spring
有關的依賴都是它的孩子,因此咱們必須引入spring-boot-starter-parent
,讓它來管理全部姓spring
的孩子。spring
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath/> </parent>
因爲Spring Boot
本身管理全部spring
依賴,你還須要把原先加在pom.xml
裏的全部與spring
有關的依賴(以及全部spring
想要管理的依賴,例如com.fasterxml.jackson.core
)所有刪掉,不然會形成版本衝突。好比這樣:apache
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.1.1.RELEASE</version></dependency>tomcat
Spring Boot
惟一須要咱們手工添加的依賴只有一個:服務器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
有了這個依賴之後,Spring Boot
項目啓動的時候就會內嵌一個Tomcat
服務器。同時Spring Boot
帶來的另一個好處是:咱們今後沒必要再依賴Tomcat
,若是咱們想換成其它引擎,只須要加上新引擎,排除掉Tomcat
就能夠了,假設咱們想換成Undertow,只須要這樣設置:架構
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency> <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>
傳統的Tomcat
應用是讓Tomcat
先啓動,而後加載咱們的war
文件,改造以後是Spring Boot
先啓動,由Spring Boot
來加載Tomcat
,因此咱們須要給咱們的應用裏增長一個Application.java
文件:app
package com.domain.app; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
傳統的Tomcat
是把全部配置項放在webapp/WEB-INF/web.xml
裏來管理的,Spring Boot
不使用web.xml
文件,它把全部配置項都放在resources/application.properties
文件中,例如:
server.port=8090 server.servlet.context-path=/app
至此爲止,就已經完成了從Tomcat
到Spring Boot
的遷移。咱們能夠經過maven
運行Spring Boot
來看一下效果:
mvn spring-boot:run
若是之前的項目是由dubbo
完成的,暫時還不想破壞原有架構,能夠把dubbo
集成到Spring Boot
中來。
在pom.xml
中添加dubbo-spring-boot-starter依賴:
<dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>1.0.2</version> </dependency>
這個dubbo-spring-boot-starter
的最高版本是2.0.0
,而且即使這個2.0.0
也已經被廢棄,更高的版本遷移到了incubator-dubbo-spring-boot-project上,可是因爲我用的是dubbo
較低的版本2.5.3
,使用了比較方便的<dubbo:annotation>
方式,因此不可能採用它的2.0.0
版本,更加不可能使用incubator-dubbo-spring-boot-project
(這個incubator-dubbo-spring-boot-project
項目甚至不支持在application.properties
文件中對dubbo
作配置)。
Dubbo
從2.5.7
之後廢棄了<dubbo:annotation>方式,改採@DubboComponentScan
方式,我我的認爲這種新方式遠遠不如舊的<dubbo:annotation>
方式簡便,因此目前或者之後也不許備遷移到更高版本的dubbo
了。
在pom.xml
中添加對dubbo
的依賴後,還須要在Application.java
中添加dubbo
的自動配置功能:
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration; @SpringBootApplication @EnableDubboConfiguration
而後在application.properties
文件中添加dubbo
的配置項:
spring.dubbo.appname=my-app spring.dubbo.registry=zookeeper://myip.mydomain.com:2181
這個配置項功能很弱,但勉強夠用。雖然它會形成一些很難看的日誌:
[2018-08-26 12:21:25] WARN - [DUBBO] ReferenceConfig(null) is not DESTROYED when FINALIZE, dubbo version: 2.5.3, current host: 192.168.1.2
可是鑑於這個插件已經被廢棄了,不會有人來解決這個問題,只能勉強這麼用了。
以上就是從Tomcat
遷移到Spring Boot
所須要的全部改動。總計只是修改了pom.xml
一個文件,新增了Application.java
和application.properties
兩個文件,新增代碼行數不超過20
行,整個遷移過程仍是比較簡便的。
固然,僅僅在代碼層面遷移到Spring Boot
不是最終目的,咱們還須要在pom.xml
文件中把<packaging>war</packaging>
改成<packaging>jar</packaging>
,這樣咱們在執行mvn package
以後,就能夠java -jar myapp.jar
來在服務器端進行部署。
更進一步,當以Spring Boot
方式啓動的微服務愈來愈多的時候,服務治理將成爲一個難題,這時候就須要考慮引入Eureka
或者甚至Kubernetes
進行服務治理,那將是另一個大話題了。