以前我们构建 Web 服务的方法是将程序打包后交给 Web 容器,让容器启动服务进程,加载程序包,然后对外提供进程。
现在我们有更方便快捷的方法来构建 Web 服务:用一些轻量级的 Web 框架,让我们的程序包内嵌 Web 服务能力,直接运行一个 main 方法就能启动进程提供 Web 服务。
这类轻量级的 Web 框架有很多。如,Spring Boot、Dropwizard、Vert.x、Grails、Play Framework 等。其中 Spring Boot 最常见。
这类框架工具的特点如下:
优点
1. 容易部署
Web 容器的安装、配置、部署都是巨麻烦的事。为了实现业务而不得不去了解这么一堆垃圾信息是非常浪费的。
内嵌 Web 服务能力的方式使我们运行一个 main 方法就能启动服务,有巨大的优势。
2. 运行环境维护成本低
内嵌 Web 服务能力这个特性让我们耗费在维护运行时环境上的资源更少,原理Web容器那堆麻烦事。开发、测试、产品等环境的维护工作都大大简化
3. 容易实现持续交付
没了Web容器这类环境上的耦合且难配置场景,持续交付的实现也容易得多
4. 研发周期短
更容易启动服务也就意味着研发过程中可以将更多时间用于处理业务。
如,“打包交给 Web 容器再启动”这个步骤的消失极大地解放了程序员。在调试的时候这种优势非常明显。
与开发本地桌面程序相比,Web程序开发时的运行时环境处理简直就是噩梦。
旗帜鲜明地反对“不讲Web服务原理,直接照猫画虎上手搭建Web服务”的教学方式。
就如同旗帜鲜明地反对“不手把手带学生入门,直接放羊式从自学C语言找编程入口”的教学方式。
5. 对第三方库版本的替换更方便
如果多个服务寄宿在同一个Web容器中,且它们共用了一个某服务想替换的第三方库。那么对这个第三库版本替换的操作几乎就成了“瞎赌”,对其它服务的影响无法估计。
6. 对依赖组件的管理更清晰
Web 容器不可能包含服务所依赖的所有组件。所以打包服务程序时,我们还是得将这些 Web 容器未提供的必要组件一起打包。
这就形成部分依赖组件来自 Web 容器,部分来自服务程序包自带。这会增加管理复杂度。
而 Spring Boot 这类框架则是将所有依赖的组件一起打包,管理起来方便多了。
7. 资源隔离更彻底
寄宿在同一个Web容器中的多个服务会共享一些CPU、内存、文件等资源。
当它们被拆分成独立的进程,由操作系统直接提供资源时,资源隔离更彻底。这有利于规划资源分配。
缺点
1. 运维工作量增加
没了Web容器,原来寄宿其中的服务被拆分到多个独立的服务中,这就需要对它们分别进行监控管理。
虽然工作复杂度可能会因为服务的彻底分离而降低,但工作量会增加——每个服务来一套。
当然,因为复杂度的降低,运维效率提高,总体工作时间可能反而降低,幸福感会提升。
2. 研发组织架构需要围绕服务进行重构
服务的彻底分离,也就意味着每个服务需要有一套完整的班子伺候它。每个对应的小组都是跨职能跨技能的。
所以原先专职开发组、测试组、运维组需要被拆分,围绕具体的服务应用进行重构。
当然,这种变动也许是好事。但是组织架构变动也是要成本的。
3. 研发成本增加(短时间内)
为每个服务配置一整套资源(包括人力、软硬件、定制的规章流程等)很可能是原有资源不能满足的。
如,某些类型的资源可能过剩,但某些类型的资源却极度缺乏。
4. 项目资源配置不足导致出错几率增大
原先通过 Web 容器管理这些服务时,某些安全性配置、异常处理机制等一般都有专人跟进统一把控。
当拆分给各小组完全复制时,这些与业务主逻辑关联度较低的事项很可能因为人力不足而被遗漏。
像数据冗余策略、超时机制、回滚机制等都是需要考虑的。这也是分布式系统经常会出问题的地方。
相关推荐
Spring Boot Starter Web 提供了一些依赖项来开发 Web 应用程序,包括Spring - core,beans,context,aop,Web MVC - (Spring MVC),Jackson - for JSON Binding,Validation - Hibernate,Validation API,...
弹簧启动启动器净额 介绍 这是一个基于netty API(4.1.12.Final)的Spring Boot嵌入式servlet容器项目。 该项目已发布到Maven中心存储库中,请参阅 ... < artifactId>spring-boot-starter-web < groupId>org.spr
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; @SpringBootApplication public class DemoApplication { public ...
例如,如果你想使用Spring MVC和Thymeleaf进行Web开发,只需要引入`spring-boot-starter-web`和`spring-boot-starter-thymeleaf`的依赖即可。 2. **自动配置(Auto Configuration)** Spring Boot根据类路径中的...
- **Web Starter** (`spring-boot-starter-web`):包含了构建一个基本Web应用所需的所有依赖,如Spring Web MVC、Tomcat嵌入式服务器等。 - **Data JPA Starter** (`spring-boot-starter-data-jpa`):提供了JPA支持...
This book covers the full set of technologies that you need to know to become a full-stack web developer with Spring Boot for the backend and React for the frontend. This comprehensive guide ...
这种变化提高了代码的可读性和可维护性,也使得Spring Boot 2能更好地支持未来Web服务器技术的发展。在实际项目中,根据需求选择适当的Web服务器工厂类,并利用`WebServerFactoryCustomizer`接口,可以轻松地调整和...
Spring Boot Documentation 1. About the Documentation 2. Getting Help 3. First Steps 4. Working with Spring Boot 5. Learning about Spring Boot Features 6. Moving to Production 7. Advanced Topics II. ...
后端,我们需要添加对文件上传处理的支持,这可能涉及Spring Boot的`spring-boot-starter-web`依赖以及文件存储库,如`spring-boot-starter-data-jpa`或`spring-boot-starter-data-mongodb`,取决于你选择的持久化...
1. Web应用:Spring提供了基于Web的应用程序开发功能,可以快速构建Web应用程序。 2. 数据持久化:Spring提供了对数据库的访问和操作功能,可以实现数据的持久化。 3. 事务处理:Spring提供了事务处理的功能,可以...
Spring Boot Web应用程序配置详解 Spring Boot作为一个流行的Java框架,提供了许多强大且灵活的配置选项,帮助开发者快速构建Web应用程序。下面,我们将详细介绍Spring Boot Web应用程序配置的几个方面。 1. HTTP...
在Spring Boot中,只需要添加`spring-boot-starter-web`依赖,它会自动包含`spring-web`和其他必要的Web组件: ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-web ``` 5. **...
在Spring Boot应用中,Web容器的定制是相当重要的,它允许开发者根据项目需求调整服务器的行为。Spring Boot默认使用Tomcat作为内置的Web容器,但我们可以对其进行各种定制,例如更改监听的端口号、设置session超时...
Spring框架包含多个模块,如Core Container(核心容器)、Data Access/Integration(数据访问/集成)、Web(Web层)、AOP、Instruments(工具类)等。Core Container主要包括Bean工厂和ApplicationContext,它们负责...
Spring Framework 5.3.4包含多个核心模块,如Core Container(核心容器)、Data Access/Integration(数据访问/集成)、Web(Web层)、AOP(面向切面编程)等。每个模块都有其特定的功能,如Core Container中的Bean...
5. **模块化设计**:Spring框架由多个模块组成,如Core Container、Data Access/Integration、Web、AOP、Inversion of Control等,这种模块化设计允许开发者按需选择和组合,降低了复杂性。 6. **安全增强**:...