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
去到该官网选择合适的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


进入该页面表示启动成功
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: 8081
spring:
application:
name: order-service # 服务名称 表示这个服务
cloud:
nacos:
#指定 Nacos 服务器的地址,这里是本地运行的 Nacos 服务
serverAddr: 127.0.0.1:8848
config:
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: 8084
spring:
application:
name: stock-service
cloud:
nacos:
serverAddr: 127.0.0.1:8848
config:
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 // 注入stockApi
private 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
返回

表示远程调用成功