从Tomcat到Spring Boot

暮夏八月是一年中最好的时节,近近地看到了凉爽的但愿,却还能享用暖热的余温。距离Phil Webb发布Spring Boot已经4年有余,咱们尝试在这个夏天把这只已经独自在外游荡了19年的野猫Tomcat装入春天的长靴。java

从零开始安装Spring Boot项目,使用内嵌的Tomcat引擎是比较容易的事情,各类中文教程已经数不胜数,那不是咱们要谈论的话题。在这里咱们要作的是以最小的代价把一个已有的Tomcat项目改造为Spring Boot项目,以实现咱们微服务改造的第一步。git

对pom.xml的修改

添加spring-boot-maven-plugin

通常来讲,在每个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段落,设置-Xmx64m,这是由于Tomcat缺省会分配物理内存的1/4为堆内存,这样咱们一台电脑最多只能运行4Tomcat服务,内存就不够用了。在这里咱们把heap size的最大尺寸设置为只用64m,能够有效节省内存,最多会引发垃圾回收频繁一些而已,这之间的平衡能够本身掌握。web

添加spring-boot-starter-parent

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-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文件: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);
    }
}

application.properties

传统的Tomcat是把全部配置项放在webapp/WEB-INF/web.xml里来管理的,Spring Boot不使用web.xml文件,它把全部配置项都放在resources/application.properties文件中,例如:

server.port=8090
server.servlet.context-path=/app

运行

至此为止,就已经完成了从TomcatSpring 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作配置)。

Dubbo2.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.javaapplication.properties两个文件,新增代码行数不超过20行,整个迁移过程仍是比较简便的。

固然,仅仅在代码层面迁移到Spring Boot不是最终目的,咱们还须要在pom.xml文件中把<packaging>war</packaging>改成<packaging>jar</packaging>,这样咱们在执行mvn package以后,就能够java -jar myapp.jar来在服务器端进行部署。

更进一步,当以Spring Boot方式启动的微服务愈来愈多的时候,服务治理将成为一个难题,这时候就须要考虑引入Eureka或者甚至Kubernetes进行服务治理,那将是另一个大话题了。

相关文章
相关标签/搜索