从零搭建Cloud Alibaba

1.初始环境的搭建

1.1环境要求:

  1. Spring Boot 3.2.5
    • 基于最新的 Spring Framework 6.x。
    • 支持现代化开发模式,帮助开发更加高效。
  1. 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: 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>-->
<!--            &lt;!&ndash; 彻底跳过从父工程继承的 spring-boot-maven-plugin &ndash;&gt;-->
<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--                <executions>-->
<!--                    <execution>-->
<!--                        <phase>none</phase> &lt;!&ndash; 表示不执行 &ndash;&gt;-->
<!--                    </execution>-->
<!--                </executions>-->
<!--                <configuration>-->
<!--                    <skip>true</skip> &lt;!&ndash; 可选 &ndash;&gt;-->
<!--                </configuration>-->
<!--            </plugin>-->

<!--            &lt;!&ndash; 保证普通 jar 被正常打包 &ndash;&gt;-->
<!--            <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

返回

表示远程调用成功

相关推荐
一叶飘零_sweeeet2 分钟前
IDEA 插件 Trae AI 全攻略
java·人工智能·intellij-idea
水无痕simon11 分钟前
5 索引的操作
数据库·elasticsearch
欧哈东哥27 分钟前
【C++】标准库中用于组合多个值的数据结构pair、tuple、array...
java·数据结构·c++
python_13631 分钟前
web请求和响应
java·spring·github
柏油1 小时前
可视化 MySQL binlog 监听方案
数据库·后端·mysql
yh云想1 小时前
《从入门到精通:Kafka核心原理全解析》
分布式·kafka
k↑1 小时前
微服务之注册中心与ShardingSphere关于分库分表的那些事
数据库·微服务·架构·shardingsphere
ciku2 小时前
Spring AI Starter和文档解读
java·人工智能·spring
柏油2 小时前
MySQL 字符集 utf8 与 utf8mb4
数据库·后端·mysql