资讯专栏INFORMATION COLUMN

从Tomcat到Spring Boot

hikui / 805人阅读

摘要:暮夏八月是一年中最好的时节,近近地看到了凉爽的希望,却还能享用暖热的余温。距离发布已经年有余,我们尝试在这个夏天把这只已经独自在外游荡了年的野猫装入春天的长靴。总结以上就是从迁移到所需要的所有改动。

暮夏八月是一年中最好的时节,近近地看到了凉爽的希望,却还能享用暖热的余温。距离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是必经的第一个步骤,添加完之后的完整段落如下:

    
        my-app
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.5.1
                
                    1.8
                    1.8
                
            
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    -Xmx64m
                
            
        
    

在这里,我们特别添加了一个configuration段落,设置-Xmx64m,这是因为Tomcat缺省会分配物理内存的1/4为堆内存,这样我们一台电脑最多只能运行4Tomcat服务,内存就不够用了。在这里我们把heap size的最大尺寸设置为只用64m,可以有效节省内存,最多会引起垃圾回收频繁一些而已,这之间的平衡可以自己掌握。

添加spring-boot-starter-parent

Spring Boot是一个非常独立的父母,它认为所有与spring有关的依赖都是它的孩子,所以我们必须引入spring-boot-starter-parent,让它来管理所有姓spring的孩子。

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.4.RELEASE
        
    

由于Spring Boot自己管理所有spring依赖,你还需要把原先加在pom.xml里的所有与spring有关的依赖(以及所有spring想要管理的依赖,例如com.fasterxml.jackson.core)全部删掉,否则会造成版本冲突。比如这样:


org.springframework
spring-core
4.1.1.RELEASE

添加spring-boot-starter-web

Spring Boot唯一需要我们手工添加的依赖只有一个:

        
            org.springframework.boot
            spring-boot-starter-web
        

有了这个依赖以后,Spring Boot项目启动的时候就会内嵌一个Tomcat服务器。同时Spring Boot带来的另外一个好处是:我们从此不必再依赖Tomcat,如果我们想换成其它引擎,只需要加上新引擎,排除掉Tomcat就可以了,假设我们想换成Undertow,只需要这样设置:

        
            org.springframework.boot
            spring-boot-starter-undertow
        

        
            org.springframework.boot
            spring-boot-starter-web
            
                
                    org.springframework.boot
                    spring-boot-starter-tomcat
                
            
        
主程序入口 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
运行

至此为止,就已经完成了从TomcatSpring Boot的迁移。我们可以通过maven运行Spring Boot来看一下效果:

mvn spring-boot:run
添加dubbo

如果以前的项目是由dubbo完成的,暂时还不想破坏原有架构,可以把dubbo集成到Spring Boot中来。

pom.xml

pom.xml中添加dubbo-spring-boot-starter依赖:

        
            com.alibaba.spring.boot
            dubbo-spring-boot-starter
            1.0.2
        

这个dubbo-spring-boot-starter的最高版本是2.0.0,并且即便这个2.0.0也已经被废弃,更高的版本迁移到了incubator-dubbo-spring-boot-project上,但是由于我用的是dubbo较低的版本2.5.3,使用了比较方便的方式,所以不可能采用它的2.0.0版本,更加不可能使用incubator-dubbo-spring-boot-project(这个incubator-dubbo-spring-boot-project项目甚至不支持在application.properties文件中对dubbo做配置)。

Dubbo2.5.7以后废弃了方式,改采@DubboComponentScan方式,我个人认为这种新方式远远不如旧的方式简便,所以目前或者以后也不准备迁移到更高版本的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文件中把war改为jar,这样我们在执行mvn package之后,就可以java -jar myapp.jar来在服务器端进行部署。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76871.html

相关文章

  • 如何优雅关闭 Spring Boot 应用

    摘要:除了,还有十余种,有的是特定操作,比如转储内存日志有的是信息展示,比如显示应用健康状态。 showImg(http://ww1.sinaimg.cn/large/006tNc79gy1g5qb2coyfoj30u00k0tan.jpg); 前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kil...

    xiyang 评论0 收藏0
  • Spring Boot Hello World

    摘要:现在这还是一个空的项目,我们可以在标签中添加我们需要的依赖,例如添加的依赖。修改我们的配置如下目前我们的这个项目还没有导入任何,这点可以通过执行命令确定。 本篇文章是SpringBoot最入门的介绍。我们不借助任何额外的工具,从无到有创建一个Spring Boot的web项目,并运行这个项目。 项目构建 归根结底,Spring Boot就只是一个框架,几个jar而已,没什么神奇的。但使...

    lijinke666 评论0 收藏0
  • spring-boot创建最简单的web应用

    摘要:初衷看了一下相关的书籍,创建一个的应用,是那么的简单。首先,我们只是创建一个简单的并不打算使用默认的,而是使用传统的。在下创建目录并且在目录下新建,内容为页面。如果是在内置的的情况下,应用会自动重启。 初衷 看了一下spring-boot相关的书籍,创建一个hello world!的应用,是那么的简单。然而,自己动手,却很不一样。 首先,我们只是创建一个简单的hello world!并...

    xiaolinbang 评论0 收藏0
  • Spring Boot整合jsp后必须通过spring-boot:run方式启动?

    摘要:为什么整合后必须通过方式启动背景在整合这篇文章中,我们用了两种启动方式方法启动测试发现,通过启动能够正常渲染页面,而通过方法启动无法渲染,本文分析下原因。通过来启动对应的服务器。 为什么整合jsp后必须通过spring-boot:run方式启动? 背景 在Spring Boot - 整合Jsp/FreeMarker这篇文章中,我们用了两种启动方式 mvn clean spring-b...

    roundstones 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<