程序员的资源宝库

网站首页 > gitee 正文

Springcloud基础知识(1)- 微服务、Spring Cloud 简介、创建多模块 Spring Boot 项目

sanyeah 2024-04-08 12:56:35 gitee 7 ℃ 0 评论


注:开始阅读 Spring Cloud 系列文章之前,读者应该已经掌握了 Java 基础知识、Web 基础知识、Spring 框架、Spring MVC 和 Spring Boot。另外,本系列文章中的所有实例都是使用 IntelliJ IDEA + Apache Maven 配置和编译的,所以还需要对 IntelliJ IDEA 和 Apache Maven 有基本的了解。

在开始之前,确保已经正确搭建了 Spring 开发环境,参考 “ Spring基础知识(1)- Spring简介、Spring体系结构和开发环境配置 ”。


1. 微服务(MicroServices)

    微服务(MicroServices)最初是由 Martin Fowler 于 2014 年发表的论文《Micro Services》中提出的名词,它一经提出就成为了技术圈的热门话题。

    微服务,我们可以从字面上去理解,即 “微小的服务”,下面我们从 “服务” 和 “微小” 两个方面进行介绍。

    所谓 “服务”,其实指的是项目中的功能模块,它可以帮助用户解决某一个或一组问题,在开发过程中表现为 IDE(集成开发环境,例如 Eclipse 或 IntelliJ IDEA)中的一个工程或 Moudle。

    “微小” 则强调的是单个服务的大小,主要体现为以下两个方面:

        (1) 微服务体积小,复杂度低:一个微服务通常只提供单个业务功能的服务,即一个微服务只专注于做好一件事,因此微服务通常代码较少,体积较小,复杂度也较低。

        (2) 微服务团队所需成员少:一般情况下,一个微服务团队只需要 8 到 10 名人员(开发人员 2 到 5 名)即可完成从设计、开发、测试到运维的全部工作。

    1) 微服务架构

        微服务架构是一种系统架构的设计风格。与传统的单体式架构(ALL IN ONE)不同,微服务架构提倡将一个单一的应用程序拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间使用轻量级通信机制(通常是 HTTP RESTFUL API)进行通讯。

        通常情况下,这些小型服务都是围绕着某个特定的业务进行构建的,每一个服务只专注于完成一项任务并把它做好 ,即“专业的人做专业的事”。

        每个服务都能够独立地部署到各种环境中,例如开发环境、测试环境和生产环境等,每个服务都能独立启动或销毁而不会对其他服务造成影响。

        这些服务之间的交互是使用标准的通讯技术进行的,因此不同的服务可以使用不同数据存储技术,甚至使用不同的编程语言。

    2) 微服务架构 vs 单体架构

        在当今的软件开发领域中,主要有两种系统架构风格,那就是新兴的 “微服务架构” 和传统的 “单体架构”。

        单体架构是微服务架构出现之前业界最经典的软件架构类型,许多早期的项目采用的也都是单体架构。单体架构将应用程序中所有业务逻辑都编写在同一个工程中,最终经过编译、打包,部署在一台服务器上运行。

        在项目的初期,单体架构无论是在开发速度还是运维难度上都具有明显的优势。但随着业务复杂度的不断提高,单体架构的许多弊端也逐渐凸显出来,主要体现在以下 3 个方面:

            (1) 随着业务复杂度的提高,单体应用(采用单体架构的应用程序)的代码量也越来越大,导致代码的可读性、可维护性以及扩展性下降。
            (2) 随着用户越来越多,程序所承受的并发越来越高,而单体应用处理高并发的能力有限。
            (3) 单体应用将所有的业务都集中在同一个工程中,修改或增加业务都可能会对其他业务造成一定的影响,导致测试难度增加。

        由于单体架构存在这些弊端,因此许多公司和组织都开始将将它们的项目从单体架构向微服务架构转型。

        下面我们就来对比下微服务架构和单体架构到底有什么不同。

不同点 微服务架构 单体架构
团队规模 微服务架构可以将传统模式下的单个应用拆分为多个独立的服务,每个微服务都可以单独开发、部署和维护。每个服务从设计、开发到维护所需的团队规模小,团队管理成本小。 单体架构的应用程序通常需要一个大型团队,围绕一个庞大的应用程序工作,团队管理的成本大。
数据存储方式 不同的微服务可以使用不同的数据存储方式,例如有的用 Redis,有的使用 MySQL。 单一架构的所有模块共享同一个公共数据库,存储方式相对单一。
部署方式 微服务架构中每个服务都可以独立部署,也可以独立于其他服务进行扩展。如果部署得当,基于微服务的架构可以帮助企业提高应用程序的部署效率。 采用单体架构的应用程序的每一次功能更改或 bug 修复都必须对整个应用程序重新进行部署。
开发模式 在采用微服务架构的应用程序中,不同模块可以使用不同的技术或语言进行开发,开发模式更加灵活。 在采用单体架构的应用程序中,所有模块使用的技术和语言必须相同,开发模式受限。
故障隔离 在微服务架构中,故障被隔离在单个服务中,避免系统的整体崩溃。 在单体架构中,当一个组件出现故障时,故障很可能会在进程中蔓延,导致系统全局不可用。
项目结构 微服务架构将单个应用程序拆分为多个独立的小型服务,每个服务都可以独立的开发、部署和维护,每个服务都能完成一项特定的业务需求。 单体架构的应用程序,所有的业务逻辑都集中在同一个工程中。

                
     3) 微服务的特点

        (1) 服务按照业务来划分,每个服务通常只专注于某一个特定的业务、所需代码量小,复杂度低、易于维护。
        (2) 每个微服都可以独立开发、部署和运行,且代码量较少,因此启动和运行速度较快。
        (3) 每个服务从设计、开发、测试到维护所需的团队规模小,一般 8 到 10 人,团队管理成本小。
        (4) 采用单体架构的应用程序只要有任何修改,就需要重新部署整个应用才能生效,而微服务则完美地解决了这一问题。在微服架构中,某个微服务修改后,只需要重新部署这个服务即可,而不需要重新部署整个应用程序。
        (5) 在微服务架构中,开发人员可以结合项目业务及团队的特点,合理地选择语言和工具进行开发和部署,不同的微服务可以使用不同的语言和工具。
        (6) 微服务具备良好的可扩展性。随着业务的不断增加,微服务的体积和代码量都会急剧膨胀,此时我们可以根据业务将微服务再次进行拆分;除此之外,当用户量和并发量的增加时,我们还可以将微服务集群化部署,从而增加系统的负载能力。
        (7) 微服务能够与容器(Docker)配合使用,实现快速迭代、快速构建、快速部署。
        (8) 微服务具有良好的故障隔离能力,当应用程序中的某个微服发生故障时,该故障会被隔离在当前服务中,而不会波及到其他微服务造成整个系统的瘫痪。
        微服务系统具有链路追踪的能力。

    4) 微服务框架

        微服务架构是一种系统架构风格和思想,想要真正地搭建一套微服务系统,则需要微服务框架的支持。随着微服务的流行,很多编程语言都相继推出了它们的微服务框架,下面我们就来简单列举下。

        Java 微服务框架:

            (1) Spring Cloud:它能够基于 REST 服务来构建服务,帮助架构师构建出一套完整的微服务技术生态链。
            (2) Dropwizard:用于开发高性能和 Restful 的 Web 服务,对配置、应用程序指标、日志记录和操作工具都提供了开箱即用的支持。
            (3) Restlet: 该框架遵循 RST 架构风格,可以帮助 Java 开发人员构建微服务。
            (4) Spark:最好的 Java 微服务框架之一,该框架支持通过 Java 8 和 Kotlin 创建微服务架构的应用程序。
            (5) Dubbo:由阿里巴巴开源的分布式服务治理框架。

        Phyton 微服务框架:

            Phyton 中的微服务框架主要有 Flask、Falcon、Bottle、Nameko 和 CherryPy 等。

        Go 语言微服务框:

            Go 语言中的微服务框架较少,使用的较多的是 GoMicro,它是一个 RPC 框架,具有负载均衡、服务发现、同步通信、异步通讯和消息编码等功能。

        NodeJS 微服务框架:

            Molecular 是一种使用 NodeJS 构建的事件驱动架构,该框架内置了服务注册表、动态服务发现、负载均衡、容错功能和内置缓存等组件。


2. Spring Cloud 简介

    Spring Cloud 是一款基于 Spring Boot 实现的微服务框架。Spring Cloud 源自 Spring 社区,主要由 Pivotal 和 Netflix 两大公司提供技术迭代和维护。

    随着微服务的火爆流行,国内外各大互联网公司都相继分享了他们在微服务架构中,针对不同场景出现的各种问题的解决方案和开源框架。

        (1) 服务治理:阿里巴巴开源的 Dubbo 和当当网在其基础上扩展出来的 DubboX、Netflix 的 Eureka 以及 Apache 的 Consul 等。
        (2) 分布式配置管理:百度的 Disconf、Netflix 的 Archaius、360 的 QConf、携程的 Apollo 以及 Spring Cloud 的 Config 等。
        (3) 批量任务:当当网的 Elastic-Job、LinkedIn 的 Azkaban 以及 Spring Cloud 的 Task 等。
        (4) 服务跟踪:京东的 Hydra、Spring Cloud 的 Sleuth 以及 Twitter 的 Zipkin 等。
          ...

    以上这些微服务框架或解决方案都具有以下 2 个特点:

        (1) 对于同一个微服务问题,各互联网公司给出的解决方案各不相同。
        (2) 一个微服务框架或解决方案都只能解决微服务中的某一个或某几个问题,对于其他问题则无能为力。

    这种情况下,搭建一套微分布式微服务系统,就需要针对这些问题从诸多的解决方案中做出选择,这使得我们不得不将大量的精力花费在前期的调研、分析以及实验上。

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

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

    Spring Cloud 并不是一个拿来即可用的框架,它是一种微服务规范,共有以下 2 代实现:

        第一代实现:Spring Cloud Netflix
        第二代实现:Spring Cloud Alibaba

    这里我们介绍的 Spring Cloud 特指 Spring Cloud 的第一代实现。

    1) Spring Cloud 常用组件

        Spring Cloud 包括 Spring Cloud Gateway、Spring Cloud Config、Spring Cloud Bus 等近 20 个服务组件,这些组件提供了服务治理、服务网关、智能路由、负载均衡、熔断器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。

        Spring Cloud 的常用组件如下表所示。

Spring Cloud 组件 描述
Spring Cloud Netflix Eureka Spring Cloud Netflix 中的服务治理组件,包含服务注册中心、服务注册与发现机制的实现。
Spring Cloud Netflix Ribbon Spring Cloud  Netflix 中的服务调用和客户端负载均衡组件。
Spring Cloud Netflix Hystrix Spring Cloud Netflix 的容错管理组件 (人称 “豪猪哥”),为服务中出现的延迟和故障提供强大的容错能力。
Spring Cloud Netflix Feign 基于 Ribbon 和 Hystrix 的声明式服务调用组件。
Spring Cloud Netflix Zuul Spring Cloud Netflix 中的网关组件,提供了智能路由、访问过滤等功能。
Spring Cloud Gateway 一个基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关框架,它使用 Filter 链的方式提供了网关的基本功能,例如安全、监控/指标和限流等。
Spring Cloud Config Spring Cloud 的配置管理工具,支持使用 Git 存储配置内容,实现应用配置的外部化存储,并支持在客户端对配置进行刷新、加密、解密等操作。
Spring Cloud Bus Spring Cloud 的事件和消息总线,主要用于在集群中传播事件或状态变化,以触发后续的处理,例如动态刷新配置。
Spring Cloud Stream Spring Cloud 的消息中间件组件,它集成了 Apache Kafka 和 RabbitMQ 等消息中间件,并通过定义绑定器作为中间层,完美地实现了应用程序与消息中间件之间的隔离。通过向应用程序暴露统一的 Channel 通道,使得应用程序不需要再考虑各种不同的消息中间件实现,就能轻松地发送和接收消息。
Spring Cloud Sleuth Spring Cloud 分布式链路跟踪组件,能够完美的整合 Twitter 的 Zipkin。

  
            注:Netflix 是美国的一个在线视频网站,它是公认的大规模生产级微服务的杰出实践者,微服务界的翘楚。Netflix 的开源组件已经在其大规模分布式微服务环境中经过了多年的生产实战验证,成熟且可靠。

    2) Spring Boot 和 Spring Cloud 的区别与联系

        Spring Boot 和 Spring Cloud 都是 Spring 大家族的一员,它们在微服务开发中都扮演着十分重要的角色,两者之间既存在区别也存在联系。

        (1) Spring Boot 和 Spring Cloud 分工不同

            Spring Boot 是一个基于 Spring 的快速开发框架,它能够帮助开发者迅速搭 Web 工程。在微服务开发中,Spring Boot 专注于快速、方便地开发单个微服务。

            Spring Cloud 是微服务架构下的一站式解决方案。Spring Cloud 专注于全局微服务的协调和治理工作。换句话说,Spring Cloud 相当于微服务的大管家,负责将 Spring Boot 开发的一个个微服务管理起来,并为它们提供配置管理、服务发现、断路器、路由、微代理、事件总线、决策竞选以及分布式会话等服务。

        (2) Spring Cloud 是基于 Spring Boot 实现的

            Spring Cloud 是基于 Spring Boot 实现的。与 Spring Boot 类似,Spring Cloud 也为提供了一系列 Starter,这些 Starter 是 Spring Cloud 使用 Spring Boot 思想对各个微服务框架进行再封装的产物。它们屏蔽了这些微服务框架中复杂的配置和实现原理,使开发人员能够快速、方便地使用 Spring Cloud 搭建一套分布式微服务系统。

        (3) Spring Boot 和 Spring Cloud 依赖项数量不同

            Spring Boot 属于一种轻量级的框架,构建 Spring Boot 工程所需的依赖较少。

            Spring Cloud 是一系列微服务框架技术的集合体,它的每个组件都需要一个独立的依赖项(Starter POM),因此想要构建一套完整的 Spring  Cloud 工程往往需要大量的依赖项。

        (4) Spring Cloud 不能脱离 Spring Boot 单独运行

            Spring Boot 不需要 Spring Cloud,就能直接创建可独立运行的工程或模块。

            Spring Cloud 是基于 Spring Boot 实现的,它不能独立创建工程或模块,更不能脱离 Spring Boot 独立运行。

        注意:虽然 Spring Boot 能够用于开发单个微服务,但它并不具备管理和协调微服务的能力,因此它只能算是一个微服务快速开发框架,而非微服务框架。

    3) Spring Cloud 版本

        Spring Cloud 包含了许多子项目(组件),这些子项目都是独立进行内容更新和迭代的,各自都维护着自己的发布版本号。

        为了避免 Spring Cloud 的版本号与其子项目的版本号混淆,Spring Cloud 没有采用常见的数字版本号,而是通过以下方式定义版本信息。

            {version.name}.{version.number}

        Spring Cloud 版本信息说明如下:

            (1) version.name:版本名,采用英国伦敦地铁站的站名来命名,并按照字母表的顺序(即从 A 到 Z)来对应 Spring Cloud 的版本发布顺序,例如第一个版本为 Angel,第二个版本为 Brixton(英国地名),然后依次是 Camden、Dalston、Edgware、Finchley、Greenwich、Hoxton 等。
            (2) version.number:版本号,每一个版本的 Spring Cloud 在更新内容积累到一定的量级或有重大 BUG 修复时,就会发布一个 “service releases” 版本,简称 SRX 版本,其中 X 为一个递增的数字,例如 Hoxton.SR8 就表示 Hoxton 的第 8 个 Release 版本。

        Spring Cloud 版本选择:

            在使用 Spring Boot + Spring Cloud 进行微服务开发时,我们需要根据项目中 Spring Boot 的版本来决定 Spring Cloud 版本,否则会出现许多意想不到的错误。

                Spring Boot 与 Spring Cloud 的版本对应关系如下表(参考自 Spring Cloud 官网)。

Spring Cloud Spring Boot
2021.0.3 >= 2.6.1 and < 3.0.0-M1
2021.0.0-RC1 >= 2.6.0-RC1 and < 2.6.1
2021.0.0-M3 >= 2.6.0-M3 and < 2.6.0-RC1
2021.0.0-M1 >= 2.6.0-M1 and < 2.6.0-M3
2020.0.5 >= 2.4.0.M1 and < 2.6.0-M1
Hoxton.SR12 >= 2.2.0.RELEASE and < 2.4.0.M1
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.5.x
Dalston 1.5.x


                注意:Spring Cloud 官方已经停止对 Dalston、Edgware、Finchley 和 Greenwich 的版本更新。

        除了上表中展示的版本对应关系之外,我们还可以使用浏览器访问 https://start.spring.io/actuator/info ,获取 Spring Cloud 与 Spring Boot 的版本对应关系(JSON 版)。

 1             {
 2                 ...
 3 
 4                 "bom-ranges":{
 5                     ...
 6 
 7                     "spring-cloud":{
 8                         "Hoxton.SR12":"Spring Boot >=2.2.0.RELEASE and <2.4.0.M1",
 9                         "2020.0.4":"Spring Boot >=2.4.0.M1 and <2.5.6-SNAPSHOT",
10                         "2020.0.5-SNAPSHOT":"Spring Boot >=2.5.6-SNAPSHOT and <2.6.0-M1",
11                         "2021.0.0-M1":"Spring Boot >=2.6.0.M1 and <2.6.0-SNAPSHOT",
12                         "2021.0.0-SNAPSHOT":"Spring Boot >=2.6.0-SNAPSHOT"
13                     },
14 
15                     ...
16                 },
17 
18                 ...
19             }


        页面上的 JSON 内容,可以复制到在线 JSON 工具里查看 https://www.bejson.com/jsonviewernew/。


3. 创建多模块 Spring Boot 项目

    Spring Cloud 项目经常会涉及到由多个 Spring Boot 创建的微服务,为了方便管理,一般采用 Maven 的多 Module 结构(即一个 Project 包含多个 Module)来构建工程。

    这里我们示范一下,如何使用 IDEA 创建多模块 Spring Boot 项目。Spring Boot 项目的创建和配置,可以参考 “ Springboot基础知识(01)- Spring Boot 简介、配置 Spring Boot 和 Spring Initializr ”。

 

    1) 创建 Maven 主项目

        运行 IDEA,点击菜单 New 创建 Project:

            New Project -> Project Type: Maven -> Project SDK: 1.8 -> Uncheck "Create from archtype" -> Next

                Name: SpringcloudDemo01
                GroupId: com.example
                ArtifactId: SpringcloudDemo01

            -> Finish

        创建的 pom.xml 内容如下:

 1             <?xml version="1.0" encoding="UTF-8"?>
 2             <project xmlns="http://maven.apache.org/POM/4.0.0"
 3                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4                     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 5                                         http://maven.apache.org/xsd/maven-4.0.0.xsd">
 6                 <modelVersion>4.0.0</modelVersion>
 7 
 8                 <groupId>com.example</groupId>
 9                 <artifactId>SpringcloudDemo01</artifactId>
10                 <version>1.0-SNAPSHOT</version>
11 
12             </project>


        项目下的 src 空目录自动被创建,目录结构如下:

            src
             |- main
             |   |- java
             |   |- resources
             |
             |- test
                 |- java


    2) CommonAPI 模块

        (1) 创建 Maven 模块

            选择左上的项目列表中的 SpringcloudDemo01,点击鼠标右键,选择 New -> Module 进入 New Module 页面:

                Maven -> Project SDK: 1.8 -> Uncheck "Create from archtype" -> Next

                    Name: CommonAPI
                    GroupId: com.example
                    ArtifactId: CommonAPI

                -> Finish

            注:CommonAPI 模块一般用来放置实体类、公共方法、接口等公共资源。模块 CommonAPI 创建后,Maven 命令会自动修改主项目 SpringcloudDemo01 的 pom.xml,添加如下内容:

                <modules>
                    <module>CommonAPI</module>
                </modules>

        (2) CommonAPI 的 pom.xml 内容如下

 1             <?xml version="1.0" encoding="UTF-8"?>
 2             <project xmlns="http://maven.apache.org/POM/4.0.0"
 3                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4                     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 5                                         http://maven.apache.org/xsd/maven-4.0.0.xsd">
 6                 <parent>
 7                     <artifactId>SpringcloudDemo01</artifactId>
 8                     <groupId>com.example</groupId>
 9                     <version>1.0-SNAPSHOT</version>
10                 </parent>
11                 <modelVersion>4.0.0</modelVersion>
12 
13                 <artifactId>CommonAPI</artifactId>
14 
15             </project>

    3) RegisterServer 模块

        (1) 创建 Maven 模块

            选择左上的项目列表中的 SpringcloudDemo01,点击鼠标右键,选择 New -> Module 进入 New Module 页面:

                Maven -> Project SDK: 1.8 -> Check "Create from archtype" -> select "org.apache.maven.archtypes:maven-archtype-quickstart" -> Next

                    Name: RegisterServer
                    GroupId: com.example
                    ArtifactId: RegisterServer

                -> Finish

        (2) 修改 RegisterServer 的 pom.xml 内容如下

 1             <?xml version="1.0" encoding="UTF-8"?>
 2             <project xmlns="http://maven.apache.org/POM/4.0.0"
 3                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4                     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 5                                         http://maven.apache.org/xsd/maven-4.0.0.xsd">
 6                 <parent>
 7                     <artifactId>SpringcloudDemo01</artifactId>
 8                     <groupId>com.example</groupId>
 9                     <version>1.0-SNAPSHOT</version>
10                 </parent>
11                 <modelVersion>4.0.0</modelVersion>
12 
13                 <artifactId>RegisterServer</artifactId>
14 
15                 <name>RegisterServer</name>
16                 <!-- FIXME change it to the project's website -->
17                 <url>http://www.example.com</url>
18 
19                 <properties>
20                     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
21                     <maven.compiler.source>1.8</maven.compiler.source>
22                     <maven.compiler.target>1.8</maven.compiler.target>
23                     <maven.install.skip>true</maven.install.skip>
24                 </properties>
25 
26                 <dependencies>
27                     <dependency>
28                         <groupId>junit</groupId>
29                         <artifactId>junit</artifactId>
30                         <version>4.12</version>
31                         <scope>test</scope>
32                     </dependency>
33                 </dependencies>
34 
35             </project>


            注:删除了 <pluginManagement> 元素和子元素。添加 <maven.install.skip>true</maven.install.skip> 表示主项目 install 时不安装该子模块。

    4) ServiceProvider 模块

        (1) 创建 Maven 模块

            选择左上的项目列表中的 SpringcloudDemo01,点击鼠标右键,选择 New -> Module 进入 New Module 页面:

                Maven -> Project SDK: 1.8 -> Check "Create from archtype" -> select "org.apache.maven.archtypes:maven-archtype-quickstart" -> Next

                    Name: ServiceProvider
                    GroupId: com.example
                    ArtifactId: ServiceProvider

                -> Finish

        (2) 修改 ServiceProvider 的 pom.xml 内容如下

 1             <?xml version="1.0" encoding="UTFcom-8"?>
 2             <project xmlns="http://maven.apache.org/POM/4.0.0"
 3                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4                     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 5                                         http://maven.apache.org/xsd/maven-4.0.0.xsd">
 6                 <parent>
 7                     <artifactId>SpringcloudDemo01</artifactId>
 8                     <groupId>com.example</groupId>
 9                     <version>1.0-SNAPSHOT</version>
10                 </parent>
11                 <modelVersion>4.0.0</modelVersion>
12 
13                 <artifactId>ServiceProvider</artifactId>
14 
15                 <name>ServiceProvider</name>
16                 <!-- FIXME change it to the project's website -->
17                 <url>http://www.example.com</url>
18 
19                 <properties>
20                     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
21                     <maven.compiler.source>1.8</maven.compiler.source>
22                     <maven.compiler.target>1.8</maven.compiler.target>
23                     <maven.install.skip>true</maven.install.skip>
24                 </properties>
25 
26                 <dependencies>
27                     <dependency>
28                         <groupId>junit</groupId>
29                         <artifactId>junit</artifactId>
30                         <version>4.12</version>
31                         <scope>test</scope>
32                     </dependency>
33                     <!-- 引入公共子模块 -->
34                     <dependency>
35                         <groupId>com.example</groupId>
36                         <artifactId>CommonAPI</artifactId>
37                         <version>${project.version}</version>
38                     </dependency>        
39                 </dependencies>
40 
41             </project>


            注:删除了 <pluginManagement> 元素和子元素。添加 <maven.install.skip>true</maven.install.skip> 表示主项目 install 时不安装该子模块。

    5) 修改 SpringcloudDemo01 的 pom.xml,内容如下

 1         <?xml version="1.0" encoding="UTF-8"?>
 2         <project xmlns="http://maven.apache.org/POM/4.0.0"
 3                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 5                                     http://maven.apache.org/xsd/maven-4.0.0.xsd">
 6 
 7             <parent>
 8                 <groupId>org.springframework.boot</groupId>
 9                 <artifactId>spring-boot-starter-parent</artifactId>
10                 <version>2.6.6</version>
11                 <relativePath/> <!-- lookup parent from repository -->
12             </parent>                                    
13             <modelVersion>4.0.0</modelVersion>
14             <packaging>pom</packaging>
15 
16             <groupId>org.example</groupId>
17             <artifactId>SpringcloudDemo01</artifactId>
18             <version>1.0-SNAPSHOT</version>
19 
20             <modules>
21                 <module>Common</module>
22                 <module>RegisterServer</module>
23                 <module>ServiceProvider</module>
24             </modules>
25 
26             <build>
27                 <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
28                     <plugins>
29                         <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
30                         <plugin>
31                             <artifactId>maven-clean-plugin</artifactId>
32                             <version>3.1.0</version>
33                         </plugin>
34                         <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
35                         <plugin>
36                             <artifactId>maven-resources-plugin</artifactId>
37                             <version>3.0.2</version>
38                         </plugin>
39                         <plugin>
40                             <artifactId>maven-compiler-plugin</artifactId>
41                             <version>3.8.0</version>
42                         </plugin>
43                         <plugin>
44                             <artifactId>maven-surefire-plugin</artifactId>
45                             <version>2.22.1</version>
46                         </plugin>
47                         <plugin>
48                             <artifactId>maven-jar-plugin</artifactId>
49                             <version>3.0.2</version>
50                         </plugin>
51                         <plugin>
52                             <artifactId>maven-install-plugin</artifactId>
53                             <version>2.5.2</version>
54                         </plugin>
55                         <plugin>
56                             <artifactId>maven-deploy-plugin</artifactId>
57                             <version>2.8.2</version>
58                         </plugin>
59                         <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
60                         <plugin>
61                             <artifactId>maven-site-plugin</artifactId>
62                             <version>3.7.1</version>
63                         </plugin>
64                         <plugin>
65                             <artifactId>maven-project-info-reports-plugin</artifactId>
66                             <version>3.0.0</version>
67                         </plugin>
68                     </plugins>
69                 </pluginManagement>
70             </build>
71         </project>


        注: SpringcloudDemo01 的 pom.xml 添加了 <parent>、<pluginManagement> 元素和子元素,子模块的 pom.xml 继承这些元素,所以子模块无需添加这些元素,就可以直接使用这些元素所定义的依赖或属性。

        <packaging>pom</packaging> 表示 SpringcloudDemo01 打包后是 pom 包。

    6) 测试运行

        (1) 安装 SpringcloudDemo01 到本地 Maven 仓库

            View -> Tool Windows -> Maven -> SpringcloudDemo01 -> Lifecycle -> install

            查看本地仓库,SpringcloudDemo01 和 CommonAPI 包被安装好了。

            注:本地 Maven 仓库相关知识,可以参考 “ Maven基础知识(1)- Maven 简介、Maven 安装配置、创建 Quickstart 项目 ”

        (2) 编译 ServiceProvider

            View -> Tool Windows -> Maven -> ServiceProvider -> Lifecycle -> compile

            编译成功。


本系列文章资料参考来源:

1. https://docs.spring.io/spring-boot/docs/2.3.12.RELEASE/reference/html/
2. http://c.biancheng.net/springcloud/
3. https://github.com/Netflix/eureka/wiki
4. https://github.com/Netflix/Hystrix/wiki/
5. https://nacos.io/zh-cn/docs/what-is-nacos.html
6. https://sentinelguard.io/zh-cn/docs/introduction.html
7. https://seata.io/zh-cn/index.html

 




本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表