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/JRE | 8及以上 |
CPU | 1核及以上,支持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 服务注册与发现
-
什么是服务注册与发现
服务发现和注册是微服务架构中的关键机制,用于动态管理和协调服务实例之间的通信。服务注册涉及将服务实例的信息(如名称、地址、端口)注册到一个服务注册中心。服务实例在启动时会向注册中心注册,并定期发送心跳信号以保持注册状态。
服务发现则是指客户端或其他服务通过服务注册中心查找和访问服务实例的过程。服务发现有两种主要模式:客户端发现和服务端发现。在客户端发现模式中,客户端直接与注册中心通信获取服务实例信息;在服务端发现模式中,负载均衡器或API网关负责从注册中心获取服务信息并转发请求。
这两者的结合实现了服务的动态扩展和高可用性,简化了微服务之间的通信配置,是构建大规模分布式系统的重要机制。 -
项目中使用服务发现与注册
实现服务注册与发现,我们需要在项目中安装nacos-sdk-csharp.aspnetcore
。
首先,我们新建项目 NacosDemo,在项目中增加两个Web Api 服务GoodsApi 和OrderApi,在这个项目中引入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
表示服务所在的命名空间,这里命名为learning。ServiceName
是注册服务的名称,GroupName
是服务所属的分组,默认是DEFAULT_GROUP。ClusterName
是服务所属的集群名称,默认是DEFAULT。Weight
表示服务实例的权重,用于负载均衡,这里设置为100。Metadata
包含服务实例的元数据,版本信息为1.0.0。username
和password
是访问Nacos服务器的认证信息。RegisterEnabled
表示是否启用服务注册,InstanceEnabled
表示服务实例是否可用,Ephemeral
表示服务实例是否为临时实例(非持久)。
在配置中我们将服务设置为了临时实例,这里所说的临时实例是指在服务注册和发现系统中,注册中心不会持久化存储的服务实例。这种实例的信息不会被持久化存储在注册中心的数据库中,当服务实例失效或停止时,注册中心会自动删除该实例的信息,不会保留历史记录。临时实例适用于生命周期较短的服务实例,例如短期运行的批处理任务或临时性服务。如果临时实例在规定时间内未发送心跳信号,注册中心会自动将其移除,确保注册中心只保留当前活跃的服务实例,避免无效实例占用资源。临时实例适用于需要快速启动和停止的服务场景,例如容器化应用的实例管理,支持快速扩展和收缩服务实例数量。
在上述Nacos配置中我们设置服务的权重为100,这个权重是用于服务实例负载均衡的重要参数。它决定了请求在多个服务实例之间的分配比例。具体来说,权重值越高的实例,被选择处理请求的概率就越大。通过设置不同的权重值,可以实现对服务实例的流量控制,优化系统性能和资源利用。里如,在微服务架构下,如果某个服务实例的硬件配置较高,处理能力较强,可以将其权重设置得更高,以便更多的请求能够分配到该实例,从而提高整体系统的效率。相反,如果某个实例的资源较为有限,则可以降低其权重,减少其负载压力。
我们还需要在Nacos中新增命名空间,也就是配置中的Namespace
。我们访问Nacos的管理界面,切换到命名空间界面,新增命名空间。
接下来我们在GoodsApi 和OrderApi两个Web Api服务中增加控制器GoodsController
和OrderController
,在这两个接口新增用来获取商品GetGoods
和获取订单GetOrder
的Action。其中GetGoods
返回服务的Ip、端口号以及商品名,GetOrder
通过服务发现,调用GoodsApi
的GetGoods
接口并返回数据。这个流程模拟了订单获取商品信息的流程,很简单但能展示了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
中返回的内容,其中包含了GoodsApi中GetGoods
返回的内容。我们多刷新几次,会发现页面显示的GoodsApi的地址在改变,这说明Nacos 服务发现起了作用。
3.2 配置中心
- 什么是配置中心
在以往的开发中,我们往往需要将数据库连接字符串这类的配置信息放在application.json文件中,这对于单体应用或服务数量不是很多的微服务应用来说没什么大问题,如果配置需要更新了,我们就直接去服务器上修改就可以,但是对于大型微服务应用来说将配置信息放在application.json中就显得很鸡肋了,每次修改配置信息去服务器上一个服务一个服务改的话是很麻烦的,而且还容易出错。这时我们就需要引入配置中心,配置中心是一种集中管理和分发应用配置的系统。它能够将配置从应用程序代码中分离出来,方便管理和修改。配置中心通常支持动态更新配置,不需要重启服务即可生效,并保障配置的一致性和可靠性。Nacos 就具备配置中心的功能。 - 项目中使用配置中心
首先,我们需要在项目中引入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,这里是GoodsDb
,Group
表示配置项所属的组,这里是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 是阿里巴巴开源的一款云原生应用基础设施,它旨在简化微服务架构中服务治理和配置管理的复杂性。通过 Nacos,服务在启动时可以自动注册,而其他服务则可以通过名称来查找并访问这些注册好的实例。同时,Nacos…...
【每日关注】科技圈重要动态
时代新动态 2025 年 2 月 12 日科技圈重要动态总结全球 AI 治理新进展巴黎 AI 宣言签署,美英缺席 科技巨头合作与竞争苹果联姻阿里开发中国版AI功能DeepSeek生态持续扩展OpenAI拒绝马斯克收购,矛盾公开化 汽车行业动态小米汽车销量跃居新势力第二比亚迪智…...
【算法】用C++实现A*算法
A*算法的背景与原理 A*(A-Star)算法是一种广泛应用于路径规划和图搜索问题中的启发式搜索算法。它结合了Dijkstra算法的广度优先搜索和贪心最佳优先搜索的优点,通过引入启发式函数来估计从当前节点到目标节点的成本,从而有效地减少搜索空间。A*算法的核心思想是使用一个评…...

细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性
现代细胞计数仪采用自动化方法,在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力,而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下,自动对焦可能会失效,从而影响细胞…...

记一次Self XSS+CSRF组合利用
视频教程在我主页简介或专栏里 (不懂都可以来问我 专栏找我哦) 目录: 确认 XSS 漏洞 确认 CSRF 漏洞 这个漏洞是我在应用程序的订阅表单中发现的一个 XSS 漏洞,只能通过 POST 请求进行利用。通常情况下,基于 POST 的…...
JVM 类加载子系统在干什么?
JVM 类加载子系统是什么? 类加载子系统(Class Loader Subsystem)是 JVM 负责 加载、链接和初始化 .class 文件的组件。它的主要作用是将字节码文件加载进 JVM 并准备执行。 类加载器(ClassLoader)是 字节码的搬运工&…...
Golang轻松实现消息模板变量替换:text/template
text/template 是 Go 语言标准库中的一个包,用于生成文本输出。它通过解析模板并根据给定的数据执行模板来生成最终的文本。text/template 提供了强大的模板引擎,支持条件判断、循环、变量替换等功能。 基本概念 模板:模板是一个文本文件或…...

DeepSeek模型R1服务器繁忙,怎么解决?
在当今科技飞速发展的时代,人工智能领域不断涌现出令人瞩目的创新成果,其中DeepSeek模型无疑成为了众多关注焦点。它凭借着先进的技术和卓越的性能,在行业内掀起了一股热潮,吸引了无数目光。然而,如同许多前沿技术在发…...
《探秘Windows 10驱动开发:从入门到实战》
《探秘Windows 10驱动开发:从入门到实战》 为什么要在 Windows 10 编写驱动程序 在当今数字化时代,计算机已成为人们生活和工作中不可或缺的工具 ,而 Windows 10 作为一款广泛使用的操作系统,其生态系统的丰富性和复杂性不言而喻。在这个庞大的体系中,驱动程序扮演着举足…...

Golang的容器化部署流程
# Golang的容器化部署流程 什么是容器化部署 容器化部署是将应用程序、运行环境及其依赖项打包在一起,以便可以在任何环境中快速、一致地运行的技术。它提供了更高效的资源利用、更便捷的部署和更稳定的环境。 的容器化支持 天生支持跨平台编译,使得将Go…...
计算机网络,大白话
好嘞,咱就从头到尾,给你好好说道说道计算机网络里这些“门门道道”的概念: 1. 网络(Network) 啥是网络? 你可以把网络想象成一个“大Party”,大家(设备)聚在一起&#…...

智慧城市V4系统小程序源码独立版全插件全开源
智慧城市V4系统小程序源码:多城市代理同城信息服务的全域解决方案 在数字化浪潮的推动下,智慧城市已成为全球发展的核心战略。作为这一领域的革新者,智慧城市V4系统小程序源码凭借其多城市代理同城信息服务能力与多商家营销功能,…...
SpringBoot分布式应用程序和数据库在物理位置分配上、路由上和数量上的最佳实践是什么?
在设计和部署Spring Boot分布式应用程序时,物理位置分配、路由和数据库数量的最佳实践对系统性能、可用性和可维护性至关重要。以下是相关建议: 1. 物理位置分配 最佳实践: 靠近用户部署:将应用实例部署在靠近用户的数据中心&a…...
【LeetCode Hot100 哈希】两数之和、字母异位词分组、最长连续序列
哈希 1. 两数之和题目描述解题思路步骤:时间复杂度:空间复杂度: 代码实现 2. 字母异位词分组题目描述解题思路步骤:时间复杂度:空间复杂度: 代码实现 3. 最长连续序列题目描述解题思路关键思路:…...

Jenkins 通过 Execute Shell 执行 shell 脚本 七
Jenkins 通过 Execute Shell 执行 shell 脚本 七 一、创建 .sh 文件 项目目录下新建 .sh 文件 jenkins-script\shell\ci_android_master.sh添加 Execute Shell 模块 在 Command 中添加 # 获取 .sh 路径 CI_ANDROID_MASTER_PATH"${WORKSPACE}/jenkins-script/shell/…...
无人机常见的定位方式
目录 1、卫星导航定位 2、基于地面基站定位 3、惯性导航定位 4、视觉定位 5、其他定位技术 目前无人机的定位方式主要有以下几种: 1、卫星导航定位 GPS 定位:全球定位系统是应用最广泛的卫星导航系统,无人机上的 GPS 接收器接收至少四…...

【Git版本控制器】:第一弹——Git初识,Git安装,创建本地仓库,初始化本地仓库,配置config用户名,邮箱信息
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 相关笔记: https://blog.csdn.net/dj…...

使用 EDOT 监测由 OpenAI 提供支持的 Python、Node.js 和 Java 应用程序
作者:来自 Elastic Adrian Cole Elastic 很自豪地在我们的 Python、Node.js 和 Java EDOT SDK 中引入了 OpenAI 支持。它们为使用 OpenAI 兼容服务的应用程序添加日志、指标和跟踪,而无需任何代码更改。 介绍 去年,我们宣布了 OpenTelemetry…...
基于 STM32 的病房监控系统
标题:基于 STM32 的病房监控系统 内容:1.摘要 基于 STM32 的病房监控系统摘要:本系统采用 STM32 微控制器作为核心,通过传感器实时监测病房内的环境参数,如温度、湿度、光照等,并将数据上传至云端服务器。医护人员可以通过手机或…...
线上HBase client返回超时异常分析 HBase callTimeout=60000
问题现象 HBase client直接返回超时异常 HBase callTimeout=60000, callDuration=60301: row ‘12649160863966c2790195059018040900010003320’ on table ‘Z_UPA’ at region=Z_UPA,1213d1a56,1184027415643. ba7224f83dbb09591a74b7059f17., hostname=abcd,60020,891863950…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...