组件日志——etcd
目录
一、简介
二、安装【Ubuntu】
安装etcd
安装C++API
三、写一个示例
3.0写一个示例代码
3.1获取一个etcd服务
3.2获取租约(写端操作)
3.3使用租约(写端操作)
3.4销毁租约(写端操作)
3.5获取etcd服务中的服务列表(读端操作)
3.6监听状态变化(读端操作)
一、简介
Etcd是一个golang编写的分布式、高可用的一致性键值存储系统,用于配置共享和服务发现等。它使用Raft一致性算法来保持集群数据的一致性,且客户端通过长连接watch功能,能够及时收到数据变化通知。
这样的简介比较干涩也不太好理解,我们换个说法,如果你开发过集群式的网络服务,你应该知道,通常情况下,你需要指定一台网关主机转发来自用户的请求,这些请求将被转发到对应的应用服务器上,然后进行业务处理。但是这里就有一个问题,当我们上线一个主机、或者下线一个主机的时候网关机器是很难进行感知的(下线相对来说好感知,可以发送网络包进行探测),但是一个新的服务主机上线就是个麻烦事,我们怎么才能通知这个服务上线了?简单点来说,这个时候就需要我们有一台管理主机,用来管理服务的上下线通知,当有新服务上下线时,就立即通知网关主机。
其实你也可以将etcd看作是一个键值存储的数据库,服务主机上线时,就将我们主机的信息放入到数据库中,当网关主机需要获取服务信息时,就需要对这个数据进行读操作,这个时候不就可以让网关机感知服务的上下线了吗?当然etcd也会主动的将变化信息发送给所有监听变化的主机上。

二、安装【Ubuntu】
安装etcd
安装etcd
sudo apt-get install etcd
启动etcd
sudo systemctl start etcd
设置开机自启
sudo systemctl enable etcd
添加使用的etcd版本到环境变量
export ETCDCTL_API=3
重新加载环境变量
source /etc/profile
测试向etcd中写入一个键值对
etcdctl put mykey "test"
获取一下
etcdctl get mykey

安装C++API
安装依赖
sudo apt-get install libboost-all-dev
libssl-dev sudo apt-get install libprotobuf-dev protobuf-compiler-grpc
sudo apt-get install libgrpc-dev libgrpc++-dev
sudo apt-get install libcpprest-dev
获取框架
git clone https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3.git
进入拉取后的目录
cd etcd-cpp-apiv3
创建并进入构建目录
mkdir build && cd build
cmake
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
构建并安装
make -j$(nproc) && sudo make install
三、写一个示例
3.0写一个示例代码
//write.cpp
#include <etcd/Client.hpp>
#include <etcd/Response.hpp>
#include <etcd/KeepAlive.hpp>
#include <thread>
#include <chrono>
#include <string>void RegistryService(etcd::Client& etcd,const std::string& serviceKey,const std::string& serviceValue,size_t liveTime)
{//获取resphone对象auto res_lease = etcd.leasekeepalive(liveTime).get();//获取租约IDint64_t leaseid = res_lease->Lease();//将键值与租约绑定etcd.put(serviceKey,serviceValue,leaseid);//休眠该执行流20sstd::this_thread::sleep_for(std::chrono::seconds(20));std::cout<<"程序已退出"<<std::endl;
}int main()
{try{ etcd::Client etcd("http://127.0.0.1:2379");size_t time=20; //单位:秒RegistryService(etcd,"/test/test1","127.0.0.1:8888",time);RegistryService(etcd,"/test/test2","127.0.0.1:8889",time);RegistryService(etcd,"/test/test3","127.0.0.1:8890",time);}catch(const std::exception& e){std::cerr << e.what() << '\n';}return 0;
}
//reader.cpp#include <etcd/Client.hpp>
#include <etcd/Watcher.hpp>
#include <etcd/Value.hpp>
void WatchListen(etcd::Response res)
{for(auto e:res.events()){if(e.event_type()==etcd::Event::EventType::PUT){std::cout<<"键值发生修改"<<std::endl;std::cout<<"before: "<<e.prev_kv().key()<<":"<<e.prev_kv().as_string()<<std::endl;std::cout<<"now: "<<e.kv().key()<<":"<<e.kv().as_string()<<std::endl;}else if(e.event_type()==etcd::Event::EventType::DELETE_){std::cout<<"数据发生删除"<<std::endl;std::cout<<"now: "<<e.kv().key()<<":"<<e.kv().as_string()<<std::endl;}}
}int main()
{etcd::Client etcd("http://127.0.0.1:2379");etcd::Response res = etcd.ls("/test").get();for(auto e:res.events()){std::cout<<"当前值"<<e.kv().key()<<e.kv().as_string()<<std::endl;}etcd::Watcher watcher(etcd,"/test",WatchListen,true);watcher.Wait();return 0;
}
//makefile
all:reader writer
reader:reader.cppg++ -o $@ $^ -letcd-cpp-api -lcpprest -std=c++17
writer:writer.cppg++ -o $@ $^ -letcd-cpp-api -lcpprest -std=c++17
3.1获取一个etcd服务
无论是想要注册的服务主机,还是想要获取服务的网关机,都需要创建一个etcd客户端类,这一点应该不难理解,因为注册的服务器需要将服务主机的信息交给etcd服务器,让其进行通知其它网关机;同理,网关机如果想要获取etcd中存储的信息,也就必须要连接上etcd才可以获取。
在3.0的示例代码中,获取etcd服务的语句是:
etcd::Client etcd("http://127.0.0.1:2379");
3.2获取租约(写端操作)
为了方便介绍,我们暂且把服务提供主机叫做“写端”,需要获取服务主机信息的网关机叫做“读端”,在获取王etcd服务之后,读写端的操作就出现了差异,写端肯定是要向etcd服务器中写入数据,而读端肯定是要从etcd服务中读取数据。
如果我们向向etcd服务中写入数据,我们必须要申请一个租约,租约其实就是一个过期时间,即你写入的这个数据,etcd服务需要给你保留多久,那么现在我们先来看看如何获取一个租约,根据官方文档中所提到的有两个方法可以获取租约一个是KeepAlive类中的Lease方法,一个是通过leasegrant方法获取;前者获取后其会定期自动重置租约时长,后者则不会,所以如果你问我推荐使用哪种方式来获取租约,我个人就更倾向于前者。
auto res_lease = etcd.leasekeepalive(liveTime).get();
//获取租约ID
int64_t leaseid = res_lease->Lease();
需要说明的是,为什么etcd要先get获取一个对象而后在使用这个对象获取租约ID?
这是因为etcd中的大部分操作都是支持异步的,租约的获取也不例外,而是用get方法则是在阻塞在原地等待资源就绪,也就是我们常说的同步获取资源,而如果想在这期间去完成其它的工作,你可以不立即使用get方法,而是将get返回的结果进行托管(设置一个回调函数),当资源就绪的时候就会执行你设置好的回调函数,那借此机会,我们看看如何异步获取一个租约ID。
int64_t lease_id1=-1;
pplx::task<std::shared_ptr<etcd::KeepAlive>> res = etcd.leasekeepalive(liveTime);
//这里的回调函数,是一个lamada表达式
res.then([&lease_id1](std::shared_ptr<etcd::KeepAlive> res){ lease_id1 = res->Lease();}
).wait();
//模拟去做其它的事情
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout<<lease_id1<<std::endl;
在这个代码中我们使用执行流休眠来模拟申请资源期间完成其它工作,此外需要注意的是,如果你将资源设置为异步获取,你必须要保证主执行流不会执行的很快以至于资源还没申请成功需要被使用,所以建议在使用异步获取的资源之前最好先做一个资源获取成功的校验。
3.3使用租约(写端操作)
使用租约就比较简单了,我们只需要指定我们需要存入的服务名称、主机信息和我们的租约ID就可以了,其中serviceKey指的时我们服务名称,serviceValue指的是我们的主机信息。leaseid就是之前申请的租约ID,这个ID对应着一个租约,如果租约过期了,etcd就会帮我们自动删除保存在etcd服务器上的服务信息。
etcd.put(serviceKey,serviceValue,leaseid);
需要说明的是serviceKey的最好是像文件目录格式一样的结构,这一点一会我们读取etcd服务器内容时,我们在说明。

3.4销毁租约(写端操作)
其实我写的代码,是错的,错就错在没有销毁租约,如果不销毁租约就会发生这样一种情况,就是当你程序退出了,但是etcd服务器中的租约没过期,也就继续保存着你的服务信息,这个时候etcd默认你的主机还在,但是如果此时有其它用户请求到来且网关主机还把这个请求交给了这台已经退出的主机那就会导致请求丢失。

在你明确某个租约退出时,你可以使用leaserevoke来释放租约,来避免租约未被即时释放放的问题。
etcd.leaserevoke(leaseid);
3.5获取etcd服务中的服务列表(读端操作)
读端操作相对简单的多,因为即便不是我们的简单示例,在实际生产中,请求的处理通常都是交给应用服务主机来进行处理的,而读端更像是一个“传话人”,我们使用Client类中的ls方法就可以获取服务的整个列表,还记得我画的图3吗,这里获取的不是目录而是所有的节点,即图3中的主机A、主机B、……,目录的作用起到的是一个指示服务类型的作用。当然,我这里只画了两层结构,实际上可能比两层结构更多。
etcd::Response res = etcd.ls("/test").get();for(auto e:res.events())
{std::cout<<"当前值"<<e.kv().key()<<e.kv().as_string()<<std::endl;
}
3.6监听状态变化(读端操作)
这个功能就是,在最开始提到的,etcd的一个重要功能,它可以通知其它主机,某一个服务主机的上线,要使用这个功能需要我们使用Watcher类,在这个类中,我们填入etcd主机信息、监听目录、状态变化时需要执行的回调函数、最后一个参数要设置为true表示监听整个目录还是监听单个主机,监听整个目录则将此值置为true,否则置为false。

需要一提的是,使用watcher监听状态变化是需要阻塞的,这是因为watcher是一个异步操作,也就是说如果你不阻塞住主执行流而且还让其退出,那么就会造成watcher执行流一并退出而导致无法监听变化。
四、结语
本片文章只讲解了一些基本操作,其实还有一些问题尚且没有明晰:
- etcd是一个集群服务,当有多个etcd服务器是如何保证一致性。
- etcd是如何保证并发安全的。
- etcd容灾都做了哪些工作。
这些问题就不在本文中阐述了,也许过几天我会在出一个补档内容了,来介绍一下这部分内容,说句心里话,博主在写这篇文章的时候也是在学习etcd,初学者学习内容难免纰漏,如果屏幕前的你发现了问题,还请多多指教。对于哪些没看懂或者想要了解更多的小伙伴可以去看看源码或者官方的示例代码,这会对你理解etcd有很大的帮助。
相关文章:
组件日志——etcd
目录 一、简介 二、安装【Ubuntu】 安装etcd 安装CAPI 三、写一个示例 3.0写一个示例代码 3.1获取一个etcd服务 3.2获取租约(写端操作) 3.3使用租约(写端操作) 3.4销毁租约(写端操作) 3.5获取etcd服务中的服务列表(读端操作) 3.6监听状态变化(读端操作) 一、简介 Et…...
search_fields与filterset_fields的使用
在Django中,search_fields 和 filterset_fields 可以在视图类中使用,尤其是在 Django REST Framework (DRF) 中。它们分别用于实现搜索和过滤功能。以下是它们在视图类中的具体使用方法。 1. search_fields 在视图类中的使用 search_fields 是 DRF 中 S…...
SQLite Delete 语句详解
SQLite Delete 语句详解 SQLite 是一种轻量级的数据库管理系统,广泛应用于移动设备、嵌入式系统和服务器端应用。在数据库管理中,删除数据是一项基本操作。SQLite 提供了强大的删除功能,本文将详细介绍 SQLite 的 Delete 语句及其用法。 1.…...
通往自主智能之路:探索自我成长的AI
1. 引言:当前AI范式与自我成长智能的愿景 当前的人工智能领域在很大程度上由大型语言模型(LLM)的卓越能力所定义。这些模型,例如OpenAI的GPT系列和谷歌的BERT,已经展示了前所未有的理解和生成类人文本的能力。LLM通常…...
[自动化] 【八爪鱼】使用八爪鱼实现CSDN文章自动阅读脚本
在CSDN上,文章的阅读量往往是衡量内容影响力的一个重要指标。为了测试自动化手段能否提高阅读数,我尝试使用网页自动化工具来模拟人工阅读某个ID的文章。 1. 网页自动化的常见方案 谈到网页自动化,Selenium 是一个最常见的选择。它可以通过…...
Kafka消息序列化深度革命:构建高性能、高安全的自定义编码体系
一、突破默认序列化的桎梏 1.1 原生序列化器的致命缺陷 Kafka默认提供的StringSerializer/ByteArraySerializer在复杂场景下暴露三大痛点: 类型安全黑洞:字节流缺乏元数据描述,消费端解析如履薄冰版本兼容困境:数据结构变更导致…...
2025年如何避免使用验证码求解器时被IP封禁
引言 2025年,验证码求解器已成为自动化网络抓取和其他在线流程的关键工具。然而,自动化用户面临的一个常见挑战是IP封禁。当网站检测到自动化活动时,通常会阻止发出请求的IP地址,导致验证码挑战无法解决。本文将探讨使用验证码求…...
前端 AI IDE应用优缺点
嗯,用户问了三个前端面试的问题,我需要仔细分析每个问题,并结合提供的搜索结果来给出全面且准确的回答。 第一个问题是关于开发工具Cursor或Vim的Windurf在开发中的占比以及它们的缺点。从搜索结果里看,网页3提到了Trae对标Curso…...
银河麒麟桌面版包管理器(二)
APT包管理器 APT是Debian及其派生系统的包管理器,构建在dpkg之上,以其强大的依赖性处理能力和丰富的软件仓库而闻名。APT具有自动解决依赖关系、提供易于使用的命令行工具(如apt-get、apt-cache等),以及稳定的软件更新…...
Leetcode 3494. Find the Minimum Amount of Time to Brew Potions
Leetcode 3494. Find the Minimum Amount of Time to Brew Potions 1. 解题思路2. 代码实现 题目链接:3494. Find the Minimum Amount of Time to Brew Potions 1. 解题思路 这道题虽说算是搞定了,通过了全部的测试样例,不过还是很暴力的求…...
制作Oracle11g Docker 镜像
基于Linux系统,宿主主机要设置如下环境变量,oracle为64位版本 dockerfile中需要的数据库安装包可从csdn下载内找到 #!/bin/bash # 在宿主机上运行以设置Oracle所需的内核参数 # 这些命令需要root权限cat > /etc/sysctl.d/99-oracle.conf << EO…...
rocky linux下载软件
一、配置国内镜像源加速下载 Rocky Linux 默认使用国外软件源,国内用户可通过替换为阿里云镜像提升下载速度: 备份原配置文件: cp -r /etc/yum.repos.d /etc/yum.repos.d.backup 修改镜像源: sed -e s|^mirrorlist|#mirrorli…...
JVM的组成--运行时数据区
JVM的组成 1、类加载器(ClassLoader) 类加载器负责将字节码文件从文件系统中加载到JVM中,分为:加载、链接(验证、准备、解析)、和初始化三个阶段 2、运行时数据区 运行时数据区包括:程序计数…...
SpringBoot中安全的设置阿里云日志SLS的accessKey
众所周知,阿里云的服务都是基于accesskeyId和accesskeySecret来进行身份鉴权的,但唯独日志因为需要写入到.xml文件里对于accesskeyId和accesskeySecret需要进行一定程度的改进,尤其是使用了jasypt进行加密的参数传递进去logback.xml更是会遇到需要对参数进行解密的问题,而官网只…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例11,TableView15_11带分页的导出表格示例
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
C++多线程编程:从创建到管理的终极指南
在高性能计算时代,掌握多线程编程是提升程序效率的必修课!本文将手把手教你如何用C++11标准库轻松创建和管理线程,告别单线程的“龟速”,让代码跑出多核CPU的性能! 一、多线程为何重要? 充分利用多核CPU:现代计算机普遍支持多核并行,多线程可让程序性能指数级提升。提升…...
人工智能算法基础
基础算法 排序查找线性结构树散列图堆栈 机器学习算法 定义:数据算法 流程:数据收集与预处理、特征选择、训练和测试模型、模型的评估。 监督学习 定义:是从给定的训练数据集中学习出一个函数,当新的数据到来时,可…...
Normal distribution (正态分布)
Normal distribution {正态分布} 1. Normal distribution (正态分布) Gaussian distribution (高斯分布)1.1. Probability density function (概率密度函数)1.2. Standard normal distribution (标准正态分布)1.3. Cumulative distribution function (累积分布函数) 2. 正态分…...
企业级前端架构设计与实战
一、架构设计核心原则 1.1 模块化分层架构 典型目录结构: src/├── assets/ # 静态资源├── components/ # 通用组件├── pages/ # 页面模块├── services/ # API服务层├── store/ # 全局状态管理├── uti…...
数据模型,数据建模,组件,核心价值,使用,意义
数据模型 一组由符号,文本组成的集合, 用以准确表达信息景观, 达到有效交流,沟通的目的 数据建模 是发现,分析和确定数据需求的过程,是一种称为数据模型的精确形式表示和传递这些需求 数据模型的组件 实体, 关系, 属性和域 数据模型的核心价值 交流性 精确性 数据模型的…...
JavaScript 比较运算符
JavaScript 比较运算符 一、基础比较运算符类型 运算符名称示例核心特性==宽松相等"5" == 5 → true隐式类型转换===严格相等"5" === 5 → false类型+值双重校验!=宽松不等null != 0 → true等效于 !(a == b)!==严格不等5 !== "5" → true类型或…...
AI Agent战国时代:Manus挑战者的破局之道与技术博弈
随着Manus引爆通用型AI Agent的"手脑协同"革命,全球AI Agent赛道进入技术竞速期。Flowith、UI-TARS、LangManus等新势力通过差异化路径重构市场格局,背后折射出开源生态、本土化创新与跨模态交互的深层技术博弈。本文结合行业权威报告与公开技…...
linux--时区查看和修改
查看当前时间和时区: 打开终端,输入以下命令查看当前的日期和时间设置: timedatectl修改时区: 使用 timedatectl 命令来修改时区: sudo timedatectl set-timezone <时区>例如,设置时区为北京时间(中国标准时间&a…...
个人博客系统 --- 测试报告
一、项目功能介绍 该项目由:登录模块、博客首页模块、博客详情页模块、博客编辑页模块四个功能模块组成。 该系统实现了个人博客的保存以及记录了发布日期、时间、发布人等信息。 二、测试内容与测试用例 我们需要对该系统进行功能测试,界面测试&…...
ESP32S3基于FreeRTOS实时操作系统控制舵机
这段代码是一个基于ESP32的舵机控制示例,通过MCPWM模块配置定时器、操作符、比较器和发生器,生成特定脉冲宽度的PWM信号,控制舵机在 -60度到60度之间以2度为步长往复转动。 1. 源码部分 #include "freertos/FreeRTOS.h" #include…...
【vue的some和filter】
在 Vue 中,some 和 filter 是两种不同的数组方法,分别用于处理数据筛选和条件判断。以下是它们在 Vue 中的具体用法和区别: 一、filter 方法 作用:对数组进行过滤,返回符合条件的新数组。 使用场景:常用于…...
【LC插件开发】基于Java实现FSRS(自由间隔重复调度算法)
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文讲解【LC插件开发】基于Java实现FSRS(自由间隔重复调度算法),期待与你一同探索、学习、进步,一起卷起来叭! 目录…...
jupyter 操作相关内容
1、jupyter界面美化 pip3 install jupyterthemes查看可用主题 jt -l推荐两个 jt -t grade3 -f consolamono -fs 140 -tfs 13 -nfs 115 -ofs 14 -cellw 90% -Tjt -t chesterish -f consolamono -fs 140 -altp -tfs 13 -nfs 115 -ofs 14 -cellw 90% -T...
【数据结构】单链表
目录 一、什么是链表?1、 定义2、链表的分类 二、无头单向非循环链表1、结构2、单链表数据的打印3、创建结点并初始化4、尾插5、头插6、尾删7、头删8、查找9、在指定位置pos之前插入数据10、在指定位置pos之后插入数据11、删除pos结点12、删除pos之后的结点13、销毁…...
UnoCSS极速入门:下一代原子化CSS引擎实战指南
文章目录 一、什么是UnoCSS?二、环境配置(Vite示例)三、核心使用模式3.1 自定义规则3.2 原子化类应用3.3 使用RegExp匹配器 四、高级功能解析4.1 主题系统4.2 响应式与深色模式 五、实战案例:构建现代按钮组件六、性能优化技巧七、…...
Es6进阶
class里的get和set 在 ES6 中,class 里的 get 和 set 是用于定义访问器属性的关键字。get 方法可在访问对象属性时调用,set 方法则在设置对象属性时调用。下面通过一个简单示例来介绍它们的用法: javascript class Person {constructor(nam…...
可发1区的创新思路:基于K-means聚类的EMD-BiLSTM-CNN-Attention时间序列预测模型(功率预测、寿命预测、流量预测、故障诊断)
首先声明,该模型为原创!原创!原创! 一、应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、交通流量预测、电机故障检测等等。 二、模型整体介绍(本文以光伏功率预测为例) 核心架构 数据聚类:K-means对风电场机组分组,降低异质性干扰。…...
Android BLE 权限管理
前言 android 权限一直是比较活跃的 在蓝牙权限这一块又分新版和旧版 新版权限 android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT旧版权限如9.0以下 Manifest.permission.A…...
vue3 ts 注册全局组件
vue3 ts 注册全局组件 register.tsmain.ts register.ts // 注册全局组件 import {App} from "vue" import headerPage from "/headerPage.vue" export default {install(app:App){app.component("headerPage",headerPage)} }main.ts import re…...
Apache Doris学习
https://doris.apache.org/zh-CN/docs/gettingStarted/what-is-apache-doris 介绍 Apache Doris 是一款基于 MPP 架构(大规模并行处理)的高性能、实时分析型数据库。它以高效、简单和统一的特性著称,能够在亚秒级的时间内返回海量数据的查询…...
llama源码学习·model.py[7]Transformer类
一、源码展示 class Transformer(nn.Module):def __init__(self, params: ModelArgs):super().__init__()self.params paramsself.vocab_size params.vocab_sizeself.n_layers params.n_layersself.tok_embeddings VocabParallelEmbedding(params.vocab_size, params.dim,…...
Windows server 2022域控制服务器的配置
Windows server 2022介绍 一、核心特性与改进 安全核心服务器(Secured-Core Server) 硬件级安全:支持基于硬件的安全功能(如TPM 2.0、Secure Boot、基于虚拟化的安全防护VBS),防止固件攻击。受信任的启动链…...
yolo目标检测算法在DJI上的研究分析(大纲)
yolo目标检测算法在DJI上的研究分析 面向边缘计算的实时目标检测系统设计与部署 第一章 绪论 1.1 研究背景与意义 目标检测技术需求: DJI设备(如无人机、摄像头)在安防、巡检、农业等场景中的广泛应用现有YOLO算法在高分辨率图像或资源受限…...
三、重学C++—C语言内存管理
上一章节: 二、重学C—C语言核心-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146191640?spm1001.2014.3001.5502 本章节代码: cPart2 CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppstudy/tree/…...
DAY37 动态归化Ⅰ基础题目
509. 斐波那契数 - 力扣(LeetCode) class Solution { public:int fib(int n) {if(n<1) return n;int dp[2];dp[0]0;dp[1]1;int sum0;for(int i2;i<n;i){sum dp[0]dp[1];dp[0]dp[1];dp[1]sum;}return sum;} }; 70. 爬楼梯 - 力扣(Lee…...
ABAP Core Data Services (SAP PRESS) (First Edition)
ABAP Core Data Services (SAP PRESS) (First Edition)...
ORM——对象关系映射
对象关系映射(ORM)深度解析:原理、优势与应用场景 一、什么是ORM? ORM(Object-Relational Mapping)即对象关系映射,是一种将面向对象编程中的对象与关系型数据库中的表进行映射的技术。简单来…...
【Docker系列五】Docker Compose 简介
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
大语言模型-2.2/3-主流模型架构与新型架构
简介 本博客内容是《大语言模型》一书的读书笔记,该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品,覆盖大语言模型训练与使用的全流程,从预训练到微调与对齐,从使用技术到评测应用,帮助学员全面掌握大语言模型的…...
JAVA组件的利用漏洞 Shlr搜索引擎 shiro身份 Log4j日志
solr组件 1、作用 : 基于http和apache lucene 进行全文搜索服务器 2、识别: 第一个就是图标类似于华为的那个 然后就是端口标识是 8983 3、CVE利用: 1、命令执行(CVE-2019-17558) Apache Solr 5.0.0版本至8…...
MongoDB未授权访问漏洞
1、连接MongoDB,添加账号密码 mongo 127.0.0.1 use admindb.createUser({user: admin,pwd: MongoDB123%.com,roles:[{role: root,db: admin}] })创建admin用户,密码为:MongoDB123%.com 2、设置完成,可以通过指令 show users 查看…...
CVPR2025 | 对抗样本智能安全方向论文汇总 | 持续更新中~
汇总结果来源:CVPR 2025 Accepted Papers 若文中出现的 论文链接 和 GitHub链接 点不开,则说明还未公布,在公布后笔者会及时添加. 若笔者未及时添加,欢迎读者告知. 文章根据题目关键词搜索,可能会有遗漏. 若笔者出现…...
MyBatis 动态 SQL 优化:标签的实战与技巧
目录 动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态SQL的常见用途 二、动态SQL的常见用法(XML方式)2.1 < if > 标签2.2 < trim> 标签2.3 <where>标签2.4<set>标签2.5 <foreach&g…...
自动化机器学习(TPOT优化临床试验数据)
目录 自动化机器学习(TPOT优化临床试验数据)1. 引言2. 项目背景与意义2.1 临床试验数据分析的重要性2.2 自动化机器学习的优势2.3 工业级数据处理与GPU加速需求3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法4. 自动化机器学习与TPOT4.1 自动化机器学习简介4.2 TPOT在临…...
spring boot3 验证码工具kaptcha使用
1、pom.xml文件,下载验证码工具kaptcha依赖 官网搭建的spring boot项目 <!--验证码工具kaptcha的依赖--> <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId> </dependency> 阿里云…...