SpringCloud Alibaba 微服务—搭建环境

一、创建父工程

在这里插入图片描述

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子工程(业务)

用来管理微服务等业务模块

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值