侧边栏壁纸
博主头像
Dioxide-CN博主等级

茶边话旧,看几许星迢露冕,从淮海南来。

  • 累计撰写 50 篇文章
  • 累计创建 49 个标签
  • 累计收到 21 条评论

目 录CONTENT

文章目录

SpringCloud微服务:1 聚合工程构建

Dioxide-CN
2022-09-18 / 0 评论 / 1 点赞 / 42 阅读 / 5,221 字
温馨提示:
本文最后更新于 2022-09-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

SpringCloud 微服务体系

Spring Cloud 是分布式微服务架构的一站式解决方案,它提供了一套简单易用的编程模型,使我们能在 Spring Boot 的基础上轻松地实现微服务系统的构建。

Spring Cloud 被称为构建分布式微服务系统的“全家桶”,它并不是某一门技术,而是一系列微服务解决方案或框架的有序集合。它将市面上成熟的、经过验证的微服务框架整合起来,并通过 Spring Boot 的思想进行再封装,屏蔽调其中复杂的配置和实现原理,最终为开发人员提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。

Spring Cloud 中包含了 spring-cloud-config、spring-cloud-bus 等近 20 个子项目,提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。

  • Spring Cloud 本身并不是一个拿来即可用的框架,它是一套微服务规范,共有两代实现。
  • Spring Cloud Netflix 是 Spring Cloud 的第一代实现,主要由 Eureka、Ribbon、Feign、Hystrix 等组件组成。
  • Spring Cloud Alibaba 是 Spring Cloud 的第二代实现,主要由 Nacos、Sentinel、Seata 等组件组成。

1 工程创建流程

1 IDEA适配

  • 使用 Maven 3.8.6 (Settings/Preference > Build, Execution, Deployment > Build Tools > Maven > “Maven home path + User setting file + Local repository”)
  • 编码 UTF-8 (Settings/Preference > Editor > File Encodings > “Projecrt Encoding + Properties File (*.properties) + Transparent native-to-ascii conversion”)
  • 第三方注解载入 (Settings/Preference > Build, Execution, Deployment > Annotation Processors > Default > “Enable annotation processing”)
  • 使用 JDK 17 编译 (Project Structure > SDK > “Oracle OpenJDK version 17.0.3”)

2 父工程Maven架构

<?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>cn.dioxide</groupId>
    <artifactId>cloudProject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 父工程包 -->
    <packaging>pom</packaging>

    <properties>
        <java.version>17</java.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- Version Controller -->
        <spring.boot.version>2.6.11</spring.boot.version>
        <spring.cloud.version>2021.0.4</spring.cloud.version>
        <spring.alibaba.version>2.2.0.RELEASE</spring.alibaba.version>
        <junit.version>4.13.2</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.18.24</lombok.version>
        <druid.version>1.2.12</druid.version>
        <mybatis.version>2.2.2</mybatis.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- spring boot 2.6.11 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
            </dependency>
            <!-- spring cloud 2021.0.4 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring cloud alibaba 2.2.0.RELEASE -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- druid 1.2.12 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <!-- log4j 1.2.17 -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <!-- mysql default -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <!-- mybatis 2.2.2 -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <!-- lombok 1.18.24 -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

区别 DependencyManagement 和 Dependencies

  • DependencyManagement聚合方式,提供了一种管理依赖版本号的方式,通常会在一个组织或者项目的最顶层的父 POM 中看到 DependencyManagement 元素。使用 pom.xml 中的 DependencyManagement 元素能让所有在子项目中引用一个依赖而不显式地列出版本号,Maven 会沿着父子层次向上走,直到找到一个拥有 DependencyManagement 元素的项目,然后它就会使用这个 DependencyManagement 元素中的指定的版本号
    • DependencyManagement 里只是声明依赖(类似于接口),并不实现引入,因此子项目需要显式地声明需要用到的依赖!
    • 如果不在子项目中声明依赖,是不会从副项目中集成下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且完全继承父项目 pom 中的 version 和 scope 。
    • 如果子项目中指定了版本号,那么会使用子项目中指定的 jar 版本(类似于重写)。

在 Maven 中跳过单元测试

image-1663486671799
启用 IDEA Maven 的 Toggle ‘Skip Tests’ Mode 功能,即可跳过 Maven 的单元测试以节省项目的构建时间,但这会使得 test 生命周期不可用。父工程创建完成后执行 mvn:install 将父工程发布到仓库方便子工程继承。

1

评论区