SpringCloud - Nacos注册/配置中心

news2025/3/31 6:19:20

前言

该博客为Nacos学习笔记,主要目的是为了帮助后期快速复习使用
学习视频:7小快速通关SpringCloud
辅助文档:SpringCloud快速通关
源码地址:cloud-demo

一、简介

Nacos官网:https://nacos.io/docs/next/quickstart/quick-start/
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现配置管理服务管理平台。
在这里插入图片描述

二、安装

2.1 Windows本地安装:

  1. 点击下载
  2. 找到对应版本的二进制下载
  3. 将压缩包解压到非中文无空格的目录
  4. 找到并进入bin目录,在地址栏输入cmd,打开黑窗口
  5. 输入startup.cmd -m standalone 启动,看到logo即启动成功【注意:黑窗口不能关闭】
  6. 在浏览器输入http://localhost:8848/nacos/
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.2 Docker安装【推荐】

docker run -d -p 8848:8848 -p 9848:9848 -e MODE=standalone --name nacos nacos/nacos-server:v2.4.3

三、注册中心

3.1 整合配置

3.1.1 依赖引入

<!-- web场景 -->
<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-discovery</artifactId>
</dependency>

3.1.2 编写yml配置文件

# 服务端口
server:
  port: 8000

spring:
  application:
    name: service-order # 服务名称
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848 # nacos地址(默认)

3.1.3 编写主程序


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class OrderMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderMainApplication.class, args);
    }
}

3.1.4 运行主程序,查看注册中心效果

运行成功,可以在服务列表中查看到
在这里插入图片描述

3.2 单机模拟集群启动

  1. 点击服务
  2. 找到OrderMainApplication,右键,点击复制配置
    在这里插入图片描述
    在这里插入图片描述
  3. 点击修改选项,将程序参数勾选上
    在这里插入图片描述
  4. 重新指定运行端口 -- + 配置,修改完成点击确定
--server.port=8001

在这里插入图片描述

  1. 右键运行,查看Nacos服务列表
    在这里插入图片描述
    在这里插入图片描述

3.3 服务发现

3.3.1 开启服务发现功能

在主程序上加上@EnableDiscoveryClient , 启用服务注册发现功能

3.3.2编写测试用例

3.3.2.1 依赖引入
<!-- 测试场景 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
</dependency>
3.3.2.2 使用DiscoveryClient测试服务发现API
@SpringBootTest
public class DiscoveryTest {

    @Autowired
    private DiscoveryClient discoveryClient; // 服务发现客户端

    @Test
    void discoveryClientTest() {
        for (String service : discoveryClient.getServices()) {
            System.out.println("service = " + service);
            // 获取服务实例 ip + port
            List<ServiceInstance> instances = discoveryClient.getInstances(service);
            for (ServiceInstance instance : instances) {
                System.out.println("ip:"+instance.getHost()+";"+"port = " + instance.getPort());
            }
        }
    }
}

在这里插入图片描述

3.3.2.3 使用NacosServiceDiscovery测试服务发现API
@SpringBootTest
public class DiscoveryTest {

    @Autowired
    private NacosServiceDiscovery nacosServiceDiscovery; // nacos服务发现客户端

    @Test
    void  nacosServiceDiscoveryTest() throws NacosException {
        for (String service : nacosServiceDiscovery.getServices()) {
            System.out.println("service = " + service);
            List<ServiceInstance> instances = nacosServiceDiscovery.getInstances(service);
            for (ServiceInstance instance : instances) {
                System.out.println("ip:"+instance.getHost()+";"+"port = " + instance.getPort());
            }
        }
    }
}

DiscoveryClientNacosServiceDiscovery 区别:

  • 抽象层次
    • DiscoveryClient 是一个通用接口,位于抽象层,不依赖于具体的服务注册中心。
    • NacosServiceDiscovery 是 DiscoveryClient 的具体实现依赖于 Nacos
  • 功能实现
    • DiscoveryClient 定义了服务发现的基本行为,但具体实现由各个服务注册中心提供。
    • NacosServiceDiscovery 提供了对 Nacos 的具体实现,包括与 Nacos 服务器的通信逻辑。
  • 使用方式
    • 在 Spring Cloud 应用程序中,通常通过 @EnableDiscoveryClient 注解启用服务发现功能,底层会自动选择合适的 DiscoveryClient 实现
    • 如果使用 Nacos 作为服务注册中心,NacosServiceDiscovery 会被自动配置为 DiscoveryClient 的实现

3.4 远程调用

3.4.1 服务之间调用的基本流程

以订单服务调用商品服务为例:

  1. 订单服务向注册中心获取商品服务可访问地址列表
  2. 注册中返回商品服务地址列表
  3. 订单服务从地址列表中选择一个地址
  4. 订单服务向选中的商品服务地址发送请求
  5. 商品服务处理请求并返回数据
  6. 订单服务接收商品服务返回的数据
    在这里插入图片描述
    在上一篇博客中详细讲解:RestTemplate快速入门

3.5 负载均衡

3.5.1 依赖引入

<!--loadbalancer-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

3.5.2 使用LoadBalancerClient开启负载均衡

3.5.2.1 测试
@SpringBootTest
public class LoadBalancerTest {

    @Autowired
    LoadBalancerClient loadBalancerClient;

    @Test
    public void test() {
        ServiceInstance choose = loadBalancerClient.choose("service-product");
        System.out.println(choose.getHost() + ":" + choose.getPort());
        choose = loadBalancerClient.choose("service-product");
        System.out.println(choose.getHost() + ":" + choose.getPort());
        choose = loadBalancerClient.choose("service-product");
        System.out.println(choose.getHost() + ":" + choose.getPort());
        choose = loadBalancerClient.choose("service-product");
        System.out.println(choose.getHost() + ":" + choose.getPort());

    }
}

在这里插入图片描述

3.5.2.2 使用示例

定义远程调用客户端RestTemplateBean对象

@Configuration
public class OrderConfig {

    @Bean
    @LoadBalanced //注解式负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

假设有一个服务名为service-product,通过RestTemplate调用其/product接口的代码如下

// 注入LoadBalancerClient对象
@Autowired
private LoadBalancerClient loadBalancerClient;
    
// 负载均衡发送请求
private Product getProductFromRemoteWithLoadBalancer(Long productId) {
      // 1. 获取到商品服务所在的所有机器IP + port
      ServiceInstance choose = loadBalancerClient.choose("service-product");
      // 2. 根据IP + port调用商品服务
      String url = "http://" + choose.getHost() + ":" + choose.getPort() + "/product/" + productId;
      log.info("调用商品服务: {}", url);
      // 调用商品服务
      return restTemplate.getForObject(url, Product.class);
  }

3.5.3 使用@LoadBalanced注解开启负载均衡

3.5.3.1 使用示例

在远程调用客户端RestTemplate的Bean对象上,加上@LoadBalanced注解,开启负载均衡

@Configuration
public class OrderConfig {

    @Bean
    @LoadBalanced //注解式负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

假设有一个服务名为service-product,通过RestTemplate调用其/product接口的代码如下

// 基于注解的负载均衡发送请求
private Product getProductFromRemoteWithLoadBalancerAnnotation(Long productId) {
     String url = "http://service-product/product/" + productId;
     // 调用商品服务,service-product为服务名称, 会被动态替换
     return restTemplate.getForObject(url, Product.class);
 }
3.5.3.2 调用过程解析

RestTemplate通过@LoadBalanced注解被标记为负载均衡客户端时,它会与服务发现机制集成。在调用http://service-product/product/时,

  1. RestTemplate会首先向服务注册中心查询service-product服务的所有可用实例。
  2. 服务注册中心会返回一个实例列表
  3. RestTemplate会根据配置的负载均衡策略(如轮询、随机等)从这些实例中选择一个进行调用
3.5.3.3 深入探索

经典面试题:如果注册中心宕机,远程调用是否可以成功?

  1. 从未调用过,如果宕机,调用会立即失败
  2. 调用过,如果宕机,因为会缓存名单,调用会成功
  3. 调用过,如果注册中心和对方服务宕机,因为会缓存名单,调用会阻塞后失败(Connection Refused)

四、配置中心

4.1 整合配置

4.1.1 依赖引入

<!-- 配置中心 -->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

4.1.2 编写yml配置文件

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848 # nacos地址(默认)
  config:
    import: nacos:service-order.properties

4.1.3 配置集-dataId

在浏览器中的Nacos可视化平台,找到配置管理,点击配置列表,新建一个配置
注意:Data ID 要和 yml配置文件 中的完全一致
在这里插入图片描述
注意:
当我们在项目引入了Nacos的配置中心的依赖,在项目启动前没导入任何的配置,就会报如下错误:

17:28:47.552 [main] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter -- 

***************************
APPLICATION FAILED TO START
***************************

Description:

No spring.config.import property has been defined

Action:

Add a spring.config.import=nacos: property to your configuration.
	If configuration is not required add spring.config.import=optional:nacos: instead.
	To disable this check, set spring.cloud.nacos.config.import-check.enabled=false.

解决方法

  1. 添加可选配置
# properties文件
spring.config.import=optional:nacos: # 可选
  1. 在yml配置中禁用导入检查
spring:
  cloud:
    nacos:
      config:
        import-check:
          enabled: false # 禁用配置检查

4.2 动态刷新

4.2.1 @RefreshScope

@RefreshScope -> 激活配置中心的自动刷新功能

@RestController
@RequiredArgsConstructor
@RefreshScope//自动刷新
public class OrderController {

    private final OrderService orderService;

    @Value("${order.timeout}")
    String orderTimeout;

    @Value("${order.timeout}")
    String orderAutoConfirm;

    @GetMapping("/config")
    public String getConfig() {
        return "timeout:" + orderTimeout + ",autoConfirm:" + orderAutoConfirm;
    }
}

启动项目,可见如下日志

2025-02-07T17:11:12.391+08:00  INFO 8056 --- [service-order] [           main] c.a.c.n.c.NacosConfigDataLoader          : [Nacos Config] Load config[dataId=service-order.properties, group=DEFAULT_GROUP] success
2025-02-07T17:11:13.761+08:00  INFO 8056 --- [service-order] [           main] c.a.c.n.refresh.NacosContextRefresher    : [Nacos Config] Listening config: dataId=service-order.properties, group=DEFAULT_GROUP

在浏览器输入http://localhost:8000/config,即可得到配置内容,在配置中心修改也可同步修改
在这里插入图片描述

4.2.2 @ConfigurationProperties

在配置文件中的属性较多的时候,使用@Value注解就显得有点繁琐。可以使用 @ConfigurationProperties 进行批量属性绑定,并且无需 @RefreshScope ,自动绑定配置,动态更新
抽取配置类,参考代码如下:

@Component
@ConfigurationProperties(prefix = "order") //配置批量绑定在nacos下,可以无需@RefreshScope就能实现自动刷新
@Data
public class OrderProperties {

    String timeout;

    String autoConfirm;

    String dbUrl;
}
@RestController
@RequiredArgsConstructor
public class OrderController {

    private final OrderProperties orderProperties; //注入订单配置类

    @GetMapping("/config")
    public String getConfig() {
        return "timeout:" + orderProperties.getTimeout() + ",autoConfirm:" + orderProperties.getAutoConfirm();
    }

}

4.3 手动编写代码监听配置变化

 /**
   * 创建并配置ApplicationRunner bean
   * 该bean在应用启动后,执行指定的操作,这里用于监听Nacos配置变化
   *
   * @param manager NacosConfigManager实例,用于与Nacos配置服务交互
   * @return ApplicationRunner实例,用于执行应用启动后的操作
   */
    @Bean
    ApplicationRunner applicationRunner(NacosConfigManager manager){
        return args -> {
            // 获取Nacos配置服务实例
            ConfigService configService = manager.getConfigService();
            // 为特定的配置文件添加监听器
            // 这里监听"service-order.properties"配置文件的变化
            configService.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {
                /**
                 * 返回一个固定大小的线程池,用于异步处理配置变更
                 *
                 * @return Executor实例,用于异步执行任务
                 */
                @Override
                public Executor getExecutor() {
                    // 创建一个包含4个线程的固定大小线程池
                    return Executors.newFixedThreadPool(4);
                }

                /**
                 * 当监听的配置信息发生变化时,该方法被调用
                 *
                 * @param configInfo 变更后的配置信息
                 */
                @Override
                public void receiveConfigInfo(String configInfo) {
                    // 打印变更后的配置信息
                    System.out.println("configInfo = " + configInfo);
                }
            });
        };
    }

思考:Nacos中的数据集 和 application.properties 有相同的 配置项,哪个生效?

参考答案:Nacos中的数据集的优先级高于本地application.properties,因此Nacos中的数据集的会生效。遵循先导入优先,外部优先,高优先级的配置会覆盖低优先级相同的配置。

在这里插入图片描述

4.4 数据隔离

4.4.1 namespace

**命名空间:**实现多环境隔离,如:开发、测试、预发、生产等
创建方式如下图:
在这里插入图片描述

4.4.2 dataId

**数据集id:**就是以前配置文件的名字。完整写法:名字.后缀 如:common.properties

4.4.3 groupId

**分组id:**一般可以用微服务的名字作为自己的组。
创建方式如下图:
在这里插入图片描述
点击创建配置后,填写配置信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.4.4 推荐用法

namespace【命名空间】、dataId【数据集】、group【组】配合 spring.config.activate.on-profile实现配置环境隔离
在这里插入图片描述
“通俗易懂”:多个命名空间,每个命名空间下有多个组,每个组就是一个微服务,每个微服务下又有多个配置文件即数据集,每个配置文件下又有多个配置项

4.4.4 按需加载

# 服务端口
server:
  port: 8000

spring:
  profiles:
    active: dev # 指定环境
  application:
    name: service-order # 服务名称
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848 # nacos地址(默认)
      config:
        import-check:
          enabled: false # 禁用配置检查 -> 记得开启不然会报错
        namespace: ${spring.profiles.active:public} # 指定命名空间 -> 采用 spring.profiles.active的值,默认为public

---
spring:
  config:
    import:
      - nacos:common.properties?group=order # 配置文件地址  group->指定组名
      - nacos:database.properties?group=order
    activate:
      on-profile: dev # 指定dev环境启用


---
spring:
  config:
    import:
      - nacos:common.properties?group=order # 配置文件地址  group->指定组名
      - nacos:database.properties?group=order
      - nacos:haha.properties?group=order
    activate:
      on-profile: test # 指定test环境启用

---
spring:
  config:
    import:
      - nacos:common.properties?group=order # 配置文件地址  group->指定组名
      - nacos:database.properties?group=order
      - nacos:hehe.properties?group=order
    activate:
      on-profile: prod # 指定prod环境启用

总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 继承(1)

1.继承概念 我们平时有时候在写多个有内容重复的类的时候会很麻烦 比如我要写Student Teacher Staff 这三个类 里面都要包含 sex name age成员变量 唯一不同的可能有一个成员变量 但是这三个成员变量我要写三遍 太麻烦了 有没有好的方式呢&#xff1f; 有的 就是继承…

【C语言】传值调用与传址调用详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;传值调用1. 什么是传值调用&#xff1f;2. 示例代码&#xff1a;传值调用失败的情况执行结果&#xff1a; 3. 为什么传值调用无法修改外部变量&#xff1f; &#x1f4…

蓝桥杯C语言组:图论问题

蓝桥杯C语言组图论问题研究 摘要 图论是计算机科学中的一个重要分支&#xff0c;在蓝桥杯C语言组竞赛中&#xff0c;图论问题频繁出现&#xff0c;对参赛选手的算法设计和编程能力提出了较高要求。本文系统地介绍了图论的基本概念、常见算法及其在蓝桥杯C语言组中的应用&#…

windows通过网络向Ubuntu发送文件/目录

由于最近要使用树莓派进行一些代码练习&#xff0c;但是好多东西都在windows里或虚拟机上&#xff0c;就想将文件传输到树莓派上&#xff0c;但试了发现u盘不能简单传送&#xff0c;就在网络上找到了通过windows 的scp命令传送 前提是树莓派先开启ssh服务&#xff0c;且Window…

Unity抖音云启动测试:如何用cmd命令行启动exe

相关资料&#xff1a;弹幕云启动&#xff08;原“玩法云启动能力”&#xff09;_直播小玩法_抖音开放平台 1&#xff0c;操作方法 在做云启动的时候&#xff0c;接完发现需要命令行模拟云环境测试启动&#xff0c;所以研究了下。 首先进入cmd命令&#xff0c;CD进入对应包的文件…

ZU47DR 100G光纤 高性能板卡

简介 2347DR是一款最大可提供8路ADC接收和8路DAC发射通道的高性能板卡。板卡选用高性价比的Xilinx的Zynq UltraScale RFSoC系列中XCZU47DR-FFVE1156作为处理芯片&#xff08;管脚可以兼容XCZU48DR-FFVE1156&#xff0c;主要差别在有无FEC&#xff08;信道纠错编解码&#xff0…

【算法】动态规划专题⑥ —— 完全背包问题 python

目录 前置知识进入正题模板 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 完全背包问题是动态规划中的一种经典问题&#xff0c;它与0-1背包问题相似&#xff0c;但有一个关键的区别&#xff1a;在完全背包问题中&#xff0c;每种物品都有无限的数量可用。…

C#中深度解析BinaryFormatter序列化生成的二进制文件

C#中深度解析BinaryFormatter序列化生成的二进制文件 BinaryFormatter序列化时,对象必须有 可序列化特性[Serializable] 一.新建窗体测试程序BinaryDeepAnalysisDemo,将默认的Form1重命名为FormBinaryDeepAnalysis 二.新建测试类Test Test.cs源程序如下: using System; us…

51单片机之引脚图(详解)

8051单片机引脚分类与功能笔记 1. 电源引脚 VCC&#xff08;第40脚&#xff09;&#xff1a;接入5V电源&#xff0c;为单片机提供工作电压。GND&#xff08;第20脚&#xff09;&#xff1a;接地端&#xff0c;确保电路的电位参考点。 2.时钟引脚 XTAL1&#xff08;第19脚&a…

jupyterLab插件开发

jupyter lab安装、配置&#xff1a; jupyter lab安装、配置教程_容器里装jupyterlab-CSDN博客 『Linux笔记』服务器搭建神器JupyterLab_linux_布衣小张-腾讯云开发者社区 Jupyter Lab | 安装、配置、插件推荐、多用户使用教程-腾讯云开发者社区-腾讯云 jupyterLab插件开发教…

配置#include “nlohmann/json.hpp“,用于处理json文件

#include “nlohmann/json.hpp” // 需要安装 nlohmann/json.hpp 头文件 using json = nlohmann::json; 下载链接:https://github.com/nlohmann/json/tree/develop 1.下载并解压:首先,需要从nlohmann/json的GitHub仓库下载源代码,并解压得到的文件。 地址: nlohmann/json…

MATLAB | 基于Theil-Sen斜率和Mann-Kendall检验的栅格数据趋势分析

最近看到一些博主分享关于 SenMK 检验的代码&#xff0c;对于新手来说可能有点复杂。我们编写了一段 MATLAB 代码&#xff0c;能够一次性解决这些问题&#xff0c;简化操作流程。我们还准备了几个关于趋势检验的空间分布图&#xff0c;供大家参考。 一、Sens Slope和Mann-Kenda…

Windows 系统下使用 Ollama 离线部署 DeepSeek - R1 模型指南

引言 随着人工智能技术的飞速发展&#xff0c;各类大语言模型层出不穷。DeepSeek - R1 凭借其出色的语言理解和生成能力&#xff0c;受到了广泛关注。而 Ollama 作为一款便捷的模型管理和部署工具&#xff0c;能够帮助我们轻松地在本地环境中部署和使用模型。本文将详细介绍如…

Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践

在现代企业中&#xff0c;管理和快速访问知识库是提升工作效率、促进创新的关键。为了满足这些需求&#xff0c;企业越来越倾向于构建本地私有化的知识库系统&#xff0c;这样可以更好地保护企业数据的安全性和隐私性。本文将介绍如何利用 **Docker**、**Ollama**、**Dify** 和…

【漫话机器学习系列】087.常见的神经网络最优化算法(Common Optimizers Of Neural Nets)

常见的神经网络优化算法 1. 引言 在深度学习中&#xff0c;优化算法&#xff08;Optimizers&#xff09;用于更新神经网络的权重&#xff0c;以最小化损失函数&#xff08;Loss Function&#xff09;。一个高效的优化算法可以加速训练过程&#xff0c;并提高模型的性能和稳定…

【JVM详解四】执行引擎

一、概述 Java程序运行时&#xff0c;JVM会加载.class字节码文件&#xff0c;但是字节码并不能直接运行在操作系统之上&#xff0c;而JVM中的执行引擎就是负责将字节码转化为对应平台的机器码让CPU运行的组件。 执行引擎是JVM核心的组成部分之一。可以把JVM架构分成三部分&am…

route 与 router 之间的差别

简述&#xff1a; router&#xff1a;主要用于处理一些动作&#xff0c; route&#xff1a;主要获得或处理一些数据&#xff0c;比如地址、参数等 例&#xff1a; videoInfo1.vue&#xff1a; <template><div class"video-info"><h3>二级组件…

SamWaf开源轻量级的网站应用防火墙(安装包),私有化部署,加密本地存储的数据,易于启动,并支持 Linux 和 Windows 64 位和 Arm64

一、SamWaf轻量级开源防火墙介绍 &#xff08;文末提供下载&#xff09; SamWaf网站防火墙是一款适用于小公司、工作室和个人网站的开源轻量级网站防火墙&#xff0c;完全私有化部署&#xff0c;数据加密且仅保存本地&#xff0c;一键启动&#xff0c;支持Linux&#xff0c;Wi…

极客说|利用 Azure AI Agent Service 创建自定义 VS Code Chat participant

作者&#xff1a;卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&a…

windows + visual studio 2019 使用cmake 编译构建静、动态库并调用详解

环境 windows visual studio 2019 visual studio 2019创建cmake工程 1. 静态库.lib 1.1 静态库编译生成 以下是我创建的cmake工程文件结构&#xff0c;只关注高亮文件夹部分 libout 存放编译生成的.lib文件libsrc 存放编译用的源代码和头文件CMakeLists.txt 此次编译CMak…