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

微服务系统记录

  记录下曾经工作涉及到微服务的相关知识。


1. 架构设计与服务划分

关键内容

  • 领域驱动设计(DDD):
    利用领域模型和限界上下文(Bounded Context)拆分业务,明确服务边界。通过事件风暴(Event Storming)和领域建模会议来确定哪些功能拆分为独立服务,从而降低耦合度。
  • 服务粒度设计:
    根据业务逻辑及团队能力,确定是细粒度服务(每个服务关注单一功能)还是粗粒度服务(划分相对较大业务模块),并关注未来的服务通信、数据一致性和维护问题。

常用方法和工具

  • 建模工具:
    • UML、PlantUML (类似)
    • 在线工具如 Lucidchart、Draw.io (类似)
  • 方法论:
    • 领域驱动设计(DDD)
    • 事件风暴(Event Storming)

2. API 网关

关键内容

API 网关充当客户端与后端服务之间的唯一入口,负责请求路由、协议转换、认证鉴权、负载均衡、限流、日志采集及监控等任务。它能简化客户端对多个服务的直接调用,同时可进行请求聚合,隐藏后端复杂度。

常用开源产品

  • Kong: 基于 NGINX 的网关,扩展性好,支持插件机制。
  • NGINX / NGINX Plus: 高效、成熟,适于高并发场景,支持丰富的负载均衡算法。
  • Envoy: 现代化的边缘和服务代理,拥有高性能的 L7 功能、服务发现与监控集成。
  • APISIX: Apache 旗下产品,采用 OpenResty 构建,灵活扩展。
  • Zuul(Netflix开发): Java 生态内较为流行,但在多语言环境下可能需要特殊适配。

3. 服务注册与发现

关键内容

在微服务大规模运作过程中,服务实例经常动态上线和下线。服务注册中心负责存储和管理这些实例信息,并为消费者提供可用服务信息。需要自动健康检查和故障剔除,确保调用到的是健康的服务。

常用开源产品

  • Eureka: Netflix 开源产品,专注于服务注册与发现;适合与 Java 生态结合。
  • Consul: HashiCorp 提供的解决方案,除了服务发现,还提供 KV 存储、健康检查及多数据中心支持。
  • Nacos: 阿里巴巴出品,支持服务发现、配置管理与动态 DNS。
  • etcd: CoreOS 提供的分布式键值存储,提供 Watch、Leader 选举等功能,常用于 Kubernetes 内部服务发现。
  • Zookeeper: Apache 提供的分布式协调服务,也经常用于服务注册、配置管理和分布式锁等场景。

4. 配置中心

关键内容

配置中心用于管理和下发系统中全局或服务的配置参数,避免硬编码。其特点在于支持动态更新、灰度发布、版本控制以及多环境(开发、测试、生产)配置隔离管理,从而降低运维风险。

常用开源产品

  • Apollo: 携程开源,功能完备,支持动态推送、灰度升级、版本回滚及权限管理。
  • Nacos: 配置管理与服务发现一体,界面友好,易于上手。
  • etcd: 虽然主要是 KV 存储,但通过 Watch 机制可实现动态配置更新,适合轻量级方案。
  • Consul: 除了服务注册与健康检查,也可以作为配置中心使用。
  • Zookeeper: 用于分布式协调,其数据节点模型可用于保存配置信息,但使用上较为繁琐。

5. 服务间通信与 API 调用

关键内容

微服务之间通常需要进行同步或异步调用,核心要求在于高性能、低延迟、易扩展和跨语言支持。

同步通信:

  • HTTP/REST:
    简单易理解,适合轻量级接口调用,广泛使用 JSON 或 XML 数据格式。
    • 常用工具:Spring Boot(Java)、Express(Node.js)、Flask(Python)等,也适用于 C++ 通过 RESTful 封装调用。
  • RPC 框架:
    采用二进制协议提高性能,减少通信延迟。
    • gRPC(Google): 基于 Protocol Buffers,支持多语言。
    • bRPC(百度): 针对高性能场景设计,适用于 C++ 和其他语言。
    • Thrift(Apache): 跨语言且灵活,可选择的协议和传输层。

异步通信:

  • 消息队列与事件总线:
    用于解耦服务和实现异步流程处理,支持高并发和可靠消息传递。
    • Kafka: 高吞吐、低延迟的分布式消息系统。
    • RabbitMQ: 丰富的消息协议支持,稳定可靠。
    • Pulsar/ActiveMQ/NSQ: 各具特色,适配不同场景需求。

6. 数据存储与数据库设计

关键内容

  • 数据库拆分原则:
    每个服务最好拥有自己的数据存储,避免跨服务直接共享数据库,实现数据隔离和自治。
  • 数据一致性问题:
    分布式事务、最终一致性以及相应的数据同步补偿机制。

常用数据库及方案:

  • 关系型数据库:
    • MySQL、PostgreSQL、MariaDB:常用且成熟,适合大部分业务场景。
  • NoSQL 数据库:
    • MongoDB: 文档存储,模型自由灵活。
    • Cassandra: 高可扩展性,适合分布式写入场景。
    • Redis: 适用于缓存、会话管理、分布式锁等场景。
  • 搜索引擎:
    • Elasticsearch: 全文检索和大数据日志分析。
  • 分布式事务解决方案:
    • Saga 模式、TCC(Try-Confirm-Cancel)、Outbox Pattern 等。

7. 消息队列与事件驱动架构

关键内容

通过消息队列可以实现服务解耦、异步处理和事件驱动架构。消息系统用于缓解流量峰值,并且通过合理设计消息幂等性和重试机制,确保服务健壮性。

常用开源产品

  • Kafka: 主打高吞吐量和分布式部署,适合日志、实时数据流的处理。
  • RabbitMQ: 功能成熟,支持丰富协议(如 AMQP)。
  • ActiveMQ: Apache 生态产品,适用于中小规模场景。
  • Pulsar: 新兴消息系统,提供分区、订阅等特性。
  • NSQ: 轻量级设计,易于快速部署和使用。

8. 日志收集、监控与分布式追踪

关键内容

  • 日志收集:
    各服务的日志需要统一格式化后集中收集,便于后续分析和故障排查。
  • 系统监控:
    实时监控系统及业务指标,将异常指标及时告警。
  • 分布式追踪:
    跨服务调用链追踪,帮助定位性能瓶颈和故障根源。

常用工具和开源产品

  • 日志系统:
    • ELK Stack:
      • Elasticsearch: 存储和查询日志
      • Logstash/Fluentd: 日志收集和处理
      • Kibana: 可视化查询和面板展示
    • EFK Stack: Elasticsearch + Fluentd + Kibana
  • 监控系统:
    • Prometheus + Grafana: Prometheus 负责指标采集、告警;Grafana 用于数据可视化。
    • Zabbix、Nagios: 适合基础设施和非云原生监控。
  • 分布式追踪:
    • Jaeger、Zipkin: 开源追踪系统,帮助重现调用链和分析性能。
    • SkyWalking: 强大的服务治理与追踪工具,同时支持监控与告警等功能。

9. 熔断、限流与容错治理

关键内容

通过熔断、降级和限流来防止因某个服务故障而引发系统级雪崩故障。主要技术手段是实时监控接口请求、设置阈值以及提供降级策略,确保在异常或超载情况下服务依然能够稳定运行。

常用开源产品与技术

  • Hystrix: Netflix 开源熔断器(目前社区多在维护),用于实现熔断、隔离和降级。
  • Sentinel: 阿里巴巴推出,除了熔断外还具备流量控制、降级和系统保护能力。
  • Resilience4j: 针对 Java 生态中的轻量级容错库,提供熔断、限流、重试、缓存等功能。
  • Rate Limiter: 各语言生态都有相应实现,比如令牌桶算法(Token Bucket)或漏桶算法(Leaky Bucket)。

10. 部署、容器化与自动化运维

关键内容

现代微服务系统强调持续交付和自动化运维,保证在环境隔离、快速部署与动态扩容之间能够高效转换。

常用技术与开源产品

  • 容器化:
    • Docker: 封装应用及其依赖,确保各环境一致性。
  • 容器编排:
    • Kubernetes: 容器集群管理、自动伸缩、滚动升级、故障自愈。
    • Docker Swarm/Mesos: 适用于小规模或特定场景,提供基础容器调度功能。
  • 持续集成/持续部署(CI/CD):
    • Jenkins、GitLab CI/CD、Argo CD、Spinnaker: 实现代码构建、测试、镜像构建以及最终部署。
  • 基础运维工具:
    • Ansible、Chef、Puppet: 自动化配置管理与部署工具。
    • Prometheus、Grafana、ELK: 监控、日志搜集与可视化运维平台。

11. 安全与权限管理

关键内容

确保系统在用户访问及服务间调用时能够满足安全要求,从认证、授权到数据传输加密,都需要有完善的安全设计。

常用技术与开源产品

  • 认证与授权:
    • OAuth2 / OpenID Connect: 标准化的认证协议与授权框架。
    • JWT(JSON Web Token): 用于安全传递认证信息,无状态、安全高效。
  • 加密传输:
    • HTTPS/TLS: 确保数据传输加密;
    • mTLS(双向 TLS): 在服务间通信中确保双方的身份验证。
  • 密钥管理与审计:
    • HashiCorp Vault: 安全存储密钥、证书和敏感配置,细粒度权限控制。
    • 云供应商 KMS(如 AWS KMS、Azure Key Vault、Google Cloud KMS): 提供平台级密钥管理和加密服务。

12. 服务治理与运维管理

关键内容

服务治理关注的是整个微服务生态系统的健康,包括流量调度、自动重试、灰度发布、版本兼容和健康监控。其目标在于实现系统动态自愈和按需扩展,同时保证升级过程中的风险控制。

常用技术与开源产品

  • 服务网格:
    • Istio: 提供流量管理、安全策略、故障注入、监控和分布式追踪的侧车代理方案。
    • Linkerd: 轻量级服务网格,侧重于简单和性能。
  • 灰度发布与版本控制:
    • Kubernetes 原生功能: 如 Liveness/Readiness Probes、Rolling Updates。
    • Spinnaker: 支持蓝绿发布、金丝雀发布等复杂部署策略。
  • 健康检查与自动预警:
    • 内置的 Kubernetes 健康检测;
    • 与 Prometheus、Grafana、AlertManager 等监控产品协同使用,实现全链路监控和实时告警。

13. 文档与协作

关键内容

  • 知识共享与系统归档:
    对于一个庞大的微服务系统,各项目间的技术文档、API 规范、系统架构图及部署流程必须做到实时更新,这不仅便于团队内部的知识共享,也能帮助新成员快速上手。

  • 跨团队协作:
    在多团队、多模块开发环境中,协作工具可以帮助统一需求讨论、任务分配、代码审查及版本管理,确保项目进展透明且高效。

  • 版本控制与持续更新:
    文档需要有版本历史记录,并能与代码仓库关联,形成完整的系统演进轨迹。

常用开源产品与工具

  • API 文档与设计:

    • Swagger/OpenAPI: 生成接口文档,支持自动化测试。
    • Redoc: 基于 OpenAPI 规范生成美观的 API 文档。
    • Postman: 用于 API 测试和文档管理。
  • 知识库与协作文档:

    • Confluence: Atlassian 出品,适合企业级知识管理与协作。
    • GitBook: 开源的文档管理系统,便于轻量级文档的协作。
    • Notion、MediaWiki: 用于构建团队知识库,支持多种格式文档编辑。
  • 项目管理与代码协作:

    • Jira/Trello/Asana: 管理任务、需求及问题跟踪。
    • Git (GitHub/GitLab/Bitbucket): 版本控制、代码审查和协作开发的核心平台。
    • Slack/Microsoft Teams/DingTalk: 实时沟通与协作工具,有助于快速讨论问题和共享信息。

应用场景

  • 系统架构及接口规范文档: 为各微服务建立详细架构图、使用流程图以及 API 协议说明文档,确保团队理解一致。
  • 运维与故障应急手册: 记录系统部署、配置变更、故障处理步骤与联系方式,形成操作标准化流程。
  • 开发协同: 通过任务管理及代码仓库集成,管理从需求到部署的整个开发周期,提高协作效率并减少沟通成本。

14. 故障恢复与高可用

关键内容

  • 容错设计与冗余:
    高可用系统设计要求在单点故障时其他组件或节点能够接管工作,保证服务不中断。

    • 冗余部署: 在不同节点或数据中心部署多个服务副本,确保单点故障时系统能够自动切换。
    • 健康检查与自愈: 定期检测各服务状态,一旦发现异常自动重启或剔除故障实例。
  • 自动化故障恢复:
    通过监控、报警和自动化运维工具,实现故障检测、告警、自动重试与快速恢复,并配合灾备计划搭建容灾架构。

    • 熔断降级: 利用熔断器防止错误向下游传播,同时提供降级策略。
    • 数据备份与恢复: 定期对数据库及关键信息进行备份,并形成及时恢复方案。
  • 混沌工程(Chaos Engineering):
    通过故意引入故障,验证系统在极端条件下的鲁棒性和自动恢复能力,如 Chaos Monkey。

常用开源产品与技术

  • 负载均衡与冗余:

    • NGINX/HAProxy: 作为反向代理和负载均衡器分发流量,支持故障检测。
    • Kubernetes 集群: 其内置的副本控制(ReplicaSet)和自动重启机制(Liveness/Readiness Probes)帮助保证服务健康。
  • 故障恢复组件:

    • Hystrix / Sentinel / Resilience4j: 实现熔断、限流、自动重试及降级策略,防止雪崩效应。
    • Service Mesh(Istio、Linkerd): 通过侧车代理管理服务流量、故障注入和恢复,提供全链路监控和流量控制。
  • 监控报警与自动化修复:

    • Prometheus + Grafana: 监控服务运行状态、资源使用和关键指标,结合 AlertManager 及时告警。
    • ELK/EFK Stack: 收集并分析日志,帮助快速锁定故障根因。
    • Chaos Monkey 等混沌测试工具: 针对云环境故障恢复能力做持续测试,验证系统的高可用性。
  • 数据备份与灾备:

    • 数据库集群与复制: MySQL 的主从复制、PostgreSQL 的高可用方案(如 Patroni)、以及 NoSQL 数据库的分布式部署。
    • 容灾方案: 使用云服务提供商的灾备工具(如 AWS RDS 的自动快照、跨区域部署)实现数据与服务备份。

应用场景

  • 自动故障检测与恢复: 在监控平台中设定合理的告警阈值与自动重启策略,确保出现问题时,系统自动将流量引导至健康节点。
  • 灾难恢复规划: 建立全面灾备体系,包括业务的多活部署、跨区域数据同步及自动故障转移方案。
  • 混沌实验: 定期通过混沌测试,检测系统在极端条件下的表现,持续改进故障恢复策略,提高系统韧性。

15. 持续集成与持续部署(CI/CD)

关键内容

  • 持续集成(CI):
    指通过自动化构建和测试,让开发者频繁地将代码集成到共享代码库,尽早发现问题。一个完善的 CI 流程应包括代码拉取、编译、静态代码分析、单元测试、集成测试以及打包过程。

    • 代码质量: 自动化静态检查(如代码风格、漏洞扫描)确保代码符合团队标准。
    • 自动化测试: 在提交代码时自动运行单元测试和部分集成测试,快速反馈问题,减少人工检查成本。
    • 版本管理: 经常打标签(Tag),保持版本清晰明了,便于追踪代码变化。
  • 持续部署(CD):
    在 CI 流程基础上,通过自动化部署机制,把经过测试验证的代码交付到测试、预发布乃至生产环境。这样不仅加快版本发布速度,还能降低人为干预出错的风险。

    • 自动化部署: 利用部署流水线将容器镜像、应用包等自动发布到各环境。
    • 滚动升级与回滚: 提供蓝绿部署、金丝雀发布等策略,保障版本发布过程中风险最小化;当更新失败时,可快速回退。
    • GitOps 思想: 利用 Git 作为真理源,通过工具(如 Argo CD 或 Spinnaker)来管理部署状态,实现声明式运维。

常用技术与开源产品

  • CI 工具:

    • Jenkins: 开源且高度定制,通过插件生态支持各类构建、测试、部署需求。
    • GitLab CI/CD: 集成于版本库平台,配置简洁且和 Git 流程无缝衔接。
    • CircleCI / Travis CI: 云端服务,适合快速启动自动化流水线。
  • CD 工具:

    • Argo CD: 针对 Kubernetes 环境的 GitOps 工具,自动对齐集群状态。
    • Spinnaker: 支持多云环境的持续交付平台,提供蓝绿、金丝雀等发布策略。
    • Flux: 另一款 GitOps 工具,适用于声明式部署管理。
  • 其他辅助工具:

    • SonarQube: 静态代码分析与代码质量管理。
    • Docker Registry: 用于存储和分发容器镜像,可以选择 Docker Hub 或私有 Registry。

应用场景

  • 每次代码提交后,自动进行构建、测试、打包并生成新的 Docker 镜像;
  • 在合并合并分支后,自动触发部署流水线,先部署到测试环境经全面验证,再逐步推送到生产环境;
  • 借助 GitOps 工具,实现代码变更与集群状态自动同步,能够在配置有误或服务异常时迅速发觉并回滚。

16. 测试

关键内容

测试是确保系统质量、提前捕获缺陷的重要环节。在微服务架构中,由于服务之间高度协作,测试策略需要覆盖单元级别、服务集成、端到端以及性能等多个层次

测试层次与策略

  1. 单元测试:

    • 目的: 验证单个模块或函数的逻辑正确性。
    • 常用工具/框架:
      • C++: Google Test、Catch2
      • Java: JUnit、TestNG、Mockito(用于单元测试中的 Mock)
      • Python: PyTest、unittest
    • 实践: 每个服务或模块代码均应配有覆盖主要业务逻辑的单元测试,通过持续集成自动执行测试用例。
  2. 集成测试:

    • 目的: 检测不同模块或服务间接口是否正确交互、数据格式是否一致。
    • 常用工具/框架:
      • 使用 Docker Compose、TestContainers 等技术构建独立测试环境;
      • 针对 RESTful 接口可用 Postman 或 REST Assured 进行自动化测试;
      • RPC 服务可以使用专门模拟服务或通过 stubbing 来验证交互逻辑。
    • 实践: 编写集成测试脚本,启动部分或全部依赖服务的测试环境,保证服务间真实交互符合预期。
  3. 端到端(E2E)测试:

    • 目的: 从用户视角验证整个系统的工作流,确保各业务场景能顺畅执行。
    • 常用工具/框架:
      • Selenium(主要用于网页端自动化)
      • Cucumber:以 BDD(行为驱动开发)描述业务场景进行自动化测试
      • 自定义测试脚本或工具,模拟用户操作
    • 实践: 在真实或近似真实的环境中(如预发布环境)运行端到端测试,验证多服务联动效果。
  4. 性能及负载测试:

    • 目的: 测试系统在高并发、大流量场景下的响应性、稳定性和扩展能力。
    • 常用工具/框架:
      • Apache JMeter、Gatling、Locust(针对性能压力测试)
    • 实践: 制定性能指标(如响应时间、吞吐量等),并定期进行基准测试,确保系统在高负载下依然能稳定运行。
  5. 用户验收测试(UAT):

    • 目的: 通过最终用户或业务方验证产品功能是否满足需求。
    • 实践: 配合自动化与手动测试方式,确保业务流程符合预定的业务规则和用户期望。
  6. 混沌测试(Chaos Engineering):

    • 目的: 主动注入故障和网络延迟,验证系统的鲁棒性与自动恢复机制。
    • 常用工具: Chaos Monkey、Gremlin
    • 实践: 定期在非生产环境中开展混沌实验,识别潜在的系统脆弱点,并根据反馈进行优化。

应用场景

  • 自动化测试流水线: 在 CI 工具中加入各层次测试,使每一次代码提交、合并前都经过全面测试;
  • 测试环境隔离: 利用容器、虚拟机或云端测试平台,构建与生产环境类似的集成测试环境;
  • 覆盖率报告: 通过工具生成代码覆盖率报告(如 gcov、JaCoCo),帮助团队了解测试盲点;
  • 故障预演: 利用混沌测试验证容灾和降级策略是否有效,保障系统在实际故障时能自动恢复。

17. 安全相关

在微服务系统中,安全从架构设计到运行维护,每个环节都至关重要。以下内容按步骤并附有序号逐步展开说明,确保系统在面对外部和内部攻击时均能保持稳健。


17.1 安全设计与整体架构规划

  1. 安全设计理念

    • 零信任理念:
      • 概念: 不再假设内部网络可信,所有访问无论来自内部还是外部,都需要严格验证。
      • 实践: 每个 API 请求、每次服务调用都嵌入令牌和数字签名,确保访问来源都要经过认证。
      • 示例: 即使服务部署在内网,仍然在每个 HTTP 请求中加入 JWT 校验。
    • 最小权限原则:
      • 概念: 每个用户、每个服务的权限仅限于完成其功能的最小必要集,避免权限过宽。
      • 实践: 对用户进行角色细分,并在微服务内部实现细粒度的 API 级别权限控制;例如某个服务仅允许内部调用,不对外暴露关键接口。
      • 示例: 通过 API 网关给不同角色用户返回不同的数据集合,管理员接口开设专用访问控制。
    • 安全分层与多重防护:
      • 概念: 从网络层、容器层、应用层到数据层,每一层都采用独立的安全策略,形成联防体系。
      • 实践: 在网络层采用安全组和防火墙,在应用层实施 API 鉴权,而存储层则依靠数据加密与访问控制。
      • 示例: 服务间数据传输与外部调用均要求 TLS 加密,同时数据库采用透明数据加密(TDE)。
  2. 安全架构规划

    • 全链路安全设计:
      • 制定安全策略文档,明确每个微服务的安全边界和交互规则。
    • 风险评估与威胁建模:
      • 定期进行威胁建模(例如 STRIDE 分析),识别系统潜在弱点,并在设计中预留补救措施。
    • 冗余与容灾设计:
      • 在设计之初规划多副本部署和故障隔离区域,以便在部分节点被攻击或失效的情况下能迅速切换。

17.2 身份认证与访问控制

  1. 身份认证(Authentication)

    • OAuth2/OpenID Connect:
      • 原理: 利用授权服务器为用户颁发访问令牌,使得后端服务可以根据令牌验证用户身份。
      • 细节: 支持不同客户端场景(Web、移动应用等),并结合 PKCE 和 JWK 进行更安全的令牌分发。
      • 实施建议: 使用成熟的中间件(如 Keycloak、Auth0)来管理 OAuth2 流程,简化集成工作。
    • JWT (JSON Web Token):
      • 原理: 将认证信息封装在令牌中,通过对令牌签名保证完整性和防篡改。
      • 细节: 令牌中可嵌入用户角色、权限及其他声明;服务端在不必访问认证服务的情况下解码和验证令牌。
      • 最佳实践: 设置合适的过期时间,结合刷新令牌机制,防止长期使用同一令牌的风险。
    • SSO (单点登录):
      • 原理: 在多个系统之间通过统一的身份验证实现一次登录,多处共享认证信息。
      • 细节: 集中管理用户会话机制,支持多协议(SAML、CAS 等),方便跨域访问。
      • 实施建议: 使用成熟 SSO 平台,如 Okta 或企业内部 SSO 系统,为微服务统一认证入口提供支撑。
  2. 访问控制(Authorization)

    • RBAC(基于角色的访问控制):
      • 概念: 根据用户所处角色的预定义权限进行资源访问控制。
      • 实施: 系统在设计时预先配置角色和权限映射,后端每次请求时根据信息判断是否允许操作。
      • 建议: 使用集中式权限管理系统,如 Casbin,可以将权限策略动态下发。
    • ABAC(基于属性的访问控制):
      • 概念: 根据用户、环境和时间等属性实现更加灵活的访问控制。
      • 实施: 依据用户信息、当前环境变量(例如访问的 IP、设备信息)进行实时访问决策。
      • 建议: 对于复杂企业应用,结合策略引擎(如 OPA:Open Policy Agent)进行动态权限管理。
    • API 网关鉴权:
      • 作用: 在所有前端请求进入系统时统一进行身份验证和权限校验。
      • 最佳实践: 在网关层实现令牌解密、权限比对、请求记录,并配置限流策略,防止暴力攻击。

17.3 数据传输与存储加密

  1. 传输层加密

    • TLS/mTLS:
      • TLS: 所有服务间、客户端与服务器间的 HTTP 或 gRPC 请求都必须采用 HTTPS/TLS 加密。
      • mTLS: 对于服务间调用,双向 TLS 能确保通信双方都经过身份验证,提升安全性。
      • 注意事项: 需要定期更新证书,并使用自动证书管理工具,如 cert-manager(Kubernetes 环境下)。
    • 专用网络/VPN:
      • 说明: 在数据中心或云平台中,使用 VPC 中的子网隔离不同安全级别的服务,通过 VPN 连接远程办公。
      • 实施: 配置防火墙与安全组,确保只有可信的流量能进入内部网络。
  2. 数据存储加密

    • 静态数据加密:
      • 实践: 在数据库层面启用 TDE(透明数据加密),对磁盘上的文件进行加密;对日志、缓存也要采取加密措施。
      • 示例: MySQL 可使用 InnoDB 加密表,MongoDB 支持加密存储引擎。
    • 密钥管理:
      • 工具选择: 使用 HashiCorp Vault、AWS KMS 等来集中管理加密密钥,定期审计密钥使用情况。
      • 流程: 敏感信息不应硬编码到应用程序中,而是通过安全参数存储系统读取。
    • 应用层加密:
      • 用途: 对极其敏感的数据(如用户密码、金融数据)在应用层进行二次加密,保障即使数据库泄露数据依旧安全。

17.4 API 安全与服务边界防护

  1. API 网关安全

    • 鉴权与流量控制:
      • 细节: 在 API 网关中集成认证机制(JWT、OAuth2),并且配置请求速率限制、IP 白名单等防护措施。
      • 工具: Kong、Envoy 或 APISIX 不仅支持路由转发,还支持插件式安全扩展,适用于多协议场景。
    • WAF(Web Application Firewall):
      • 使用场景: 放置在 API 网关或前端边界,防御常见 Web 攻击,如 SQL 注入、XSS、CSRF 等。
      • 实施方案: 如果使用云厂商提供的 WAF(如 AWS WAF),可根据业务流量灵活配置规则。
  2. 服务间安全隔离

    • 服务网格应用:
      • 作用: 服务网格(例如 Istio、Linkerd)可以在侧车模式下,实现所有服务间的自动 TLS 加密和动态证书管理。
      • 优势: 不需要在每个应用中重复实现安全逻辑,统一由服务网格负责管理。
    • 最小边界原则:
      • 实施: 对外暴露 API 的服务接口仅接收必要的请求,其余的内部接口通过专用网络或专用端口仅供内部访问。
      • 策略: 使用防火墙规则和网络策略确保内部接口不对公共网络开放。

17.5 容器与网络基础设施安全

  1. 容器安全

    • 镜像扫描和安全基线:
      • 实践: 每次构建 Docker 镜像前,利用 Clair、Trivy 等工具扫描镜像,确保没有已知漏洞。
      • 最小镜像原则: 选用精简版基础镜像,移除不必要的工具和库,降低潜在的安全风险。
    • 运行时安全监控:
      • 工具: 使用 Falco、Aqua Security 等实时监控容器内部的异常行为,如系统调用异常和配置更改。
      • 策略: 配置资源限制、权限控制和只读文件系统来限制容器的运行范围。
  2. 网络与集群安全

    • VPC、子网与安全组:
      • 实施: 在云平台中使用 VPC 将各个微服务按安全级别隔离,用安全组限制不同子网间的通信。
      • 策略: 将数据库、配置中心等敏感组件放在隔离网络中,仅允许来自特定安全组的访问。
    • Kubernetes 网络策略:
      • 描述: 通过 NetworkPolicy 定义 Pod 间的访问规则,确保只有授权 Pod 能访问特定服务。
      • 实践: 为每个命名空间设置严格访问规则,实现服务之间的最小互信。
    • 入侵检测系统(IDS/IPS):
      • 应用: 部署防火墙、IDS/IPS 系统监控网络异常流量,并结合日志和 SIEM 平台进行实时响应。

17.6 安全编码与漏洞管理

  1. 安全编码实践

    • 制定编码标准:
      • 内容: 依据 OWASP 安全开发指南编写安全编码规范,具体涉及输入验证、输出编码、错误处理等。
      • 推广: 通过代码审查和代码模板,在开发早期预防漏洞问题。
    • 静态代码分析:
      • 工具: 使用 SonarQube、Checkmarx 对代码进行自动化扫描,找出潜在安全问题。
      • 流程: 将静态扫描集成到 CI 流水线中,确保每次提交前经过安全检查。
  2. 漏洞扫描与补丁管理

    • 周期性安全扫描:
      • 定期利用 Nessus、Qualys 之类的工具扫描操作系统、依赖库及容器环境,及时发现已知漏洞。
      • 建立补丁管理机制,确保安全补丁第一时间更新到生产环境。
    • 第三方依赖管理:
      • 工具: 利用 OWASP Dependency-Check、Snyk 等工具扫描项目依赖的安全性。
      • 策略: 制定依赖版本升级和替换流程,确保任何时刻引入最新版且无安全隐患的组件。
  3. 软件供应链安全

    • 代码和镜像签名:
      • 使用 GPG 或类似机制对源码、构建产物和容器镜像进行数字签名,以确保传输和发布过程中未被篡改。
    • 可信构建流水线:
      • 在 CI/CD 流程中加入镜像扫描、签名校验和环境隔离环节,确保构建过程和最终产物来源可信且无漏洞。

17.7 日志审计、安全监控与应急响应

  1. 日志记录与集中审计

    • 日志格式与存储:
      • 统一采用结构化日志(如 JSON 格式),记录所有关键安全事件(认证失败、IP 黑名单触发、权限更改)。
    • 集中日志系统:
      • 利用 ELK/EFK(Elasticsearch、Logstash/Fluentd、Kibana)、Splunk 或 Graylog 将各节点日志集中存储,并实现长时间保存和索引查询。
    • 审计策略:
      • 定期对日志进行分析,形成安全报告,并用于追责审计或合规检查。
  2. 安全监控与告警

    • 实时监控:
      • 配置 Prometheus 采集安全相关指标(例如异常认证次数、频繁拒绝请求等),并在 Grafana 中建立监控仪表盘。
      • 设定 AlertManager 告警规则,确保在异常情况发生时能够及时通知相关人员。
    • 入侵检测:
      • 部署 IDS/IPS 系统(例如 Snort、Suricata),对网络流量进行分析,发现潜在攻击行为。
    • SIEM 集成:
      • 将日志数据、监控数据汇聚到 SIEM 平台(如 Splunk)进行关联分析,帮助识别高级持续性威胁(APT)。
  3. 应急响应与混沌测试

    • 应急预案:
      • 制定安全事件响应计划,明确故障隔离、数据备份、通知流程与责任人。
      • 定期举行演练并更新预案,确保团队在面对安全事件时能够迅速响应和恢复。
    • 混沌安全测试:
      • 利用 Chaos Monkey、Gremlin 等工具模拟攻击和故障场景,测试系统对异常情况下的防御与容灾能力。

综合说明

通过以上详细步骤和多层次措施,我们建立了全链路安全防护体系。具体效果体现在以下几个方面:

  1. 全方位防护: 每个环节(从身份认证到数据加密,从 API 网关到容器安全)均有专门措施覆盖,降低单点故障风险。
  2. 层次分明: 体系中分别在网络层、应用层、数据层和运维层建立安全屏障,使得即使某一层受到攻击,其它层仍能保持防护。
  3. 可持续改进: 定期漏洞扫描、混沌测试和日志审计使得系统能够不断调整安全策略,应对不断变化的安全威胁。

相关文章:

微服务系统记录

记录下曾经工作涉及到微服务的相关知识。 1. 架构设计与服务划分 关键内容 领域驱动设计(DDD): 利用领域模型和限界上下文(Bounded Context)拆分业务,明确服务边界。通过事件风暴(Event Storm…...

同花顺客户端公司财报抓取分析

目标客户端下载地址:https://ft.51ifind.com/index.php?c=index&a=download PC版本 主要难点在登陆,获取token中的 jgbsessid (每次重新登录这个字段都会立即失效,且有效期应该是15天的) 抓取jgbsessid 主要通过安装mitmproxy 使用 mitmdump + 下边的脚本实现监听接口…...

二叉树与红黑树核心知识点及面试重点

二叉树与红黑树核心知识点及面试重点 一、二叉树 (Binary Tree) 1. 基础概念 定义:每个节点最多有两个子节点(左子节点和右子节点) 术语: 根节点:最顶层的节点 叶子节点:没有子节点的节点 深度&#xf…...

Rocket-JWT鉴权

目录 一、概述 二、相关依赖 三、环境准备 3.1 创建项目 3.2 读取私钥信息 3.3 token数据负载 3.4 生成token 四、Web鉴权 4.1 验证载体 4.2 接收请求 五、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rocket-JWT鉴权] ❤博主广交技术好友,喜…...

2025 年网络安全终极指南

我们生活在一个科技已成为日常生活不可分割的一部分的时代。对数字世界的依赖性日益增强的也带来了更大的网络风险。 网络安全并不是IT专家的专属特权,而是所有用户的共同责任。通过简单的行动,我们可以保护我们的数据、隐私和财务,降低成为…...

横扫SQL面试——PV、UV问题

📊 横扫SQL面试:UV/PV问题 🌟 什么是UV/PV? 在数据领域,UV(Unique Visitor,独立访客) 和 PV(Page View,页面访问量) 是最基础也最重要的指标&…...

ctf-show-杂项签到题

下载文件,解压需要密码,用010打开没看出什么 然后用Advanced Archive Password Recovery暴力破解,发现没用 怀疑是伪解密,解压出来发现加密受损用随波逐流修复加密文件 打开修复的加密文件直接得flag flag:flag{79d…...

对解释器模式的理解

对解释器模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1096)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用解释器模式1、代码2、“缺点” 三、采用解释器模式1、代码2、“优点” 四、思考1、解释器模式的意义…...

高频面试题(含笔试高频算法整理)基本总结回顾64

干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...

python入门之从安装python及vscode开始

本篇将解决三个问题: 1. 如何下载及安装官方python? 2. 如何下载及安装vscode? 3. 如何配置vscode的python环境? 一、python下载及安装 1.搜索python,找到官网并打开 2.找到download,按需选择版本下载 …...

OpenGL学习笔记(模型材质、光照贴图)

目录 光照与材质光照贴图漫反射贴图采样镜面光贴图 GitHub主页:https://github.com/sdpyy OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppLearn/tree/main/OpenGL 光照与材质 在现实世界里&…...

视觉_transform

visual_transform 图像分块 (Patch Embedding) 假设输入图像为 x ∈ R ∗ H ∗ ∗ W ∗ ∗ C ∗ x∈R^{*H**W**C*} x∈R∗H∗∗W∗∗C∗ C 是图像的通道数(例如,RGB图像的 C3) 将图像分割成N个大小为P*CP的patch,每个patch的大…...

Redis的安装及通用命令

二. Redis 的安装及通用命令 1. Ubuntu 安装 Redis (1) 切换到 root 用户: su root(2) 搜索 Redis 软件包 apt search redis(3) 安装 Redis apt install redis(4) 查看 Redis netstat -anp | grep redis(5) 切换到 Redis 目录下 cd /etc/redis/(6) 修改 Redis 配置文件:…...

Python 实现的运筹优化系统代码详解(0-1规划背包问题)

一、引言 在数学建模与实际决策场景的交织领域中,诸多复杂问题亟待高效且精准的解决方案。0-1 规划作为一种特殊且极为重要的优化方法,宛如一把万能钥匙,能够巧妙开启众多棘手问题的解决之门。它专注于处理决策变量仅能取 0 或 1 这两种极端状…...

护网蓝初面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...

音视频学习(三十二):VP8和VP9

VP8 简介 全称&#xff1a;Video Processing 8发布者&#xff1a;原 On2 Technologies&#xff08;2010 被 Google 收购&#xff09;定位&#xff1a;开源视频压缩标准&#xff0c;主要竞争对手是 H.264应用&#xff1a; WebRTC 视频通信HTML5 <video> 标签&#xff08…...

美国mlb与韩国mlb的关系·棒球9号位

MLB&#xff08;Major League Baseball&#xff0c;美国职业棒球大联盟&#xff09;作为全球最高水平的职业棒球联赛&#xff0c;与韩国市场流行的“MLB”时尚品牌之间存在着授权合作关系&#xff0c;但两者在业务范畴和品牌定位上存在显著差异。 一、品牌授权背景&#xff1a;…...

免费在线PUA测试工具:识别情感操控,守护情感健康

免费在线PUA测试工具&#xff1a;识别情感操控&#xff0c;守护情感健康 你是否曾经在感情中感到困惑、不安&#xff0c;甚至怀疑自己&#xff1f;今天为大家推荐一个专业的PUA测试工具&#xff0c;帮助你识别是否正在经历情感操控。 测试工具链接&#xff1a;PUA测试工具 什么…...

nginx中的try_files指令

try_files 是 Nginx 中一个非常有用的指令&#xff0c;用于按顺序检查文件是否存在&#xff0c;并返回第一个找到的文件。如果所有指定的文件都不存在&#xff0c;则执行回退逻辑&#xff0c;如重定向到一个指定的 URI 或返回一个错误代码。 作用 文件查找&#xff1a;按顺序检…...

[特殊字符] 驱动开发硬核特训 · Day 4

主题&#xff1a;从硬件总线到驱动控制 —— I2C 协议与传感器驱动开发全解析 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线是一种广泛用于嵌入式设备的串行通信协议&#xff0c;因其低成本、简单布线和多从设备支持&#xff0c;成为连接各种传感器&#xff08;温…...

Python 实现玻璃期货数据处理、入库与分析:从代码到应用

Python 实现期货数据处理与分析&#xff1a;从代码到应用 引言 在金融市场中&#xff0c;期货数据的处理和分析对于投资者和分析师来说至关重要。Python 凭借其丰富的库和简洁的语法&#xff0c;成为了处理和分析期货数据的强大工具。本文将详细解读一段用于处理期货持仓和行…...

神经网络之损失函数

引言&#xff1a;损失函数 &#xff08;Loss Function&#xff09;是机器学习和深度学习中非常重要的一个概念。用于衡量模型的预测值与真实值之间的差异&#xff0c;从而指导模型优化其参数以最小化这种差异。 一、损失函数作用 量化误差&#xff1a;损失函数是将预测值和真实…...

在Ubuntu内网环境中为Gogs配置HTTPS访问(通过Apache反向代理使用IP地址)

一、准备工作 确保已安装Gogs并运行在HTTP模式(默认端口3000) 确认服务器内网IP地址(如192.168.1.100) 二、安装Apache和必要模块 sudo apt update sudo apt install apache2 -y sudo a2enmod ssl proxy proxy_http rewrite headers 三、创建SSL证书 1. 创建证书存储目录…...

printf

printf() 是 C 和 C 标准库中的一个输出函数&#xff0c;位于 <cstdio> 头文件中。下面为你详细介绍它的相关知识点。 1. 基本使用 printf() 函数的作用是按照指定格式将数据输出到标准输出设备&#xff08;通常是控制台&#xff09;。其基本语法如下&#xff1a; cpp …...

Leetcode 311 Sparse Matrix Multiplication 稀疏矩阵相乘

Problem Given two sparse matrices A and B, return the result of AB. You may assume that A’s column number is equal to B’s row number. Example: A [[ 1, 0, 0],[-1, 0, 3] ]B [[ 7, 0, 0 ],[ 0, 0, 0 ],[ 0, 0, 1 ] ]| 1 0 0 | | 7 0 0 | | 7 0 0 | AB …...

mysql和sqlite关于data数据的识别问题

<input type"date" name"birthday" value""> # 表单传入的日期 birthday request.form.get(birthday) # 获取日期 birthday Column(birthday, Date, comment出生日期, nullableTrue) # 数据库的数据字段模型 birthday_str request…...

2024 天梯赛——工业园区建设题解

思路 将点 i i i 视为固定点&#xff0c; 点 j j j 视为灵活点&#xff0c;其中 s i 1 s_{i} 1 si​1&#xff0c; s j 0 s_{j} 0 sj​0。维护四个队列&#xff0c;其中 q 0 q_{0} q0​ 和 q 1 q_{1} q1​ 分别维护还没有被选用的固定点 和 灵活点&#xff0c; Q 0 Q…...

亚马逊AI新功能上线:5大亮点解锁精准消费预测

在人工智能技术不断重塑跨境电商生态之际&#xff0c;全球电商巨头亚马逊&#xff08;Amazon&#xff09;再次迈出关键一步。近日&#xff0c;亚马逊正式对其卖家中心推出一系列基于AI的新功能&#xff0c;聚焦于消费数据预测、用户行为洞察、库存智能管理与个性化营销服务等方…...

opus+ffmpeg+c++实现录音

说明&#xff1a; opusffmpegc实现录音 效果图&#xff1a; step1:C:\Users\wangrusheng\source\repos\WindowsProject1\WindowsProject1\WindowsProject1.cpp // WindowsProject1.cpp : 定义应用程序的入口点。 //#include "framework.h" #include "Windows…...

ComfyUI的本地私有化部署使用Stable Diffusion文生图

什么是ComfyUI &#xff1f; ComfyUI是一个基于节点流程的Stable Diffusion操作界面。以下是关于它的详细介绍&#xff1a; 特点与优势 高度可定制&#xff1a;提供丰富的节点类型&#xff0c;涵盖文本处理、图像处理、模型推理等功能。用户可根据需求自由组合节点&#xff0…...

【学习笔记17】Windows环境下安装RabbitMQ

一. 下载RabbitMQ&#xff08; 需要按照 Erlang/OTP 环境的版本依赖来下载&#xff09; (1) 先去 RabbitMQ 官网&#xff0c;查看 RabbitMQ 需要的 Erlang 支持&#xff1a;https://www.rabbitmq.com/ 进入官网&#xff0c;在 Docs -> Install and Upgrade -> Erlang V…...

【LeetCode 热题100】55:跳跃游戏(详细解析)(Go语言版)

&#x1f680; LeetCode 热题 55&#xff1a;跳跃游戏&#xff08;Jump Game&#xff09;完整解析 &#x1f4cc; 题目描述 给定一个非负整数数组 nums&#xff0c;你最初位于数组的第一个下标。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一…...

OpenCV轮廓检测全面解析:从基础到高级应用

一、概述 轮廓检测是计算机视觉中的基础技术&#xff0c;用于识别和提取图像中物体的边界。与边缘检测不同&#xff0c;轮廓检测更关注将边缘像素连接成有意义的整体&#xff0c;形成封闭的边界。 轮廓检测的核心价值 - 物体识别&#xff1a;通过轮廓可以识别图像中的独立物体…...

微服务入门:Spring Boot 初学者指南

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 微服务因其灵活性、可扩展性和易于维护性而成为现代软件架构的重要组成部分。在本博客中&#xff0c;我们将探讨如何使用 Spring Boot 构建…...

Windows环境下开发pyspark程序

Windows环境下开发pyspark程序 一、环境准备 1.1. Anaconda/Miniconda&#xff08;Python环境&#xff09; 如果不怕包的版本管理混乱&#xff0c;可以直接使用已有的Python环境。 需要安装anaconda/miniconda&#xff08;python3.8版本以上&#xff09;&#xff1a;Anaconda…...

嵌入式学习笔记——大小端及跳转到绝对地址

大小端以及跳转到绝对地址 0x100000 嵌入式编程中的大小端详解一、大端模式与小端模式二、判断当前系统是大端还是小端方法一&#xff1a;指针强制类型转换方法二&#xff1a;使用联合体&#xff08;union&#xff09; 三、结构体位段和大小端的影响四、大小端影响内存的 memc…...

eprime相嵌模式实验设计

一、含义与模型结构 该模式的实验设计至少 由两个存储不同实验材料及 属性的List和一个核心实验 过程CEP组成。子list1和 list2相嵌在父List中&#xff0c;CEP 可以调用List中的材料&#xff0c;也 可以调用list1和list2中的材 料。 二、相嵌模式的应用 应用于解决“多重随…...

编译uboot的Makefile编写

make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distcleanmake ARCHarm CROSS_COMPILEarm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfigmake V1 ARCHarm CROSS_COMPILEarm-linux-gnueabihf- -j12 这三条命令中 ARCHarm 设置目标为 arm 架构&#xff0c; CROSS_COMP…...

Go语言常用算法实现

以下是Go语言中常用的算法实现&#xff0c;涵盖排序、搜索、数据结构操作等核心算法。 一、排序算法 1. 快速排序 func QuickSort(arr []int) []int {if len(arr) < 1 {return arr}pivot : arr[0]var left, right []intfor i : 1; i < len(arr); i {if arr[i] < pi…...

Windows上使用NSSM注册定时服务

适用和不适用场景 适用场景 持续运行 的脚本或程序&#xff08;如 Laravel 的 schedule:run 每分钟检查任务&#xff09;后台常驻 的任务或服务&#xff08;如监听服务、实时同步&#xff09; 不适用场景 低频次任务&#xff08;如每日/每周备份&#xff09; NSSM 常驻内存…...

【Gorm】模型定义

intro package mainimport ("gorm.io/gorm""gorm.io/driver/sqlite" // GORM 使用该驱动来连接和操作 SQLite 数据库。 )type Product struct {gorm.Model // 嵌入GORM 内置的模型结构&#xff0c;包含 ID、CreatedAt、UpdatedAt、DeletedAt 四个字段Cod…...

程序化广告行业(65/89):AdX/SSP系统深度剖析与实战要点

程序化广告行业&#xff08;65/89&#xff09;&#xff1a;AdX/SSP系统深度剖析与实战要点 大家好&#xff01;一直以来&#xff0c;我都对程序化广告领域充满热情&#xff0c;这个领域发展迅速且不断涌现新的技术和模式。之前我们探讨了程序化广告的一些基础内容&#xff0c;…...

算法刷题记录——LeetCode篇(2.7) [第161~170题](持续更新)

更新时间&#xff1a;2025-04-06 算法题解目录汇总&#xff1a;算法刷题记录——题解目录汇总技术博客总目录&#xff1a;计算机技术系列博客——目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 169. 多数元素 给定一个大小为…...

conda安装指定版本python环境

1. 创建指定 Python 版本的环境 使用以下命令创建环境&#xff0c;并将 <env_name> 替换为你的环境名称&#xff0c;<python_version> 替换为具体的 Python 版本&#xff08;如 3.8, 3.9 等&#xff09; conda create -n <env_name> python<python_vers…...

PH热榜 | 2025-04-05

1. Comp AI 标语&#xff1a;开源的 Vanta 和 Drata 替代方案 介绍&#xff1a;这款开源的 Drata 和 Vanta 替代方案&#xff0c;能够帮助你在几周内&#xff0c;轻松满足 SOC 2、ISO 27001 和 GDPR 等合规框架的要求&#xff0c;而不是像往常那样拖延数月。 产品网站&#…...

C++之红黑树

目录​​​​​​​ 一、红黑树的概念 1.1、红黑树的规则 1.2、红黑树如何确保最长路径不超过最短路径的二倍 1.3、红黑树的效率 二、红黑树的实现 2.1、红黑树的结构 2.2、红黑树的插入 2.2.1、红黑树插入一个值的大概过程 2.2.2、情况一&#xff1a;变色 2.2.3、情…...

各个语言对不同数据结构的叫法

一、基础数据结构对比 数组&#xff08;Array&#xff09;‌ C/C‌&#xff1a;固定大小数组&#xff08;int arr&#xff09;&#xff0c;动态数组通过vector&#xff08;C&#xff09;实现 ‌ Java‌&#xff1a;固定数组&#xff08;int[]&#xff09;&#xff0c;动态数组…...

蓝桥杯 web 水果拼盘 (css3)

做题步骤&#xff1a; 看结构&#xff1a;html 、css 、f12 分析: f12 查看元素&#xff0c;你会发现水果的高度刚好和拼盘的高度一样&#xff0c;每一种水果的盘子刚好把页面填满了&#xff0c;所以咱们就只要让元素竖着排列&#xff0c;加上是竖着&#xff0c;排不下的换行…...

算法专题(八):分治-归并排序

目录 一、排序数组 1.1 题目 2.2 思路 2.3 代码实现 二、LCR 170. 交易逆序对的总数 &#xff08;数组中的逆序对&#xff09; 2.1 题目 2.2 思路 方法一&#xff1a;快速统计出某个数前面有多少个数比它大 方法二&#xff1a;快速统计出某个数后面有多少个数比它小 …...

51单片机使用定时器实现LCD1602的时间显示(STC89C52RC)

本文前半部分直接给出实现&#xff08;注意进位问题是秒->分->小时&#xff0c;用 if 嵌套即可实现&#xff09;&#xff0c;后半部分讲解定时器和中断系统。 效果展示&#xff1a; LCD1602电路图&#xff1a; 项目结构&#xff1a; 代码实现&#xff1a; main.c #…...