建)
目錄一、在SpringBoot上建立SpringCloud二、創(chuàng)建父子工程三、每個(gè)模塊升級(jí)成SpringBootWeb項(xiàng)目四、總結(jié)一、在SpringBoot上建立SpringCloud我們前邊創(chuàng)建過(guò)SpringBoot項(xiàng)目都會(huì)引入一個(gè)前綴為springboot-starter-的依賴?yán)鐒?chuàng)建一個(gè)項(xiàng)目pom文件中就包含parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version4.0.2/version relativePath/ !-- lookup parent from repository -- /parent我這里的springBoot版本號(hào)是4.0.2,我們ctrl點(diǎn)擊artifactId后逐層進(jìn)入父pom會(huì)看到一個(gè)巨大的“版本仲裁中心”這里存放了很多依賴的版本號(hào)這也讓我們先前在引入依賴時(shí)沒(méi)有去指定版本號(hào)因?yàn)檫@里面存放的就是推薦版本。比如我們熟知的mysql依賴但是沒(méi)有springcloud依賴的版本但是springcloud又是在springBoot之上建立的。所以在springboot項(xiàng)目上創(chuàng)建springcloud項(xiàng)目需要引入springcloud依賴。這個(gè)時(shí)候我們有多種選擇可以選擇引入官方SpringCloud、SpringCloud Alibaba、等其他微服務(wù)生態(tài)。他們都集成了所必須的組件例如服務(wù)注冊(cè)和發(fā)現(xiàn)等。阿里巴巴生態(tài)是國(guó)內(nèi)的主流選擇集成Nacos、Sentinel等阿里開(kāi)源組件。如果你想要使用netflix OSS組件那么你也可以引入官方Spring Cloud.更多時(shí)候我們都是結(jié)合著用的。值得注意的是我們此時(shí)導(dǎo)入的是一個(gè)SpringCloud生態(tài)是一個(gè)BOM物料清單而非jar包。需要將其放到dependencyManagement節(jié)點(diǎn)下這里面并不含有任何業(yè)務(wù)代碼只是一份依賴清單。所以導(dǎo)入時(shí)要指定類(lèi)型為pom明確這是個(gè)“元數(shù)據(jù)”不是代碼。其次就是作用域?yàn)閕mport,這樣只要子項(xiàng)目引入后就能把倉(cāng)庫(kù)里面所有的版本聲明全部復(fù)制到當(dāng)前項(xiàng)目的dependencyManagement中了。不同的作用域有不同作用作用域編譯測(cè)試運(yùn)行compile(默認(rèn))生效生效生效test生效provided生效生效runtime生效生效import(只能給BOM用)---SpringBoot版本不同需要引入的cloud依賴版本也不同。針對(duì)這個(gè)問(wèn)題可以查看官方手冊(cè)。官方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當(dāng)你引入了任何一個(gè)他們包含的jar包時(shí)才可以使用同樣的方式ctrl點(diǎn)擊artifactId看到一些版本配置信息這些都是推薦的版本。里面有我們經(jīng)常使用的Openfeign和Gateway,阿里巴巴BOM中還有我們會(huì)使用的nacos等組件。二、創(chuàng)建父子工程之前我們的應(yīng)用程序是單體架構(gòu)現(xiàn)在我們需要把它拆分成分布式微服務(wù)架構(gòu)。這樣做的好處是將服務(wù)進(jìn)行拆分分別部署到不同服務(wù)器上減輕單個(gè)服務(wù)器的壓力單個(gè)服務(wù)發(fā)生宕機(jī)不會(huì)導(dǎo)致整體服務(wù)不可用提高了穩(wěn)定性按照業(yè)務(wù)拆分進(jìn)行解耦降低業(yè)務(wù)耦合在多人開(kāi)發(fā)中有利于分工合作。例如博客服務(wù)可以簡(jiǎn)單分為這么三類(lèi)用戶服務(wù)博客服務(wù)和網(wǎng)關(guān)服務(wù)。用父子工程的方式將其管理起來(lái)就構(gòu)成了分布式架構(gòu)。這三個(gè)服務(wù)可以分別部署在不同的機(jī)器上和不同的端口上。Common作為公共組件為其他服務(wù)提供工具。本身不是服務(wù)不含啟動(dòng)類(lèi)。到時(shí)候每個(gè)服務(wù)的jar包打完都會(huì)含有一個(gè)common jar包用來(lái)為自己的程序服務(wù)。我們先創(chuàng)建父工程創(chuàng)建一個(gè)Maven空項(xiàng)目刪除掉src目錄因?yàn)槲覀儾⒉恍枰诟腹こ滔聦?xiě)任何業(yè)務(wù)代碼,所以父工程必須打包成pom。在pom文件中添加如下配置這樣方便我們管理依賴不會(huì)發(fā)生版本沖突。?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 !--所有子項(xiàng)目都會(huì)繼承的依賴-- dependencies dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies !-- 依賴管理 不會(huì)給父工程、子模塊引入任何 jar 包 只定義好「依賴坐標(biāo) 固定版本」 子模塊需要用到某個(gè)依賴時(shí)只需要寫(xiě) groupId、artifactId省略 version自動(dòng)繼承父工程這里約定好的版本 -- 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才會(huì)被識(shí)別到注意先創(chuàng)建模塊才會(huì)出現(xiàn)modules這樣整個(gè)組織結(jié)構(gòu)才得以建立。我們還在pom文件中提前約定了版本號(hào)這是一組非常穩(wěn)定的組合后續(xù)依賴均使用這組版本號(hào)不會(huì)導(dǎo)致混亂。需要注意父工程里的dependencies會(huì)被子項(xiàng)目所繼承例如Lombok而dependencyManagement則不會(huì)被繼承例如mybatis它只是聲明了依賴信息包括版本號(hào)作用域等。后續(xù)子項(xiàng)目需要引入依賴時(shí)才會(huì)被引入這個(gè)時(shí)候就會(huì)按照我們約定好的配置去引入依賴。接下來(lái)只要按照我們上面的模塊名創(chuàng)建子工程即可。可以發(fā)現(xiàn)子模塊的Lombok依賴被隱式繼承了自身pom文件中無(wú)但是依賴庫(kù)里能看到。如此反復(fù)創(chuàng)建得到如下的目錄配置文件也會(huì)顯示父子關(guān)系三、每個(gè)模塊升級(jí)成SpringBootWeb項(xiàng)目此時(shí)我們需要對(duì)網(wǎng)關(guān)服務(wù)、用戶服務(wù)和博客服務(wù)添加SpringWeb依賴并且添加配置信息和啟動(dòng)類(lèi)。dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId /dependencyweb來(lái)自springboot父工程的起步依賴我們的springboot版本是3.1.6所以用的是web,如果是4.0.x則要改成mvc.隨后創(chuàng)建配置文件指定端口號(hào)那需不需要指定IP地址呢每個(gè)服務(wù)確實(shí)由IP地址端口號(hào)確定的。但是我們完全沒(méi)必要去指定我們會(huì)把服務(wù)注冊(cè)到nacos當(dāng)我們程序跑起來(lái)時(shí)會(huì)自動(dòng)向nacos上報(bào)IP地址和端口號(hào)所以不用擔(dān)心別的服務(wù)找不到我們。例如先做這樣的配置后續(xù)的話需要配置很多東西目前配置先這樣寫(xiě)。接著添加啟動(dòng)類(lèi)。然后測(cè)試是否可以成功運(yùn)行控制臺(tái)顯示成功運(yùn)行。這樣我們所有的工作就做完了。后續(xù)的博客業(yè)務(wù)就在這個(gè)子目錄下完成。四、總結(jié)到目前為止我們學(xué)習(xí)了分布式微服務(wù)的創(chuàng)建流程重要的是父項(xiàng)目如何管理依賴后續(xù)不會(huì)發(fā)生依賴沖突。BOM需要在dependenceManagement中聲明類(lèi)型為pom文件作用域?yàn)閕mport,主要注意這些就能規(guī)避大部分錯(cuò)誤。