【JAVA】BOSS系统发版艺术:构建高效、优雅的微服务部署策略
在现代软件开发领域,微服务架构与容器化部署已迅速成为行业新趋势。微服务架构通过将应用拆分成多个小型、自治的服务单元,每个服务承担某项特定的业务功能。而容器化部署则以其轻量级和高度可移植的特性,为这些微服务的有效打包、分发和运行提供了强大支持。
在这样的环境中,实现微服务的优雅上下线变得至关重要。优雅上下线意味着在进行服务更新、扩展或缩减服务规模时,能够无缝切换,避免或最小化对用户的影响。这种做法不仅保障了系统的高可用性和稳定性,还大幅提升了开发和运维团队的工作效率。
本文将深入探讨如何借助容器化技术,实现微服务的优雅上下线。我们将分享一系列实用的方法和策略,包括滚动升级、就绪检查以及优雅关闭等。通过采用这些策略,您能在进行版本更新、规模调整或故障恢复期间,确保系统的连续稳定运行,从而显著提升整体的系统可靠性和稳定性。
1 项目背景
BOSS物业管理系统(以下简称“BOSS系统”)是碧桂园服务(以下简称“碧服”)体系中的核心主营收费系统,它主要负责管理客户、房屋及车位等基础数据,并支持物业费、合同类、表计类、车位类及临时类费用的全自动化计费。BOSS系统采用微服务架构和容器化部署,拆分成30个不同功能的微服务。这种设计虽然大幅提升了系统的灵活性和可维护性,却也增加了服务发版部署的时长。
此外,在发版过程中,服务可能会出现短暂的中断,或者在服务停止时还有未完成的异步线程的任务,导致业务数据的不完整,进而引发大量的运维工单,增加运维成本的同时也影响了用户体验。
当前,BOSS系统采用了敏捷开发模式,其显著特点之一是小步快跑。这种模式使我们能够以更快的速度推出新功能和优化现有功能,迅速响应用户业务需求的变化。在这种开发模式下,发版效率显得尤为重要。以往,每次部署时长约两小时,再加上发版后的验证回归和测试,整个流程可能需要数小时才能完成。这样漫长的发版流程不仅占用了团队大量的时间和资源,还增加了出错的风险。
2 如何实现高效
2.1 引入发版的checklist
由于BOSS系统的服务拆分的比较细,若全量发版则需要发布30个服务。每次发版不仅包括数据库更改脚本、nacos配置更新及XXL-Job任务调度等内容,还有服务清单和代码迁入的情况。如果在发版前没有进行充分的检查与准备,后续可能需要多次更新服务,极大地增加了整个发版时长。
为了解决这一问题,引入发版checklist显得尤为重要。该checklist能够帮助盘点上线事项,并回顾开发过程中的各个细节。通过checklist,团队可以更有序地执行发版流程,从而提高发版的效率和准确性。
上线checklist包括以下几个关键内容:
1、上线前准备:此阶段需准备数据库脚本、nacos配置、XXL-Job任务以及一些提前编写好的配置文件等;
2、上线步骤:包括更新的SQL、各个模块的更新顺序以及是否依赖公共包等。对于C端应用,需要注意服务端与前端的发布先后顺序;
3、需验证的事项:在每个模块更新完成后,需采取相应的措施来验证其是否正常,例如观察页面、检查日志和监控是否正常等;
4、明确人与时间:checklist应尽可能详细,明确具体的人员和特定时间段的任务安排;
5、评估对用户的影响:在每个步骤完成后,需要评估对用户的影响,并关注相应的内容;
6、提前做好预发回归:预发环境应与生产环境的数据源相通。在预发环境中,可以模拟线上更新的步骤,提前预演一遍。为避免预发环境对线上的影响,可考虑使用白名单控制访问权限,同时注意用户权限的回收,以防止误操作影响线上环境。
2.2 容器升级策略
在容器化部署中,滚动更新允许逐个替换Pod实例以实现零停机的Deployment更新。新创建的Pod将会被调度到可用资源的节点上。
在阿里云k8s中,默认采用滚动升级策略。此策略下“不可用Pod最大数量”和“超出期望的Pod数量”都是25%。然而,当节点资源的内存严重紧张时,日常使用平均内存利用率已经超过80%,并且需要同时更新30个服务,尤其是这些服务配置的内存需求多集中在8至16GB之间,就可能导致发版过程中节点池的内存资源不足以支撑这么多Pod的同时申请,导致容器尝试滚动升级时大量Pod处于pending状态,等待分配资源。
我们通过优化容器升级策略,在不增加节点服务器资源前提下,实现了快速的滚动升级。考虑到常规发布操作安排在非高峰时段,因此可以接受不可用Pod的最大数量控制在25%至80%之间。这种调整显著释放了节点资源,极大地提升了后续的容器滚动升级速率。
2.3 发版汇总
通过最近几次的发版汇总记录进行分析,我们可以发现,初次执行全量发布30个服务的操作耗时约两小时。然而,在引入发版checklist和优化容器升级策略后,第二次进行全量发版的时间大幅缩短至半小时内。目前,全量发版仅需20分钟即可完成,而对于日常的少量服务发版,则仅需10分钟。发版时间的显著缩短,为后续的测试验证工作提供了更加充裕的时间,从而提高了整个发版与验证的效率。
3 微服务优雅上下线设计与实践
3.1 什么是微服务优雅上下线
微服务优雅上下线的基本原理是指在微服务更新发布过程中确保服务的稳定性和可用性,防止由于服务变更引起的流量中断或错误。
实现微服务的优雅上下线,旨在避免以下问题:
-
过早的注册服务:服务尚未完全就绪时就注册到了注册中心,开始接受请求,导致业务异常;
-
过早退出应用程序:服务还在处理请求时,应用程序被强制终止,导致正在进行的请求出现错误。
针对这些问题,我们可以采取以下优化措施:
-
优雅上线:在服务启动后,等待服务完全就绪后再对外提供服务,或者有一个服务预热过程;
-
优雅下线:在服务停止前,先从服务注册中心注销,拒绝新的请求,并等待旧的请求处理完毕后再下线服务,从而确保所有请求都能得到妥善处理。
3.2 实现微服务在容器中优雅上下线 
1、优雅上线
在实现微服务的优雅上线过程中,我们可以利用k8s的就绪检查与微服务生命周期对齐,等完成服务注册与准备就绪后,再开始接受外部流量。
就绪检查接口一般包括数据库连接状态、redis连接状态、nacos注册状态及调用预热接口等工作。
我们可使用Spring Boot Actuator提供的健康检查接口/health来做就绪检查:
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
启用liveness和readiness探针
management:server:port: 8088endpoints:web:exposure:include: health,info,metrics,prometheus,monitoring,deregisterendpoint:health:show-details: alwaysprobes:enabled: truehealth:livenessstate:enabled: truereadinessstate:enabled: true
health/readiness接口会严格检查SpringBoot的各项组件服务,比如邮件服务、数据库服务及MQ服务等。当所有组件处于正常状态时,它会返回内容{"status": "UP"},否则返回{"status": "down"}。
2、优雅下线
在实现微服务的优雅下线过程中,我们可以结合使用SpringBoot的优雅停机方案和k8s生命周期管理(停止前处理)来实现服务的优雅退出。
SpringBoot的优雅停机使用方式:
通过配置文件的方式即可开启优雅停机,需要配置server.shutdown属性和宽限期。宽限期会影响到同步请求的超时中断。
# 开启优雅关闭
server:shutdown: graceful
# 配置强制结束时间,不配置的话默认30s
spring:lifecycle:timeout-per-shutdown-phase: 60scloud:loadbalancer:cache:ttl: 10s
在Spring Cloud LoadBalancer中,为了优化服务调用的性能,减少对服务注册中心的频繁请求,LoadBalancer实现了对服务实例列表的本地缓存。默认设置下,这个缓存的时效为35秒。但是,这一默认缓存过期时间可能会导致在系统上下线过程中出现问题。如果缓存中仍然存储着旧的服务列表,那么这可能会影响到服务的可用性和准确性。
优雅下线接口,这里采用的是手写的方式,还可以用Spring Boot Actuator提供的接口/shutdown端点的方式,但该接口只支持POST的方式。
@Autowired
private NacosAutoServiceRegistration nacosAutoServiceRegistration;@ReadOperation
public String deregister() {Executors.newSingleThreadExecutor().submit(() -> {log.info("Ready to stop service: {}", serviceName);nacosAutoServiceRegistration.stop();log.info("Nacos instance has been de-registered.");});return "{\n" +" \"status\": \"UP\"\n" +"}";
}
注意:在优雅下线接口中,我们只需要执行退出nacos注册操作即可,无需手动退出spring应用程序。这是因为配置文件已经启用了服务器端的优雅关闭机制。另外,timeout-per-shutdown-phase参数的时间是影响同步请求的超时中断。
容器停止前处理:配置调用优雅退出接口并等待30秒
容器生命周期:
容器终止流程:
1、Pod被删除,状态置为Terminating;
2、将Pod从service的endpoint列表中摘除掉;
3、如果Pod配置了preStop Hook,将会执行(容器停止前处理);
4、发送SIGTERM信号以通知容器进程开始优雅停止;
5、等待容器进程完全停止。如果在terminationGracePeriodSeconds内 (默认30s) 还未完全停止,就发送SIGKILL信号强制杀死进程;
6、容器进程终止,清理Pod资源。
在k8s的容器终止流程中,第五步为容器删除预留了一个最大时间限制,即30秒。如果SpringBoot应用的优雅关闭超时时间和k8s的preStopHooks的总和超过30秒,那么k8s可能会在SpringBoot处理完所有请求之前强制删除容器。
为了避免这种情况,我们可以调整优雅终止的时间。在k8s中,这个时间由terminationGracePeriodSeconds参数控制,其默认值是30s。我们可以根据实际情况调整这个值,但需要确保terminationGracePeriodSeconds的值要大于sleep时间。请注意,terminationGracePeriodSeconds设置的是最大等待时间,并不意味着每次终止都会等待这么长时间。
此外,探索JVM退出的钩子函数(Runtime.addShutdownHook)的使用也是一个很好的实践。通过添加关闭钩子函数,可以实现在程序退出时的关闭资源、优雅退出的功能。这也是SpringBoot优雅退出的原理,ApplicationContext.registerShutdownHook方法是spring框架中的一个方法,用于注册一个JVM关闭的钩子(Shutdown Hook),当JVM关闭时,Spring容器可以优雅地关闭并释放资源。
3、异步线程优雅退出
在实现服务优雅退出过程中,我们遇到了一个挑战:异步线程的优雅退出。由于BOSS系统的业务复杂性,几乎每个服务都使用了异步线程来处理一些耗时操作。然而,在发版期间,如果容器提前退出,那些尚未完成的异步任务可能会被中断,导致业务数据的不完整,进而需要人工介入进行数据修正。
异步线程优雅退出的解决办法:
-
使用统一的自定义线程池;
-
配置线程池优雅退出和任务最大结束时间。
@Bean("bossTaskExecutor")
public ThreadPoolTaskExecutor bossTaskExecutor() {log.info("start taskExecutor");ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 配置核心线程数executor.setCorePoolSize(threadPoolCorePoolSize);// 设置最大线程数executor.setMaxPoolSize(threadPoolMaxPoolSize);// 设置队列容量executor.setQueueCapacity(threadPoolQueueCapacity);// 设置线程活跃时间(秒)executor.setKeepAliveSeconds(threadPoolKeepAliveSeconds);// 配置线程池中的线程的名称前缀executor.setThreadNamePrefix("async-service-");// 设置拒绝策略// rejection-policy:当pool已经达到max size的时候,如何处理新任务// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 等待所有任务结束后再关闭线程池executor.setWaitForTasksToCompleteOnShutdown(true);// 等待所有任务结束的最长时间executor.setAwaitTerminationSeconds(threadAwaitTerminationSeconds);// 执行初始化executor.initialize();log.info("创建一个线程池 threadPoolCorePoolSize is [" + threadPoolCorePoolSize + "] threadPoolMaxPoolSize is ["] threadPoolKeepAliveSeconds is [" + threadPoolKeepAliveSeconds + "].");return executor;
}
关键配置:
等待所有任务结束后再关闭线程池:
executor.setWaitForTasksToCompleteOnShutdown(true)
等待所有任务结束的最长时间:
executor.setAwaitTerminationSeconds(awaitTerminationSeconds)
需要注意的是:要保证异步线程的任务处理完才退出,容器端的
terminationGracePeriodSeconds时间要大于等于awaitTerminationSeconds,这样才能够确保异步线程任务的优雅退出。此外,上述的timeout-per-shutdown-phase时间和异步线程的任务最长时间没冲突。
4、测试结果
为了测试异步线程在发版中是否被中断,我们可以编写一个测试接口来模拟这种情况:
@Autowired
@Qualifier("bossTaskExecutor")
private ThreadPoolTaskExecutor executorService;@ApiOperation(value = "测试异步耗时任务", notes = "测试异步耗时任务")
@GetMapping("/testAsyncTask")
public Response testAsyncTask() throws InterruptedException {executorService.execute(new Runnable() {@SneakyThrows@Overridepublic void run() {for (int i=0;i<=200;i++){Thread.sleep(1000);log.info("testAsyncTask-Thread:"+i);}}});for (int i=0;i<=120;i++){Thread.sleep(1000);log.info("testAsyncTask:"+i);}return Response.ok("200");
}
我们在容器开始部署时调用接口,并通过打印的日志可以观察到异步线程能够处理完,日志打印到了200。然而,在观察容器滚动升级的过程中,我们会发现有一个Pod在Terminating的状态停留了较久时间才退出,这是因为它正在等待异步线程的任务处理完再销毁容器。
4 总结
综上,通过Spring Boot Actuator的优雅配置和健康检查接口,以及配合k8s的就绪检查策略,我们实现了优雅上线。对于优雅下线,我们通过SpringBoot的优雅停机配置和自定义的优雅下线接口,再配合k8s生命周期中的停止前处理,实现微服务的优雅退出。此外,我们还采用了统一的自定义线程池,并配置了线程池优雅退出机制和任务最大结束时间,以确保发版期间能够妥善处理所有异步任务。
通过微服务优雅上下线实践,我们取得了以下成果:
1、最小化服务中断:通过优雅上下线,可以最小化服务中断的时间和影响范围,从而确保服务的可用性和稳定性;
2、数据一致性和完整性:优雅下线可以确保正在处理的请求能够完成,避免数据丢失和请求失败;
3、提升用户体验:优雅上下线可以确保用户在使用服务时不会遇到任何中断或错误,从而提高用户的使用体验和满意度。
本文作者:
蔡冠怡:碧桂园服务后端开发高级工程师
指导人:
余俭:碧桂园服务技术总监
岳黎明:碧桂园服务架构师
黄志鸿:碧桂园服务运维高级工程师
相关文章:
【JAVA】BOSS系统发版艺术:构建高效、优雅的微服务部署策略
在现代软件开发领域,微服务架构与容器化部署已迅速成为行业新趋势。微服务架构通过将应用拆分成多个小型、自治的服务单元,每个服务承担某项特定的业务功能。而容器化部署则以其轻量级和高度可移植的特性,为这些微服务的有效打包、分发和运行…...
React的响应式
在 React 中,useState 是一个 Hook,用于在函数组件中定义和管理状态。 setCount 是由 useState 返回的第二个值,用于更新状态并触发组件重新渲染。它的本质是一个状态更新函数,背后是 React 的状态管理和调度机制。下面是对 setCo…...
deep face cam 部署报错解决
这里写自定义目录标题 使用conda创建py3.9环境使用按照readme.txt安装所有依赖后遇到的报错2.最后一个模块insightface安装报错3.运行run.py又报错原因:解决方法:4.缺少模块解决方法:pip命令安装5.AttributeError: NoneType object has no attribute configure解决方法:安装…...
图像处理基础(4):高斯滤波器详解
本文主要介绍了高斯滤波器的原理及其实现过程 高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的…...
outlook附件限制最大5m如何解决
Outlook 附件大小限制为 5MB,通常由邮件服务器(如 Exchange、Office 365、Gmail 等)或本地 Outlook 配置决定。可以采取以下几种方法来解决该限制问题: 解决方案 1:调整服务器端限制(管理员权限)…...
Word常见问题:嵌入图片无法显示完整
场景:在Word中,嵌入式图片显示不全,一部分图片在文字下方。如: 问题原因:因段落行距导致 方法一 快捷方式 选中图片,通过"ctrl1"快捷调整为1倍行距 方法二 通过工具栏调整 选中图片࿰…...
【面试题】java基础概念
以下是关于这道面试题的回答,包括JDK中一些相关概念的区别以及JIT的原理: JDK中相关概念区别 JDK、JRE和JVM JDK(Java Development Kit):是Java开发工具包,它包含了JRE和一系列开发工具。JDK提供了编译、…...
WebSocket实现私聊私信功能
目录 后端pom.xmlConfig配置类Controller类DTO 前端安装相关依赖websocketService.js接口javascripthtmlCSS 效果展示简单测试连接: 报错解决方法1、vue3 使用SockJS报错 ReferenceError: global is not defined 后面将继续完善,待更新... 后端 pom.xml…...
进程的哪些内存类型容易引起内存泄漏
相信你在平时的工作中,应该遇到过下面这些场景: 伴随着服务器中的后台任务持续地运行,系统中可用内存越来越少; 应用程序正在运行时忽然被 OOM kill 掉了; 进程看起来没有消耗多少内存,但是系统内存就是不够…...
用着很顺手的电脑亮度随心随意调节
一、功能介绍 显示高级设置,可以调节屏幕RGB色彩。 娱乐亮度,一键娱乐亮度调节。 护眼亮度,保护眼睛,减少蓝光。 恢复正常,一键恢复到默认模块。 二、问题解答 1、亮度更改后显示器无变化!软件根本都没…...
图片生成Prompt编写技巧
1. 图片情绪(场景氛围) 一张图片一般都会有一个情绪基调,因为作画本质上也是在传达一些情绪,一般都会借助图片的氛围去转达。例如:比如家庭聚会一般是欢乐、喜乐融融。断壁残垣一般是悲凉。还有萧瑟、孤寂等。 2.补充细…...
博客之星2024年度总评选——我的年度创作回顾与总结
2024年,是我在CSDN博客上持续耕耘、不断成长的一年。在此,与大家分享一下我的年度创作回顾与总结。 一、创作成长与突破 在人工智能领域,技术迭代迅速,知识更新频繁。为了保持自己的竞争力,在今年,我始终…...
前端Vue2项目使用md编辑器
项目中有一个需求,要在前端给用户展示内容,内容有 AI 生成的,返回来的是 md 格式,所以需要给用户展示 md 格式,并且管理端也可以编辑这个 md 格式的文档。 使用组件库 v-md-editor。 https://code-farmer-i.github.i…...
Docker核心命令与Yocto项目的高效应用
随着软件开发逐渐向分布式和容器化方向演进,Docker 已成为主流的容器化技术之一。它通过标准化的环境配置、资源隔离和高效的部署流程,大幅提高了开发和构建效率。Yocto 项目作为嵌入式 Linux 系统构建工具,与 Docker 的结合进一步增强了开发…...
kong 网关和spring cloud gateway网关性能测试对比
该测试只是简单在同一台机器设备对spring cloud gateway网关和kong网关进行对比,受限于笔者所拥有的资源,此处仅做简单评测。 一、使用spring boot 的auth-service作为服务提供者 该服务提供了一个/health接口,接口返回"OK"&…...
DDoS攻击防护能力测试:Python版脚本
引言 在互联网服务日益复杂和流量持续增长的今天,确保服务器能够应对高并发请求并具备良好的抗DDoS攻击的能力至关重要。声明以下代码仅在合法的前提下使用。 工具设计原理 脚本的核心在于它能够创建多个线程来并发执行不同的攻击方法,从而实现对目标…...
白玉微瑕:闲谈 SwiftUI 过渡(Transition)动画的“口是心非”(下)
概述 秃头小码农们都知道,SwiftUI 不仅仅是一个静态 UI 构建框架那么简单,辅以海量默认或自定义的动画和过渡(Transition)特效,我们可以将 App 界面的绚丽升华到极致。 不过,目前 SwiftUI 中的过渡&#x…...
5.4 解锁 OpenAI - Translator:模块设计,构建翻译系统的 “基石”
OpenAI-Translator 模块设计 OpenAI-Translator 作为一款基于 OpenAI GPT 模型的智能翻译助手,其模块设计至关重要。为了保证翻译的高效性、准确性与可扩展性,系统需要一个结构清晰、功能强大的模块化设计。本文将对 OpenAI-Translator 的各个模块进行详细解析,涵盖其核心功…...
数据分析 变异系数
目录 变异系数的应用场景包括: 特点: 注意事项: np.nanvar——方差,np.sanstd标准差 简单来讲就是平均值/标准差 变异系数(Coefficient of Variation, CV)是一种相对量的变异指标,常用于衡…...
C语言——编译与链接
目录 前言 一程序的两种环境 1翻译环境 2执行环境 二预处理 1预处理符号 2#define 2.1#define 定义标识符 2.2#define 定义宏 2.2.1#和## 2.3带副作用的宏参数 2.4宏和函数的比较 2.5命名约定 3#undef 4命令行定义 5条件编译 5.1单分支 5.2多分支 5.3判断是…...
NewStar CTF week1 web wp
谢谢皮蛋 做这题之前需要先去学习一些数据库的知识 1 order by 2 1可以理解为输入的id,是一个占位符,按第二列排序用来测试列数,如果没有两列则会报错-1 union select 1,2 -1同样是占位符,union的作用是将注入语句合并到原始语句…...
Android BitmapShader简洁实现马赛克,Kotlin(一)
Android BitmapShader简洁实现马赛克,Kotlin(一) 这一篇, Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现马赛克效果,Kotlin(3)-CSDN博客 基于PorterDuffXfermode实现马…...
NavVis手持激光扫描帮助舍弗勒快速打造“数字孪生”工厂-沪敖3D
在全球拥有近100家工厂的舍弗勒,从2016年开启数字化运营进程,而当前制造、库存、劳动力和物流的数字化,已无法支持其进一步简化工作流程,亟需数字化物理制造环境,打造“数字孪生”工厂。 NavVis为其提供NavVis VLX 3…...
web服务器 网站部署的架构
WEB服务器工作原理 Web web是WWW(World Wide Web)的简称,基本原理是:请求(客户端)与响应(服务器端)原理,由遍布在互联网中的Web服务器和安装了Web浏览器的计算机组成 客户端发出请求的方式:地址栏请求、超链接请求、表单请求 …...
ecovadis验厂相关要求
EcoVadis验厂的相关要求主要包括以下几个方面: 一、企业基本资质要求 合法注册与运营:企业必须是合法注册并运营的法人实体,具备合法的经营资质,如营业执照、税务登记证等。无严重违法记录:在过去三年内,…...
SSM开发(一)JAVA,javaEE,spring,springmvc,springboot,SSM,SSH等几个概念区别
目录 JAVA 框架 javaEE spring springmvc springboot SSM SSH maven JAVA 一种面向对象、高级编程语言,Python也是高级编程语言;不是框架(框架:一般用于大型复杂需求项目,用于快速开发)具有三大特性,所谓Jav…...
Spring Boot中选择性加载Bean的几种方式
说明:用过Spring框架的都知道其自动装配的特性,本文介绍几种选择性加载Bean的方式。Spring自动装配参考以下两篇文章: 基于SpringBoot的三层架构开发&统一响应结果 SpringBoot自动装配原理简单分析 ConditionalOnProperty Conditiona…...
【JVM】垃圾收集器详解
你将学到 1. Serial 收集器 2. ParNew 收集器 3. Parallel Scavenge 收集器 4. Serial Old 收集器 5. Parallel Old 收集器 6. CMS 收集器 7. G1 收集器 在 Java 中,垃圾回收(GC)是自动管理内存的一个重要机制。HotSpot JVM 提供了多种…...
【实用技能】如何在Stimulsoft产品中使用用户函数,快速创建报表及仪表盘
Stimulsoft Ultimate (原Stimulsoft Reports.Ultimate)是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能,Stimulsoft Ultimate包含了…...
MySQL四种隔离级别
MySQL的隔离级别是在事务这个大主题下面产生的说法。 那么什么是事务,事务就是一组sql语句,要么全部执行成功,要么都不执行,不能只执行成功其中的部分sql。事务的最终目的是为了保证数据库数据的完整性、一致性和可用性。 要保…...
Unity入门1
安装之后无法获得许可证,可以考虑重装 新建项目 单击空白处生成脚本 双击c#文件 会自动打开vstudio 检查引用 如果没有引用,重开vstu,或者重新加载项目 hierarchy层级 scenes场景 assets资产 inspector督察 icon图标 资源链接&…...
qml Loader详解
1、概述 QML Loader是Qt Quick框架中的一个关键元素,它允许开发者动态地加载和卸载QML组件。这种动态加载机制对于提升应用程序的性能、响应速度和用户体验至关重要。通过Loader,应用程序可以在需要时才加载特定的组件,而不是在启动时一次性…...
《安富莱嵌入式周报》第349期:VSCode正式支持Matlab调试,DIY录音室级麦克风,开源流体吊坠,物联网在军工领域的应用,Unicode字符压缩解压
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: 《安富莱嵌入式周报》第349期:VSCode正式支持Matlab调试,DIY录音室级麦克风…...
web端ActiveMq测试工具
如何用vue3创建简单的web端ActiveMq测试工具? 1、复用vue3模板框架 创建main.js,引入APP文件,createApp创建文件,并加载element插件,然后挂载dom节点 2、配置vue.config.js脚本配置 mport { defineConfig } from "vite&qu…...
1561. 你可以获得的最大硬币数目
class Solution:def maxCoins(self, piles: List[int]) -> int:piles.sort()res,n0,len(piles)for i in range(n//3):respiles[n-2-2*i]return res这里如果"你"想要获取最大,那么从最大的开始找 每隔俩算一个最大累计,Bob默认自己从最小那找…...
NIO | 什么是Java中的NIO —— 结合业务场景理解 NIO (二)
实时通信应用 的主流技术 并非NIO , 整理本文的目的是 更好的理解 NIO 。 在现代的 即时聊天应用中,使用 WebSocket、MQTT 或 SignalR 等协议更为普遍。 若您想了解 当前主流的有关 实时通信应用 的技术 , 请移步他文。 (一) 业务场景 实…...
GD32L233RB 驱动数码管
1.数码管有8段A、B、C、D、E、F、G 和 H小数点 以及片选信号(DIG) DIG用来选择那一位,A-G 用来显示段 静态显示每次只能一次显示单个位 动态显示(动态扫描)所有的位显示结束要在10ms左右 显示2ms 消光1ms 实…...
AIGC视频生成模型:Stability AI的SVD(Stable Video Diffusion)模型
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Stability AI的视频生成模型SVD(Stable Video Diffusion)模型,这家公司在图像生成领域富有盛名,开发并维护了知名开源项目SD系列…...
Linux 系统错误处理简介
Linux 系统错误处理简介 1. errno:错误代码的载体2. strerror():错误信息的翻译官3. perror():便捷的错误信息输出4. 系统调用与库函数的区别5. 错误处理的最佳实践 在 C/C 程序开发中,我们经常需要处理各种错误情况 Linux 系统提…...
systemC示例
main.cpp #include <memory> using namespace std; #include "top.h" int sc_main(int i, char *av[]) { // 关闭关于 IEEE 1666 标准中过时特性的警告 sc_report_handler::set_actions("/IEEE_Std_1666/deprecated", SC_DO_NOTHING); cout <…...
C++打字模拟
改进于 文宇炽筱_潜水 c版的打字效果_c自动打字-CSDN博客https://blog.csdn.net/2401_84159494/article/details/141023898?ops_request_misc%257B%2522request%255Fid%2522%253A%25227f97863ddc9d1b2ae9526f45765b1744%2522%252C%2522scm%2522%253A%252220140713.1301023…...
国产低功耗带LCD驱动和触摸按键功能的MCU
以下是国产低功耗、集成LCD驱动和触摸按键功能的MCU精选型号及其核心特性,结合性能、功耗和适用场景进行综合推荐: 1.灵动微MM32L0130系列 257 核心特性:低功耗:待机模式功耗低至100nA,支持多种低功耗模式。 LCD驱动&a…...
在 imx93 平台调试 nau88c10 声卡
一、环境介绍 linux 版本:6.6.52 soc:imx9331 codec:nau88c10 使用的内核文件为 Image,dtb 文件为:imx93-11x11-evk.dtb 二、硬件检查 i2s 信号线要接对 i2c 控制信号建议为 4.7k 上拉 codec 供电可以按参考设计…...
机器学习-分类算法评估标准
一. 准确率 accuracy 将预测结果和测试集的目标值比较,计算预测正确的百分比 准确率越高说明模型效果越好 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier #加载鸢尾花…...
美区TikTok解封后如何回归使用?
随着2025年初美区TikTok解封的消息引起了广泛关注,许多用户纷纷开始重新关注这一全球最受欢迎的短视频平台。在经历了数月的禁用期后,TikTok在美国市场的回归,代表了这一平台的巨大潜力和挑战。从用户的使用习惯,到平台的内容策略…...
行人识别检测数据集,yolo格式,PASICAL VOC XML,COCO JSON,darknet等格式的标注都支持,准确识别率可达99.5%
作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C,go等语言开发经验,mysql,mongo,redis等数据库,设计模…...
grafana + Prometheus + node_exporter搭建监控大屏
本文介绍生产系统监控大屏的搭建,比较实用也是实际应用比较多的方式,希望能够帮助大家对监控系统有一定的认识。 0、规划 grafana主要是展示和报警,Prometheus用于保存监控数据,node_exporter用于实时采集各个应用服务器的事实状…...
【腾讯云】docker创建网络遇到Unable to enable SKIP DNAT rule
docker创建网络遇到Unable to enable SKIP DNAT rule 背景 今天打算在服务器上安装es,但是在创建网络时,提示 Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER…...
DeepSeek R1模型解读与使用
DeepSeek在推出R1预览版两个月后,发布了R1的正式版本,并且开源了模型,开放了API调用。我们直接来解读一下这款模型。 这是官方的性能评测图。从左到右分别是DeepSeek-R1,o1正式版,32B蒸馏版R1,o1-mini&…...
AI新玩法:Flux.1图像生成结合内网穿透远程生图的解决方案
文章目录 前言1. 本地部署ComfyUI2. 下载 Flux.1 模型3. 下载CLIP模型4. 下载 VAE 模型5. 演示文生图6. 公网使用 Flux.1 大模型6.1 创建远程连接公网地址 7. 固定远程访问公网地址 前言 在这个AI技术日新月异的时代,图像生成模型已经成为了创意工作者和开发者手中…...