1.初始環境的搭建
1.1環境要求:
- Spring Boot 3.2.5:
-
- 基于最新的 Spring Framework 6.x。
- 支持現代化開發模式,幫助開發更加高效。
- JDK 17 或更高版本:
Spring Boot 3.x 開始要求 Java 17 作為最低運行環境。
Spring Boot 與 Spring Cloud Alibaba 版本對應關系
- 2023.x 分支對應的是 Spring Cloud 2023 與 Spring Boot 3.2.x,最低支持 JDK 17。
請根據您使用的 Spring Boot 版本,選擇兼容的 Spring Cloud Alibaba 版本
Spring Boot Version | Spring Cloud Alibaba Version | Spring Cloud Version |
3.0.2 | 2022.0.0.0 | Spring Cloud 2022.0.0 |
3.0.2 | 2022.0.0.0-RC2 | Spring Cloud 2022.0.0 |
3.0.0 | 2022.0.0.0-RC1 | Spring Cloud 2022.0.0 |
2.6.13 | 2021.0.5.0 | Spring Cloud 2021.0.5 |
2.6.11 | 2021.0.4.0 | Spring Cloud 2021.0.4 |
2.6.3 | 2021.0.1.0 | Spring Cloud 2021.0.1 |
2.4.2 | 2021.1 | Spring Cloud 2020.0.1 |
2.3.12.RELEASE | 2.2.10-RC1 | Spring Cloud Hoxton.SR12 |
2.3.12.RELEASE | 2.2.9.RELEASE | Spring Cloud Hoxton.SR12 |
2.3.12.RELEASE | 2.2.8.RELEASE | Spring Cloud Hoxton.SR12 |
2.3.12.RELEASE | 2.2.7.RELEASE | Spring Cloud Hoxton.SR12 |
2.3.2.RELEASE | 2.2.6.RELEASE | Spring Cloud Hoxton.SR9 |
2.2.5.RELEASE | 2.2.1.RELEASE | Spring Cloud Hoxton.SR3 |
2.2.X.RELEASE | 2.2.0.RELEASE | Spring Cloud Hoxton.RELEASE |
2.1.13.RELEASE | 2.1.4.RELEASE | Spring Cloud Greenwich.SR6 |
2.1.X.RELEASE | 2.1.2.RELEASE | Spring Cloud Greenwich |
2.0.X.RELEASE | 2.0.4.RELEASE(停止維護,建議升級) | Spring Cloud Finchley |
1.5.X.RELEASE | 1.5.1.RELEASE(停止維護,建議升級) | Spring Cloud Edgware |
1.2.創建Spring Boot 作為父工程
將Spring boot版本更換為3.2.5
將此項目作為父工程使用,引入Spring cloud及其Spring Cloud Alibaba的版本控制:? ? <dependencyManagement> 該標簽表示控制子工程引入這些依賴時的版本,子工程引入該依賴不需要寫版本號
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2023.0.1.0</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2023.0.3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
完整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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 定義版本屬性 --><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot-version>3.2.5</spring-boot-version><!-- 版本的控制--><spring-cloud-alibaba-dependencies-version>2023.0.1.0</spring-cloud-alibaba-dependencies-version><spring-cloud-dependencies-version>2023.0.3</spring-cloud-dependencies-version></properties><modelVersion>4.0.0</modelVersion><!-- 父工程 坐標--><groupId>com.xiaog</groupId><artifactId>xiaoG-Cloud</artifactId><version>0.0.1-SNAPSHOT</version><name>xiaoG-Cloud</name><description>xiaoG-Cloud</description><!-- ?聚合工程 必須設置為 pom --><packaging>pom</packaging><!-- 模塊(當父工程使用Maven命令時子工程也一并執行該命令) --><modules><module>cloud-order</module></modules><!--子工程繼承父工程時會自動繼承dependencies 中的包--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 引入SpringCloud的依賴 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud-dependencies-version}</version><type>pom</type><scope>import</scope></dependency><!--引入alibaba依賴--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba-dependencies-version}</version><type>pom</type><scope>import</scope></dependency></dependencies><!--該標簽用戶控制子模塊 引入這些包時不需要寫版本號--><dependencyManagement><dependencies><!-- 引入SpringCloud Alibaba的依賴 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba-dependencies-version}</version><type>pom</type><scope>import</scope></dependency><!-- 引入SpringCloud的依賴 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud-dependencies-version}</version><type>pom</type><scope>import</scope></dependency><!-- 引入SpringBoot的依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot-version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot-version}</version><configuration><mainClass>com.xiaog.xiaogcloud.XiaoGCloudApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
1.3安裝 配置 nacos
發布歷史 | Nacos 官網
去到該官網選擇合適的naocs版本,本篇文章采用Nacos 2.3.2,的Windows版本。
? ? ? ? 選擇版本的小技巧,ctrl+左鍵點擊進入,搜索nacos,里面會寫有需要哪個版本的Nacos客戶端
解壓后進入文件夾,創建對應所需要的數據庫進行持久化,否者重啟數據就會丟失
先執行命令
CREATE DATABASE nacos2_3_2;
創建對應的數據庫
在該庫下執行該sql命令 創建對應的表
修改nacos的連接數據庫的配置文件 application.properties
回到主目錄,將bin/startup.cmd 修改為單機啟動,默認使用集群啟動
將 cluster 更換為 standalone
然后雙擊 startup.cmd 啟動Nacos
訪問http://localhost:8848/nacos
進入該頁面表示啟動成功
2.創建訂單服務
在父工程下新建模塊
新建模塊口訣,建pom 寫 yml 啟動類
pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xiaog</groupId><artifactId>cloud-order</artifactId><version>0.0.1-SNAPSHOT</version><name>cloud-order</name><description>cloud-order</description><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><parent><groupId>com.xiaog</groupId><artifactId>xiaoG-Cloud</artifactId><version>0.0.1-SNAPSHOT</version></parent><dependencies></dependencies></project>
然后再添加服務注冊 和 服務發現 依賴:
<!--集成 Nacos 作為配置中心。--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--集成 Nacos 作為服務注冊中心。--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
配置yml配置文件
server:port: 8081spring:application:name: order-service # 服務名稱 表示這個服務cloud:nacos:#指定 Nacos 服務器的地址,這里是本地運行的 Nacos 服務serverAddr: 127.0.0.1:8848config:import:#含義:從 Nacos 配置中心加載與當前應用名稱(spring.application.name)匹配的配置文件。#optional 如果找不到該文件則不報錯- optional:nacos:${spring.application.name}.yaml
啟動類上加上
@EnableDiscoveryClient 注解
啟動服務
查看nacos服務
服務注冊成功
3.創建庫存服務
先建目錄
口訣:先建pom再建yml 最后啟動類
添加為Maven項目
復制訂單服務的Maven內容,粘貼到庫存服務中
并修改畫紅線的位置為cloud-stock
完整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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xiaog</groupId><artifactId>cloud-stock</artifactId><version>0.0.1-SNAPSHOT</version><name>cloud-stock</name><description>cloud-stock</description><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><parent><groupId>com.xiaog</groupId><artifactId>xiaoG-Cloud</artifactId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--集成 Nacos 作為配置中心。--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--集成 Nacos 作為服務注冊中心。--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies></project>
建yml
server:port: 8084spring:application:name: stock-servicecloud:nacos:serverAddr: 127.0.0.1:8848config:import:#含義:從 Nacos 配置中心加載與當前應用名稱(spring.application.name)匹配的配置文件。#optional 如果找不到該文件則不報錯- optional:nacos:${spring.application.name}.yaml
啟動類:
@SpringBootApplication
@EnableDiscoveryClient
public class CloudStockApplication {public static void main(String[] args) {SpringApplication.run(CloudStockApplication.class, args);}}
完整:結構
啟動服務
查看nacos
服務添加成功
4.編寫Api公共模塊(OpenFeign遠程調用)
使用Api模塊可以使調用進行分離,還可以將實體類放入該模塊進行統一管理。
結構如下(不需要啟動類 yml 和web框架的引用)
maven:(包含OpenFeign的依賴及loadbalancer(必須兩個依賴一起引入),不需要指定版本的原因是父類中指定了coud 的版本,會自動幫忙選擇合適的Openfeign版本)
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xiaog</groupId><artifactId>cloud-api-commons</artifactId><version>0.0.1-SNAPSHOT</version><name>cloud-api-commons</name><description>cloud-api-commons</description><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><parent><groupId>com.xiaog</groupId><artifactId>xiaoG-Cloud</artifactId><version>0.0.1-SNAPSHOT</version></parent><dependencies><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version><scope>provided</scope></dependency><!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--LoadBalancer--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies><packaging>jar</packaging><!-- <build>-->
<!-- <plugins>-->
<!-- <!– 徹底跳過從父工程繼承的 spring-boot-maven-plugin –>-->
<!-- <plugin>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <phase>none</phase> <!– 表示不執行 –>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- <configuration>-->
<!-- <skip>true</skip> <!– 可選 –>-->
<!-- </configuration>-->
<!-- </plugin>--><!-- <!– 保證普通 jar 被正常打包 –>-->
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-jar-plugin</artifactId>-->
<!-- <version>3.3.0</version>-->
<!-- <configuration>-->
<!-- <skipIfEmpty>false</skipIfEmpty>-->
<!-- </configuration>-->
<!-- </plugin>-->
<!-- </plugins>--><!-- </build>--></project>
給父工程maven添加模塊
<!-- 模塊(當父工程使用Maven命令時子工程也一并執行該命令) --><modules><module>cloud-order</module><module>cloud-stock</module><module>cloud-api-commons</module></modules>
編寫統一返回體
ResultData:
@Data
@Accessors(chain = true)
public class ResultData<T> {private String code;private String message;private T data;private long timestamp;//調用方法的時間戳public ResultData() {this.timestamp = System.currentTimeMillis();}public static <T> ResultData<T> success(T data) {ResultData<T> resultData = new ResultData<>();resultData.setCode(ReturnCodeEnum.RC200.getCode());resultData.setMessage(ReturnCodeEnum.RC200.getMessage());resultData.setData(data);return resultData;}public static <T> ResultData<T> fail(String code, String message) {ResultData<T> resultData = new ResultData<>();resultData.setCode(code);resultData.setMessage(message);return resultData;}
}
ReturnCodeEnum:
@Getter
public enum ReturnCodeEnum {//1.舉值RC999("999", "操作XXX失敗"),RC200("200", "success"),RC201("201", "服務開啟降級保護,請稍后再試!"),RC202("202", "熱點參數限流,請稍后再試!"),RC203("203", "系統規則不滿足要求,請稍后再試!"),RC204("204", "授權規則不通過,請稍后再試!"),RC403("403", "無訪問權限,請聯系管理員授予權限"),RC401("401", "匿名用戶訪問無權限資源時的異常"),RC404("404", "404頁面找不到的異常"),RC500("500", "系統異常,請稍后重試"),RC375("375", "數學運算異常,請稍后重試"),INVALID_TOKEN("2001", "訪問令牌不合法"),ACCESS_DENIED("2003", "沒有權限訪問該資源"),CLIENT_AUTHENTICATION_FAILED("1001", "客戶端認證失敗"),USERNAME_OR_PASSWORD_ERROR("1002", "用戶名或密碼錯誤"),BUSINESS_ERROR("1004", "業務邏輯異常"),UNSUPPORTED_GRANT_TYPE("1003", "不支持的認證模式");//2.構造private final String code;//自定義狀態碼,對應前面枚舉的第一個參數private final String message;//自定義信息,對應前面枚舉的第二個參數ReturnCodeEnum(String code, String message) {this.code = code;this.message = message;}//3.遍歷public static ReturnCodeEnum getReturnCodeEnum(String code) {//傳入一個狀態碼,如果有,就返回整個枚舉信息,如果沒有就返回空for (ReturnCodeEnum element : ReturnCodeEnum.values()) {if (element.getCode().equalsIgnoreCase(code)) {return element;}}return null;}}
目前為止我們的遠程服務就搭建得差不多完成了。
將Api模塊引入庫存服務和訂單服務中?? ,此時還需要在庫存服務中編寫一個扣減庫存的controller和在Api模塊編寫一個遠程扣減庫存調用的接口,實現在訂單服務下單時遠程調用庫存扣減接口
1.庫存服務 和 訂單服務都 引入Api模塊
<dependency><groupId>com.xiaog</groupId><artifactId>cloud-api-commons</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
在庫存服務cloud-stock中編寫一個Controller
@RestController
@RequestMapping("/praise")
public class StockManageController {//扣減庫存@GetMapping("/reduceInventory")public ResultData<String> reduceInventory() {return ResultData.success("扣減庫存成功");}}
在Api公共模塊中編寫調用接口
//value 指定生產者服務名稱 ,也就是stock模塊中的 yml 文件中的 spring.application.name
//path 指定生產者服務中的請求路徑
@FeignClient(name = "stock-service",path = "/praise")
public interface stockApi {//庫存扣減@GetMapping("/reduceInventory")public ResultData<String> reduceInventory() ;}
在訂單服務創建Controller并嘗試遠程調用
@RestController
public class orderManageController {@Autowired // 注入stockApiprivate com.xiaog.api.stockApis.stockApi stockApi;@RequestMapping("/createOrder")public String createOrder(){ResultData<String> stringResultData = stockApi.reduceInventory();if (stringResultData.getCode().equals("200")) {System.out.println("庫存服務返回消息為"+stringResultData.toString());return "被調用者 庫存服務返回消息為"+stringResultData.toString()+"創建訂單成功";}return "創建失敗";}
}
并在訂單啟動類上打上啟動OpenFeign注解
訪問地址?localhost:8082/createOrder
返回
表示遠程調用成功