从Tomcat到Spring Boot
暮夏八月是一年中最好的时节,近近地看到了凉爽的希望,却还能享用暖热的余温。距离Phil Webb发布Spring Boot已经4
年有余,我们尝试在这个夏天把这只已经独自在外游荡了19
年的野猫Tomcat装入春天的长靴。
从零开始安装Spring Boot
项目,使用内嵌的Tomcat
引擎是比较容易的事情,各种中文教程已经数不胜数,那不是我们要谈论的话题。在这里我们要做的是以最小的代价把一个已有的Tomcat
项目改造为Spring Boot
项目,以实现我们微服务改造的第一步。
对pom.xml的修改
添加spring-boot-maven-plugin
一般来说,在每一个pom.xml
的结尾,都会有一个build
段落,在这里添加spring-boot-maven-plugin
是必经的第一个步骤,添加完之后的完整段落如下:
<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
,可以有效节省内存,最多会引起垃圾回收频繁一些而已,这之间的平衡可以自己掌握。
添加spring-boot-starter-parent
Spring Boot
是一个非常独立的父母,它认为所有与spring
有关的依赖都是它的孩子,所以我们必须引入spring-boot-starter-parent
,让它来管理所有姓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
)全部删掉,否则会造成版本冲突。比如这样:
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.1.1.RELEASE</version></dependency>
添加spring-boot-starter-web
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>
主程序入口
Application.java
传统的Tomcat
应用是让Tomcat
先启动,然后加载我们的war
文件,改造之后是Spring Boot
先启动,由Spring Boot
来加载Tomcat
,所以我们需要给我们的应用里增加一个Application.java
文件:
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); } }
application.properties
传统的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
完成的,暂时还不想破坏原有架构,可以把dubbo
集成到Spring Boot
中来。
pom.xml
在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
了。
Application.java
在pom.xml
中添加对dubbo
的依赖后,还需要在Application.java
中添加dubbo
的自动配置功能:
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration; @SpringBootApplication @EnableDubboConfiguration
application.properties
然后在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
进行服务治理,那将是另外一个大话题了。
相关推荐
-
一文了解ConfigurationConditon接口 Java框架
2019-6-27
-
Spring Boot 支持 Https 有那么难吗? Java框架
2019-8-16
-
聊聊dubbo的CacheFilter Java框架
2019-6-29
-
SpringBoot开发案例之分布式集群共享Session Java框架
2019-9-3
-
阿里云Redis开发规范 Java框架
2019-3-27
-
微服务化小团队集群的组织和管理 Java框架
2019-3-27
-
Spring Data REST不完全指南(三) Java框架
2020-6-11
-
SpringBoot 2.0 系列002 –运行流程分析 Java框架
2020-6-1
-
Spring Cloud构建微服务架构:消息驱动的微服务(核心概念)【Dalston版】 Java框架
2020-6-1
-
如何进行高效的源码阅读:以Spring Cache扩展为例带你搞清楚 Java框架
2019-7-28