热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从Tomcat到SpringBoot(精华贴)

原文格式清晰,转载自:https:segmentfault.coma1190000016152932暮夏八月是一年中最好的时节,近近地看到

原文格式清晰,转载自:https://segmentfault.com/a/1190000016152932

 

暮夏八月是一年中最好的时节,近近地看到了凉爽的希望,却还能享用暖热的余温。距离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-apporg.apache.maven.pluginsmaven-compiler-plugin3.5.11.81.8org.springframework.bootspring-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.bootspring-boot-starter-parent2.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.bootspring-boot-starter-web

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

org.springframework.bootspring-boot-starter-undertoworg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-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.bootdubbo-spring-boot-starter1.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, dubboversion: 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进行服务治理,那将是另外一个大话题了。

 


推荐阅读
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • 一:跨域问题1、同源策略(浏览器的安全策略)    只允许当前页面朝当前域下发请求,如果向其他域发请求,请求可以正常发送,数据也可以拿回,但是被浏览器拦截了  2、c ... [详细]
  • 都说Python处理速度慢,为何月活7亿的 Instagram依然在使用Python?
    点击“Python编程与实战”,选择“置顶公众号”第一时间获取Python技术干货!来自|简书作者|我爱学python链接|https:www.jian ... [详细]
  • 尾部|柜台_Java并发线程池篇附场景分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java并发-线程池篇-附场景分析相关的知识,希望对你有一定的参考价值。作者:汤圆个人博客 ... [详细]
  • 1、问题?项目打包报错;程序包com.sun.image.codec.jpeg不存在;2、原因尚不明确;由于jdk升级问题。才出现的,可能jdk6就不会出现;初步怀疑jdk的问题; ... [详细]
author-avatar
王友仁国珍_326
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有