SpringBoot 项目如何按模块进行拆分?

点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

每天 14:00 更新文章,每天掉亿点点头发...

源码精品专栏

 
  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:blog.csdn.net/virtual_users/

article/details/118048064

  • 什么是微服务?

  • 微服务的优缺点是什么?

  • 什么是微服务架构?

  • 创建一个父项目

  • 父项目pom文件

  • 创建子模块

  • 父项目中引入子项目

  • 子项目依赖父项目

  • DAO层依赖

  • yml配置

  • 启动项目(踩过的坑)

SpringBoot 项目如何按模块进行拆分?_第1张图片


在了解SpringBoot项目拆分之前首先我们需要了解微服务架构

什么是微服务?

单个轻量级服务一般为一个单独微服务,微服务讲究的是 专注某个功能的实现,比如登录系统只专注于用户登录方面功能的实现,讲究的是职责单一,开箱即用,可以独立运行。微服务架构系统是一个分布式的系统,按照业务进行划分服务单元模块,解决单个系统的不足,满足越来越复杂的业务需求。

马丁福勒(Martin Fowler):就目前而言,对于微服务业界并没有一个统一的、标准的定义。但通常而言,微服务架构是一种架构模式或者说是架构风格,它提倡将单一应用程序划分成一组小的服务。每个服务运行在其独立的自己的进程中服务之间相互配合、相互协调,为用户提供最终价值。服务之间采用轻量级通信。每个服务都围绕具体业务进行构建,并能够独立部署到生产环境等。另外应尽量避免统一的、集中的服务管理机制。

通俗的来讲:

微服务就是一个独立的职责单一的服务应用程序。在 intellij idea 工具里面就是用maven开发的一个个独立的module,具体就是使用springboot 开发的一个小的模块,处理单一专业的业务逻辑,一个模块只做一个事情。

微服务强调的是服务大小,关注的是某一个点,具体解决某一个问题/落地对应的一个服务应用,可以看做是idea 里面一个 module。

比如你去医院:你的牙齿不舒服,那么你就去牙科。你的头疼,那么你就去脑科。一个个的科室,就是一个微服务,一个功能就是一个服务。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

微服务的优缺点是什么?

优点: 松耦合,聚焦单一业务功能,无关开发语言,团队规模降低。在开发中,不需要了解多有业务,只专注于当前功能,便利集中,功能小而精。微服务一个功能受损,对其他功能影响并不是太大,可以快速定位问题。微服务只专注于当前业务逻辑代码,不会和 html、css 或其他界面进行混合。可以灵活搭配技术,独立性比较舒服。

缺点: 随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大,运维工程师压力增大,人力资源增多,系统依赖增强,数据一致性,性能监控

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

什么是微服务架构?

微服务架构 就是 对微服务进行管理整合应用的。微服务架构 依赖于 微服务,是在微服务基础之上的。

例如:上面已经列举了什么是微服务。在医院里,每一个科室都是一个独立的微服务,那么 这个医院 就是 一个大型的微服务架构,就类似 院长 可以 对下面的 科室进行管理。微服务架构主要就是这种功能。

创建一个父项目

项目依赖咱们可以先不添加,项目创建完之后统一加入就好了

SpringBoot 项目如何按模块进行拆分?_第2张图片 SpringBoot 项目如何按模块进行拆分?_第3张图片

父项目pom文件

然后我们需要注意的是需要更改父项目的pom文件

SpringBoot 项目如何按模块进行拆分?_第4张图片

在父级项目中的pom.xml文件使用的packaging配置一定为pom。父级的pom文件只作项目的子模块的整合,在maven install时不会生成jar/war压缩包。

然后将打包插件更改为 maven-compiler-plugin


    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            3.1
            
                ${java.version}
                ${java.version}
         
                   
    

创建子模块

SpringBoot 项目如何按模块进行拆分?_第5张图片 SpringBoot 项目如何按模块进行拆分?_第6张图片

在指定项目路径的时候需要注意,需要加入到父项目路径下

因为子项目是需要我们启动的项目所以我们需要更新子项目pom文件打包方式为jar

demo-dao
jar
demo-dao
0.0.1-SNAPSHOT
dao project

由于父项目仅需要对子项目进行管理,所以可以直接删除掉父项目的src目录,保留pom文件即可

随后我们分别创建 dao、model、service、common、admin 共5个子模块,其中admin模块作为我们的启动项目,现在我们的目录结构是这样的

SpringBoot 项目如何按模块进行拆分?_第7张图片

但现在父项目与子项目并无关系,子项目仅仅是在父项目目录下而已,我们需要用maven将子项目交给父项目管理

父项目中引入子项目

SpringBoot 项目如何按模块进行拆分?_第8张图片

子项目依赖父项目

SpringBoot 项目如何按模块进行拆分?_第9张图片

在每个子项目都依赖父项目之后我们就可以在pom文件中查看到此时的父项目与子项目已经是相互依赖的关系了,如下图

SpringBoot 项目如何按模块进行拆分?_第10张图片

至此我们就可以添加pom文件相关的依赖了,多项目拆分的情况下由父项目管理所有子项目的jar包版本,而父项目中引入的依赖子项目中不需要重复引入也可直接使用,所以我们在引入依赖时如果这个jar包在其他项目也需要使用到的话就可以直接写到父项目的pom文件中就可以了

以下是父项目的pom文件


        1.8
        1.18.20
        1.1.18
        3.4.1
        2.9.2
        7.2.2.jre8



        
            org.springframework.boot
            spring-boot-starter
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            org.springframework.boot
            spring-boot-starter-aop
        

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

        
            org.springframework.session
            spring-session-data-redis
        

        
            org.projectlombok
            lombok
            ${lombok.version}
        

        
        
            com.alibaba
            druid-spring-boot-starter
            ${druid.version}
        

        
            com.baomidou
            mybatis-plus-boot-starter
            ${mybatis-plus.version}
        


        
        
            com.microsoft.sqlserver
            mssql-jdbc
            ${sqlserver.jdbc}
            runtime
        

        
        
            com.baomidou
            mybatis-plus-generator
            ${mybatis-plus.version}
        
        
            com.baomidou
            mybatis-plus-core
            ${mybatis-plus.version}
        
        
            org.apache.velocity
            velocity-engine-core
            2.3
        

        
        
            io.springfox
            springfox-swagger2
            ${swagger2.version}
        
        
            io.springfox
            springfox-swagger-ui
            ${swagger2.version}
        
        
            com.github.xiaoymin
            swagger-bootstrap-ui
            1.9.0
        


这里我使用的是SQLSERVER数据库,除了DAO层的项目,我们在common项目中也会对多数据源、主从库提供工具类,避免重复引入所以将数据库驱动一并放在父项目中

而DAO层作为数据访问层肯定需要连接数据库进行操作的,现在我们着重查看一下dao层的注意事项

DAO层依赖


        
            com.youxue
            demo-model
            ${project.version}
        



      
          
              org.springframework.boot
              spring-boot-maven-plugin
          
      

DAO层项目中无非就是Mapper映射的接口以及Mapper.xml文件,而数据库驱动在父项目已经引入了,所以我们只需要引入Model项目即可

yml配置

spring:
  datasource:
    druid:
      username: username
      password: password
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
      url: databaseUrl
      initial-size: 5
      min-idle: 5
      max-active: 20
  aop:
    auto: true
    proxy-target-class: true

project:
  version: '@project.version@'

mybatis-plus:
  # resource目录 classpath:/mapper/*Mapper.xml
  mapper-locations: classpath:/mapper/*Mapper.xml
  # 实体类 包扫描
  type-aliases-package: com.youxue.demo.model

  global-config:
    db-config:
      db-type: sql_server
      #数据库大写下划线转换
      #capital-mode: true
  configuration:
    # 数据库关闭缓存
    cache-enabled: false
    # 开启下划线转换驼峰命名 例 :(model  String userName, SQL  select user_name from userInfo)
    map-underscore-to-camel-case: true
    jdbc-type-for-null: 'null'
    # 开启控制台SQL打印
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

数据库相关配置完成之后我们直接创建Mapper接口就行了,如下:

SpringBoot 项目如何按模块进行拆分?_第11张图片

随后在service项目中创建对应的service以及impl:

SpringBoot 项目如何按模块进行拆分?_第12张图片

service层中我们需要依赖DAO层项目以及Model项目,并且可能会使用到一些工具类,所以还需要添加依赖:


        
            com.youxue
            demo-common
            ${project.version}
        
        
            com.youxue
            demo-dao
            ${project.version}
        
        
            com.youxue
            demo-model
            ${project.version}
        

因为我们的启动项目为Admin项目,所以我们所有的Controller都放在这个项目

SpringBoot 项目如何按模块进行拆分?_第13张图片

而Admin项目作为启动项目,接口调用的响应结果肯定需要依赖Model层以及Service层,所以我们把依赖加入进来

这里需要注意的是,Admin项目需要引入spring-boot-starter-tomcat来提供访问支持


     
         org.springframework.boot
         spring-boot-starter-tomcat
         provided
     
     
         com.youxue
         demo-model
         ${project.version}
     
     
         com.youxue
         demo-service
         ${project.version}
     

重点来了!!!!

启动项目(踩过的坑)

@SpringBoot注解,@MapperScan注解 的包扫描机制

大家肯定都知道,需要写入对应的包路径,此时我的Application是这样的

SpringBoot 项目如何按模块进行拆分?_第14张图片

是不是看起来有模有样的,好像没啥问题子项目相互依赖,各方面的引入也没啥问题,然而启动后:

SpringBoot 项目如何按模块进行拆分?_第15张图片

啥玩意??? 数据库url属性没有配置?咱们可是在DAO项目中配置的好好的,可是为啥这里仿佛没有用?

其实是因为没有加载到DAO层项目的yml文件,导致了启动时无法识别到数据库相关配置导致Spring抛出了这个异常,那么怎么解决呢?

其实非常简单,我们都知道SpringBoot是支持多配置文件例如:application-dev.ymlapplication-prod.ymlapplication-local.yml

我们需要在Admin启动项目的配置文件中引入DAO层项目的数据库配置就行了

SpringBoot 项目如何按模块进行拆分?_第16张图片 SpringBoot 项目如何按模块进行拆分?_第17张图片

随即项目启动成功!是不是很棒,咱们来访问一下Controller层的接口查看一下效果

SpringBoot 项目如何按模块进行拆分?_第18张图片

访问时是不是感觉与单一架构差不多?然后我们其实已经将DAO、Service、Controller整个三层架构拆分为三个子项目,甚至将Model、Common都拆分为独立的子项目,作者当前公司就是拆分成这样的,是不是很细?



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

SpringBoot 项目如何按模块进行拆分?_第19张图片

已在知识星球更新源码解析如下:

SpringBoot 项目如何按模块进行拆分?_第20张图片

SpringBoot 项目如何按模块进行拆分?_第21张图片

SpringBoot 项目如何按模块进行拆分?_第22张图片

SpringBoot 项目如何按模块进行拆分?_第23张图片

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)

你可能感兴趣的:(数据库,分布式,中间件,spring,java)