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

19.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--当前项目拆分规划

随着业务规模的不断扩大和系统复杂度的提升,孢子记账系统需要进行微服务架构的转型。本文将详细规划从单体应用向微服务架构迁移的具体方案,包括功能模块分析、服务拆分、技术选型以及实施步骤等内容。通过合理的服务拆分和架构设计,未来我们将构建一个更加灵活、可扩展的系统架构。

一、现有功能分析

1.1 分析方法

为了准确识别系统中的功能模块,我们采用了以下三种分析方法:

  1. 代码结构分析:通过分析项目代码组织结构和命名空间
  2. 数据库表结构分析:通过分析数据库表之间的关联关系
  3. 业务功能梳理:通过分析业务流程和功能依赖关系
1.2 分析过程
  1. 首先分析系统的基础架构层,识别出系统管理相关的功能模块
  2. 然后分析核心业务层,识别出账务相关的功能模块
  3. 最后分析支撑功能层,识别出货币汇率和报表相关的功能模块
1.3 分析结果

系统在表现层采用RESTful API设计风格,通过Controllers层处理所有HTTP请求,并实现了统一的响应格式和基于角色的权限控制机制。在业务层,系统通过Server.Interface定义业务接口,并在Server命名空间下实现具体业务逻辑,采用依赖注入模式实现松耦合。数据访问层使用Entity Framework Core作为ORM框架,通过统一的SporeAccountingDBContext管理数据库操作,支持MySQL数据库。

系统的主要业务功能围绕账务管理展开,包括账本管理、收支记录管理、收支分类管理和预算管理。账本管理支持创建、查询、修改和删除账本;收支记录管理支持记录、查询、修改和删除收支;收支分类管理采用树形结构,支持分类的增删改查和层级控制;预算管理支持设置预算、查看预算使用情况和调整预算。此外,系统还提供货币汇率管理功能,包括货币信息维护、汇率记录和汇率转换。报表管理功能支持报表生成、查询和日志记录,系统配置功能支持用户配置和系统参数配置。

在数据库设计方面,系统采用关系型数据库设计,主要包含用户权限、账务核心、货币汇率、系统配置和报表等五大类数据表。用户权限相关表包括SysUser、SysRole、SysUrl和SysRoleUrl,实现了用户-角色-权限的完整权限管理体系。账务核心表包括AccountBook、IncomeExpenditureRecord、IncomeExpenditureClassification和Budget,构成了系统的核心业务数据。货币汇率相关表包括Currency和ExchangeRateRecord,支持多币种记账和汇率转换。系统配置表Config用于存储用户配置信息,报表相关表Report和ReportLog用于记录报表生成历史。

根据上述分析,系统主要包含以下核心功能模块:

模块名称功能
系统管理模块用户管理
角色管理
权限管理
系统配置
账务核心模块账本管理
收支记录
收支分类
预算管理
货币与汇率模块货币管理
汇率记录
报表模块报表生成
报表日志
1.4 模块依赖分析

核心业务模块之间存在明确的依赖关系:用户服务依赖角色服务,收支记录依赖账本和分类,预算依赖收支分类,报表依赖收支记录。外部依赖包括MySQL数据库、RabbitMQ消息队列和JWT认证服务。系统配置包括数据库连接配置、JWT配置和消息队列配置,这些配置通过appsettings.json文件统一管理。

二、微服务拆分

根据前面的分析,我们将服务拆分为五大模块:身份认证服务、账务核心服务、货币汇率服务、报表服务以及配置服务。以下是这五大服务的具体职责、核心实体以及与其他服务的依赖关系,后续我们将按照这五大模块来重构目前的系统。

服务名称职责核心实体依赖关系
身份认证服务
(Identity Service)
• 用户认证与授权
• 用户信息管理
• 角色权限管理
• SysUser
• SysRole
• SysUrl
• SysRoleUrl
• 被其他所有服务依赖
• 独立的用户数据库
账务核心服务
(Accounting Core Service)
• 账本管理
• 收支记录管理
• 收支分类管理
• 预算管理
• AccountBook
• IncomeExpenditureRecord
• IncomeExpenditureClassification
• Budget
• 依赖身份认证服务
• 依赖货币汇率服务
货币汇率服务
(Currency Service)
• 货币信息管理
• 汇率管理
• 汇率转换计算
• Currency
• ExchangeRateRecord
• 依赖身份认证服务
• 需要对接外部汇率API
报表服务
(Report Service)
• 报表生成
• 报表存储
• 报表查询
• Report
• ReportLog
• 依赖身份认证服务
• 依赖账务核心服务
• 依赖货币汇率服务
配置服务
(Configuration Service)
• 系统配置管理
• 配置项统一维护
• Config
• ConfigTypeEnum
• 依赖身份认证服务
• 被其他服务依赖

三、 使用技术

在进行微服务拆分时,我们需要选择合适的技术栈来支撑整个系统的运行。以下是针对服务通信、数据存储和部署等方面的技术选型。

3.1 服务间通信

在服务间通信方面,我们将采用RESTful API作为主要的通信方式,通过HTTP/HTTPS协议实现服务之间的数据交换。RESTful API具有良好的可读性和自描述性,能够支持多种数据格式如JSON、XML等,便于不同服务之间的集成。同时,我们将在服务内部实现统一的API版本控制机制,确保API的向后兼容性。

对于需要异步处理的场景,我们将引入RabbitMQ消息队列系统,通过发布-订阅模式处理服务间的异步通信需求。RabbitMQ具有高可靠性和灵活的消息路由能力,可以有效解耦服务间的依赖关系,提高系统的可扩展性。

在整个微服务架构中,我们将实现基于Ocelot的API网关,统一管理所有服务的入口。API网关将负责请求路由、负载均衡、认证授权、限流熔断等功能,同时提供API聚合能力,减少客户端与后端服务的直接通信次数。此外,我们还将在API网关层面实现统一的日志记录、监控指标收集和调用链路追踪,为系统运维和问题排查提供支持。通过这种方式,我们可以构建一个稳定、高效、可扩展的服务间通信体系。

3.2 数据库策略

在数据库策略方面,我们将采用数据库分离的方案,为每个微服务配置独立的数据库实例。这种方式可以确保服务之间的数据隔离,避免数据耦合,同时也能让各个服务根据自身的数据访问特点选择最适合的数据库类型。

对于身份认证服务,由于需要处理用户信息、角色权限等结构化数据,我们选择使用MySQL等关系型数据库,这类数据库在处理事务性操作和复杂查询方面表现出色。

报表服务则考虑使用MongoDB等文档数据库,因为报表数据通常包含大量非结构化或半结构化信息,文档数据库在处理这类数据时具有更好的灵活性和查询性能。

对于配置服务,我们计划使用Redis等键值存储数据库,这类数据库具有极快的读写速度和简单的数据结构,非常适合存储系统配置信息。

账务核心服务和货币汇率服务仍然使用关系型数据库,因为这些服务需要处理大量的事务性操作和复杂的数据关系。

通过选择合适的数据库类型,我们可以充分发挥每个服务的性能优势,同时也为未来的扩展提供更大的灵活性。此外,我们还将实施完善的数据备份和恢复策略,确保数据的安全性和可靠性。

3.3 部署建议

在部署方面,我们将采用基于Docker的容器化部署方案,通过容器技术实现服务的标准化封装和快速部署。每个微服务都会被打包成独立的Docker镜像,包含运行时环境和应用程序代码,确保了环境的一致性和可移植性。我们将使用Docker Compose来编排多个容器的运行,实现服务之间的联动部署。

同时,为了更好地管理服务实例,我们将引入Nacos作为服务注册与发现中心,所有微服务在启动时都会向Nacos注册自己的服务信息,包括服务名称、IP地址、端口等,其他服务可以通过Nacos发现和访问目标服务。

在配置管理方面,我们选择使用Nacos配置中心,实现配置的统一管理和动态更新。Nacos支持配置的版本管理、灰度发布和权限控制,能够有效降低配置管理的复杂度。

为了实现统一的日志管理,我们将部署ELK(Elasticsearch、Logstash、Kibana)日志收集系统。所有微服务的日志都会被收集到Elasticsearch中集中存储,通过Kibana提供的可视化界面,运维人员可以方便地查看和分析系统日志,快速定位问题。

这套完整的部署方案将为整个微服务架构提供稳定可靠的运行环境,同时也为后续的扩展和维护提供了良好的基础支持。

四、 拆分步骤建议

在进行微服务拆分时,我们需要遵循一定的顺序和策略,以确保整个拆分过程的平稳进行。首先,我们将从身份认证服务开始拆分,因为这是整个系统的基础设施。身份认证服务负责用户认证、授权以及用户信息管理,其他所有服务都需要依赖它来实现用户身份验证。在这个阶段,我们需要将现有的用户管理相关代码迁移到新的服务中,同时确保JWT token的生成和验证机制能够正常工作。

第二步是拆分配置服务。配置服务作为系统的中枢神经,为其他所有服务提供配置管理支持。我们需要将分散在各个模块中的配置项统一迁移到配置服务中,实现配置的集中管理和动态更新。这包括数据库连接字符串、第三方服务配置、系统参数等各类配置信息。同时,我们还需要实现配置的版本控制和环境隔离,确保不同环境下的配置能够正确加载。

第三步将进行货币汇率服务的拆分。这是一个相对独立的功能模块,主要负责货币信息管理和汇率转换计算。由于该服务的功能相对独立,且与其他业务模块的耦合度较低,因此适合在这个阶段进行拆分。我们需要设计合理的汇率数据更新机制,并确保汇率转换的准确性。同时,还需要考虑如何优化汇率数据的缓存策略,以提高系统性能。

第四步是拆分账务核心服务,这是整个系统最核心的业务模块。该服务包含账本管理、收支记录管理、收支分类管理以及预算管理等核心功能。在拆分过程中,我们需要特别注意数据一致性的问题,确保在服务拆分过程中不会影响用户的正常使用。同时,我们还需要设计合理的数据迁移方案,并进行充分的测试验证。

最后一步是拆分报表服务。报表服务依赖于账务核心服务和货币汇率服务的数据,因此放在最后进行拆分是最合适的。在这个阶段,我们需要重点关注数据聚合的性能优化,因为报表服务需要处理大量的数据统计和分析工作。同时,我们还需要设计合理的报表缓存机制,避免频繁进行大量的数据计算,提高系统的响应速度。在实现过程中,我们可以考虑采用异步处理的方式,将耗时的报表生成任务放到后台进行处理。

五、非业务功能

在微服务架构转型过程中,数据一致性问题是首要需要关注的风险点。由于系统被拆分成多个独立的服务,每个服务都维护着自己的数据库,这就可能导致数据同步不及时或数据不一致的情况。例如,在账务核心服务中进行收支记录的同时,可能需要同步更新报表服务中的统计数据,如果这个过程中出现网络故障或服务宕机,就可能造成数据不一致。为了解决这个问题,我们需要实现可靠的数据同步机制,采用最终一致性策略,并建立完善的数据校验和修复机制。

服务间通信延迟是另一个重要的风险因素。在微服务架构中,原本系统内部的方法调用变成了跨网络的服务调用,这不可避免地会增加系统的响应时间。特别是在某些业务流程需要调用多个服务时,延迟会进一步累积。例如,生成一份完整的财务报表可能需要依次调用账务核心服务、货币汇率服务等多个服务,如果不做优化,可能会导致用户体验下降。我们需要通过合理的服务调用设计、数据缓存策略和异步处理机制来降低通信延迟带来的影响。

分布式事务处理是微服务架构中最具挑战性的问题之一。在单体应用中,我们可以依赖数据库的事务机制来保证数据的一致性,但在微服务架构中,由于涉及多个独立的数据库,传统的ACID事务已经无法满足需求。例如,当用户进行一笔跨币种的收支记录时,需要同时在账务核心服务中记录收支信息,并在货币汇率服务中记录汇率使用记录,这就形成了一个跨服务的事务场景。我们需要采用补偿事务(Saga)模式或最终一致性等分布式事务解决方案来处理这类问题。

随着服务数量的增加,服务之间的依赖关系会变得越来越复杂。每个服务都可能依赖多个其他服务,形成复杂的依赖网络。这种复杂的依赖关系不仅增加了系统的维护难度,还可能导致服务调用链路过长,影响系统性能。例如,报表服务依赖于账务核心服务和货币汇率服务,如果这些被依赖的服务又依赖其他服务,就可能形成较深的调用链。我们需要通过合理的服务设计和依赖管理来控制服务间的依赖复杂度。

运维复杂度的提升是微服务架构转型过程中不可避免的挑战。相比单体应用,微服务架构需要管理更多的服务实例、数据库实例和网络连接。这不仅增加了部署和维护的工作量,还提高了问题排查的难度。例如,当系统出现异常时,需要分析多个服务的日志才能定位问题根源;服务的更新和升级也需要考虑多个服务之间的兼容性。我们需要建立完善的监控告警系统、自动化部署流程和服务治理机制来应对这些挑战。

我们需要实现一个统一的监控系统,用于全面监控微服务架构的运行状态。这个监控系统将集成Prometheus和Grafana,实时收集各个服务的性能指标、资源使用情况和业务指标。通过Prometheus,我们可以收集服务的CPU使用率、内存占用、请求响应时间、错误率等关键指标;而Grafana则提供直观的可视化界面,帮助运维人员快速发现和定位问题。同时,我们还将实现自定义的业务监控指标,如数据提交成功率、用户活跃度等,为业务决策提供数据支持。监控系统还需要配置合理的告警规则,当发现异常情况时能够及时通知相关人员。

为了提高系统的可用性和稳定性,我们将建立完善的服务降级和熔断机制。当检测到某个服务出现故障或响应时间异常时,自动触发服务降级,返回默认值或缓存数据,避免故障扩散。例如,当货币汇率服务无法访问时,系统可以使用缓存的汇率数据继续提供服务。同时,我们还需要实现优雅的服务降级策略,在非核心功能出现问题时,确保核心业务流程不受影响。此外,还要建立完善的熔断恢复机制,当服务恢复正常后能够自动恢复正常调用。

然后,我们将制定详细的API文档和版本控制策略。使用Swagger或OpenAPI规范编写API文档,详细描述每个接口的请求参数、响应格式、错误码等信息。在版本控制方面,我们将采用语义化版本号(Semantic Versioning)规范,明确定义API的主版本、次版本和修订版本。对于不兼容的API变更,必须升级主版本号;对于向后兼容的功能新增,升级次版本号;对于bug修复,升级修订版本号。同时,我们还需要维护API的变更日志,记录每个版本的变更内容,并制定合理的API废弃策略。

同时,建立完整的微服务测试策略至关重要。我们将实施多层次的测试方案,包括单元测试、集成测试、契约测试和端到端测试。单元测试确保各个服务的核心逻辑正确性;集成测试验证服务间的交互是否符合预期;契约测试确保服务间的接口协议一致性;端到端测试验证整个业务流程的正确性。我们将使用xUnit作为单元测试框架,WireMock模拟外部服务依赖,Pact进行契约测试,Selenium执行端到端测试。同时,我们还需要在CI/CD流程中集成自动化测试,确保每次代码变更都经过完整的测试验证。

最后,我们需要规划合理的数据备份和恢复方案,确保系统数据的安全性和可靠性。针对不同类型的数据库,采用不同的备份策略:关系型数据库采用全量备份加增量备份的方式,每天进行一次全量备份,每小时进行增量备份;MongoDB采用副本集机制,确保数据的多副本存储;Redis采用主从复制和AOF持久化机制。所有备份数据都需要进行加密存储,并定期转移到异地备份系统。

六、总结

我们制定了从身份认证服务开始,依次拆分配置服务、货币汇率服务、账务核心服务到报表服务的渐进式迁移策略。同时,我们也充分考虑了数据一致性、服务通信延迟、分布式事务等技术挑战,并通过监控系统、服务降级机制、API版本控制等手段来保障系统的可用性和可维护性。这套完整的规划方案将指导我们有序地完成微服务架构转型,构建一个更具扩展性和弹性的系统。

相关文章:

19.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--当前项目拆分规划

随着业务规模的不断扩大和系统复杂度的提升,孢子记账系统需要进行微服务架构的转型。本文将详细规划从单体应用向微服务架构迁移的具体方案,包括功能模块分析、服务拆分、技术选型以及实施步骤等内容。通过合理的服务拆分和架构设计,未来我们…...

JFLAP SOFTWARE 编译原理用(自动机绘图)

csdn全是蛆虫,2mb的软件,都在那里搞收费,我就看不惯,我就放出来,那咋了!!! https://pan.baidu.com/s/1IuEfHScynjCCUF5ScF26KA 通过网盘分享的文件:JFLAP7.1.jar 链接: h…...

从 Vue 到 React:React 合成事件

目录 一、什么是 React 合成事件?二、处理流程React 事件系统的大致流程和 Vue 3 的区别 三、用法示例四、SyntheticEvent 的特点五、为什么 React 要统一事件到根节点?1.减少事件监听器数量2. 简化事件解绑逻辑3. 保证一致的行为 六、React 18 后事件系…...

react的fiber 用法

在 React 里,Fiber 是 React 16.x 及后续版本采用的协调算法,它把渲染工作分割成多个小任务,让 React 可以在渲染过程中暂停、恢复和复用任务,以此提升渲染性能与响应能力。在实际开发中,你无需直接操作 Fiber 节点&am…...

深度学习-学习笔记

文章目录 1、概述2、学习笔记2.1、pytorch 的环境配置 1、概述 本篇博客用来记录我学习深度学习的学习笔记 参考视频:PyTorch深度学习快速入门教程 PyTorch 是一个开源的机器学习框架,主要用于构建和训练深度学习模型。 2、学习笔记 2.1、pytorch 的环…...

[创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论

前言: 人、财、物、信息、机制、流程、制度、方法共同组合了一个持续的消耗资源、持续的价值创造、持续面临生存与发展、遗传与变异的社会性生命系统。 "人"是所有社会性生命系统最最基础性的要素,它弥漫在系统中多维立体空间的不同节点上&am…...

Redis常见面试题——List对象

当然可以!这里我帮你整理了一份【Redis中 List 结构】相关的高频面试题,并附上简明回答: 📚 Redis List 结构面试题(高频总结版) 1. Redis 中的 List 是什么?底层是什么实现的? 答&…...

案例速成GO操作redis,个人笔记

更多个人笔记:(仅供参考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note 安装redis客户端:go get github.com/redis/go-redis/v9 注意go …...

什么是WebSocket?NGINX如何支持WebSocket协议?

大家好,我是锋哥。今天分享关于【什么是WebSocket?NGINX如何支持WebSocket协议?】面试题。希望对大家有帮助; 什么是WebSocket?NGINX如何支持WebSocket协议? 1000道 互联网大厂Java工程师 精选面试题-Java…...

ssm驾校预约管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 伴随着我国社会的发展,人民生活质量日益提高。在人们出行方式上的体现就是,价格较为昂贵的代步工具——汽车,它的拥有率在我国越来越高了。而汽车的行驶速度很快,并且随着汽车拥有率的增加,城市中行驶和停靠的车…...

babel核心知识点

Babel 是一个 JavaScript 编译器,主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript 代码,以便在旧版本的浏览器或环境中运行。以下是 Babel 的核心知识点: 1. 基本概念 编译器:Babel 本质上是一个编译器&…...

学习笔记(算法学习+Maven)

单调队列优化多重背包 #include <bits/stdc.h> using namespace std; const int M 2010; const int N 20010; int q[N]; int hh 0, tt -1; int f[N]; int g[N]; int v[M], w[M], s[M]; int n, m; int main() { cin >> n >> m; for (int i 1; …...

买币永续合约成全球交易热点,XBIT去中心化交易所平台显著提升市场流动性

在全球加密货币市场日益扩大的背景下&#xff0c;买币永续合约正展现出惊人的增长势头。虽然比特币自2021年黄金时期以来整体兴趣有所减弱&#xff0c;但永续合约市场表现亮眼&#xff0c;专业和机构交易者正从传统日历期货转向这一领域&#xff0c;使得永续合约占据了约66%的未…...

详解 `from datasets import load_dataset`:数据格式、公开数据集与自定义数据集实战指南

在自然语言处理(NLP)和机器学习领域,Hugging Face 的 datasets 库凭借其高效的数据加载和预处理能力成为开发者必备工具。本文通过代码示例详解 load_dataset 的核心用法,涵盖数据格式解析、公开数据集调用和自定义数据集构建。 一、数据格式解析与加载示例 datasets 库支…...

Eclipse 插件开发 1

Eclipse 插件开发 1 1 创建 Eclipse 插件2 特点对比表3 总结对比表 Eclipse 是一个功能强大的集成开发环境(IDE)&#xff0c;最初为 Java 开发设计&#xff0c;但现在已经支持多种语言和平台。它的核心优势在于高度可扩展的插件架构&#xff0c;使开发者能够定制开发环境以满足…...

单链表专题(1)

1.什么是链表&#xff1f; 链表是结构体变量与结构体变量连接在一起 2.动态创建一个链表 动态内存申请模块化设计 1.创建链表&#xff08;创建一个表头表示整个链表&#xff09; 2.创建结点 3.插入结点 4.删除结点 5.打印遍历链表&#xff08;测试&#xff09; 3.创建链…...

[贪心_8] 跳跃游戏 | 单调递增的数字 | 坏了的计算器

目录 1.跳跃游戏 题解 2.单调递增的数字 证明 3.坏了的计算器 题解 解法一&#xff1a;正向推导 解法二&#xff1a;正难则反 1.跳跃游戏 链接&#xff1a; 55. 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你…...

Python基于Django的全国二手房可视化分析系统【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

Spring Boot 升级指南(2.x → 3.x)

&#x1f680; Spring Boot 升级指南&#xff08;2.x → 3.x&#xff09; &#x1f522; 1️⃣ 必读文档 &#x1f4d8; 当您需要从 Spring Boot 2.x 升级时&#xff1a; • 官方迁移指南 → https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-…...

基于亚马逊云科技构建音频转文本无服务器应用程序

Amazon Transcribe是一项基于机器学习模型自动将语音转换为文本的服务。它提供了多种可以提高文本转录准确性的功能&#xff0c;例如语言自定义、内容过滤、多通道音频分析和说话人语音分割。Amazon Transcribe 可用作独立的转录服务&#xff0c;也可以集成到应用程序中提供语音…...

io_uring概述:现代 Linux 异步 IO 的新范式

一、引言 在 Linux 系统中&#xff0c;I/O 性能一直是高性能服务器、数据库、存储系统的关键瓶颈。传统的 I/O 接口&#xff08;如 read、write、poll、epoll&#xff09;已经难以满足现代高吞吐低延迟场景的需求。io_uring 的诞生&#xff0c;正是为了解决这些传统 I/O 模型中…...

定制一款国密浏览器(12):分析SM2签名算法的实现

SM2 是一种非对称加密算法,除了用来进行加密解密外,主要作用还用作数字签名。数字签名是私钥签名,公钥用来验签。由于私钥是不公开的,所以私钥签名还可以防抵赖。 一般的签名流程如下: 发送者对消息计算摘要值。发送者用私钥对摘要值进行签名得到签名值。发送者将原始消息…...

SSE协议

目录 SSE协议协议实现传输格式data 字段id 字段event 字段retry 字段 前后端实现使用案例FastAPI SSE-STARLETTE 模拟大模型推理流&#x1f5a5; 代码&#xff1a;FastAPI SSE-STARLETTE 模拟大模型推理流 SSE协议 SSE&#xff0c;全称是 Server-Sent Events&#xff0c;是一…...

精益数据分析(25/126):关键指标驱动业务发展

精益数据分析&#xff08;25/126&#xff09;&#xff1a;关键指标驱动业务发展 在创业和数据分析的道路上&#xff0c;我们都在不断探索如何利用数据实现业务的增长与优化。今天&#xff0c;让我们一起深入学习《精益数据分析》中的关键知识点&#xff0c;通过实际案例来理解…...

基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API

前言 Spring AI Alibaba 开源项目基于 Spring AI 构建&#xff0c;是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践&#xff0c;提供高层次的 AI API 抽象与云原生基础设施集成方案&#xff0c;帮助开发者快速构建 AI 应用。 项目地址 gitcode平台&#xff1a;ht…...

git 工具

Git教程 Git Bash详细教程 Git教程 Git Bash详细教程-CSDN博客 Download – TortoiseGit – Windows Shell Interface to Git...

利用【指针引用】对【非空单循环链表】进行删除操作

【非空单循环链表】是链式存储结构的其中一种&#xff0c;下面是各个词汇的意思&#xff1a; 先说【单】的意思&#xff1a; 这里指的是【单循环】的&#xff0c;另外在别的地方你会碰到一些不一样的循环链表&#xff0c;比如说是【多重链】的。 单循环 【单循环链表】常在表的…...

2025.4.26_STM32_SPI

1.SPI简介 2.硬件电路 所有SPI设备的SCK(时钟)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)分别连在一起。SCK线只能被主机控制&#xff0c;和I2C相同。 主机另外引出多条SS控制线&#xff0c;分别接到各从机的SS引脚 (SS不用的时候为高电平&#xff0c;当主机需要选中某…...

基于OpenMV+STM32+OLED与YOLOv11+PaddleOCR的嵌入式车牌识别系统开发笔记

基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记 基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记系统架构全景 一、实物演示二、OpenMV端设计要点1. 硬件配置优化2. 智能帧率控制算法3. 数据传输协议设计 三、PyTorch后端核心实现&#xff1a;YOLOv11与PaddleOCR的…...

当JIT遇见K8s

目录 一、技术融合背景&#xff1a;从静态架构到动态生态的范式重构 1.1 动态编译技术的三次进化浪潮 1.2 容器编排系统的动态特性解剖 弹性伸缩的数学建模 服务质量&#xff08;QoS&#xff09;的编译场景适配 硬件拓扑感知的编译优化 二、关键技术挑战与突破性解决方案…...

单片机-89C51部分:4、固件烧录

飞书文档https://x509p6c8to.feishu.cn/wiki/M00gwFX3WilLe0kiAmBcPBUsnLc 接线 通过USB线把开发板和电脑连接起来&#xff0c;如果电脑没有安装过USB转串口驱动&#xff0c;在设备管理器中就找不到COM口&#xff0c;而且会有驱动提示叹号&#xff0c;我们可以下载下方驱动安…...

7.13 GitHub Sentinel全链路测试实战:自动化框架+零误差传输,QPS提升6倍!

GitHub Sentinel全链路测试实战:自动化框架+零误差传输,QPS提升6倍 GitHub Sentinel Agent 用户界面设计与实现 关键词:前后端联调测试、数据传输验证、接口稳定性测试、命令行工具测试、自动化测试框架 测试前后端功能与数据传输稳定性 1. 全链路测试策略设计 采用分层…...

stm32之EXIT外部中断详解

目录 1.引入: STM32F1031.1 中断路径上的3个部件1.2 STM32F103的GPIO中断1.1.1 GPIO控制器 -- AFIO1.1.2 EXTI1.1.3 NVIC1.1.4 CPU1. PRIMASK2. FAULTMASK3. BASEPRI 1.3 中断执行流程 2.旋转编码器介绍3.实验3.1 EXIT3.1.1 结构体3.1.2 函数 3.2 NVIC3.2.1 结构体3.2.2 函数 3…...

STM32 开发 - stm32f10x.h 头文件(内存映射、寄存器结构体与宏、寄存器位定义、实现点灯案例)

概述 STM32F10x.h 是 STM32F1 系列微控制器的核心头文件&#xff0c;提供了所有外设寄存器的定义和内存映射 一、内存映射 #define PERIPH_BASE ((uint32_t)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE 0x…...

UniApp 的现状与 WASM 支持的迫切性

一、UniApp 的跨平台优势与性能瓶颈 UniApp 凭借“一次开发&#xff0c;多端发布”的核心理念&#xff0c;已成为跨平台开发的主流框架之一。然而&#xff0c;随着移动应用场景的复杂化&#xff08;如 3D 渲染、音视频处理、AI 推理&#xff09;&#xff0c;传统的 JavaScript…...

Prometheus、Zabbix和Nagios针对100个节点的部署设计架构图

一、Prometheus 架构图(联邦集群+分布式存储) graph TD;subgraph 全局监控层GlobalProm[Prometheus Server] -->|联邦查询| RegionalProm1[区域Prometheus]GlobalProm -->|联邦查询| RegionalProm2[区域Prometheus]GlobalProm -->|联邦查询| RegionalProm3[区域Pro…...

坚果派已适配的鸿蒙版flutter库【持续更新】

坚果派已适配的鸿蒙版flutter库 序号原仓版本适配仓文章解读是否完成1https://pub.dev/packages/fluttertoast8.2.12https://gitcode.com/nutpi/FlutterToasthttps://www.nutpi.net/thread?topicId1575是2https://pub.dev/packages/flutter_udid4.0.0https://gitcode.com/nut…...

代码随想录打卡|Day28 动态规划(理论基础、斐波那契数列、爬楼梯、使用最小花费爬楼梯)

动态规划 Part01 理论基础 代码随想录讲解链接 视频讲解链接 斐波那契数 力扣题目链接 代码随想录链接 视频讲解链接 题目描述&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一…...

《USB技术应用与开发》第四讲:实现USB鼠标

一、标准鼠标分析 1.1简介 1.2页面显示 其中页面显示的“”不用管它&#xff0c;因为鼠标作为物理抓包&#xff0c;里面有时候会抓到一些错误&#xff0c;不一定是真正的通讯错误&#xff0c;很可能是本身线路接触质量不好等原因才打印出来的“”。 1.3按下鼠标左键 &#x…...

elk中kibana一直处于可用和降级之间且es群集状态并没有问题的解决方法

前言 在公司部elk的时候发现kibana的web界面一直很卡&#xff0c;数据量为0也会很卡&#xff0c;es群集状态正常&#xff0c;资源足够。 报错信息 [2025-03-17T09:54:50.19400:00][INFO ][status] Kibana is now available (was degraded) [2025-03-17T09:55:03.28000:00][I…...

2025.4.26总结

今天把马良老师的《职场十二法则》看完后&#xff0c;感触极大&#xff0c;这们课程就是一场职场启蒙课。 虽然看过不少关于职场的书籍&#xff0c;但大多数是关于职场进阶&#xff0c;方法方面的。并没有解答“面对未来二三十年的职场生涯&#xff0c;我该怎么去看待自己的工…...

一、UI自动化测试01--认识和元素定位方法

目录 一、自动化测试1. 自动化应用场景2. ⾃动化测试的优缺点3. ⾃动化测试的分类 二、UI ⾃动测试1. 适合使用的项目2. 实现时机3. 常⻅的UI⾃动化测试⼯具4. Selenium 框架5. Web ⾃动化环境部署6. Web ⾃动化基本代码 二、元素定位1. 浏览器开发者⼯具⽅法1: 直接获取信息⽅…...

目标检测原理简介

目标检测是一类计算机视觉任务,简单来说,目标检测可被定义为在计算机中输入一张图像,计算机需要找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,如图一所示。目标检测是计算机视觉领域的核心问题之一,相较于最原始的将整张图片分类为某一类别,目标检测不光可…...

软件设计原则

开闭原则 对扩展开放&#xff0c;对修改关闭。在程序需要进行拓展的时候&#xff0c;不能去修改原有的代码&#xff0c;实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#xff0c;易于维护和升级。 想要达到这样的效果&#xff0c;需要使用接口和抽象类。 因…...

Postman脚本处理各种数据的变量

一、变量是字符串里列表&#xff0c; 如 "["100","101","102","103","108"]" //把字符串的变量处理成列表 var myListJSON.parse(pm.environment.get(giftTabId)) #giftTabId变量名 //设置随机取值 var rando…...

嵌入式硬件开发工具---万用表---示波器---仿真器

万用表 主要功能&#xff1a; 测量交直流电压、电流 测量电阻、二级管及电路通断 其他----电容、频率、温度----特殊的万用表 * 检查电路是否正常 * 检查电路连接情况 示波器 主要功能&#xff1a; 以波形展示电信号随时间变化的关系 主要指标&#xff1a; 带宽---大…...

数据预处理之特征选择 (Feature Selection)

哈喽&#xff0c;大家好&#xff0c;我是我不是小upper~ 今天的文章和大家来聊聊数据与处理方法中常用的特征选择 在开始说特征选择前&#xff0c;咱们先搞清楚这个所谓的“特征”到底是啥玩意儿。 打个比方说&#xff0c;如果我们要训练一个模型来判断某个人是否会买一双运…...

Java基础 — 循环

介绍 Java基础循环是程序流程控制的核心结构&#xff0c;主要用于重复执行特定代码块。常见的循环包括for、while和do-while三种形式&#xff0c;开发者可根据不同场景灵活选择。 合理使用循环关键字能有效提升代码执行效率。掌握循环结构的核心在于理解执行流程与条件判断的时…...

参考平面的宽度-信号与电源完整性分析

参考平面的宽度: 计算特征阻抗时假设参考平面是无限宽的平面。在参考平面的宽度远大于线宽或介质厚度时&#xff0c;这种假设是正确的。但是PCB板上的参考平面经常被反焊盘掏空&#xff0c;当互连线经过参考平面掏空区域附近时&#xff0c;掏空的局部互连线参考平面变窄&#x…...

【Linux】Centos7 安装 Docker 详细教程

一、安装步骤 步骤一&#xff1a;确定你是Centos7及以上的版本 cat /etc/redhat-release 步骤二&#xff1a;卸载旧版本 查看官方文档&#xff1a;CentOS | Docker Docs 步骤三&#xff1a;安装GCC等工具 1.首先确保 CentOS7 能上外网 ping www.baidu.com 2.更新 Centos7…...