一、创建父工程
1、创建父工程
打开IDEA,选择File > New > Project,选择Maven>Next,然后输入父工程的信息。
删除 src 等没用的文件,只留关键的pom
。
2、父工程的 pom 文件添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.newstar</groupId>
<artifactId>SpringCloudAlibaba</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>alibaba-module</module>
<module>alibaba-server</module>
<module>alibaba-common</module>
</modules>
<!-- 统一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 项目字符集编码 -->
<maven.compiler.source>1.8</maven.compiler.source> <!-- 源代码编译版本 -->
<maven.compiler.target>1.8</maven.compiler.target> <!-- 目标平台编译版本 -->
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<spring.boot.version>2.2.2.RELEASE</spring.boot.version>
<spring.version>5.1.2.RELEASE</spring.version>
<mybatis.version>3.4.6</mybatis.version>
<mybatis.plus.version>3.0-RELEASE</mybatis.plus.version>
<mysql.version>8.0.19</mysql.version>
<druid.version>1.1.9</druid.version>
<jackson.version>2.9.7</jackson.version>
</properties>
<dependencyManagement>
<dependencies>
<!--springBoot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--MybatisPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId> <!--MybatisPlus的代码生成器-->
<version>${mybatis.plus.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--引入配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--引入注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--引入sentinel-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
(1)父子工程依赖的管理:
(1)父工程中 dependentcyManagement 和 dependencies 的区别:
dependentcyManagement :① 通常
在最顶层的父类POM中存在
dependentcyManagement;
② pom.xml中的dependentcyManagement能让所有子项目中引用一个依赖而不用显示的列出版本号(管理版本)
;
③ dependentcyManagement只是声明依赖,并不实际引入,仍需子项目导入需要引用的依赖(按需引入)
;dependentcies:
所有在 dependencies 中定义的依赖
都会被在子项目中自动引入
,并被子项目继承
(2) dependentcyManagement 和 dependencies 的使用场景:
① 如果依赖在所有子项目都使用的话,你需要使用 dependencies 来进行定义,这样所有你在 dependencies 中定义的 Package 将会自动被导入到子项目中
② 如果依赖只有部分模块使用而其他模块不使用,在 parent 项目的 pom 文件中使用 < dependencyManagement> < /dependencyManagement> 将依赖管理起来,如果有哪个子项目要用,那么子项目在自己的 pom 文件中使用。注意:使用父工程中 < dependencyManagement > 标签中声明的依赖还必须在子项目中再声明一次以导入到项目中,只不过不需要声明版本
。
(3)子模块中依赖版本的确定
①如果 dependencies 里的 dependency 自己没有声明 version 元素,那么 maven 就会到父工程中的dependencyManagement 里面去找有没有对该 artifactId 和 groupId 进行过版本声明
,如果有,就继承它,如果没有就会报错,告诉你必须为 dependency 声明一个 version。②
如果 dependencies 中的 dependency 声明了 version,那么无论 dependencyManagement 中有无对该 jar 的 version 声明,都以父项目 dependency 里的 version 为准
。
(4)关于 exclusions 标签
当dependencyA 自身的依赖 B,与其他 dependency 存在冲突的时候(最常见的就是版本冲突),我们就需要把B排除掉,这时就需要使用exclusions元素。那么我们怎么知道一个 dependency 自身包含哪些依赖呢?
1、通过 mvn dependency:tree 命令查看依赖树
2、使用 IDEA 或其他 IDA 查看依赖树
点击 IDEA 右侧的 Maven Projects,在每个模块的 Dependencies 中即可查看每个 dependency 内部的依赖及版本号,从来识别哪些依赖需要被排除掉。
(2) SpringBoot 和 SpringCloud的版本搭配
SpringBoot 和 SpringCloud 有严格的版本搭配,否则会冲突:
(3)父、子模块的 SpringBoot 版本的继承
在微服务项目中,建议不使用spring-boot-starter-parent作为
<parent>
依赖,使用自定义的,但同时还希望进行项目依赖版本的统一管理以及有Springboot自动配置等特性。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
但是此时 Java 的版本、编码的格式都需要手动配置,只需添加一个 plugin 即可。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
3、添加热部署
仅限开发时使用,生产环境关闭
(1)实现原理
Springboot 的自动重启技术涉及两个类加载器,一个是 baseclassloader,用来加载不会变化的类,比如项目可能有要引入的第三方 jar 包;另一个是 restarclassloader,用来加载开发者自己写的会有变化的类。当项目需要重启时,restartclassloader 将被一个新创建的类加载器代替,而 baseclassloader 则会继续使用原来的,这种方式启动的话会比冷启动快得多,因为 baseclassloader 已经存在且加载好了。
(2)使用步骤
1)pom.xml 添加依赖
<!--支持热启动jar包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>${spring-boot.version}</version> <optional>true</optional> <!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖该项目的项目如果想要使用devtools,需要重新引入 --> </dependency> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- spring热部署--> <!--fork 如果没有改配置devtools不会起作用,即应用不会restart--> <fork>true</fork> </configuration> </plugin>
devtools 会监听 classpath 下的文件变动
,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的。
配置了 true 后在修改 java 文件后也就支持了热启动,不过这种方式是属于项目重启(速度比较快的项目重启),会清空 session 中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆
。
默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools 内嵌了一个 LiveReload server,当资源发生改变时,浏览器刷新)。2)application.yml 进行配置
spring: devtools: restart: #热部署生效。若为false,此时restart类加载器还会初始化,但不会监视文件更新。 enabled: true #设置重启的目录 additional-paths: src/main/java #设置不重启的目录 #classpath目录下的WEB-INF文件夹内容修改不重启 exclude: WEB-INF/**
3)IDEA配置
当我们修改了 Java 类后,IDEA 默认是不自动编译的,而 spring-boot-devtools 又是监测 classpath 下的文件发生变化才会重启应用,所以需要
设置 IDEA 的自动编译
:(1)File->Settings->Build,Execution,Deployment->Compiler:勾选
(2)ctrl + shift + alt + /:选择 Registry,勾选
4)重启项目
二、创建子模块
右击父项目,选择 New > Moudle,选择 Maven>Next,然后输入子项目信息。
分别创建子工程(maven工程) alibaba-common、alibaba-gateway、alibaba-mybatis-generator和alibaba-server。
注意:建议在创建子Module的时候,Project Name 最好和 ArtifactId 保持一致
。
1、alibaba-common子工程(公共功能)
用来
管理公共功能模块
2、alibaba-gateway子工程(路由)
用来
管理微服务路由
3、alibaba-mybatis-generator 子工程(自动生成代码)
用来
mybatis自动生成代码
pom.xml 添加依赖:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
</dependencies>
CodeGenerator.java 的代码如下:
全局配置中设置好
生成代码的位置
,
数据源配置中设置好数据库信息
,
包配置中设置好生成的代码的包结构
,
策略配置中设置好数据库表映射到实体类的具体细节
。
public class CodeGenerator {
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
//使用 Freemarker 模板引擎
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
// 1、全局配置
GlobalConfig globalConfig = new GlobalConfig();
File f = new File(CodeGenerator.class.getResource("/").getPath());
String projectPath = f.getParentFile().getParent();
//指定生成的代码位于何处
globalConfig.setOutputDir(projectPath + "/src/main/java");
globalConfig.setFileOverride(false);
globalConfig.setAuthor("lhj");
mpg.setGlobalConfig(globalConfig);
globalConfig.setIdType(IdType.AUTO);
globalConfig.setDateType(DateType.ONLY_DATE);
mpg.setGlobalConfig(globalConfig);
// 2、数据源配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/springboot?serverTimezone=CST");
dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("admin");
dataSourceConfig.setDbType(DbType.MYSQL);
mpg.setDataSource(dataSourceConfig);
// 3、生成代码的包配置
PackageConfig packageConfig = new PackageConfig();
//设置包名
packageConfig.setModuleName("mybatisplus");
//设置包的父路径
packageConfig.setParent("com.newstar");
//设置实体类包名
packageConfig.setEntity("entity");
//设置Service层包名
packageConfig.setService("service");
//设置Mapper层包名
packageConfig.setMapper("mapper");
//设置Controller层包名
packageConfig.setController("controller");
mpg.setPackageInfo(packageConfig);
// 4、策略配置
StrategyConfig strategy = new StrategyConfig();
//数据库表映射到实体的命名策略
strategy.setNaming(NamingStrategy.underline_to_camel);
//数据库表字段映射到实体的命名策略, 未指定按照 naming 执行
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//需要映射的表名
strategy.setInclude("book","user");
//实体是否为lombok模型(默认 false)
strategy.setEntityLombokModel(true);
//生成 @RestController 控制器
strategy.setRestControllerStyle(true);
//设置url使用下划线命名
strategy.setControllerMappingHyphenStyle(true);
//乐观锁设置
strategy.setVersionFieldName("version");
mpg.setStrategy(strategy);
mpg.execute();
}
}
4、alibaba-server子工程(业务)
用来
管理微服务等业务模块