⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/virtual_users/article/details/118048064 「bug解决只是一瞬间,但帅是一辈子」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

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

什么是微服务?

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

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

通俗的来讲:

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

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

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

微服务的优缺点是什么?

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

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

什么是微服务架构?

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

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

创建一个父项目

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

父项目pom文件

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

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

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

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugins>
<build>

创建子模块

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

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

<name>demo-dao</name>
<packaging>jar</packaging>
<artifactId>demo-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<description>dao project</description>

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

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

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

父项目中引入子项目

子项目依赖父项目

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

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

以下是父项目的pom文件

<properties>
<java.version>1.8</java.version>
<lombok.version>1.18.20</lombok.version>
<druid.version>1.1.18</druid.version>
<mybatis-plus.version>3.4.1</mybatis-plus.version>
<swagger2.version>2.9.2</swagger2.version>
<sqlserver.jdbc>7.2.2.jre8</sqlserver.jdbc>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>

<!-- ali数据源、mybatis-plus-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>


<!-- SQL server 数据库驱动 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>${sqlserver.jdbc}</version>
<scope>runtime</scope>
</dependency>

<!-- mybatis-plus 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>

<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.0</version>
</dependency>


</dependencies>

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

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

DAO层依赖

<dependencies>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-model</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

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接口就行了,如下:

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

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

<dependencies>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-dao</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-model</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

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

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

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

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-model</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-service</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

重点来了!!!!

启动项目(踩过的坑)

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

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

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

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

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

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

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

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

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

文章目录
  1. 1. 什么是微服务?
  2. 2. 微服务的优缺点是什么?
  3. 3. 什么是微服务架构?
  4. 4. 创建一个父项目
  5. 5. 父项目pom文件
  6. 6. 创建子模块
  7. 7. 父项目中引入子项目
  8. 8. 子项目依赖父项目
  9. 9. DAO层依赖
  10. 10. yml配置
  11. 11. 启动项目(踩过的坑)