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
返回
表示远程调用成功