当前位置: 首页 > news >正文

SpringCloud - Nacos注册/配置中心

前言

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

一、简介

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: 8000spring: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 {@Autowiredprivate DiscoveryClient discoveryClient; // 服务发现客户端@Testvoid discoveryClientTest() {for (String service : discoveryClient.getServices()) {System.out.println("service = " + service);// 获取服务实例 ip + portList<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 {@Autowiredprivate NacosServiceDiscovery nacosServiceDiscovery; // nacos服务发现客户端@Testvoid  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 {@AutowiredLoadBalancerClient loadBalancerClient;@Testpublic 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 + portServiceInstance 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 definedAction: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实例,用于执行应用启动后的操作*/@BeanApplicationRunner applicationRunner(NacosConfigManager manager){return args -> {// 获取Nacos配置服务实例ConfigService configService = manager.getConfigService();// 为特定的配置文件添加监听器// 这里监听"service-order.properties"配置文件的变化configService.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {/*** 返回一个固定大小的线程池,用于异步处理配置变更** @return Executor实例,用于异步执行任务*/@Overridepublic Executor getExecutor() {// 创建一个包含4个线程的固定大小线程池return Executors.newFixedThreadPool(4);}/*** 当监听的配置信息发生变化时,该方法被调用** @param configInfo 变更后的配置信息*/@Overridepublic 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: 8000spring: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=orderactivate:on-profile: dev # 指定dev环境启用---
spring:config:import:- nacos:common.properties?group=order # 配置文件地址  group->指定组名- nacos:database.properties?group=order- nacos:haha.properties?group=orderactivate:on-profile: test # 指定test环境启用---
spring:config:import:- nacos:common.properties?group=order # 配置文件地址  group->指定组名- nacos:database.properties?group=order- nacos:hehe.properties?group=orderactivate:on-profile: prod # 指定prod环境启用

总结

在这里插入图片描述

相关文章:

SpringCloud - Nacos注册/配置中心

前言 该博客为Nacos学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 一、简介 Nacos官网&#xff1a;https://nacos.io/docs/next/quickstart/quick-start/ Nacos /nɑ:kəʊ…...

面试准备——Java理论高级【笔试,面试的核心重点】

集合框架 Java集合框架是面试中的重中之重&#xff0c;尤其是对List、Set、Map的实现类及其底层原理的考察。 1. List ArrayList&#xff1a; 底层是动态数组&#xff0c;支持随机访问&#xff08;通过索引&#xff09;&#xff0c;时间复杂度为O(1)。插入和删除元素时&#…...

AI伴读-清华大学104页《DeepSeek:从入门到精通》

辅助工具&#xff1a;deepseek、豆包AI伴读 官网&#xff1a;DeepSeekDeepSeek, unravel the mystery of AGI with curiosity. Answer the essential question with long-termism.https://www.deepseek.com/https://www.deepseek.com/清华大学104页《DeepSeek&#xff1a;从入…...

unity学习34:角色相关3,触发器trigger,铰链 hingejoint 等 spring joint, fixed joint

目录 1 触发的实现条件 1.1 碰撞的的实现条件 1.2 触发的实现条件 1.3 触发器trigger&#xff0c;直接拿 碰撞器collider修改下配置即可 2 触发器相关实验&#xff1a;触发开门效果 2.0 目标 2.1 player物体的属性 2.2 新建一个trigger 物体 2.3 新建一个被trigger 控…...

HarmonyOS Next 方舟字节码文件格式介绍

在开发中&#xff0c;可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中&#xff0c;arkts会编译成方舟字节码。方舟字节码长什么样呢&#xff1f;我们以一个demo编译出的abc文件&#xff1a; 二进制就是长这样&#xff0c;怎么去理解呢&…...

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目录 计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模块3. 软注意力与硬注意力4. 实验…...

html 列动态布局

样式说明&#xff1a; /* 列动态布局&#xff0c;列之间以空格填充 */ li {display: flex;/* flex-direction: column; */justify-content: space-between; }...

DeepSeek开源多模态大模型Janus-Pro部署

DeepSeek多模态大模型部署 请自行根据电脑配置选择合适环境配置安装conda以及gitJanus 项目以及依赖安装运行cpu运行gpu运行 进入ui界面 请自行根据电脑配置选择合适 本人家用电脑为1060&#xff0c;因此部署的7B模型。配置高的可以考虑更大参数的模型。 环境配置 安装conda…...

DeepSeek结合Langchain的基本用法

DeepSeek结合Langchain的基本用法 DeepSeek 基于Openai接口规范的Prompt应答Deepseek结合LangchainDeepSeek 基于langchain的结构化返回 DeepSeek 基于Openai接口规范的Prompt应答 首先我们需要先基于pip 安装 pip install openai最开始我们先熟悉如何使用openai的接口规范&a…...

Redis持久化的两种方式:RDB和AOF

redis中的数据存储在缓存中&#xff0c;如果没有持久化的策略&#xff0c;Redis一旦宕机&#xff0c;那么将会导致数据丢失&#xff1b;因此redis提供了以下两种持久化方式&#xff1a;RDB和AOF 一般来说&#xff0c;大部分公司对这两种方式都是同时开启的 一、RDB RDB策略全…...

每日一题——131.分割回文串

题目链接&#xff1a;131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; class Solution { private:vector<vector<string>> result;vector<string> path;void backtracking (const string& s,int startindex){if(startindex …...

内容中台赋能人工智能技术提升业务创新能力

内容概要 在当今快速变化的市场环境中&#xff0c;企业需要不断寻求创新以保持竞争力。内容中台作为一种新型的内容管理架构&#xff0c;能够极大地提升企业在内容创建、管理和分发方面的效率。通过与人工智能技术的深度融合&#xff0c;企业能够将海量的数据和信息转化为有价…...

第七节 文件与流

基本的输入输出&#xff08;iostream&#xff09; C标准库提供了一组丰富的输入/输出功能&#xff0c;C的I/O发生在流中&#xff0c;流是字节序列。如果字节流是从设备&#xff08;键盘、磁盘驱动器、网络连接等&#xff09;流向内存&#xff0c;叫做输入操作。如果字节流是从…...

软件工程 项目管理

软件项目管理中可以分成两部分: 软件创新 软件项目管理项目是定义明确的任务&#xff0c;这是为了实现某个目标&#xff08;例如&#xff0c;软件开发和交付&#xff09;进行的一系列操作的集合。一个项目可以表征为: 每个项目都可以有一个独特而鲜明的目标。 项目不是日常活…...

通过类加载和初始化的一些题目理解Java类加载过程

通过题目重点理解&#xff1a;Class加载流程和运行时区域 目录 子类和父类static变量父子类加载顺序2class.forName初始化 子类和父类static变量 class Parent {static int a 1;static int b 2;static int c;static {c 3;System.out.println("parent static block&quo…...

LLMs之DeepSeek r1:TinyZero的简介、特点、安装和使用方法、案例应用Logic-RL的简介、安装和使用方法、案例应用之详细攻略

LLMs之DeepSeek r1&#xff1a;TinyZero的简介、特点、安装和使用方法、案例应用Logic-RL的简介、安装和使用方法、案例应用之详细攻略 目录 TinyZero的简介 1、TinyZero的特点 TinyZero的安装和使用方法 1、安装 创建 conda 环境 数据准备 (倒计时任务) 多GPU (适用于 …...

爬取豆瓣电影 Top250 数据的脚本及调整方法

以下是一个完整的 Python 脚本,用于爬取豆瓣电影 Top250 的数据,包括电影名称、评分和短评。同时,我将提供应对豆瓣页面结构更新和反爬虫机制的调整方法。 安装必要的库 首先,确保安装了必要的库: bash复制 pip install requests beautifulsoup4 pandas示例代码 Pyth…...

Deepseek 接入Word处理对话框(隐藏密钥)

硅基流动邀请码&#xff1a;1zNe93Cp 邀请链接&#xff1a;网页链接 亲测deepseek接入word&#xff0c;自由调用对话&#xff0c;看截图有兴趣的复用代码&#xff08;当然也可以自己向deepseek提问&#xff0c;帮助你完成接入&#xff0c;但是提问逻辑不一样给出的答案是千差万…...

Jupyter Notebook自动保存失败等问题的解决

一、未生成配置文件 需要在命令行中&#xff0c;执行下面的命令自动生成配置文件 jupyter notebook --generate-config 执行后会在 C:\Users\用户名\.jupyter目录中生成文件 jupyter_notebook_config.py 二、在网页端打开Jupyter Notebook后文件保存失败&#xff1b;运行代码…...

基于机器学习时序库pmdarima实现时序预测

目录 一、Pmdarima实现单变量序列预测1.1 核心功能与特性1.2 技术优势对比1.3 python案例1.3.1 时间序列交叉验证1.3.1.1 滚动交叉验证1.3.1.2 滑窗交叉验证 时间序列相关参考文章&#xff1a; 时间序列预测算法—ARIMA 基于VARMAX模型的多变量时序数据预测 基于机器学习时序库…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...