强大!Spring Boot全新模块化管理方式

开发 前端
Spring Boot还提供了丰富的服务配置选项,允许开发者根据需要调整Tomcat服务器的默认行为,如端口,线程数等等,这极大地提升了开发效率。

环境:SpringBoot3.2.5

1. 简介

默认情况下,Spring Boot项目会内置一个Tomcat服务器,用于快速启动和运行Web应用程序。这一特性极大地简化了开发和部署流程,开发者无需单独配置和安装Tomcat服务器。Spring Boot还提供了丰富的服务配置选项,允许开发者根据需要调整Tomcat服务器的默认行为,如端口,线程数等等,这极大地提升了开发效率。

当我们在Spring Boot项目中引入Actuator后,并且进行了如下的配置,你是否注意到启动的应用有什么不同呢?

management:
  server:
    port: 7000

当我们修改了Actuator端口后,启动服务后控制台输出如下:

图片图片

应用启动了2个Tomcat,所有关于Actuator的端点,都将运行在该7000端口的Tomcat服务上(/ac前缀的请求,我修改了默认的前缀)。

开发中,我们可以通过 SpringApplicationBuilder 类实现启动多个Tomcat实例,将不同的服务(模块)分别运行在不同的Tomcat实例上,以实现资源隔离并共享主应用的配置。

接下来,我们将详细介绍如何在Spring Boot应用中启动多个Tomcat实例,通过这些实例来管理不同的服务或模块。

2. 实战案例

我们将按照如下来建立我们的项目及模块:

图片

说明:

  • 在上面我们定义了2个模块分别是:com.pack.m1.*,com.pack.m2.* 。模块中包含了当前模块的配置及接口定义等等。
  • 父模块com.pack.parent.*将作为我们的共享模块,m1与m2共享该模块。
  • 针对不同的模块,分别建立不同的配置文件(如上:m1.properties,m2.properties),这里的配置文件与Spring Boot默认的application.[properties | yml]对等。
  • 其它都于默认的Spring Boot一致。
     

2.1 定义模块

模块1

配置类

@Configuration
@ComponentScan(basePackages = {"com.pack.m1"})
@PropertySource({"classpath:m1.properties"})
@EnableAutoConfiguration
public class M1Config {
}

启动了自动配置,扫描的基包com.pack.m1及对应的配置文件,这里的配置文件就相当于Spring Boot默认的application.yml或properties。

定义测试接口

@RestController
@RequestMapping("/m")
public class M1Controller {


  private final ParentService parentService ;
  public M1Controller(ParentService parentService) {
    this.parentService = parentService ;
  }
  
  @GetMapping("/index")
  public Object m1() {
    return "module 01 -" + this.parentService.query() ;
  }
}

定义配置文件

# m1.properties
server.port=8075
server.servlet.context-path=/m1

这里的配置完全就是Spring Boot提供的那些配置,所以该配置文件你就当是默认的配置文件配置即可。

模块2

模块2与模块1除了内容不一样外,其它都一致。

@Configuration
@ComponentScan(basePackages = {"com.pack.m2"})
@PropertySource({"classpath:m2.properties"})
@EnableAutoConfiguration
public class M2Config {
}
// 测试接口
@RestController
@RequestMapping("/m")
public class M1Controller {


  private final ParentService parentService ;
  public M2Controller(ParentService parentService) {
    this.parentService = parentService ;
  }
  
  @GetMapping("/index")
  public Object m2() {
    return "module 02 - " + this.parentService.query() ;
  }
}
// 配置文件m2.properties内容
server.port=8076
server.servlet.context-path=/m2

这里为了区分所以为不同的模块配置了不同的上下文。

按照如果的结构,不同的模块内容定义在对应的m1,m2包下即可。

2.2 父模块定义

由于父模块是其它子模块共享的,没有什么特别的配置,我们就定义一个配置及测试接口即可。

@Service
public class ParentService {


  public String query() {
    return "我是父模块内容" ;
  }
}

配置类

@Configuration
@ComponentScan(basePackages = {"com.pack.parent"})
public class ParentConfig {
}

这里我们并没有配置启用Web MVC所以,我们上面的ParentController类并不会生效。(注意:并不仅仅是启用Web MVC那么简单,还需要Spring适合的容器支持,这与下面我们将要看到的配置有关)。

2.3 全局配置文件

不管你如何配置(除非你通过spring.config.name进行了修改)默认的application.yml或properties还是会生效了。默认的文件内容如下:

spring:
  application:
    name: springboot-parent-child
---
logging:
  include-application-name: false
  pattern:
    dateformat: HH:mm:ss

如果你希望你的子模块都能继承某些配置,那么你可以将配置信息都写入该公共的文件中。

2.4 启动类

最后一步就是启动类了,这时候就与之前的Spring Boot默认的启动类完全不同了,内容如下:

public class SpringbootParentChildApplication {


  public static void main(String[] args) {
    SpringApplicationBuilder builder = new SpringApplicationBuilder() ;
    builder
      // 配置父容器的配置类(这一步内部就将当前容器设置为非web容器)
      .parent(ParentConfig.class) 
      // 配置子容器对应的配置及web应用
      .child(M1Config.class).web(WebApplicationType.SERVLET)
      // 配置子容器(与上面的child相当于兄弟容器),他们都有共同的父容器
      // 在这一步将会创建父容器及上面child子容器
      .sibling(M2Config.class).web(WebApplicationType.SERVLET)
      // 而这里则会创建sibling设置子容器
      .run(args) ;
  }
}

在该启动类上我们没有添加任何的注解(默认你需要添加@SpringBootApplication)。

2.5 测试

启动服务后,控制台日志输入如下:

图片图片

启动了2个Tomcat实例,分别运行在8075和8076端口上。接下来访问接口测试

图片图片

模块1

图片

模块2

两个模块都正常访问接口及父模块中的组件。

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2013-07-09 13:13:27

路由器管理路由器

2013-03-14 10:28:52

管理人才管理管理方式

2019-08-28 16:18:39

JavaScriptJS前端

2009-12-25 17:15:03

Linux内存

2009-07-09 17:59:16

模块化系统英特尔服务器

2015-03-16 12:49:56

虚拟化

2013-08-20 15:31:18

前端模块化

2017-05-18 10:23:55

模块化开发RequireJsJavascript

2020-09-17 10:30:21

前端模块化组件

2015-10-10 11:29:45

Java模块化系统初探

2020-09-18 09:02:32

前端模块化

2022-03-11 13:01:27

前端模块

2010-09-30 11:55:03

DB2表空间

2019-03-14 15:00:48

混合云云计算管理

2011-02-25 14:00:15

ProFTPD

2010-03-18 10:45:43

网管交换机

2018-06-21 09:36:09

模块化数据中心集中化

2018-03-21 21:31:28

Java9编程Java

2022-09-05 09:01:13

前端模块化

2019-09-02 10:51:59

Python脚本语言程序员
点赞
收藏

51CTO技术栈公众号