JavaScript系列(36)--微服务架构详解
JavaScript微服务架构详解 🏗️
今天,让我们深入了解JavaScript的微服务架构,这是构建大规模分布式系统的关键技术。
微服务基础概念 🌟
💡 小知识:微服务架构是一种将应用程序构建为一组小型服务的方法,每个服务运行在自己的进程中,并使用轻量级机制进行通信。
基本微服务实现 📊
// 1. 服务注册中心
class ServiceRegistry {constructor() {this.services = new Map();this.healthChecks = new Map();}register(serviceName, instance) {if (!this.services.has(serviceName)) {this.services.set(serviceName, new Set());}this.services.get(serviceName).add(instance);this.setupHealthCheck(serviceName, instance);console.log(`Service ${serviceName} registered: ${instance.url}`);}deregister(serviceName, instance) {if (this.services.has(serviceName)) {this.services.get(serviceName).delete(instance);this.healthChecks.delete(instance.url);console.log(`Service ${serviceName} deregistered: ${instance.url}`);}}getInstances(serviceName) {return Array.from(this.services.get(serviceName) || []);}setupHealthCheck(serviceName, instance) {const healthCheck = setInterval(async () => {try {const response = await fetch(`${instance.url}/health`);if (!response.ok) {throw new Error('Health check failed');}} catch (error) {console.error(`Health check failed for ${instance.url}:`, error);this.deregister(serviceName, instance);}}, 30000); // 每30秒检查一次this.healthChecks.set(instance.url, healthCheck);}
}// 2. 负载均衡器
class LoadBalancer {constructor() {this.algorithms = {'round-robin': this.roundRobin.bind(this),'random': this.random.bind(this),'least-connections': this.leastConnections.bind(this)};this.currentIndex = 0;this.connectionCounts = new Map();}roundRobin(instances) {if (instances.length === 0) return null;const instance = instances[this.currentIndex];this.currentIndex = (this.currentIndex + 1) % instances.length;return instance;}random(instances) {if (instances.length === 0) return null;const randomIndex = Math.floor(Math.random() * instances.length);return instances[randomIndex];}leastConnections(instances) {if (instances.length === 0) return null;let minConnections = Infinity;let selectedInstance = null;for (const instance of instances) {const connections = this.connectionCounts.get(instance.url) || 0;if (connections < minConnections) {minConnections = connections;selectedInstance = instance;}}return selectedInstance;}incrementConnections(instance) {const current = this.connectionCounts.get(instance.url) || 0;this.connectionCounts.set(instance.url, current + 1);}decrementConnections(instance) {const current = this.connectionCounts.get(instance.url) || 0;if (current > 0) {this.connectionCounts.set(instance.url, current - 1);}}
}// 3. API网关
class APIGateway {constructor(serviceRegistry, loadBalancer) {this.serviceRegistry = serviceRegistry;this.loadBalancer = loadBalancer;this.middlewares = [];}use(middleware) {this.middlewares.push(middleware);}async handleRequest(req) {// 执行中间件for (const middleware of this.middlewares) {await middleware(req);}const serviceName = this.extractServiceName(req.path);const instances = this.serviceRegistry.getInstances(serviceName);if (instances.length === 0) {throw new Error(`No instances available for service: ${serviceName}`);}const instance = this.loadBalancer.roundRobin(instances);return this.forwardRequest(instance, req);}extractServiceName(path) {// 从路径中提取服务名return path.split('/')[1];}async forwardRequest(instance, req) {this.loadBalancer.incrementConnections(instance);try {const response = await fetch(`${instance.url}${req.path}`, {method: req.method,headers: req.headers,body: req.body});return response;} finally {this.loadBalancer.decrementConnections(instance);}}
}
高级微服务模式 🚀
// 1. 断路器模式
class CircuitBreaker {constructor(service, options = {}) {this.service = service;this.options = {failureThreshold: 5,resetTimeout: 60000,...options};this.state = 'CLOSED';this.failures = 0;this.lastFailureTime = null;}async execute(request) {if (this.state === 'OPEN') {if (this.shouldReset()) {this.halfOpen();} else {throw new Error('Circuit breaker is OPEN');}}try {const response = await this.service.execute(request);this.onSuccess();return response;} catch (error) {this.onFailure();throw error;}}onSuccess() {this.failures = 0;this.state = 'CLOSED';}onFailure() {this.failures++;this.lastFailureTime = Date.now();if (this.failures >= this.options.failureThreshold) {this.state = 'OPEN';}}shouldReset() {return Date.now() - this.lastFailureTime >= this.options.resetTimeout;}halfOpen() {this.state = 'HALF-OPEN';this.failures = 0;}
}// 2. 服务网格
class ServiceMesh {constructor() {this.proxies = new Map();this.metrics = new Map();}addProxy(serviceName, instance) {const proxy = new ServiceProxy(instance);if (!this.proxies.has(serviceName)) {this.proxies.set(serviceName, new Set());}this.proxies.get(serviceName).add(proxy);this.initializeMetrics(proxy);return proxy;}initializeMetrics(proxy) {this.metrics.set(proxy, {requests: 0,errors: 0,latency: []});}async routeRequest(serviceName, request) {const proxySet = this.proxies.get(serviceName);if (!proxySet || proxySet.size === 0) {throw new Error(`No proxies available for service: ${serviceName}`);}const proxy = Array.from(proxySet)[0]; // 简单选择第一个代理const metrics = this.metrics.get(proxy);const startTime = Date.now();metrics.requests++;try {const response = await proxy.forward(request);metrics.latency.push(Date.now() - startTime);return response;} catch (error) {metrics.errors++;throw error;}}getMetrics(serviceName) {const proxySet = this.proxies.get(serviceName);if (!proxySet) return null;const serviceMetrics = {totalRequests: 0,totalErrors: 0,averageLatency: 0};for (const proxy of proxySet) {const metrics = this.metrics.get(proxy);serviceMetrics.totalRequests += metrics.requests;serviceMetrics.totalErrors += metrics.errors;if (metrics.latency.length > 0) {const sum = metrics.latency.reduce((a, b) => a + b, 0);serviceMetrics.averageLatency += sum / metrics.latency.length;}}return serviceMetrics;}
}// 3. 分布式追踪
class DistributedTracer {constructor() {this.traces = new Map();this.spans = new Map();}startTrace(traceId = this.generateTraceId()) {const trace = {id: traceId,startTime: Date.now(),spans: []};this.traces.set(traceId, trace);return traceId;}startSpan(traceId, spanId = this.generateSpanId(), parentSpanId = null) {const span = {id: spanId,traceId,parentSpanId,startTime: Date.now(),events: []};this.spans.set(spanId, span);this.traces.get(traceId).spans.push(span);return spanId;}addEvent(spanId, event) {const span = this.spans.get(spanId);if (span) {span.events.push({timestamp: Date.now(),...event});}}endSpan(spanId) {const span = this.spans.get(spanId);if (span) {span.endTime = Date.now();span.duration = span.endTime - span.startTime;}}endTrace(traceId) {const trace = this.traces.get(traceId);if (trace) {trace.endTime = Date.now();trace.duration = trace.endTime - trace.startTime;return this.generateTraceReport(trace);}}generateTraceReport(trace) {return {traceId: trace.id,duration: trace.duration,spans: trace.spans.map(span => ({id: span.id,parentId: span.parentSpanId,duration: span.duration,events: span.events}))};}generateTraceId() {return `trace-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;}generateSpanId() {return `span-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;}
}
性能优化技巧 ⚡
// 1. 缓存管理器
class CacheManager {constructor(options = {}) {this.options = {maxSize: 1000,ttl: 3600000, // 1小时...options};this.cache = new Map();this.accessLog = new Map();}set(key, value, ttl = this.options.ttl) {this.ensureCapacity();const entry = {value,expires: Date.now() + ttl};this.cache.set(key, entry);this.accessLog.set(key, Date.now());}get(key) {const entry = this.cache.get(key);if (!entry) return null;if (Date.now() > entry.expires) {this.cache.delete(key);this.accessLog.delete(key);return null;}this.accessLog.set(key, Date.now());return entry.value;}ensureCapacity() {if (this.cache.size >= this.options.maxSize) {// 删除最少访问的条目const entries = Array.from(this.accessLog.entries());entries.sort((a, b) => a[1] - b[1]);const keyToDelete = entries[0][0];this.cache.delete(keyToDelete);this.accessLog.delete(keyToDelete);}}clear() {this.cache.clear();this.accessLog.clear();}
}// 2. 请求合并器
class RequestBatcher {constructor(options = {}) {this.options = {maxBatchSize: 100,maxDelay: 50,...options};this.batch = [];this.timer = null;}async add(request) {return new Promise((resolve, reject) => {this.batch.push({request,resolve,reject});if (this.batch.length >= this.options.maxBatchSize) {this.flush();} else if (!this.timer) {this.timer = setTimeout(() => this.flush(), this.options.maxDelay);}});}async flush() {if (this.batch.length === 0) return;const currentBatch = this.batch;this.batch = [];if (this.timer) {clearTimeout(this.timer);this.timer = null;}try {const results = await this.processBatch(currentBatch);currentBatch.forEach((item, index) => {item.resolve(results[index]);});} catch (error) {currentBatch.forEach(item => {item.reject(error);});}}async processBatch(batch) {// 实现批处理逻辑return Promise.all(batch.map(item => this.processRequest(item.request)));}async processRequest(request) {// 实现单个请求处理逻辑return request;}
}// 3. 性能监控器
class PerformanceMonitor {constructor() {this.metrics = {requestCount: 0,errorCount: 0,responseTime: [],cpuUsage: [],memoryUsage: []};this.startMonitoring();}startMonitoring() {setInterval(() => {this.collectMetrics();}, 5000); // 每5秒收集一次}collectMetrics() {const metrics = process.metrics();this.metrics.cpuUsage.push({timestamp: Date.now(),value: metrics.cpu.usage});this.metrics.memoryUsage.push({timestamp: Date.now(),value: process.memoryUsage().heapUsed});// 保持最近1小时的数据this.pruneMetrics();}recordRequest(duration, isError = false) {this.metrics.requestCount++;if (isError) this.metrics.errorCount++;this.metrics.responseTime.push({timestamp: Date.now(),value: duration});}pruneMetrics() {const oneHourAgo = Date.now() - 3600000;['cpuUsage', 'memoryUsage', 'responseTime'].forEach(metric => {this.metrics[metric] = this.metrics[metric].filter(item => item.timestamp > oneHourAgo);});}getMetrics() {return {requestCount: this.metrics.requestCount,errorCount: this.metrics.errorCount,errorRate: this.metrics.errorCount / this.metrics.requestCount,averageResponseTime: this.calculateAverage(this.metrics.responseTime),averageCpuUsage: this.calculateAverage(this.metrics.cpuUsage),averageMemoryUsage: this.calculateAverage(this.metrics.memoryUsage)};}calculateAverage(metrics) {if (metrics.length === 0) return 0;const sum = metrics.reduce((acc, item) => acc + item.value, 0);return sum / metrics.length;}
}
最佳实践建议 💡
- 服务设计原则
// 1. 服务隔离
class ServiceIsolation {constructor(service) {this.service = service;this.circuitBreaker = new CircuitBreaker(service);this.bulkhead = new Bulkhead(10); // 限制并发请求数}async execute(request) {return this.bulkhead.execute(() => this.circuitBreaker.execute(request));}
}// 2. 服务发现
class ServiceDiscovery {constructor(registry) {this.registry = registry;this.cache = new Map();this.cacheTimeout = 30000; // 30秒缓存}async getService(name) {const cached = this.cache.get(name);if (cached && Date.now() - cached.timestamp < this.cacheTimeout) {return cached.service;}const service = await this.registry.lookup(name);this.cache.set(name, {service,timestamp: Date.now()});return service;}
}// 3. 配置管理
class ConfigurationManager {constructor() {this.configs = new Map();this.watchers = new Map();}set(key, value) {this.configs.set(key, value);this.notifyWatchers(key, value);}get(key) {return this.configs.get(key);}watch(key, callback) {if (!this.watchers.has(key)) {this.watchers.set(key, new Set());}this.watchers.get(key).add(callback);}notifyWatchers(key, value) {const watchers = this.watchers.get(key);if (watchers) {watchers.forEach(callback => callback(value));}}
}
结语 📝
微服务架构为构建大规模分布式系统提供了强大的支持。通过本文,我们学习了:
- 微服务的基本概念和实现方法
- 高级微服务模式和最佳实践
- 性能优化和监控技术
- 服务隔离和容错处理
- 配置管理和服务发现
💡 学习建议:在实践微服务架构时,要特别注意服务的隔离性和容错性。合理使用断路器、服务发现等模式,可以显著提升系统的可靠性和可维护性。
如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇
终身学习,共同成长。
咱们下一期见
💻
相关文章:
JavaScript系列(36)--微服务架构详解
JavaScript微服务架构详解 🏗️ 今天,让我们深入了解JavaScript的微服务架构,这是构建大规模分布式系统的关键技术。 微服务基础概念 🌟 💡 小知识:微服务架构是一种将应用程序构建为一组小型服务的方法&…...
神经网络基础 | 给定条件下推导对应的卷积层参数
神经网络基础 | 给定条件下推导对应的卷积层参数 按照 PyTorch 文档中 给定的设置: H o u t ⌊ H i n 2 padding [ 0 ] − dilation [ 0 ] ( kernel_size [ 0 ] − 1 ) − 1 stride [ 0 ] 1 ⌋ H_{out} \left\lfloor\frac{H_{in} 2 \times \text{padding}[0]…...
面向CTF的python_requests库的学习笔记
看师傅们写的各种脚本羡慕不已,自己却只会一点一点手搓,于是来做个笔记 requests库是干嘛的? 顾名思义,request就是请求,可以用来向服务器发送请求。它可以代替你在网站上发送请求报文,并接受回应报文。简…...
MIAOYUN信创云原生项目亮相西部“中试”生态对接活动
近日,以“构建‘中试’生态,赋能科技成果转化”为主题的“科创天府智汇蓉城”西部“中试”生态对接活动在成都高新区菁蓉汇隆重开幕。活动分为成果展览、“中试”生态主场以及成果路演洽谈对接三大板块。在成果展览环节,成都元来云志科技有限…...
Papers with Code:从代码索引到AI创新引擎
标题:Papers with Code:从代码索引到AI创新引擎 文章信息摘要: Papers with Code从解决机器学习论文代码复现的特定需求起步,通过建立全面的ML资源库和首个系统性leaderboard系统,快速积累了大量用户基础。被Meta收购…...
FastExcel 新一代的潮流 (EasyExcel)
目录 简介 FastExcel的特点 FastExcel使用方法详解 创建实体类和监听器 实现写入和读取功能 Excel转换为PDF 小结 FastExcel与EasyExcel的区别 结论 简介 FastExcel是由原EasyExcel作者在阿里巴巴宣布停止维护EasyExcel之后推出的升级版框架。它继承了EasyExcel的所有…...
Linux静态库与动态库的理解
Linux静态库与动态库的理解 一、静态库如何创建和使用静态库 二、动态库如何创建和使用动态库 三、静态库与动态库的关键区别四、总结 在 Linux 编程中,静态库和动态库是非常重要的概念 一、静态库 静态库是将多个目标文件(.o 文件)打包成一…...
mongoose 支持https踩坑纪实
简述 mongoose是C编写的嵌入式web服务,它能够支持https协议,可以简单的部署,但要做到完美部署,不是那么容易。 部署方法 本人使用的是最新的7.16版,以前版本似乎是要通过修改 头文件中的 MG_ENABLE_SSL 宏定义&…...
人工智能之数学基础:线性表达和线性组合
本文重点 线性表达和线性组合作为线性代数的核心概念,不仅深刻揭示了向量空间的基本性质,也为解决复杂问题提供了直观而有效的方法。 向量组 要想学习线性表达和线性组合,先来理解向量组。在线性代数中,向量组是指由若干个向量构成的集合。这些向量可以是二维的、三维的…...
uniapp——App 监听下载文件状态,打开文件(三)
5 实现下载文件并打开 这里演示,导出Excel 表格 文章目录 5 实现下载文件并打开DEMO监听下载进度效果图为什么 totalSize 一直为0? 相关Api: downloader DEMO 提示: 请求方式支持:GET、POST;POST 方式需要…...
Microsoft SQL Serve的下载与安装
1.访问Microsoft SQL Serve官网 SQL Server 下载 | Microsoft开始使用 Microsoft SQL Server 下载。选择最符合你的数据和工作负载需求的 SQL Server 试用版、版本、工具或连接器。[这里是图片001]https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.下载SQL…...
JMeter 测试Dubbo 接口
在使用 JMeter 进行 Dubbo 接口的测试时,JMeter 本身并没有直接支持 Dubbo 协议(基于 RPC)的插件。但是,我们可以通过以下几种方式来测试 Dubbo 接口: 1. 使用 JMeter 的 Java 请求(JDBC 请求)…...
Java 日志技术、Logback日志框架、日志级别
一. 日志 1. 日志:程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息。 二. 日志技术 1. 日志技术:可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中) 2. 可以随时以开关的…...
美妆系列圣罗兰气垫粉色与黑色有什么区别?
在美妆界,圣罗兰的气垫一直备受青睐,而其中粉色款和黑色款更是有着各自的特点,存在不少区别呢。 从外观设计来看,粉色款整体给人一种温柔、甜美的感觉,外壳颜色清新,很容易击中少女心,携带在身边…...
HTML中的`<!DOCTYPE html>`是什么意思?
诸神缄默不语-个人CSDN博文目录 在学习HTML时,我们经常会看到HTML文档的开头出现<!DOCTYPE html>,它是HTML文件的第一行。很多初学者可能会疑惑,为什么需要这行代码?它到底有什么作用呢?在这篇文章中࿰…...
Sudo命令的配置及使用
概念 sudo 命令是 Linux 系统中一个非常重要的工具,它允许普通用户以超级用户(通常是 root)或其他用户的身份执行命令。从概念上来说,在普通用户在权限不够的时候,通过 sudo 命令 “摇人”,这个 “人” 就是…...
【HarmonyOS NEXT】鸿蒙三方应用跳转到系统浏览器
【HarmonyOS NEXT】鸿蒙三方应用跳转到系统浏览器 一、前言: 从三方应用跳转到系统浏览器是比较常见的功能。 拓展应用功能边界: 三方应用的功能通常相对聚焦和特定,无法涵盖用户可能需要的所有网络浏览需求。跳转到系统浏览器能让用户访问…...
电梯系统的UML文档06
系统传感器 系统值是用于控制系统的。在类图中系统传感器用一个箭头和系统控制对象连接。 类图中的系统传感器包括AtFloor、电梯呼叫器、关门、开门、门反转、楼层呼叫器和驱动(AtFloor,CarCall,DoorClosed,DoorOpen,…...
指针之旅:从基础到进阶的全面讲解
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文(1)内置数…...
AT8870单通道直流电机驱动芯片
AT8870单通道直流电机驱动芯片 典型应用原理图 描述 AT8870是一款刷式直流电机驱动器,适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器,该驱动器由四个N-MOS组成,能够以高达3.6A的峰值电流双向控制电机。利用电流…...
RISC-V读书笔记
目录 关于RISC-V 关于RISC-V 简洁 RISC-V是一个崭新的架构,比起来传统的x86-64架构,他更加的简约和现代。下面这种图像阐述了传统的x86的指令集的膨胀速度有多么的吓人(汗颜 这是可以理解的,我们的ISA(Computer Syst…...
游戏开发中常用的设计模式
目录 前言一、工厂模式简单工厂模式工厂方法模式抽象工厂模式 二、单例模式三、观察者模式观察者模式的优势 四、状态模式状态模式的优势 五、策略模式策略模式的优势 六、组合模式七、命令模式八、装饰器模式策略模式与状态模式有什么区别呢? 前言 本文介绍了游戏开发中常用…...
Android 11适配全攻略:从理论到实践
随着Google正式发布Android 11,开发者们迎来了新的挑战和机遇。Android 11不仅带来了全新的用户体验和功能提升,还要求开发者们对应用进行相应的适配,以确保应用的兼容性和稳定性。本文将从理论到实践,全面解析Android 11的适配攻…...
Grafana 统一可视化了,告警如何统一?
对于大部分公司,通常都不止一套监控、可观测性相关的系统,云上的、云下的,开源的、商业的,指标的、日志的、链路的,各个系统体验不同,权限难管,如何统一化并为各个团队赋能,是很多技…...
ubuntu20.04有亮度调节条但是调节时亮度不变
尝试了修改grub文件,没有作用,下载了brightness-controllor,问题解决了。 sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt update sudo apt install brightness-controller 之后在应用软件中找到brightness-contro…...
抖音小程序一键获取手机号
前端代码组件 <button v-if"!isFromOrderList"class"get-phone-btn" open-type"getPhoneNumber"getphonenumber"onGetPhoneNumber">一键获取</button>// 获取手机号回调onGetPhoneNumber(e) {var that this tt.login({f…...
某政务行业基于 SeaTunnel 探索数据集成平台的架构实践
分享嘉宾:某政务公司大数据技术经理 孟小鹏 编辑整理:白鲸开源 曾辉 导读:本篇文章将从数据集成的基础概念入手,解析数据割裂给企业带来的挑战,阐述数据集成的重要性,并对常见的集成场景与工具进行阐述&…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)
为进一步测试通过请求头传递token进行身份验证,在main.htm中增加layui的数据表格组件,并调用后台服务分页显示数据,后台分页查询数据接口如下所示(测试时,直接将数据写死到代码中,没有查询数据库࿰…...
Android 高德地图API(新版)
新版高德地图 前言正文一、创建应用① 获取PackageName② 获取调试版安全码SHA1③ 获取发布版安全码SHA1 二、配置项目① 导入SDK② 配置AndroidManifest.xml 三、获取当前定位信息① ViewBinding使用和导包② 隐私合规设置③ 权限请求④ 初始化定位⑤ 获取定位信息 四、显示地…...
51c~缺陷检测~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12386431 一、缺陷检测~使用深度学习1 这里研究工业ai, 在制造业中任何公司的主要目标都是为客户生产无缺陷产品。如果在产品开发过程中出现任何内部孔、凹坑、磨损或划痕(由于多种原因,从生产设备…...
强化学习与ai黑科技实例
一.强化学习简介和其应用 (1)强化学习,深度学习,有监督,无监督区别与联系。 1)强化学习讨论的核心就是智能机(agent)怎么在复杂,不确定的环境中最大化它能获得的奖励。 2)人工智能包括机器学习,机器学习包括有监督学习,无监督学习(例如聚类…...
《TikTok归来:机遇与挑战并存》
TikTok 回归:波折中的 “重生” 在全球社交媒体的版图中,TikTok 的存在无疑是一颗璀璨的明星。它以独特的短视频形式、强大的算法推荐以及丰富多样的内容,迅速风靡全球,吸引了数以亿计的用户。然而,其发展并非一帆风顺…...
Rust语言的正则表达式
Rust语言的正则表达式 正则表达式(Regular Expressions,简称Regex)是一种强大的文本处理工具,广泛应用于字符串的搜索、匹配、替换和解析。在Rust语言中,正则表达式的支持既高效又功能强大,非常适合开发者…...
三维扫描赋能文化:蔡司3D扫描仪让木质文化遗产焕发新生-沪敖3D
挪威文化历史博物馆在其修复工作中融入现代3D扫描技术,让数百年的历史焕发新生。 文化历史博物馆的工作 文化历史博物馆是奥斯陆大学的一个院系。凭借其在文化历史管理、研究和传播方面的丰富专业知识,该博物馆被誉为挪威博物馆研究领域的领先机构。馆…...
c# PDF文件合并工具
界面 主要用于发票PDF文件的合并。经常出差要报销的很有用。 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System…...
【16届蓝桥杯寒假刷题营】第1期DAY5
5.依依的询问最小值 - 蓝桥云课 问题描述 依依有个长度为 n 的序列 a,下标从 1 开始。 她有 m 次查询操作,每次她会查询下标区间在 [li,ri] 的 a 中元素和。她想知道你可以重新排序序列 a,使得这 m 次查询的总和最小。 求你求出 m 次…...
.NET周刊【1月第1期 2025-01-05】
国内文章 3款.NET开源、功能强大的通讯调试工具,效率提升利器! https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具,旨在提高调试效率。这些工具包括LLCOM,提供串口调试和自动化处…...
(7)(7.2) 围栏
文章目录 前言 1 通用设置 2 围栏类型 3 破坏栅栏行动 4 使用 RC 通道辅助开关启用栅栏 5 自动高度规避 6 在任务规划器中启用围栏 7 用于遥控飞行训练 8 MAVLink 支持 前言 ArduPilot 支持基于本机的圆柱形(“TinCan”)和多边形和/或圆柱形、…...
1166 Summit (25)
A summit (峰会) is a meeting of heads of state or government. Arranging the rest areas for the summit is not a simple job. The ideal arrangement of one area is to invite those heads so that everyone is a direct friend of everyone. Now given a set of tenta…...
linux_socket
udp 通信 server #include <iostream> #include <arpa/inet.h> #include <unistd.h> #include <cstring>using namespace std;#define UPORT 12511int main(){int sock socket(AF_INET, SOCK_DGRAM, 0); // 创建一个UDP套接字if (sock -1) {cout&…...
Linux探秘坊-------3.开发工具详解(2)
1.动静态库和动静态链接(操作) 静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件 ⽐较⼤,但在运⾏时也就不再需要库⽂件了。其后缀名⼀般为“.a” 动态库与之相反,在编译链接时并 没有把库⽂件的代码加⼊到可执⾏⽂件中 ,⽽…...
Mysql InnoDB B+Tree是什么?
“mysql中常用的数据库搜索引擎InnoDB,其索引通过BTree的方式进行构建。” 实在想不起来BTree是怎么一回事了。以点带线,将涉及到的数据结构一起复习一下。 文章目录 数据结构定义红黑树定义使命 BTree定义使命 BTree定义 InnoDB BTree 旋转与调整二叉排序树插入删…...
C语言进阶习题【1】指针和数组(1)——一维数组
1. 数组名的意义: sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。除此之外所有的数组名都表示首元素的地址。(一维数…...
2024:成长、创作与平衡的年度全景回顾
文章目录 1.前言2.突破自我:2024年个人成长与关键突破3.创作历程:从构想到落笔,2024年的文字旅程4.生活与学业的双重奏:如何平衡博客事业与个人生活5.每一步都是前行:2024年度的挑战与收获6.总结 1.前言 回首2024年&a…...
【Linux】网络基础探索:开启你的网络之旅
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 计算机网络背景 🦋 1-1 网络发展 二:🔥 初识协议 🦋 2-1 协议分层协议分层 vs. 软件分层 🦋 2-…...
function isBulkReadStatement, file SQLiteDatabaseTracking.cpp
一问题:Xcode16.0运行在iPhone16/ios18.0 以上发生闪退, 闪退在 YYCache–>YYKVStorage 文件内。 以上删除保以下错误: function isBulkReadStatement, file SQLiteDatabaseTracking.cpp 解决方案: 找到YYKVStorage文件中_d…...
React 中hooks之useTransition使用总结
目录 概述基本用法使用场景最佳实践注意事项 概述 什么是 useTransition? useTransition 是 React 18 引入的新 Hook,用于标记非紧急的状态更新。它允许组件在状态转换期间保持响应,通过将某些更新标记为"过渡"来推迟它们的渲染。 主要特…...
leetcode 3097. 或值至少为 K 的最短子数组 II 中等
给你一个 非负 整数数组 nums 和一个整数 k 。 如果一个数组中所有元素的按位或运算 OR 的值 至少 为 k ,那么我们称这个数组是 特别的 。 请你返回 nums 中 最短特别非空 子数组 的长度,如果特别子数组不存在,那么返回 -1 。 示例 1&…...
C# OpenCV机器视觉:特征匹配 “灵魂伴侣”
在一个阳光仿佛被施了魔法,欢快得直蹦跶的早晨,阿强像个即将踏上神秘寻宝之旅的探险家,一屁股墩在实验室那张堆满各种奇奇怪怪小玩意儿的桌前。桌上,零件、线路、半成品设备乱成一团,唯有他那宝贝电脑屏幕散发着清冷又…...
DDD - 整洁架构_解决技术设计困局
文章目录 Pre如何落地 DDD底层技术的更迭 整洁架构的设计主动适配器/北向适配器被动适配器/南向适配器 整洁架构的落地总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对象的两种设计思路…...