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

MongoDB伪分布式部署(mac M2)

1. 序言

  • 本博客是上一博客的进阶版:mac M2安装单机版 MongoDB 7.x,上一博客可以看做是单机、单节点部署MongoDB
  • 本博客将介绍单机、多服务部署MongoDB,实际就是伪分布式部署

2. 副本集(Replica Set)方式部署

2.1 什么是副本集?

  • 多节点部署、主从部署等其实都是为了 MongoDB 的高可用,支持数据多副本、读写分离等
  • 较新版本的MongoDB Master/slave 被废弃,通过副本集提供高可用和数据冗余
    "msg":"Master/slave replication is no longer supported"
    
  • 一个副本集由多个节点组成,其中一个节点是主节点(Primary),其余是从节点(Secondary)
  • 主节点处理所有的写操作,从节点复制主节点的数据并可以处理读操作(如果启用了读偏好)
  • 副本集的特点:
    • 高可用性: 如果主节点发生故障,从节点会自动选举一个新的主节点。
    • 数据冗余:数据在多个节点上复制,提供数据冗余。
    • 读扩展:可以配置从节点处理读操作,以减轻主节点的负载。

2.2 副本集部署

2.2.1 启动3个MongoDB服务

  • 在本机以前台进程的方式启动3个 MongoDB 服务,且指定副本集为 rs0

    mongod --replSet rs0 --dbpath /Users/bytedance/mongodb11/data --port 27031 --bind_ip_allmongod --replSet rs0 --dbpath /Users/bytedance/mongodb12/data --port 27032 --bind_ip_allmongod --replSet rs0 --dbpath /Users/bytedance/mongodb13/data --port 27033 --bind_ip_all
    
  • 如果想通过配置文件部署,服务1的配置文件如下

    # 数据存储相关配置
    storage:dbPath: /Users/bytedance/mongodb2/datajournal:enabled: true# 网络相关配置
    net:port: 27030bindIp: 0.0.0.0  # 允许从所有IP地址访问# 副本集相关配置
    replication:replSetName: "rs0"# 日志相关配置
    systemLog:destination: filelogAppend: truelogRotate: renamepath: /Users/xxx/mongodb11/log/mongo.log# 进程管理相关配置
    processManagement:fork: true  # 以守护进程方式运行(后台运行)# 安全相关配置
    security:authorization: disabled  # 关闭用户认证
    

2.2.2 初始化副本集

  • 通过mongosh登录访问其中一个服务:

    mongosh --port 27032
    
  • 执行如下命令初始化副本集合:

    rs.initiate({_id: "rs0",members: [{ _id: 0, host: "localhost:27031" },{ _id: 1, host: "localhost:27032" },{ _id: 2, host: "localhost:27033" }]
    })
    
  • 执行rs.status() 验证副本集状态

    rs0 [direct: primary] test> rs.status()
    {set: 'rs0',... # 其他信息省略members: [{_id: 0, # initiate 时指定的idname: 'localhost:27031',health: 1,state: 2,stateStr: 'SECONDARY', # 从节点... # 其他信息省略},{_id: 1,name: 'localhost:27032',health: 1,state: 1,stateStr: 'PRIMARY', # 主节点... # 其他信息省略},{_id: 2,name: 'localhost:27033',health: 1,state: 2,stateStr: 'SECONDARY', # 从节点... # 其他信息省略}],ok: 1,... # 其他信息省略
    }
    
  • 还可以通过 rs.isMaster() 查看当前访问的服务是不是primary节点

    rs0 [direct: primary] test> rs.isMaster()
    {... # 其他信息省略hosts: [ 'localhost:27031', 'localhost:27032', 'localhost:27033' ],setName: 'rs0',setVersion: 1,ismaster: true, # 当前访问的是primary节点(服务)secondary: false,primary: 'localhost:27032',me: 'localhost:27032',.. # 其他信息省略readOnly: false,... # 其他信息省略isWritablePrimary: true # 只能通过primary节点写入
    }
    

2.3 副本集中数据的读写

  • 从上面的信息就可以看出, 副本集的可以支持设置读写偏好、支持读写分离

  • 例如,isWritablePrimary: true 只能在primary节点写入,若在非primary节点插入数据将报错

    Uncaught:
    MongoBulkWriteError[NotWritablePrimary]: not primary
    
  • 在primary节点插入数据

    db.test_data.insertMany([{ name: "Bob", age: 25, sex: "male", city: "Los Angeles" },{ name: "Carol", age: 28, sex: "female", city: "Chicago" },{ name: "Dave", age: 35, sex: "male", city: "San Francisco" }
    ])
    
  • 在任意节点查询数据

    db.test_data.find({'name':"Bob"})
    

3. 部署分片(Sharding)集群

3.1 什么是分片?

  • 在数据存储系统中,除了支持副本集(多副本存储全量数据),还支持分片(Sharding),MongoDB也不例外
  • 分片是 MongoDB 提供的一种水平扩展机制,用于将数据分布在多个服务器上
  • 分片具备以下特性:
    • 水平扩展:通过将数据分布在多个分片上,解决单个服务器的存储和性能限制。
    • 负载均衡:数据和请求可以在多个分片之间均匀分布。
    • 高可用性:结合副本集使用,每个分片可以是一个副本集,从而提供高可用性。

3.2 副本集 vs 分片

  • 相对副本集,分片会按照某种规则将数据拆分成多个split,每个split存储到相应的分片
  • 以销售数据为例,形象化比喻:
    • 副本集就是一个机房有多台机器,每台机器都将存储中国市场的销售数据
    • 分片就是存在多个机房,每个机房存储只存储所在区域的销售数据。例如,华北机房只存储华北地区的销售数据,西南机房只存储西南地区的销售数据
    • 同时,为了提供高可用和数据冗余,分片存储时,每个机房需要有多台机器,支持多副本储存该区域的销售数据
    • 也就是说,一个分片就是一个副本集,分片内部通过副本集实现高可用和数据冗余机制

3.3 部署分片集群(副本集与分片的结合使用)

  • 分片集群由配置服务器(Config Servers)、分片服务器(Shards)、和路由服务器(mongos)组成
    • 配置服务器作为副本集:配置服务器存储集群的元数据,为了确保配置服务器的高可用性,配置服务器也通常设置为一个副本集
    • 每个分片作为一个副本集:在分片集群中,每个分片通常是一个副本集。这意味着每个分片不仅能存储数据的一部分,还能提供高可用性和数据冗余。
    • 路由服务器(mongos):mongos不存储数据,而是作为路由器将客户端请求路由到适当的分片,可以部署多个mongos实例以提供高可用性和负载均衡

3.3.1 部署配置服务器

  • 使用如下命令,在本地启动三个配置服务器,注意提前创建好data目录

    • --configsvr:表示这是一个配置服务器

    • --replSet rs0:设置副本集,配置服务器的本质是一个副本集

      
      mongod --configsvr --replSet rs0 --dbpath /Users/xxx/mongodb1/data/configdb --port 27019 --bind_ip_allmongod --configsvr --replSet rs0 --dbpath /Users/xxx/mongodb2/data/configdb --port 27020 --bind_ip_allmongod --configsvr --replSet rs0 --dbpath /Users/xxx/mongodb3/data/configdb --port 27021 --bind_ip_all
      
  • 访问某个配置服务,初始化副本集

    mongosh --port 27019 # 访问配置服务rs.initiate({_id: "rs0",configsvr: true,members: [{ _id: 0, host: "localhost:27019" },{ _id: 1, host: "localhost:27020" },{ _id: 2, host: "localhost:27021" }]
    })
    
  • PS: 若以后台服务方式启动,上述启动方式对应的配置文件如下

    storage:dbPath:  /Users/xxx/mongodb1/data/configdbjournal:enabled: true
    # 网络相关配置
    net:port: 27010bindIp: 0.0.0.0  # 允许从所有IP地址访问
    # 复制集相关配置
    replication:replSetName: "rs0"
    # 设置role:分片集群中的配置服务器
    sharding:clusterRole: "configsvr"
    # 日志相关配置
    systemLog:destination: filelogAppend: truelogRotate: renamepath: /Users/xxx/mongodb1/log/configd/mongo.log
    # 进程管理相关配置
    processManagement:fork: true  # 以守护进程方式运行(后台运行)
    # 安全相关配置
    security:authorization: disabled  # 关闭用户认证
    

3.3.2 部署分片服务器

shard1
  • 使用如下命令,在本地启动三个分片服务器,注意提前创建好data目录

    mongod --shardsvr --replSet shard1 --dbpath /Users/bytedance/mongodb1/data/shard --port 27022 --bind_ip_allmongod --shardsvr --replSet shard1 --dbpath  /Users/bytedance/mongodb2/data/shard --port 27023 --bind_ip_allmongod --shardsvr --replSet shard1 --dbpath  /Users/bytedance/mongodb3/data/shard --port 27024 --bind_ip_all
    
  • 访问其中某个分片服务器,初始化分片信息

    mongosh --port 27022rs.initiate({_id: "shard1",members: [{ _id: 0, host: "localhost:27022" },{ _id: 1, host: "localhost:27023" },{ _id: 2, host: "localhost:27024" }]
    })
    
shard2
  • 使用如下命令,在本地启动三个分片服务器,注意提前创建好data目录

    mongod --shardsvr --replSet shard2 --dbpath /Users/bytedance/mongodb1/data/shard2 --port 27025 --bind_ip_allmongod --shardsvr --replSet shard2 --dbpath  /Users/bytedance/mongodb2/data/shard2 --port 27026 --bind_ip_allmongod --shardsvr --replSet shard2 --dbpath  /Users/bytedance/mongodb3/data/shard2 --port 27027 --bind_ip_all
    
  • 访问其中某个分片服务器,初始化分片信息

    mongosh --port 27025rs.initiate({_id: "shard2",members: [{ _id: 0, host: "localhost:27025" },{ _id: 1, host: "localhost:27026" },{ _id: 2, host: "localhost:27027" }]
    })
    

3.3.4 部署mongos

  • 先创建好mongos所需的相关目录

    mkdir /Users/xxx/mongos
    cd /Users/xxx/mongos
    mkdir data log etc
    
  • 在etc目录下创建mongos的配置文件,mongos-config.yaml

    net:bindIp: 0.0.0.0port: 27017sharding:configDB: rs0/localhost:27019,localhost:27020,localhost:27021
    
  • 以前台方式启动mongos

    mongos --config /Users/xxx/mongos/etc/mongos-config.yaml
    
  • 访问mongos,添加分片(之前部署好的分片服务器)

    mongosh --port 27017sh.addShard("shard1/localhost:27022,localhost:27023,localhost:27024")
    sh.addShard("shard2/localhost:27025,localhost:27026,localhost:27027")
    
  • 通过 sh.status() 查看shard信息

    # 关键信息
    shards
    [{_id: 'shard1',host: 'shard1/localhost:27022,localhost:27023,localhost:27024',state: 1,topologyTime: Timestamp({ t: 1727872634, i: 3 })},{_id: 'shard2',host: 'shard2/localhost:27025,localhost:27026,localhost:27027',state: 1,topologyTime: Timestamp({ t: 1727939236, i: 4 })}
    ]
    

3.5 启用分片

3.5.1 启用数据库分片和集合分片

  • 启用数据库分片和集合分片

    use admin # 一定要先切换到admin,
    sh.enableSharding("test")use test
    sh.shardCollection("test.test_data", {user_id: 1}) # user_id作为分片的key
    
  • 验证是否成功开启集合分片

    use test
    db.test_data.getShardDistribution()
    
  • 若有如下输出,说明开启成功

3.5.2 插入数据并查看

  • 插入100条数据

    # 数据示例 -- user_id: id000001; name: name1
    for (let i = 1; i <= 2000; i++) {let user_id = `id${String(i).padStart(6, '0')}`;  let name = `name${i}`;  db.test_data.insertOne({ user_id: user_id, name: name });
    }
    
  • 执行sh.status()查看分片信息,但数据只分布到了shard2,要么是集群部署存在问题,要么跟公司的 “chatGPT” 回答一样

    • 分片键选择不当:如果分片键的值分布不均匀,可能会导致数据集中在一个分片上。例如,如果您的分片键是一个递增的字段(如时间戳或自增 ID),那么所有新插入的数据都会集中在同一个分片上
    • 数据量不足:在数据量较小的情况下,MongoDB 可能不会立即将数据分布到多个分片上。MongoDB 需要一定的数据量来决定何时进行分片 (笔者倾向于该原因)
       ... # 其他信息省略,可以看到 'test.test_data' 集合成功开启了分片collections: {'test.test_data': {shardKey: { user_id: 1 },unique: false,balancing: true,chunkMetadata: [ { shard: 'shard2', nChunks: 1 } ],chunks: [{ min: { user_id: MinKey() }, max: { user_id: MaxKey() }, 'on shard': 'shard2', 'last modified': Timestamp({ t: 1, i: 0 }) }],tags: []}}
    
  • PS: 公司的 “chatGPT” 还给出了其他的查看分片信息的方法,但无任何输出

    use config
    db.chunks.find({ ns: "testDB.test_data" }).sort({ min: 1 }).pretty()
    

3.5.3 在shard2的各服务器查询数据

  • 由于上面的集合只分布在shard2,现在连接shard2的任意服务器,执行如下查询命令

    use test
    db.test_data.find({'name':"name1"})
    
  • 均能从shard2的每个服务器查到数据,这也说明了,shard2分片自身就是一个副本集


4. 后记

  • 网上查了很多MongoDB多副本部署,大部分的版本都比较低,还有 master/slave 之类的配置
    • MongoDB主从复制(master–>slave)环境搭建
    • mongodb的主从同步配置:实战详细版(建议收藏)
  • 笔者依靠公司的chartGPT完成部署后,发现这篇文章是最靠谱的:MongoDB数据库之主从复制配置实战
  • 其他一些感悟
    • AI真强大: 此次部署完全依靠公司的chartGPT,不懂就问、出问题也问,最后磕磕绊绊完成了部署
    • 磨刀不误砍柴工: 部署分片集群时,一开始没有为认真了解分片集群的架构,不知道副本集是存储元数据的,导致部署失败

相关文章:

MongoDB伪分布式部署(mac M2)

1. 序言 本博客是上一博客的进阶版&#xff1a;mac M2安装单机版 MongoDB 7.x&#xff0c;上一博客可以看做是单机、单节点部署MongoDB本博客将介绍单机、多服务部署MongoDB&#xff0c;实际就是伪分布式部署 2. 副本集(Replica Set)方式部署 2.1 什么是副本集&#xff1f; …...

Golang | Leetcode Golang题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }...

[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷

在数字艺术和创意领域&#xff0c;[ComfyUI]Flux以其独特的虚实结合技术&#xff0c;已经成为艺术家和设计师们手中的利器。今天&#xff0c;我们激动地宣布&#xff0c;[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品&#xff0c;经典中文元素通过AI技术重现&#xff0c;包…...

Linux 系统 nvm 管理node无法使用

文章目录 一、报错说明二、报错原因三、解决办法四、验证 一、报错说明 centos7服务器使用nvm安装的node之后&#xff0c;只要使用npm或者node&#xff0c;均会出现以下问题。 npm -v node: /lib64/libm.so.6: version GLIBC_2.27 not found (required by node) node: /lib64…...

信号处理快速傅里叶变换(FFT)的学习

FFT是离散傅立叶变换的快速算法&#xff0c;可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的&#xff0c;但是如果变换到频域之后&#xff0c;就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外&#xff0c;FFT可以将一个信号的频谱提取出来&am…...

vue3项目el-table表格行内编辑加输入框校验

核心点 1. el-form的model属性需要跟el-form-item的prop要对应 2. el-form的model属性绑定tableData 3. el-form-item的prop绑定字符串&#xff1a;scope.index.列名&#xff08;注意有个点&#xff09; 4. el-form-item需要单独设置rules属性 代码示例 <el-form :mod…...

【Node.js】内置模块FileSystem的保姆级入门讲解

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;Vscode 本文代码都经由博主PleaSure乐事实操后得出&#xff0c;可以放心使用。 1.FileSystem介绍 Node.js 的 fs&#xff08;filesystem&#xff09;模块是一个核心模块&#xff0c…...

问:LINUXWINDOWS线程CPU时间如何排序?

Linux 在Linux上&#xff0c;你可以使用ps命令结合sort命令来查看和排序进程或线程的CPU使用时间。 查看进程的CPU使用时间并按时间排序 使用ps命令的-o选项可以自定义输出格式&#xff0c;-e选项表示显示所有进程&#xff0c;--sort选项用于排序。 ps -e -o pid,tid,comm,…...

postgresql-重复执行相同语句,试试 prepare!

文章目录 每次你向 PostgreSQL 发送 SQL 语句时&#xff0c;数据库都必须对其进行解析(parse)。解析虽然很快&#xff0c;但如果同样的语句被解析一千次&#xff0c;这种操作累积起来可能会占用大量时间&#xff0c;而这些时间本可以用于处理其他事务。为避免这种情况&#xff…...

wpf加载带材料的3D模型(下载的3D预览一样有纹理)

背景&#xff1a;最近真的是忙啊&#xff0c;累出汁水了 整体效果&#xff1a; 放大可以看清砖头&#xff1a; 1、需要自己准备好3D模型&#xff0c;比如我这里是下载的这里的3D Warehouse&#xff0c;下载Collada File格式文件 2、解压可以看到一个model.dae和材料的文件夹&…...

【k8s之深入理解调度】调度框架扩展点理解

参考自 K8s 调度框架设计与 scheduler plugins 开发部署示例&#xff08;2024&#xff09; 调度插件扩展点 等待调度阶段PreEnqueuePod 处于 ready for scheduling 的阶段。 内部工作原理&#xff1a;sig-scheduling/scheduler_queues.md。在 Pod 被放入调度队列之前执行的插…...

音视频基础理论

1. 音频基础 1.1 音频基本概念 1.1 频率&#xff1a;声波的频率&#xff0c;即声音的音调&#xff0c;人类听觉的频率(音调)范围为20Hz--20KHz 1.2 振幅&#xff1a;即声波的响度&#xff0c;通俗的讲就是声音的高低&#xff0c;一般男生的声音振幅(响度)大于女生。 1.3 波形…...

《江苏科技大学学报(自然科学版)》

《江苏科技大学学报&#xff08;自然科学版&#xff09;》&#xff08;双月刊&#xff0c;国内外公开发行&#xff09;是由江苏省教育厅主管、江苏科技大学主办的理工类学术期刊&#xff0c;1986年创刊&#xff0c;国际刊号&#xff1a;ISSN1673-4807&#xff0c;国内刊号&…...

C++初学者指南-5.标准库(第二部分)–随机数生成

C初学者指南-5.标准库(第二部分)–随机数生成 文章目录 C初学者指南-5.标准库(第二部分)–随机数生成基本概念例子统一随机数布尔值&#xff08;“抛硬币”&#xff09;正态分布具有独立概率的整数 怎么做种子引擎使用自定义生成器 shuffle算法分布类型概述通用接口均匀分布采样…...

Unity2017在安卓下获取GPS位置时闪退的解决办法

在Unity使用低功耗蓝牙通信&#xff08;BLE&#xff09;需要用到设备的位置信息。但是调用Input.location.Start()程序会闪退。 解决办法&#xff1a;调用原生安卓接口。 参见《Unity2021通过aar调用Android方法》编写一个aar插件gpsplugin&#xff0c;在插件中提供获取GPS位…...

OpenGL ES 索引缓冲区(4)

OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区&#xff0c;索引缓冲区和顶点缓冲区类似&#xff0c;也是显存上的一段内存&#xff0c;只不过上面的数据用处不同&#xff0c;索引缓冲区故名思义里面的数据是用于索引&#xff0c;主要作用是用于复用顶点缓冲区里的数据。…...

01:(寄存器开发)点亮一个LED灯

寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板&#xff0c;教程来源B站up“嵌入式那些事”。…...

.Net 6.0 Windows平台如何判断当前电脑是否联网

最近在工作中开发需要判断当前电脑是否联网的需求&#xff0c;在网上找了一个调用window API来判断本机是否联网。具体请看下面介绍&#xff1a; 1.方法一&#xff08;调用winAPI&#xff09; [DllImport("wininet")] public static extern bool InternetGetConnec…...

微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用

Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序&#xff0c;并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…...

MacOS 终端执行安装 Brew

在配置新的 Mac 环境时&#xff0c;如果你发现终端中无法识别 brew 命令&#xff0c;可以按照以下步骤进行解决。 步骤 1&#xff1a;确保网络稳定 为了避免安装过程中出现中断&#xff0c;建议使用 Wi-Fi 或有线连接&#xff0c;不推荐使用移动网络。 步骤 2&#xff1a;打…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

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 开发者设计的强大库&#xff…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...