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

4. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--什么是微服务--微服务设计原则与最佳实践

相比传统的单体应用,微服务架构通过将大型系统拆分成多个独立的小服务,不仅提升了系统的灵活性和扩展性,也带来了许多设计和运维上的挑战。如何在设计和实现微服务的过程中遵循一系列原则和最佳实践,从而构建一个稳定、高效、易维护的系统,成为开发者亟待解决的问题。
本文将从5各方面详细介绍微服务设计中的关键原则和最佳实践:

  1. 服务拆分原则
  2. 服务自治与独立部署的重要性
  3. 数据管理策略与跨服务通信设计方法
  4. 配置管理、容错设计与监控实践
  5. 实际项目中的成功经验与失败教训

通过对这些内容的详细讲解,读者将全面了解微服务架构设计的思路和实施技巧,为构建稳定高效的系统提供坚实的理论和实践依据。

一、 服务拆分原则

1.1 基于业务功能的拆分

在微服务架构中,最核心的设计原则之一就是“按业务功能拆分服务”。这意味着系统的各个模块应该围绕具体的业务功能划分为独立的服务单元。业务功能拆分的目标在于确保每个服务具备单一职责,既专注于解决特定的业务问题,也能独立进行开发、测试、部署和扩展。

  • 单一职责原则
    每个微服务应只负责单一的业务能力,避免服务功能臃肿。如果一个服务承担了过多职责,就会导致代码耦合、测试困难以及部署风险增加。为此在进行业务功能拆分时,必须深入理解业务流程、关键业务实体以及各功能之间的依赖关系,确保每个服务都具备清晰的边界。
  • 领域驱动设计(DDD)
    领域驱动设计是一种以业务领域为核心的设计方法。通过与业务专家紧密合作,使用统一的业务语言来描述业务概念,DDD帮助开发者识别系统中不同的领域模型,并根据领域模型划分服务。例如,一个电商系统可以根据“订单”、“库存”、“支付”、“用户”等领域,将相应功能拆分为独立的微服务。这种方式不仅使得服务之间的职责划分更为清晰,也有助于后续服务的演进和扩展。
1.2 基于团队边界的拆分

除了业务功能,团队的组织结构也是微服务拆分的重要依据。现代软件开发提倡跨职能、自治的小团队,每个团队负责特定业务模块的开发和维护。基于团队边界拆分服务的优势在于:

  • 减少沟通成本
    当服务划分与团队结构一致时,每个团队只需关注自己负责的微服务,团队之间的依赖和沟通成本大大降低。这样可以提高开发效率,减少因为跨团队协调带来的延迟。
  • 提高敏捷性
    自治团队能够独立制定开发计划、选用技术栈以及进行版本管理,使得每个微服务能够根据业务需求快速迭代和上线,满足敏捷开发和持续交付的要求。
  • 边界明确
    当团队边界与服务划分一致时,代码、测试、部署等环节都可以按照团队独立进行,不仅有利于责任明确,也有助于降低服务之间的耦合度。
1.3 基于数据隔离的拆分

数据管理是微服务架构中一个不可忽视的问题。为了保证服务之间的独立性,通常需要对数据进行合理的隔离,即每个微服务拥有自己的数据存储。这种数据隔离的拆分原则有以下优点:

  • 降低耦合度
    当每个服务拥有独立的数据存储时,服务之间的数据依赖和耦合关系大大降低。这样,在对某个服务进行修改或扩展时,不会影响其他服务的数据完整性和一致性。
  • 提升性能与可扩展性
    不同服务的数据存储可以根据各自的业务需求进行独立调优和扩展,避免单一数据库成为性能瓶颈。同时,数据隔离还可以增强安全性,防止不同服务之间的数据泄露和不当访问。
  • 应对分布式事务
    数据隔离有助于解决分布式系统中常见的数据一致性问题。尽管跨服务事务仍然是一个挑战,但通过采用最终一致性、事件溯源(Event Sourcing)等设计模式,可以在一定程度上缓解分布式事务的复杂性。
1.4 服务拆分过程中的权衡

尽管基于业务功能、团队边界和数据隔离的拆分原则为服务拆分提供了指导,但在实际拆分过程中,仍需要权衡以下几个方面:

  • 服务粒度的把握
    服务拆分的粒度既不能过大也不能过小。过大的服务可能重现单体架构的弊端,而过小的服务会导致服务数量激增,增加系统整体的管理和维护成本。合理的服务粒度需要根据实际业务需求、团队能力和系统复杂性来确定。
  • 跨服务依赖与通信成本
    服务拆分后,原本内部调用变为跨服务调用,这会引入网络延迟和额外的通信开销。设计时应考虑如何通过异步通信、消息队列等手段降低跨服务调用的影响,同时设计清晰的接口契约,减少服务间的紧密耦合。
  • 演进和重构
    服务拆分并非一次性完成的任务,而是一个持续演进的过程。在系统不断扩展的过程中,可能需要对服务边界进行重新评估和调整。采用灵活、模块化的设计和良好的版本管理,可以使服务拆分和重构更为顺畅。

二、服务自治与独立部署的重要性

2.1 服务自治的内涵

服务自治是微服务架构的核心原则之一,指的是每个微服务在业务逻辑、数据存储和部署等方面都具有独立性。自治服务能够独立运行,独立演进,并且在出现故障时能够独立隔离和恢复。服务自治主要体现在以下几个方面:

  • 独立开发与演进
    每个微服务由专门的团队负责,可以独立进行开发、测试和发布。这样不仅能够减少团队之间的依赖,也有助于快速响应业务需求和技术变更。
  • 独立运行和扩展
    自治服务拥有独立的运行环境和数据存储,可以根据业务需求独立扩展。比如在高并发场景下,可以仅针对访问量大的服务进行横向扩展,而无需扩展整个系统。
  • 独立故障隔离
    当某个服务出现故障时,其影响仅限于自身,而不会蔓延到整个系统。通过设计良好的服务自治架构,可以实现快速故障隔离和恢复,提高系统的整体可用性。
2.2 独立部署的优势

独立部署是服务自治的重要体现。与单体应用相比,微服务允许每个服务独立部署、独立升级,不同服务之间互不干扰。这种独立部署的模式带来了多方面的优势:

  • 持续集成与持续交付(CI/CD)
    每个服务独立部署后,开发团队可以采用 CI/CD 流水线,实现自动化测试、自动化构建和自动化部署。这样一来每次代码变更都可以快速验证和上线,极大地缩短了产品迭代周期。
  • 快速响应业务需求
    当业务需求发生变化时,开发团队只需对相关的服务进行调整和部署,而无需重构整个系统。独立部署使得系统能够更快适应市场变化,提高业务响应速度。
  • 降低发布风险
    独立部署允许分阶段发布和灰度发布。即使新版本存在问题,也只影响到单个服务,降低了整体系统的风险。通过滚动升级、蓝绿部署等策略,可以进一步保障系统的稳定性和安全性。
2.3 实现服务自治的关键技术

实现服务自治和独立部署需要借助一系列现代化技术和工具,主要包括:

  • 容器化技术
    使用 Docker 等容器化工具,可以将每个微服务打包成独立的容器,确保服务在不同环境中运行的一致性。容器化技术还便于资源隔离和快速部署。
  • 容器编排平台
    如 Kubernetes、Docker Swarm 等容器编排平台,可以自动管理微服务的部署、扩展、监控和故障恢复,进一步实现服务自治和高可用性。
  • 微服务网关
    API 网关作为微服务架构的重要组成部分,既能实现统一路由、身份认证和流量控制,又能屏蔽后端服务的复杂性,提升服务自治的效果。
  • 配置中心
    配置管理工具(如 Spring Cloud Config、Consul 等)使得各个微服务能够集中管理和动态更新配置,进一步降低了系统的耦合度,提高了整体运维效率。
三、数据管理策略与跨服务通信设计方法
3.1 数据管理策略

在微服务架构中,每个服务通常拥有独立的数据存储。这种数据隔离策略有助于保证服务自治性,但同时也带来了数据一致性和跨服务查询等问题。以下是数据管理中的几种策略:

  • 数据库拆分
    根据业务需求,将单体应用中的数据拆分到不同的数据库中。每个微服务使用独立的数据库,可以根据业务特点选择最适合的数据库类型(如关系型数据库、NoSQL 数据库等)。
  • 事件溯源(Event Sourcing)
    通过将所有状态变更记录为不可变的事件,服务可以通过重放事件来重构自身状态。这种模式不仅支持数据审计和追踪,也有助于解决分布式系统中的数据一致性问题。
  • 最终一致性
    在跨服务数据一致性方面,通常采用最终一致性模式。通过异步消息、事件总线等手段,确保各服务间的数据在一定时间内达到一致,而不是强一致性。这样既能保证系统的高可用性,也能有效应对分布式事务问题。
  • 共享数据与数据冗余
    在某些场景下,不同服务可能需要访问公共数据。为避免服务之间直接依赖,可以通过数据复制或数据同步机制,将公共数据冗余到各个服务中,保证服务独立性和数据可用性。
3.2 跨服务通信设计

微服务之间需要通过网络进行通信,这就要求设计高效、可靠的跨服务通信机制。常用的跨服务通信方法包括:

  • 同步通信
    基于 HTTP REST 或 gRPC 的同步通信是最常见的跨服务调用方式。通过定义清晰的 API 接口,服务之间可以直接调用对方提供的功能。同步通信的优势在于简单易用,但缺点是如果某个服务响应缓慢,可能会影响调用链上的其他服务。
  • 异步通信
    为降低服务之间的耦合和提高系统的容错性,异步通信常通过消息队列(如 RabbitMQ、Kafka 等)实现。服务将请求或事件发布到消息队列,由订阅方异步处理。异步通信可以有效缓解瞬时流量高峰,提高系统吞吐量,但需要额外设计消息幂等性和失败重试机制。
  • 服务发现与负载均衡
    跨服务通信通常依赖于服务发现机制,确保调用方能够动态获取目标服务的网络地址。配合负载均衡器,可以将请求均匀分发到各个服务实例,提高系统的响应能力和容错性。常见的服务发现工具有 Consul、Eureka 等,而负载均衡器可以采用 Nginx、Envoy 或者服务网格技术来实现。
  • 契约测试与 API 网关
    为确保跨服务通信接口的稳定性,采用契约测试(Contract Testing)可以在服务发布前验证接口契约的一致性。同时,API 网关作为跨服务调用的入口,既能实现路由转发、限流和安全认证,又能屏蔽后端服务细节,简化跨服务调用的复杂性。
四、配置管理、容错设计与监控实践
4.1 配置管理

在分布式系统中,配置管理是保持系统一致性和灵活性的重要环节。微服务的配置管理需要考虑如下方面:

  • 集中式配置中心
    采用集中式配置管理工具如 Spring Cloud Config、Consul KV、ZooKeeper 等可以统一管理所有微服务的配置信息。这样,当业务需求或环境变化时,只需更新配置中心,服务即可动态加载最新配置,降低手动维护成本。
  • 环境隔离与动态配置
    根据开发、测试、预发布、生产等不同环境,采用不同的配置文件或配置策略,确保每个环境的安全性和稳定性。同时,通过动态配置刷新机制,使得配置变更可以实时生效,保证服务能够及时响应环境变化。
4.2 容错设计

分布式系统必然会面临各种网络故障、服务超时、资源不足等问题,因此,容错设计在微服务架构中至关重要。常用的容错设计方法包括:

  • 断路器模式
    当某个服务出现故障或响应超时时,断路器能够自动断开调用链,防止故障蔓延到其他服务。通过监控请求失败率,断路器可以在必要时打开,隔离故障服务,待服务恢复后再逐步关闭断路器。常见的实现有 Netflix Hystrix 或 Polly 等库。
  • 重试机制
    对于临时性故障,设计合理的重试机制可以有效提高系统的容错性。重试机制通常需要配合指数退避策略,避免重试过于频繁导致系统压力激增。重试逻辑应嵌入到服务调用层,同时结合断路器等措施,防止无限重试。
  • 超时设置与限流
    为防止单个服务调用阻塞整个系统,必须对跨服务调用设置合理的超时时间,并在必要时采用限流措施,确保系统整体的响应能力。限流可以通过令牌桶、漏桶算法等实现,同时也应设计好降级策略,以应对部分服务过载的情况。
  • 降级与熔断
    当某个服务不可用时,通过降级策略为调用方提供默认或缓存数据,保证系统基本功能不受影响。熔断机制与断路器类似,可以在服务恢复后自动恢复正常调用。降级设计需要结合业务实际情况,确保用户体验和系统稳定性之间达到平衡。
4.3 监控与日志实践

在微服务架构中,服务数量众多,分布在多个节点和环境中,传统的监控手段往往难以满足需求。为此,建立完善的监控与日志系统显得尤为重要。

  • 集中式日志管理
    利用 ELK(Elasticsearch、Logstash、Kibana)、EFK(Elasticsearch、Fluentd、Kibana)或 Graylog 等工具,实现各个微服务日志的集中收集和存储。通过集中式日志管理,开发者可以实时查询、分析和追踪系统中的异常情况,快速定位问题根源。
  • 分布式追踪
    采用 Zipkin、Jaeger、SkyWalking 等分布式追踪工具,可以对跨服务调用链进行全面监控。分布式追踪系统能够记录每个请求在各个服务之间的调用轨迹,帮助开发者分析请求延迟、故障节点和性能瓶颈。
  • 实时监控与告警
    利用 Prometheus、Grafana、Zabbix 等监控系统,对微服务的运行状态、资源使用率、响应时间、错误率等关键指标进行实时监控。结合预先设定的告警规则,当指标超过阈值时及时通知运维人员,以便迅速采取措施进行故障处理。
  • 健康检查与自动化恢复
    每个微服务应实现自我检测的健康检查接口,供负载均衡器或容器编排平台使用。当某个服务实例出现异常时,自动将其从服务池中剔除,并触发自动重启或调度新的实例,确保系统整体的高可用性。

五、实际项目中的成功经验与失败教训

在理论指导和最佳实践之上,实际项目中的经验更能揭示微服务架构设计中的潜在问题与解决方案。以下结合多个实际案例,总结一些成功经验与失败教训。

5.1 成功经验
  • 明确服务边界与职责
    某大型互联网项目通过采用领域驱动设计,将整个系统拆分为订单、用户、支付、库存等多个微服务。各服务之间接口清晰、职责单一,极大降低了跨服务耦合,提高了开发效率。该项目在高并发场景下,通过独立扩展热门服务,成功实现了系统弹性伸缩,保证了业务稳定运行。
  • 良好的自动化部署体系
    一家金融科技公司在微服务架构中引入了完善的 CI/CD 流水线,每个服务都经过自动化测试、构建、容器化打包以及 Kubernetes 自动部署。通过自动化流程,该公司实现了每周多次的版本更新,降低了人为部署错误的风险,同时提高了新功能上线的速度。
  • 健全的监控与故障响应机制
    在某电商平台的微服务架构中,通过引入 Prometheus 监控、Grafana 可视化以及分布式追踪系统,实现了对各项关键指标的实时监控。当某个服务响应时间异常或错误率上升时,系统能够自动触发告警,运维人员迅速定位故障原因,并进行修复,从而将故障影响降到最低。
5.2 失败教训
  • 服务拆分过细导致的管理混乱
    在一些项目中,由于追求极致的微服务拆分,服务粒度划分过小,导致服务数量激增,管理和维护工作变得异常复杂。过多的服务不仅增加了跨服务通信的开销,还使得整体系统的监控、日志和故障排查变得十分困难。因此在服务拆分时必须平衡粒度问题,避免为追求纯粹的模块化而牺牲系统整体的可管理性。
  • 缺乏有效的版本管理与契约测试
    某项目在多个团队协同开发时,由于缺乏统一的接口契约和版本管理,导致服务间接口频繁变更,影响了跨服务调用的稳定性。最终,项目不得不投入大量资源进行回滚和修复,严重影响了产品发布进度。
  • 分布式数据一致性问题未得到充分解决
    在一些微服务项目中,各服务独立数据库的设计初衷虽好,但跨服务的数据一致性问题却成为顽疾。由于缺乏有效的异步事件处理和数据同步机制,部分业务场景出现了数据不一致、重复下单等问题,最终迫使团队不得不重新设计数据同步方案。通过这一教训,可以看出在设计数据管理策略时,必须充分考虑分布式事务和数据一致性的平衡,并采用最终一致性、补偿机制等方案予以解决。
    . 总结与展望

六、总结

微服务设计原则与最佳实践涵盖了从系统整体拆分到各个微服务具体实现的各个方面。本文详细讨论了如何基于业务功能、团队边界和数据隔离合理拆分服务;探讨了服务自治和独立部署的重要性;深入解析了数据管理策略与跨服务通信设计的方法;并介绍了配置管理、容错设计与监控实践等关键环节,辅以实际项目中的成功经验和失败教训,为构建稳定高效的微服务系统提供了全面的指导。
在构建微服务架构时,遵循这些设计原则和最佳实践,不仅能提高系统的灵活性和可扩展性,还能显著降低运维和故障恢复的复杂性。面对未来不断变化的业务需求和技术挑战,开发团队需要不断更新知识、总结实践经验,从而打造出更具竞争力和高可靠性的微服务系统。

相关文章:

4. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--什么是微服务--微服务设计原则与最佳实践

相比传统的单体应用,微服务架构通过将大型系统拆分成多个独立的小服务,不仅提升了系统的灵活性和扩展性,也带来了许多设计和运维上的挑战。如何在设计和实现微服务的过程中遵循一系列原则和最佳实践,从而构建一个稳定、高效、易维…...

大语言模型遇上自动驾驶:AsyncDriver如何巧妙解决推理瓶颈?

导读 这篇论文提出了AsyncDriver框架,致力于解决大语言模型在自动驾驶领域应用中的关键挑战。论文的主要创新点在于提出了大语言模型和实时规划器的异步推理机制,实现了在保持性能的同时显著降低计算开销。通过设计场景关联指令特征提取模块和自适应注入…...

第17章 读写锁分离设计模式(Java高并发编程详解:多线程与系统设计)

1.场景描述 对资源的访问一般包括两种类型的动作——读和写(更新、删除、增加等资源会发生变化的动作),如果多个线程在某个时刻都在进行资源的读操作,虽然有资源的竞争,但是这种竞争不足以引起数据不一致的情况发生,那么这个时候…...

硬盘修复后,文件隐身之谜

在数字时代,硬盘作为数据存储的重要载体,承载着无数珍贵的信息与回忆。然而,当硬盘遭遇故障并经过修复后,有时我们会遇到这样一个棘手问题:硬盘修复后,文件却神秘地“隐身”,无法正常显示。这一…...

Ollama+ page Assist或Ollama+AnythingLLM 搭建本地知识库

参考:【AI】10分钟学会如何用RAG投喂数据给你的deepseek本地模型?_哔哩哔哩_bilibili 方法一:Ollama page Assist 本地知识库 ***下方操作比较精简,详情参考:Ollama 部署本地大语言模型-CSDN博客 1.下载Ollama 2.O…...

树莓派5添加摄像头 在C++下调用opencv

由于树莓派5 os系统升级,正常libcamera创建对象每次失败。 改如下方法成功。 1 创建管道 rpicam-vid -t 0 --codec mjpeg -o udp://127.0.0.1:8554 > /dev/null 2>&1 2 opencv从管道里读取 #include <opencv2/opencv.hpp> #include <iostream>int mai…...

redis之RDB持久化过程

redis的rdb持久化过程 流程图就想表达两点&#xff1a; 1.主进程会fork一个子进程&#xff0c;子进程共享主进程内存数据(fork其实是复制页表)&#xff0c;子进程读取数据并写到新的rdb文件&#xff0c;最后替换旧的rdb文件。 2.在持久化过程中主进程接收到用户写操作&#x…...

Linux后台运行进程

linux 后台运行进程&#xff1a;& , nohup-腾讯云开发者社区-腾讯云 进程 &&#xff0c;后台运行&#xff0c;结束终端退出时结束进程。 nohup 进程 &&#xff0c;后台运行&#xff0c;结束终端后依然保持运行。...

webpack配置方式

1. 基本配置文件 (webpack.config.js)&#xff08;导出一个对象&#xff09; 最常见的方式是通过 webpack.config.js 文件来配置 Webpack&#xff0c;导出一个对象。你可以在这个文件中导出一个配置对象&#xff0c;指定入口、输出、加载器、插件等。 // webpack.config.js m…...

123,【7】 buuctf web [极客大挑战 2019]Secret File

进入靶场 太熟悉了&#xff0c;有种回家的感觉 查看源代码&#xff0c;发现一个紫色文件 点下看看 点secret 信息被隐藏了 要么源代码&#xff0c;要么抓包 源代码没有&#xff0c;抓包 自己点击时只能看到1和3处的文件&#xff0c;点击1后直接跳转3&#xff0c;根本不出…...

OSPF基础(2):数据包详解

OSPF数据包(可抓包) OSPF报文直接封装在IP报文中&#xff0c;协议号89 头部数据包内容&#xff1a; 版本(Version):对于OSPFv2&#xff0c;该字段值恒为2(使用在IPV4中)&#xff1b;对于OSPFv3&#xff0c;该字段值恒为3(使用在IPV6中)。类型(Message Type):该OSPF报文的类型。…...

Vue 入门到实战 八

第8章 组合API与响应性 目录 8.1 响应性 8.1.1 什么是响应性 8.1.2 响应性原理 8.2 为什么使用组合API 8.3 setup组件选项 8.3.1 setup函数的参数 8.3.2 setup函数的返回值 8.3.3 使用ref创建响应式引用 8.3.4 setup内部调用生命周期钩子函数 8.4 提供/注入 8.4.1 …...

【学习总结|DAY036】Vue工程化+ElementPlus

引言 在前端开发领域&#xff0c;Vue 作为一款流行的 JavaScript 框架&#xff0c;结合 ElementPlus 组件库&#xff0c;为开发者提供了强大的构建用户界面的能力。本文将结合学习内容&#xff0c;详细介绍 Vue 工程化开发流程以及 ElementPlus 的使用&#xff0c;助力开发者快…...

HTML之CSS三大选择器

HTML之CSS三大选择器 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><st…...

理解链接:加载二进制动态库

理解链接&#xff1a;加载二进制动态库 文章目录 理解链接&#xff1a;加载二进制动态库前情提要基本方式1 - 显式连接 dlopen基本方式 2 - 隐式链接 compile link ld衍生方式 3 - 弱链接 weak linking衍生方式 4 - dlmopen 加载到独立命名空间调试所有符号 补充知识1. 动态库…...

ASP.NET Core中Filter与Middleware的区别

中间件是ASP.NET Core这个基础提供的功能&#xff0c;而Filter是ASP.NET Core MVC中提供的功能。ASP.NET Core MVC是由MVC中间件提供的框架&#xff0c;而Filter属于MVC中间件提供的功能。 区别 中间件可以处理所有的请求&#xff0c;而Filter只能处理对控制器的请求&#x…...

《语义捕捉全解析:从“我爱自然语言处理”到嵌入向量的全过程》

首先讲在前面&#xff0c;介绍一些背景 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合了信息检索与语言生成模型的技术&#xff0c;通过从外部知识库中检索相关信息&#xff0c;并将其作为提示输入给大型语言模型&#xff…...

大规模多准则决策模型构建详细方案

第二阶段&#xff1a;大规模多准则决策模型构建详细方案 目标 基于消费者群体偏好和个体交互数据&#xff0c;构建动态、可扩展的多准则决策模型&#xff0c;实现实时个性化产品排序。 一、技术架构设计 1. 系统架构图 [用户交互层] → (React前端) ↓ [API服务层] → (…...

Rust 语言:变革关键任务软件的新力量

软件无处不在&#xff0c;从手表、烤箱、汽车&#xff0c;甚至可能是牙刷中都有它的身影。更重要的是&#xff0c;软件控制着关乎生死的系统&#xff0c;如飞机、医疗设备、电网系统和银行基础设施等。如果软件工程师稍有疏忽&#xff0c;软件缺陷和漏洞可能导致数十亿美元的损…...

Linux特权组全解析:识别GID带来的权限提升风险

组ID&#xff08;Group ID&#xff0c;简称 GID&#xff09;是Linux系统中用来标识不同用户组的唯一数字标识符。每个用户组都有一个对应的 GID&#xff0c;通过 GID&#xff0c;系统能够区分并管理不同的用户组。 在Linux系统中&#xff0c;系统用户和组的配置文件通常包括以…...

安卓/ios脚本开发按键精灵经验小分享

1. 程序的切换 我们经常碰到这样的需求&#xff1a;打开最近的应用列表&#xff0c;选取我们想要的程序。但是每个手机为了自己的风格&#xff0c;样式都有区别&#xff0c;甚至连列表的滑动方向都不一样&#xff0c;我们很难通过模拟操作来识别点击&#xff0c;那么我们做的只…...

机器学习在癌症分子亚型分类中的应用

学习笔记&#xff1a;机器学习在癌症分子亚型分类中的应用——Cancer Cell 研究解析 1. 文章基本信息 标题&#xff1a;Classification of non-TCGA cancer samples to TCGA molecular subtypes using machine learning发表期刊&#xff1a;Cancer Cell发表时间&#xff1a;20…...

DeepSeek本地部署保姆级教程

由于DeepSeek近期遭受攻击&#xff0c;又加上用户访问量较大&#xff0c;导致总是服务不可用&#xff0c;让人十分窝火。有没有好的解决办法呢&#xff1f;答案是自己在电脑端部署一套&#xff0c;这样就不用和别人抢着用了。另外本地部署的好处还有保护隐私与减少延迟。 如果…...

无惧户外复杂环境,安科瑞 AKH-0.66/K-HW 开口式互感器准确测流

​安科瑞 吕梦怡 18706162527 1.产品特点 AKH-0.66/K-HW 系列互感器具有防水功能&#xff0c;可在户外使用&#xff0c;切面端口采用橡胶垫环绕可有效阻止雨水进入。互感器采用注塑技术&#xff0c;将互感器线圈直接在模具中进行注塑&#xff0c;同时二次侧引线采用防水端子…...

玩转Docker | 使用Docker部署httpd服务

玩转Docker | 使用Docker部署httpd服务 前言一、准备工作环境确认检查操作系统准备网站目录和配置文件二、拉取httpd镜像三、运行httpd容器运行容器命令检查容器状态四、验证httpd服务浏览器访问测试错误排查五、容器管理与维护查看容器状态停止和启动容器更新网站内容和配置六…...

MacOS 安装NVM

MacOS 安装NVM 方法一&#xff1a;使用Homebrew安装nvm 打开终端&#xff08;Terminal&#xff09;&#xff0c;输入以下命令安装Homebrew&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装nvm…...

Qt 数据库SQLite 使用【01】基本功能

1.开发背景 Qt 开发过程中难免需要存储数据&#xff0c;可以选择保存到本地文件&#xff0c;但是查找比较麻烦&#xff0c;所以就有了数据库&#xff0c;主要是方便查找数据&#xff0c;增删改查等操作&#xff0c;而 SqLite 属于数据库中轻量级的存在&#xff0c;适合本地数据…...

http状态码:请说说 503 Service Unavailable(服务不可用)的原因以及排查问题的思路

503 Service Unavailable&#xff08;服务不可用&#xff09; 是一种HTTP状态码&#xff0c;表示服务器当前无法处理请求&#xff0c;通常是由于临时性原因导致服务中断。以下是它的常见原因和排查思路&#xff1a; 一、503错误的常见原因 1. 服务器过载 场景&#xff1a;服务…...

58页PPT学习华为面向业务价值的数据治理实践

目录 1. 正文解读... 1 2. 华为数据质量管控的质量度量框架是怎样的?... 2 3. 如何在企业中实施类似华为的数据质量管控...

电脑开机提示按f1原因分析及终极解决方法来了

经常有网友问到一个问题&#xff0c;我电脑开机后提示按f1怎么解决&#xff1f;不管理是台式电脑&#xff0c;还是笔记本&#xff0c;都有可能会遇到开机需要按F1&#xff0c;才能进入系统的问题&#xff0c;引起这个问题的原因比较多&#xff0c;今天小编在这里给大家列举了比…...

DeepSeek模型构建与训练

在完成数据预处理之后,下一步就是构建和训练深度学习模型。DeepSeek提供了简洁而强大的API,使得模型构建和训练变得非常直观。无论是简单的全连接网络,还是复杂的卷积神经网络(CNN)或循环神经网络(RNN),DeepSeek都能轻松应对。本文将带你一步步构建一个深度学习模型,并…...

ProxySQL实现mysql8主从同步读写分离

一、ProxySQL基本介绍 ProxySQL是 MySQL 的高性能、高可用性、协议感知代理。 简单介绍下ProxySQL及其功能和配置&#xff0c;主要包括&#xff1a; 最基本的读/写分离&#xff0c;且方式有多种&#xff1b;可定制基于用户、基于schema、基于语句的规则对SQL语句进行路由&…...

Day38-【13003】短文,树的基本概念,用广义表表示树

文章目录 第五章 树与二叉树第一节 树的基本概念用广义表&#xff0c;也就是集合表示发&#xff0c;来表示树 第五章 树与二叉树 第一节 树的基本概念 因为树是一种层次结构&#xff0c;所以它是一种非线性结构&#xff0c;在实际应用中具有广泛的用途。 日常生活中&#xff…...

LabVIEW与PLC交互

一、写法 写命令立即读出 写命令后立即读出&#xff0c;在同一时间不能有多个地方写入&#xff0c;因此需要在整个写入后读出过程加锁 项目中会存在多个循环并行执行该VI&#xff0c;轮询PLC指令 在锁内耗时&#xff0c;就是TCP读写的实际耗时为5-8ms&#xff0c;在主VI六个…...

MySQL第四次作业

新建数据库 新建表 student表 2.course表 3.sc表 修改Student 表中年龄(sage)字段属性&#xff0c;数据类型由int 改变为smallint alter table student modify sage smallint; 为Course表中Cno 课程号字段设置索引&#xff0c;并查看索引 create index index_cno on cou…...

栈和队列的实现(C语言)

1&#xff1a;栈 1&#xff1a;概念和结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只运行在固定的一段进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守先进后出的原则。 压栈&#xff1a;在栈里面插入…...

(四)QT——QMainWindow——界面菜单设计

目录 前言 QMainWindow 结构 菜单栏 工具栏 状态栏 停靠部件 核心部件 UI 文件创建窗口 总结 前言 QMainWindow 是 Qt 框架中的一个类&#xff0c;主要用于创建桌面应用程序的主窗口。它提供了一个标准的窗口布局&#xff0c;包含菜单、工具栏、状态栏和中心小部件等功…...

MySQL InnoDB引擎 脏读、不可重复读和幻读

在 MySQL 的 InnoDB 存储引擎中&#xff0c;脏读、不可重复读和幻读是并发事务操作时可能出现的数据不一致问题&#xff0c;不同的事务隔离级别对这些问题有不同的处理方式。 1、脏读&#xff08;Dirty Read&#xff09; 定义&#xff1a;一个尚未提交的数据变更的事务&#…...

初阶数据结构:树---堆

目录 一、树的概念 二、树的构成 &#xff08;一&#xff09;、树的基本组成成分 &#xff08;二&#xff09;、树的实现方法 三、树的特殊结构------二叉树 &#xff08;一&#xff09;、二叉树的概念 &#xff08;二&#xff09;、二叉树的性质 &#xff08;三&#…...

判断192.168.1.0/24网络中,当前在线的ip有哪些

需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 [rootopenEuler ~]# cat 1.sh #!/bin/bash for ip in $(seq 1 254); do ping -c 1 -W 1 "192.168.1.$ip" > /dev/null 2>&1 if [ $? …...

初始JavaEE篇 —— Spring Web MVC入门(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 RequestMappingg 注解介绍 Postman的介绍与使用 PostMapping 与 GetMapping 注解 构造并接收请求 接收简单参数 接收对象…...

STM32的HAL库开发-通用定时器输入捕获实验

一、通用定时器输入捕获部分框图介绍 1、捕获/比较通道的输入部分(通道1) 首先设置 TIM_CCMR1的CC1S[1:0]位&#xff0c;设置成01&#xff0c;那么IC1来自于TI1&#xff0c;也就是说连接到TI1FP1上边。设置成10&#xff0c;那个IC1来自于TI2&#xff0c;连接到TI2FP1上。设置成…...

nodejs:express + js-mdict 网页查询英汉词典,能播放.spx 声音

向 DeepSeek R1 提问&#xff1a; 我想写一个Web 前端网页&#xff0c;后台用 nodejs js-mdict , 实现在线查询英语单词&#xff0c;并能播放.spx 声音文件 1. 项目结构 首先&#xff0c;创建一个项目目录&#xff0c;结构如下&#xff1a; mydict-app/ ├── public/ │ …...

【蓝桥杯嵌入式】5_PWM

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、PWM占空比可调 以往届的赛题举例 将PA6、PA7分别设置为TIM16_CH1和TIM17_CH1 打开TIM16和TIM17&#xff0c;并设置PWM输出模式及其频率 设置占空比初…...

ESM-IF1:从AF2的预测结构中学习逆折叠

作者研究了从蛋白质骨干原子坐标预测蛋白质序列的问题。迄今为止&#xff0c;机器学习解决此问题的方法一直受限于可用的实验测定蛋白质结构的数量。作者使用AlphaFold2为1200万个蛋白质序列预测的结构&#xff0c;从而将训练数据扩充了近三个数量级。相比现有方法&#xff0c;…...

kafka服务端之控制器

文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controler&#xff09;&#xff0c;它负责管理整个集群中所有分区和副本的状态。…...

Redis双写一致性(数据库与redis数据一致性)

一 什么是双写一致性&#xff1f; 当修改了数据库&#xff08;MySQL&#xff09;中的数据&#xff0c;也要同时更新缓存&#xff08;redis&#xff09;中的数据&#xff0c;缓存中的数据要和数据库中的数据保持一致 双写一致性&#xff0c;根据业务对时间上的要求&#xff0c;…...

feign Api接口中注解问题:not annotated with HTTP method type (ex. GET, POST)

Bug Description 在调用Feign api时&#xff0c;出现如下异常&#xff1a; java.lang.IllegalStateException: Method PayFeignSentinelApi#getPayByOrderNo(String) not annotated with HTTPReproduciton Steps 1.启动nacos-pay-provider服务&#xff0c;并启动nacos-pay-c…...

开源2+1链动模式AI智能名片S2B2C商城小程序:突破流量与创意困境的新路径

摘要&#xff1a;本文深入剖析当前互联网行业中流量集中于巨头以及创意边际效应递减的困境&#xff0c;并探讨开源21链动模式AI智能名片S2B2C商城小程序在应对这些困境时所展现的独特优势与应用策略。通过对行业现状的分析以及该小程序功能特点的研究&#xff0c;旨在为企业在艰…...

python编程-内置函数compile(),exec(),complex(),eval()详解

1. compile() 函数 ‌用途‌&#xff1a;将一个字符串源代码编译为字节码对象&#xff0c;这样可以直接被Python解释器执行&#xff0c;或者通过exec()或eval()函数来执行。 ‌参数‌&#xff1a; source&#xff1a;一个字符串或AST&#xff08;抽象语法树&#xff09;对象&am…...