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

5. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Nacos

一、什么是Nacos

Nacos 是阿里巴巴开源的一款云原生应用基础设施,它旨在简化微服务架构中服务治理和配置管理的复杂性。通过 Nacos,服务在启动时可以自动注册,而其他服务则可以通过名称来查找并访问这些注册好的实例。同时,Nacos 内置了实时健康检查机制,能够监控各个服务实例的状态,确保只有健康的服务节点能够处理请求,从而提升整个系统的可靠性和稳定性。此外,Nacos 还提供了一个集中化的配置管理平台,使得应用能够在运行时动态更新配置而无需重启,这不仅大大降低了运维成本,也避免了因硬编码或分布式文件更新而带来的各种问题。得益于其与 Kubernetes、Spring Cloud、Dubbo 等流行框架的无缝集成,Nacos 为构建云原生和微服务架构提供了一整套简单而全面的解决方案。

二、启动Nacos

下面,我们来启动Naocs。启动Nacos前我们在官网下载Nacos压缩包,截至文章发布时Nacos的最新版是2.5.0,我们就使用这个版本来简单的讲解Nacos。
使用前需确保开发环境符合Nacos最低运行要求:

环境配置
JDK/JRE8及以上
CPU1核及以上,支持64位CPU
内存2G及以上
硬盘无最小要求,根据保留日志自行调整
操作系统Linux, Mac OS X, Windows

Tip:Nacos 2.50下载地址: https://download.nacos.io/nacos-server/nacos-server-2.5.0.zip?spm=5238cd80.2ef5001f.0.0.3f613b7cP0VdIa&file=nacos-server-2.5.0.zip

2.1 Windows 启动Nacos

在 Windows 环境下进入解压后的目录中找到 bin 文件夹。在该目录下,通过双击或在命令行中执行 startup.cmd 脚本(建议使用命令行执行脚本),如果使用命令行执行脚本需附加参数“-m standalone”来启动 Nacos 的单机模式,这时 Nacos 会在默认的 8848 端口启动服务,启动成功后你可以通过浏览器访问 http://localhost:8848/nacos 进行管理和配置。需要注意的是,启动前必须确保系统中已正确配置 JDK 环境变量,以便 Nacos 能够正常运行。

2.2 Linux 启动Nacos

在 Linux 系统上启动 Nacos 的流程与 Windows 类似,进入解压后的目录找到 bin 目录。为了在 Linux 环境下运行脚本,首先确认 startup.sh 文件具有可执行权限,如果没有可通过命令 chmod +x startup.sh 进行赋权。接下来,在终端中执行sh startup.sh -m standalone命令,即可启动 Nacos 的单机模式。启动完成后,Nacos 同样会监听默认的 8848 端口,我们可以通过浏览器访问管理界面。

Tip:如果通过双击startup.cmd 启动Nacos,会出现报错问题,这是因为startup.cmd 中默认设置的是集群模式运行,需要将文件中的MODE="cluster" 改为MODE="standalone",再次双击运行既可。

2.3 开启鉴权

一般情况下我们在开发时,不需要开启鉴权,但是有必要在这里说一下如何开启鉴权。进入Nacos目录下的conf目录,修改application.properties文件。
首先,我们需要配置自定义的用于生成JWT令牌的密钥,自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符:

nacos.core.auth.default.token.secret.key=生成JWT令牌的密钥

接着,配置用于服务端之间请求的身份识别信息:

nacos.core.auth.server.identity.key=服务器身份验证的键
nacos.core.auth.server.identity.value=服务器身份验证的值

最后,我i们就可以开启鉴权了:

# 使用哪种认证机制来进行身份验证和授权
nacos.core.auth.system.type=nacos
# 启用身份认证
nacos.core.auth.enabled=true

Tip:Nacos 的认证类型分为:内置认证nacos、OAuth2认证oauth2以及自定义认证custom

三、使用Nacos

3.1 服务注册与发现
  1. 什么是服务注册与发现
    服务发现和注册是微服务架构中的关键机制,用于动态管理和协调服务实例之间的通信。服务注册涉及将服务实例的信息(如名称、地址、端口)注册到一个服务注册中心。服务实例在启动时会向注册中心注册,并定期发送心跳信号以保持注册状态。
    服务发现则是指客户端或其他服务通过服务注册中心查找和访问服务实例的过程。服务发现有两种主要模式:客户端发现和服务端发现。在客户端发现模式中,客户端直接与注册中心通信获取服务实例信息;在服务端发现模式中,负载均衡器或API网关负责从注册中心获取服务信息并转发请求。
    这两者的结合实现了服务的动态扩展和高可用性,简化了微服务之间的通信配置,是构建大规模分布式系统的重要机制。

  2. 项目中使用服务发现与注册
    实现服务注册与发现,我们需要在项目中安装nacos-sdk-csharp.aspnetcore
    首先,我们新建项目 NacosDemo,在项目中增加两个Web Api 服务GoodsApiOrderApi,在这个项目中引入nacos-sdk-csharp.aspnetcore

    Tip:注意:不要安装带unoffical的nuget包,带unoffical包支支持Nacos 1.x。

    接着,在Program 类中新增服务注册的代码。

    // 将服务注册到nacos
    builder.Services.AddNacosAspNet(builder.Configuration);
    

    然后,我们需要在application.json文件中配置Nacos 服务发现。

    "Nacos": {"ServerAddresses": ["http://192.168.116.1:8848"],"Namespace": "learning","ServiceName": "GoodsApi","GroupName": "DEFAULT_GROUP","ClusterName": "DEFAULT","Weight": 100,"Metadata": {"version": "1.0.0"},"username": "nacos","password": "nacos","RegisterEnabled": true,"InstanceEnabled": true,"Ephemeral": true
    }
    

    这个Nacos配置文件包含了服务注册和发现的详细信息。ServerAddresses是Nacos服务器的地址列表,Namespace表示服务所在的命名空间,这里命名为learningServiceName是注册服务的名称,GroupName是服务所属的分组,默认是DEFAULT_GROUPClusterName是服务所属的集群名称,默认是DEFAULTWeight表示服务实例的权重,用于负载均衡,这里设置为100。Metadata包含服务实例的元数据,版本信息为1.0.0usernamepassword是访问Nacos服务器的认证信息。RegisterEnabled表示是否启用服务注册,InstanceEnabled表示服务实例是否可用,Ephemeral表示服务实例是否为临时实例(非持久)。
    在配置中我们将服务设置为了临时实例,这里所说的临时实例是指在服务注册和发现系统中,注册中心不会持久化存储的服务实例。这种实例的信息不会被持久化存储在注册中心的数据库中,当服务实例失效或停止时,注册中心会自动删除该实例的信息,不会保留历史记录。临时实例适用于生命周期较短的服务实例,例如短期运行的批处理任务或临时性服务。如果临时实例在规定时间内未发送心跳信号,注册中心会自动将其移除,确保注册中心只保留当前活跃的服务实例,避免无效实例占用资源。临时实例适用于需要快速启动和停止的服务场景,例如容器化应用的实例管理,支持快速扩展和收缩服务实例数量。
    在上述Nacos配置中我们设置服务的权重为100,这个权重是用于服务实例负载均衡的重要参数。它决定了请求在多个服务实例之间的分配比例。具体来说,权重值越高的实例,被选择处理请求的概率就越大。通过设置不同的权重值,可以实现对服务实例的流量控制,优化系统性能和资源利用。里如,在微服务架构下,如果某个服务实例的硬件配置较高,处理能力较强,可以将其权重设置得更高,以便更多的请求能够分配到该实例,从而提高整体系统的效率。相反,如果某个实例的资源较为有限,则可以降低其权重,减少其负载压力。
    我们还需要在Nacos中新增命名空间,也就是配置中的Namespace。我们访问Nacos的管理界面,切换到命名空间界面,新增命名空间。
    在这里插入图片描述
    接下来我们在GoodsApiOrderApi两个Web Api服务中增加控制器GoodsController OrderController ,在这两个接口新增用来获取商品GetGoods和获取订单GetOrder的Action。其中GetGoods返回服务的Ip、端口号以及商品名,GetOrder通过服务发现,调用GoodsApiGetGoods接口并返回数据。这个流程模拟了订单获取商品信息的流程,很简单但能展示了Nacos服务发现的能力。

    using Microsoft.AspNetCore.Mvc;namespace GoodsApi.Controllers
    {[Route("api/[controller]")][ApiController]public class GoodsController : ControllerBase{[HttpGet][Route("GetGoods")]public string GetGoods(){// 获取服务ip和端口var ip = HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString();var port = HttpContext.Connection.LocalPort;return "Goods Service,服务地址:" + ip + ":" + port+",商品列表:苹果、香蕉、橘子";}}
    }
    
    using Microsoft.AspNetCore.Mvc;
    using Nacos.V2;namespace OrderApi.Controllers;[ApiController]
    [Route("[controller]")]
    public class OrderController : ControllerBase
    {private readonly INacosNamingService _nacosNamingService;public OrderController(INacosNamingService nacosNamingService){_nacosNamingService = nacosNamingService;}[HttpGet][Route("GetOrder")]public  string GetOrder(){var instance = _nacosNamingService.SelectOneHealthyInstance("GoodsApi").Result;if (instance!=null){// 调用GetGoods方法HttpClient client = new HttpClient();var response = client.GetAsync($"http://{instance.Ip}:{instance.Port}/api/Goods/GetGoods").Result;return $"Order Service,调用GoodsApi服务成功,调用GetGoods方法返回数据:{response.Content.ReadAsStringAsync().Result}";}else{return "Order Service,调用GoodsApi服务失败";}}
    }
    

    紧接着,我们启动项目调试代码。进入GohodsApi紧接着,我们启动项目调试代码。进入GoodsApi 接口项目的bin目录,开启两个命令窗口分别执行运行命令,指定不同的端口。同样在OrderApi接口项目的bin目录中执行运行命令。

    dotnet .\GoodsApi.dll --urls=http://localhost:5001/
    dotnet .\GoodsApi.dll --urls=http://localhost:5002/
    dotnet .\OrderApi.dll --urls=http://localhost:5003/
    

    执行上述命令后我们查看Nacos管理界面的服务列表,会看到两个GoodsApi服务和一个OrderApi服务。
    在这里插入图片描述
    最后,我们访问在浏览器中访问http://localhost:5003/order/GetOrder,会看到浏览器显示出了GetOrder中返回的内容,其中包含了GoodsApiGetGoods返回的内容。我们多刷新几次,会发现页面显示的GoodsApi的地址在改变,这说明Nacos 服务发现起了作用。
    在这里插入图片描述
    在这里插入图片描述

3.2 配置中心
  1. 什么是配置中心
    在以往的开发中,我们往往需要将数据库连接字符串这类的配置信息放在application.json文件中,这对于单体应用或服务数量不是很多的微服务应用来说没什么大问题,如果配置需要更新了,我们就直接去服务器上修改就可以,但是对于大型微服务应用来说将配置信息放在application.json中就显得很鸡肋了,每次修改配置信息去服务器上一个服务一个服务改的话是很麻烦的,而且还容易出错。这时我们就需要引入配置中心,配置中心是一种集中管理和分发应用配置的系统。它能够将配置从应用程序代码中分离出来,方便管理和修改。配置中心通常支持动态更新配置,不需要重启服务即可生效,并保障配置的一致性和可靠性。Nacos 就具备配置中心的功能。
  2. 项目中使用配置中心
    首先,我们需要在项目中引入Nacos 配置中心的nuget包nacos-sdk-csharp.extensions.configuration,这个包可以帮我们去监听配置的变化。
    其次,为了演示配置中心的使用,我们在Nacos管理界面的配置页面新增一个数据库配置GoodsDb
    在这里插入图片描述
    在这里插入图片描述
    接着,我们在GoodsApi项目的application.json文件的Nacos节点下增加需要监听的配置。
    "Listeners": [{"Optional":false,"DataId":"GoodsDb","Group":"GoodsGroup"}
    ]
    
    这个配置表示一个监听器列表,包含一个监听器对象,Listeners表示配置监听器的数组,Optional表示监听器是否可选,false表示必需,DataId表示监听的配置项ID,这里是GoodsDbGroup表示配置项所属的组,这里是GoodsGroup,这个监听器用于监控GoodsGroup组中GoodsDb配置项的变化。
    然后,我们在GoodsApi项目中新增一个控制器DbTestController,并在其中编写GetDbConnectionString Action,这个Action中支是回去了数据库连接字符串,并将这个字符串返回给调用方。
    using Microsoft.AspNetCore.Mvc;namespace GoodsApi.Controllers;[ApiController]
    [Route("[controller]")]
    public class DbTestController : ControllerBase
    {/// <summary>/// 配置/// </summary>private IConfiguration _configuration;public DbTestController(IConfiguration configuration){_configuration = configuration;}/// <summary>/// 获取/// </summary>/// <returns></returns>[HttpGet][Route("GetDbConnectionString")]public string GetDbConnectionString(){// 从配置中获取数据库连接字符串return _configuration.GetConnectionString("GoodsDb");}
    } 
    
    最后,我们在浏览器中输入http://localhost:5001/dbtest/GetDbConnectionString即可看到我们在Nacos中配置的数据库链接字符串。这是我们修改Nacos中配置的链接字符串,再次刷新页面显示的连接字符串改变了。
    在这里插入图片描述
    在这里插入图片描述

    TIP:像数据库连接字符串这种在项目启动时就注入进来的配置,如果Nacos对应的配置修改后虽然会自动更新到项目中,但是我们的项目使用的链接字符串还是在启动时注入进来的旧的连接字符串,因此我们需要自己实现更新注入的连接字符串的代码。由于专栏不是专门讲Naocs的,因此在这里就不再讲解如何实现了。

四、总结

本文详细介绍了 Nacos 的概念、安装启动和使用方法,全面展示了 Nacos 在微服务架构中的重要作用。文章首先指出,Nacos 是阿里巴巴开源的云原生应用基础设施,通过自动注册和服务发现机制,使各服务实例能够动态注册、查询并健康检查,从而提升系统的稳定性和可靠性;同时,其集中化的配置管理平台能够让应用在运行时动态更新配置,彻底解决了硬编码或手动修改分布式文件所带来的维护困难和运维成本高的问题,并能与 Kubernetes、Spring Cloud、Dubbo 等流行框架无缝集成。接着,文章介绍了如何获取最新版 Nacos(以 2.5.0 为例),并列举了启动前的系统环境要求,包括 JDK 8 及以上、1 核 CPU、2G 内存等;详细说明了在 Windows 和 Linux 环境下分别如何通过命令行或脚本启动 Nacos 的单机模式,以及如何在启动脚本中调整模式设置。文章还讲解了如何开启鉴权,通过修改配置文件设定 JWT 密钥和服务间身份验证参数,保障访问安全。随后,文中通过一个基于 C# 的示例展示了如何在项目中使用 Nacos 实现服务注册与发现,说明了服务如何通过注册中心实现自动注册、权重路由和负载均衡,从而支持客户端动态调用其他服务;同时,也介绍了如何利用 Nacos 配置中心实现配置的动态管理,通过配置监听机制,使得应用能够实时感知配置变化并更新数据库连接等关键参数。总体来说,文章系统地阐释了 Nacos 如何以简洁而高效的方式实现服务治理与动态配置管理,帮助开发者降低微服务运维复杂度,构建更加稳定、弹性和高效的云原生系统。

相关文章:

5. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Nacos

一、什么是Nacos Nacos 是阿里巴巴开源的一款云原生应用基础设施&#xff0c;它旨在简化微服务架构中服务治理和配置管理的复杂性。通过 Nacos&#xff0c;服务在启动时可以自动注册&#xff0c;而其他服务则可以通过名称来查找并访问这些注册好的实例。同时&#xff0c;Nacos…...

VUE项目中实现权限控制,菜单权限,按钮权限,接口权限,路由权限,操作权限,数据权限实现

VUE项目中实现权限控制&#xff0c;菜单权限&#xff0c;按钮权限&#xff0c;接口权限&#xff0c;路由权限&#xff0c;操作权限&#xff0c;数据权限实现 权限系统分类&#xff08;RBAC&#xff09;引言菜单权限按钮权限接口权限路由权限 菜单权限方案方案一&#xff1a;菜单…...

网站的记住我功能与用户登录持久化

1.先决条件&#xff1a;拿到了后端发的凭证并做了持久化储存 2.在1的基础上&#xff0c;加上一个记住我功能&#xff0c;记住我的体现暂时定为&#xff1a; a.不勾选记住我&#xff1a;在浏览器的对话窗不关闭的情况下&#xff0c;凭证是存在有效的&#xff0c;但关闭了对话框…...

SQL自学,mysql从入门到精通 --- 第 15天,数据导入、导出

数据的导入、导出 -- 查看当前设置的目录路径&#xff0c;限制从数据库服务器读取和写入文件的操作只能在指定的目录中进行,在安全性和文件操作限制方面具有重要意义。rootmysqldb 14:19: [(none)]> SHOW VARIABLES LIKE "secure_file_priv"; -----------------…...

android skia渲染介绍

Android AOSP 的渲染系统主要使用 Skia 图形库。Skia 是一个开源的 2D 图形库&#xff0c;它被广泛应用于 Android 的图形渲染中&#xff0c;负责绘制 UI 元素、文本、图像以及其他 2D 图形内容。 以下是 Android AOSP 中 Skia 的作用和它在渲染系统中的位置&#xff1a; 1. 什…...

【网络安全】服务器安装Docker及拉取镜像教程

文章目录 1. 安装 Docker2. 拉取镜像3. 运行 Ubuntu 容器4. 执行相关操作5. 退出并停止容器1. 安装 Docker # 更新软件包索引 sudo apt update# 安装必要的依赖 sudo apt install -y ca-certificates curl gnupg...

Day87:游戏事件绑定

在游戏开发中,事件绑定是指通过监听和处理用户的输入或其他事件(如鼠标点击、键盘按键、碰撞等),来控制游戏中的行为和流程。事件绑定在游戏中扮演着至关重要的角色,它能够让游戏具备互动性和实时反馈。 今天,我们将学习如何在 Python 中使用 Pygame 进行游戏事件绑定,…...

elementplus 使用日期时间选择器,设置可选范围为前后大于2年且只能选择历史时间不能大于当前时间点

需求&#xff1a;时间选择器可选的时间范围进行限制&#xff0c;-2年<a<2年且a<new Date().getTime()核心&#xff1a;这里需要注意plus版没有picker-options换成disabled-date属性了&#xff0c;使用了visible-change和calendar-change属性逻辑&#xff1a;另设一个参…...

将 AMD Zynq™ RFSoC 扩展到毫米波领域

目录 将 AMD Zynq™ RFSoC 扩展到毫米波领域Avnet XRF RFSoC 系统级模块适用于 MATLAB 的 Avnet RFSoC Explorer 工具箱5G mmWave PAAM 开发平台突破性的宽带毫米波波束成形特征&#xff1a;OTBF103 Mathworks Simulink 模型优化毫米波应用中的射频信号路径 用于宽带毫米波上/下…...

Redis企业开发实战(五)——点评项目之分布式锁Redission与秒杀优化

目录 一、Redisson (一)Redisson基本介绍 (二)Redisson入门 1.引入依赖 2.配置Redisson客户端 3.使用Redission的分布式锁 4.tryLock参数解析 4.1tryLock() 4.2tryLock(long waitTime, TimeUnit unit) 4.3tryLock(long waitTime, long leaseTime, TimeUnit unit) 4…...

IDEA安装离线插件(目前提供了MavenHelper安装包)

目录 1、离线安装方式2、Maven Helper 1、离线安装方式 首先访问 IDEA插件网站 下载离线插件安装包&#xff0c;操作如下&#xff1a; 然后打开IDEA的Settings配置&#xff0c;点击Plugins&#xff0c;点击右侧设置按钮&#xff08;齿轮&#xff09;&#xff0c;选择Install P…...

LabVIEW 开发航天项目软件

在航天项目软件开发中&#xff0c;LabVIEW 凭借其图形化编程优势被广泛应用。然而&#xff0c;航天项目的高可靠性、高精度及复杂环境适应性要求&#xff0c;使得在使用 LabVIEW 开发时&#xff0c;有诸多关键要点需要特别关注。本文将详细分析在开发航天项目软件时需要重点注意…...

互联网大厂中面试的高频计算机网络问题及详解

前言 哈喽各位小伙伴们,本期小梁给大家带来了互联网大厂中计算机网络部分的高频面试题,本文会以通俗易懂的语言以及图解形式描述,希望能给大家的面试带来一点帮助,祝大家offer拿到手软!!! 话不多说,我们立刻进入本期正题! 一、计算机网络基础部分 1 先来说说计算机网…...

如何定义“破坏环境”

当我们谈论破坏环境时&#xff0c;通常会从人类活动对自然生态造成负面影响的角度来定义。例如&#xff0c;大规模的森林砍伐、工业污染排放、温室气体增加等&#xff0c;都是典型的破坏环境的行为。我们常常看到这些行为导致了生态系统的破坏、物种灭绝、气候变化等问题&#…...

WPS接入DeepSeek模型

1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 &#xff08;最好是安装最新的wps&#xff09; 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…...

自然语言处理NLP_[1]-NLP入门

文章目录 1.自然语言处理入门1. 什么是自然语言处理2.自然语言处理的发展简史3 自然语言处理的应用场景1. **机器翻译**2. **文本分类**3. **情感分析**4. **问答系统**5. **文本生成**6. **信息抽取**7. **语音识别与合成**8. **文本摘要**9. **搜索引擎优化**10. **聊天机器人…...

详解在Pytest中忽略测试目录的三种方法

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 你是否曾因无关或过时的代码导致测试失败&#xff1f; 这可能会增加调试和故障排除…...

IDEA中列举的是否是SpringBoot的依赖项的全部?在哪里能查到所有依赖项,如何开发自己的依赖项让别人使用

在 IntelliJ IDEA 中列举的依赖项并不一定是 Spring Boot 项目的全部依赖项。IDEA 通常只显示你在 pom.xml&#xff08;Maven&#xff09;或 build.gradle&#xff08;Gradle&#xff09;中显式声明的依赖项&#xff0c;而这些依赖项本身可能还会引入其他传递性依赖。 1. 如何…...

ECG分析0210

指标计算方法 1. HR (心率&#xff0c;Heart Rate)&#xff1a; 心率是每分钟心跳的次数。它通常通过计算RR间期&#xff08;即两次R波之间的时间间隔&#xff09;来获得。 计算方法&#xff1a; 首先&#xff0c;检测到R波的位置&#xff08;例如通过find_peaks函数检测&a…...

计算机毕业设计Python+Spark知识图谱医生推荐系统 医生门诊预测系统 医生数据分析 医生可视化 医疗数据分析 医生爬虫 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

JavaScript:CPU缓存预取以及确定数据下直接更改数组length的好处

CPU缓存预取以及确定数据下直接更改数组length的好处 1. CPU 缓存预取&#xff08;Cache Preloading&#xff09;&#xff1a;CPU 缓存预取&#xff1a;为什么反向填充栈能利用缓存预取&#xff1a; 2. 为什么可以直接改变数组的 length&#xff1a;数组的动态长度&#xff1a;…...

Selenium常用自动化函数

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1.元素的定位 1.1 定位步骤 1,要想定位,就先打开开发者工具 2,先点击左上角图标 1.2 cssSelector 1.3 xpath 2.操作测…...

【故障排除】ls: command not found 终端命令失效的解决办法

【TroubleShooting】ls: command not found 终端命令失效的解决办法 A Solution to Solve “Command not found” of Terminal on Mac 一直在使用心爱的MacBook Pro的Terminal&#xff0c;并且为她定制了不同的Profile。 这样&#xff0c;看起来她可以在不同季节&#xff0c…...

OpenStack-Train版-Allinone自动化部署脚本

一、环境准备 操作系统&#xff1a;CentOS 7 或以上版本 建议配置&#xff1a; CPU&#xff1a;8 核或以上 内存&#xff1a;16 GB 或以上 磁盘&#xff1a;500 GB 或以上 网络配置&#xff1a; 确保虚拟机已配置静态 IP 地址 确保虚拟机可以正常访问外部网络 二、自动…...

12.翻转、对称二叉树,二叉树的深度

反转二叉树 递归写法 很简单 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(rootnullptr)return root;TreeNode* tmp;tmproot->left;root->leftroot->right;root->righttmp;invertTree(root->left);invertTree(root->right);return …...

新电脑配置安装下载

1、谷歌浏览器 地址https://www.google.cn/chrome/ 下载安装即可。 2、nvm下载 下载地址&#xff1a;地址https://nvm.uihtm.com/#google_vignette nvm install 相对应的node版本 // 安装 nvm list 可以查看已下载的node版本 // 查看 nvm use 相对应的node版本号 // 使用 nv…...

数字孪生智慧停车管理可视化平台

采用图扑可视化技术搭建智慧停车管理平台&#xff0c;实现了全面的数据整合与实时监控&#xff0c;提升了停车场运营效率和用户体验。通过 HT 可视化界面&#xff0c;管理者能够实时观察和分析停车位使用情况&#xff0c;进行精准调度与优化决策。...

win10 llamafactory模型微调相关②

微调 使用微调神器LLaMA-Factory轻松改变大语言模型的自我认知_llamafactory 自我认知-CSDN博客 【大模型微调】使用Llama Factory实现中文llama3微调_哔哩哔哩_bilibili 样本数据集 &#xff08;数据集管理脚本处需更改&#xff0c;见报错解决参考1&#xff09; 自我认知微…...

车载测试工具 --- CANoe VH6501 进行Not Acknowledge (NAck) 测试

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...

Mysql中存储引擎各种介绍以及应用场景、优缺点

概述 MySQL 提供了多种存储引擎&#xff0c;每种引擎有不同的特点和适用场景。以下是几种常见的 MySQL 存储引擎的详细介绍&#xff0c;包括它们的底层工作原理、优缺点&#xff0c;以及为什么 MySQL 默认选择某种引擎。 1. InnoDB 底层工作原理&#xff1a; 事务支持&#…...