
目录一、在SpringBoot上建立SpringCloud二、创建父子工程三、每个模块升级成SpringBootWeb项目四、总结一、在SpringBoot上建立SpringCloud我们前边创建过SpringBoot项目都会引入一个前缀为springboot-starter-的依赖例如创建一个项目pom文件中就包含parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version4.0.2/version relativePath/ !-- lookup parent from repository -- /parent我这里的springBoot版本号是4.0.2,我们ctrl点击artifactId后逐层进入父pom会看到一个巨大的“版本仲裁中心”这里存放了很多依赖的版本号这也让我们先前在引入依赖时没有去指定版本号因为这里面存放的就是推荐版本。比如我们熟知的mysql依赖但是没有springcloud依赖的版本但是springcloud又是在springBoot之上建立的。所以在springboot项目上创建springcloud项目需要引入springcloud依赖。这个时候我们有多种选择可以选择引入官方SpringCloud、SpringCloud Alibaba、等其他微服务生态。他们都集成了所必须的组件例如服务注册和发现等。阿里巴巴生态是国内的主流选择集成Nacos、Sentinel等阿里开源组件。如果你想要使用netflix OSS组件那么你也可以引入官方Spring Cloud.更多时候我们都是结合着用的。值得注意的是我们此时导入的是一个SpringCloud生态是一个BOM物料清单而非jar包。需要将其放到dependencyManagement节点下这里面并不含有任何业务代码只是一份依赖清单。所以导入时要指定类型为pom明确这是个“元数据”不是代码。其次就是作用域为import,这样只要子项目引入后就能把仓库里面所有的版本声明全部复制到当前项目的dependencyManagement中了。不同的作用域有不同作用作用域编译测试运行compile(默认)生效生效生效test生效provided生效生效runtime生效生效import(只能给BOM用)---SpringBoot版本不同需要引入的cloud依赖版本也不同。针对这个问题可以查看官方手册。官方SpringCloud版本SpringCloud官方阿里巴巴SpringCloud版本SpringCloud阿里巴巴dependencyManagement dependencies !--官方SpringCloud-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version2025.1.0/version typepom/type scopeimport/scope /dependency !--阿里巴巴SpringCloud-- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-alibaba-dependencies/artifactId version2025.1.0.0/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement当你引入了任何一个他们包含的jar包时才可以使用同样的方式ctrl点击artifactId看到一些版本配置信息这些都是推荐的版本。里面有我们经常使用的Openfeign和Gateway,阿里巴巴BOM中还有我们会使用的nacos等组件。二、创建父子工程之前我们的应用程序是单体架构现在我们需要把它拆分成分布式微服务架构。这样做的好处是将服务进行拆分分别部署到不同服务器上减轻单个服务器的压力单个服务发生宕机不会导致整体服务不可用提高了稳定性按照业务拆分进行解耦降低业务耦合在多人开发中有利于分工合作。例如博客服务可以简单分为这么三类用户服务博客服务和网关服务。用父子工程的方式将其管理起来就构成了分布式架构。这三个服务可以分别部署在不同的机器上和不同的端口上。Common作为公共组件为其他服务提供工具。本身不是服务不含启动类。到时候每个服务的jar包打完都会含有一个common jar包用来为自己的程序服务。我们先创建父工程创建一个Maven空项目删除掉src目录因为我们并不需要在父工程下写任何业务代码,所以父工程必须打包成pom。在pom文件中添加如下配置这样方便我们管理依赖不会发生版本冲突。?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.miao/groupId artifactIdspring-cloud-blog/artifactId version1.0-SNAPSHOT/version !-- 声明父工程的打包方式为pom -- packagingpom/packaging modules moduleblog-info/module moduleuser-info/module modulegateway-service/module moduleblog-common/module /modules !-- 完善依赖 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.1.6/version relativePath/ !-- lookup parent from repository -- /parent properties maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target java.version17/java.version mybatis.version3.0.3/mybatis.version mysql.version8.0.33/mysql.version mysql.plus.version3.5.5/mysql.plus.version spring-cloud.version2022.0.3/spring-cloud.version spring-cloud-alibaba.version2022.0.0.0-RC2/spring-cloud-alibaba.version /properties !--所有子项目都会继承的依赖-- dependencies dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies !-- 依赖管理 不会给父工程、子模块引入任何 jar 包 只定义好「依赖坐标 固定版本」 子模块需要用到某个依赖时只需要写 groupId、artifactId省略 version自动继承父工程这里约定好的版本 -- dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version${spring-cloud.version}/version typepom/type scopeimport/scope /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-alibaba-dependencies/artifactId version${spring-cloud-alibaba.version}/version typepom/type scopeimport/scope /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version${mybatis.version}/version /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-spring-boot3-starter/artifactId version${mysql.plus.version}/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version${mysql.version}/version /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter-test/artifactId version${mybatis.version}/version scopetest/scope /dependency /dependencies /dependencyManagement /project父工程打包成pom后这样指定的modules才会被识别到注意先创建模块才会出现modules这样整个组织结构才得以建立。我们还在pom文件中提前约定了版本号这是一组非常稳定的组合后续依赖均使用这组版本号不会导致混乱。需要注意父工程里的dependencies会被子项目所继承例如Lombok而dependencyManagement则不会被继承例如mybatis它只是声明了依赖信息包括版本号作用域等。后续子项目需要引入依赖时才会被引入这个时候就会按照我们约定好的配置去引入依赖。接下来只要按照我们上面的模块名创建子工程即可。可以发现子模块的Lombok依赖被隐式继承了自身pom文件中无但是依赖库里能看到。如此反复创建得到如下的目录配置文件也会显示父子关系三、每个模块升级成SpringBootWeb项目此时我们需要对网关服务、用户服务和博客服务添加SpringWeb依赖并且添加配置信息和启动类。dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId /dependencyweb来自springboot父工程的起步依赖我们的springboot版本是3.1.6所以用的是web,如果是4.0.x则要改成mvc.随后创建配置文件指定端口号那需不需要指定IP地址呢每个服务确实由IP地址端口号确定的。但是我们完全没必要去指定我们会把服务注册到nacos当我们程序跑起来时会自动向nacos上报IP地址和端口号所以不用担心别的服务找不到我们。例如先做这样的配置后续的话需要配置很多东西目前配置先这样写。接着添加启动类。然后测试是否可以成功运行控制台显示成功运行。这样我们所有的工作就做完了。后续的博客业务就在这个子目录下完成。四、总结到目前为止我们学习了分布式微服务的创建流程重要的是父项目如何管理依赖后续不会发生依赖冲突。BOM需要在dependenceManagement中声明类型为pom文件作用域为import,主要注意这些就能规避大部分错误。