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

滚雪球学SpringCloud[10.2讲]:微服务项目的性能优化与调优

全文目录:

    • 前言
    • 性能优化与调优概述
      • 性能优化的核心目标
      • 常见的性能瓶颈来源
    • 性能瓶颈分析与调优策略
      • 1. 服务间通信优化
        • 优化策略:
      • 2. 数据库优化
        • 优化策略:
      • 3. 线程池优化
        • 优化策略:
      • 4. 缓存优化
        • 优化策略:
    • 常见问题的排查与解决
      • 1. 慢查询问题
      • 2. 内存泄漏问题
      • 3. 线程池饱和问题
    • 实战案例:性能优化实践
      • 背景
      • 识别瓶颈
      • 优化过程
    • 前言
    • 性能优化与调优概述
      • 性能优化的核心目标
      • 常见的性能瓶颈来源
    • 性能瓶颈分析与调优策略
      • 1. 服务间通信优化
        • 优化策略:
      • 2. 数据库优化
        • 优化策略:
      • 3. 线程池优化
        • 优化策略:
      • 4. 缓存优化
        • 优化策略:
    • 常见问题的排查与解决
      • 1. 慢查询问题
      • 2. 内存泄漏问题
      • 3. 线程池饱和问题
    • 实战案例:性能优化实践
      • 背景
      • 识别瓶颈
      • 优化过程
    • 微服务性能优化的其他重要维度
      • 5. 自动扩展与弹性架构
        • 优化策略:
      • 6. 网络优化
        • 优化策略:
      • 7. 日志与监控优化
        • 优化策略:
      • 8. 配置优化
        • 优化策略:
    • 总结与最佳实践
    • 预告:11.1 微服务的测试与质量保证

前言

在上一节【10.1 项目实战:从零开发一个微服务系统】中,我们详细探讨了如何从零开始构建微服务架构,包括服务的拆分、API设计、数据持久化以及CI/CD流程的实施。这些基础为我们构建高效、可扩展的微服务系统奠定了良好的基础。然而,随着系统的运行和用户量的增加,性能问题不可避免地浮现出来。如何有效识别和解决这些问题,是保证系统高效稳定运行的关键。

微服务架构虽然具备灵活性和可扩展性,但由于多个服务之间的复杂交互和网络延迟,性能瓶颈往往成为影响用户体验和系统稳定性的主要因素。在本节中,我们将深入分析微服务项目中的性能瓶颈,并探讨相应的优化与调优策略。通过实际案例,您将更好地理解这些概念与技术。

在下一节【微服务的测试与质量保证】中,我们将关注如何通过有效的测试策略确保微服务的高质量输出,包括功能测试、性能测试和安全测试等内容。

性能优化与调优概述

微服务架构中的性能优化是一个系统性的过程,涉及多个层面的分析与调整。性能瓶颈可能出现在多个方面,如服务间通信延迟、数据库查询效率低下、资源配置不当等。通过识别并解决这些瓶颈,我们可以提升系统的整体性能。

性能优化的核心目标

  1. 提升系统响应速度:确保用户请求的快速处理。
  2. 提高吞吐量:增加单位时间内的请求处理能力。
  3. 减少资源占用:优化 CPU、内存和网络使用效率。
  4. 增强可扩展性:确保系统能够在业务增长时平稳扩展。

常见的性能瓶颈来源

  • 服务间通信的延迟:微服务通过网络进行交互,网络延迟和服务调用效率直接影响系统性能。
  • 数据库性能问题:查询速度慢、索引不合理、事务锁等待等都会导致数据库成为瓶颈。
  • 资源配置不当:线程池、缓存等的配置问题可能导致系统性能不佳。
  • 负载均衡不合理:流量分配不均可能导致某些服务过载。

接下来,我们将逐一探讨这些问题的调优策略,并通过实际案例演示如何有效解决性能瓶颈。

性能瓶颈分析与调优策略

1. 服务间通信优化

服务间通信是微服务架构中性能优化的重要环节。服务通过 HTTP、gRPC、RPC 或消息队列进行交互,这一过程的效率直接影响到系统的响应速度。

优化策略:
  • 使用异步通信:对于某些不需要实时响应的请求,可以采用异步处理或消息队列来降低服务间调用的延迟。例如,在电商平台上,用户下单后发送确认邮件可以通过消息队列异步处理,避免用户等待邮件发送的过程。

    案例展示

    @PostMapping("/placeOrder")
    public ResponseEntity<String> placeOrder(@RequestBody Order order) {orderService.processOrder(order);messagingService.sendOrderConfirmation(order); // 异步处理return ResponseEntity.ok("Order placed successfully!");
    }
    
  • 减少跨服务调用层级:通过API网关或服务聚合,将多个服务的调用整合为一次请求,减少网络往返时间。使用GraphQL等技术可以在一次请求中获取所需的所有数据。

    案例展示

    在用户查询订单时,如果需要调用用户服务、订单服务和商品服务,可以通过API网关整合这些请求,减少延迟。

2. 数据库优化

数据库常常是性能瓶颈的关键所在。慢查询、低效的索引和不当的事务管理都会导致数据库性能下降。

优化策略:
  • 索引优化:对常用的查询字段建立索引,显著提高查询性能。使用数据库的慢查询日志找出需要优化的查询。

    案例展示

    在某电商系统中,用户经常根据商品名称查询订单。如果没有在 product_name 字段上建立索引,查询性能将受到影响。

    CREATE INDEX idx_product_name ON orders(product_name);
    
  • 使用连接池:使用连接池技术可以有效管理数据库连接,减少连接建立的开销。在Spring Boot中,可以使用HikariCP作为数据源连接池,进行高效管理:

    spring.datasource.hikari.maximum-pool-size=30
    spring.datasource.hikari.minimum-idle=10
    
  • 读写分离:对于读多写少的场景,可以采用主从数据库架构,将读取请求分发到从数据库上,减轻主数据库的压力。

3. 线程池优化

线程池的配置对于系统的并发处理能力至关重要。过小的线程池会导致请求等待,过大的线程池则可能消耗过多的系统资源。

优化策略:
  • 合理配置线程池参数:根据实际的请求量和系统性能,合理设置线程池的核心线程数、最大线程数及队列长度。

    案例展示

    使用Java的ThreadPoolExecutor进行线程池配置:

    ThreadPoolExecutor executor = new ThreadPoolExecutor(10, // 核心线程数50, // 最大线程数60L, TimeUnit.SECONDS, // 线程存活时间new LinkedBlockingQueue<Runnable>(100) // 队列长度
    );
    
  • 使用异步处理:将耗时的任务异步化,减少对主线程的阻塞。例如,在处理用户上传的文件时,可以将文件处理任务放入异步线程池中,提升用户体验。

    @Async
    public CompletableFuture<Void> handleFileUpload(MultipartFile file) {// 文件处理逻辑return CompletableFuture.completedFuture(null);
    }
    

4. 缓存优化

缓存能够显著提高系统的响应速度,但不当的缓存管理可能导致性能问题。

优化策略:
  • 合理设置缓存策略:根据业务场景合理设置缓存的过期时间和更新策略,避免数据不一致。例如,对于热数据可以设置较长的缓存时间,而对于变化频繁的数据则应短期缓存。

  • 避免缓存雪崩:对于大量相同数据的缓存,可以采用随机过期时间来防止同一时间大量缓存失效导致的数据库压力激增。

    案例展示

    假设某电商平台的热门商品缓存,如果缓存同时失效,可能导致大量请求直接查询数据库。可以设置不同的过期时间,防止缓存雪崩。

  • 实现防穿透机制:对于不存在的数据请求,可以利用布隆过滤器等技术进行防护,避免直接查询数据库。

常见问题的排查与解决

性能调优过程中,快速排查常见问题至关重要。以下是一些常见问题的排查思路:

1. 慢查询问题

通过数据库的慢查询日志,找到需要优化的查询。可以使用 EXPLAIN 语句分析查询计划,检查是否可以通过增加索引或优化查询语句来改善性能。

2. 内存泄漏问题

内存泄漏会导致服务长时间运行后内存持续增长,最终导致崩溃。可以使用JProfiler、VisualVM等工具分析内存使用情况,查找未释放的对象。例如,通过观察内存堆图,查找引用计数未归零的对象。

3. 线程池饱和问题

监控线程池的使用情况,检查是否存在请求阻塞的情况。如果线程池经常满载,可以考虑增加线程池的容量或优化任务的处理逻辑,减少长时间运行的任务。

实战案例:性能优化实践

让我们通过一个真实的案例来具体化上述策略的应用。

背景

假设我们正在优化一个在线购物网站,该网站使用微服务架构,包含用户服务、订单服务和商品服务。随着用户量的增长,性能瓶颈开始显现,用户反馈页面加载缓慢,订单处理时间过长。

识别瓶颈

通过监控工具(如Prometheus和Grafana),我们发现:

  • 用户服务的响应时间平均为600ms,主要由数据库查询引起。
  • 订单服务的处理时间在高峰期经常超过2秒,导致用户体验不佳。

优化过程

  1. 数据库优化

    • 针对用户服务中的慢查询,使用慢查询日志找出问题SQL,并建立适当的索引。
    • 将读操作分配到从库,缓解主库压力。
  2. 服务间通信优化

    • 在用户下单时,采用消息队列处理邮件发送,避免直接调用邮件服务导致的阻塞。
  3. **线程# 10.2 微服务项目的性能优化与调优

前言

在上一节【10.1 项目实战:从零开发一个微服务系统】中,我们详细探讨了如何从零开始构建微服务架构,包括服务的拆分、API设计、数据持久化以及CI/CD流程的实施。这些基础为我们构建高效、可扩展的微服务系统奠定了良好的基础。然而,随着系统的运行和用户量的增加,性能问题不可避免地浮现出来。如何有效识别和解决这些问题,是保证系统高效稳定运行的关键。

微服务架构虽然具备灵活性和可扩展性,但由于多个服务之间的复杂交互和网络延迟,性能瓶颈往往成为影响用户体验和系统稳定性的主要因素。在本节中,我们将深入分析微服务项目中的性能瓶颈,并探讨相应的优化与调优策略。通过实际案例,您将更好地理解这些概念与技术。

在下一节【微服务的测试与质量保证】中,我们将关注如何通过有效的测试策略确保微服务的高质量输出,包括功能测试、性能测试和安全测试等内容。

性能优化与调优概述

微服务架构中的性能优化是一个系统性的过程,涉及多个层面的分析与调整。性能瓶颈可能出现在多个方面,如服务间通信延迟、数据库查询效率低下、资源配置不当等。通过识别并解决这些瓶颈,我们可以提升系统的整体性能。

性能优化的核心目标

  1. 提升系统响应速度:确保用户请求的快速处理。
  2. 提高吞吐量:增加单位时间内的请求处理能力。
  3. 减少资源占用:优化 CPU、内存和网络使用效率。
  4. 增强可扩展性:确保系统能够在业务增长时平稳扩展。

常见的性能瓶颈来源

  • 服务间通信的延迟:微服务通过网络进行交互,网络延迟和服务调用效率直接影响系统性能。
  • 数据库性能问题:查询速度慢、索引不合理、事务锁等待等都会导致数据库成为瓶颈。
  • 资源配置不当:线程池、缓存等的配置问题可能导致系统性能不佳。
  • 负载均衡不合理:流量分配不均可能导致某些服务过载。

接下来,我们将逐一探讨这些问题的调优策略,并通过实际案例演示如何有效解决性能瓶颈。

性能瓶颈分析与调优策略

1. 服务间通信优化

服务间通信是微服务架构中性能优化的重要环节。服务通过 HTTP、gRPC、RPC 或消息队列进行交互,这一过程的效率直接影响到系统的响应速度。

优化策略:
  • 使用异步通信:对于某些不需要实时响应的请求,可以采用异步处理或消息队列来降低服务间调用的延迟。例如,在电商平台上,用户下单后发送确认邮件可以通过消息队列异步处理,避免用户等待邮件发送的过程。

    案例展示

    @PostMapping("/placeOrder")
    public ResponseEntity<String> placeOrder(@RequestBody Order order) {orderService.processOrder(order);messagingService.sendOrderConfirmation(order); // 异步处理return ResponseEntity.ok("Order placed successfully!");
    }
    
  • 减少跨服务调用层级:通过API网关或服务聚合,将多个服务的调用整合为一次请求,减少网络往返时间。使用GraphQL等技术可以在一次请求中获取所需的所有数据。

    案例展示

    在用户查询订单时,如果需要调用用户服务、订单服务和商品服务,可以通过API网关整合这些请求,减少延迟。

2. 数据库优化

数据库常常是性能瓶颈的关键所在。慢查询、低效的索引和不当的事务管理都会导致数据库性能下降。

优化策略:
  • 索引优化:对常用的查询字段建立索引,显著提高查询性能。使用数据库的慢查询日志找出需要优化的查询。

    案例展示

    在某电商系统中,用户经常根据商品名称查询订单。如果没有在 product_name 字段上建立索引,查询性能将受到影响。

    CREATE INDEX idx_product_name ON orders(product_name);
    
  • 使用连接池:使用连接池技术可以有效管理数据库连接,减少连接建立的开销。在Spring Boot中,可以使用HikariCP作为数据源连接池,进行高效管理:

    spring.datasource.hikari.maximum-pool-size=30
    spring.datasource.hikari.minimum-idle=10
    
  • 读写分离:对于读多写少的场景,可以采用主从数据库架构,将读取请求分发到从数据库上,减轻主数据库的压力。

3. 线程池优化

线程池的配置对于系统的并发处理能力至关重要。过小的线程池会导致请求等待,过大的线程池则可能消耗过多的系统资源。

优化策略:
  • 合理配置线程池参数:根据实际的请求量和系统性能,合理设置线程池的核心线程数、最大线程数及队列长度。

    案例展示

    使用Java的ThreadPoolExecutor进行线程池配置:

    ThreadPoolExecutor executor = new ThreadPoolExecutor(10, // 核心线程数50, // 最大线程数60L, TimeUnit.SECONDS, // 线程存活时间new LinkedBlockingQueue<Runnable>(100) // 队列长度
    );
    
  • 使用异步处理:将耗时的任务异步化,减少对主线程的阻塞。例如,在处理用户上传的文件时,可以将文件处理任务放入异步线程池中,提升用户体验。

    @Async
    public CompletableFuture<Void> handleFileUpload(MultipartFile file) {// 文件处理逻辑return CompletableFuture.completedFuture(null);
    }
    

4. 缓存优化

缓存能够显著提高系统的响应速度,但不当的缓存管理可能导致性能问题。

优化策略:
  • 合理设置缓存策略:根据业务场景合理设置缓存的过期时间和更新策略,避免数据不一致。例如,对于热数据可以设置较长的缓存时间,而对于变化频繁的数据则应短期缓存。

  • 避免缓存雪崩:对于大量相同数据的缓存,可以采用随机过期时间来防止同一时间大量缓存失效导致的数据库压力激增。

    案例展示

    假设某电商平台的热门商品缓存,如果缓存同时失效,可能导致大量请求直接查询数据库。可以设置不同的过期时间,防止缓存雪崩。

  • 实现防穿透机制:对于不存在的数据请求,可以利用布隆过滤器等技术进行防护,避免直接查询数据库。

常见问题的排查与解决

性能调优过程中,快速排查常见问题至关重要。以下是一些常见问题的排查思路:

1. 慢查询问题

通过数据库的慢查询日志,找到需要优化的查询。可以使用 EXPLAIN 语句分析查询计划,检查是否可以通过增加索引或优化查询语句来改善性能。

2. 内存泄漏问题

内存泄漏会导致服务长时间运行后内存持续增长,最终导致崩溃。可以使用JProfiler、VisualVM等工具分析内存使用情况,查找未释放的对象。例如,通过观察内存堆图,查找引用计数未归零的对象。

3. 线程池饱和问题

监控线程池的使用情况,检查是否存在请求阻塞的情况。如果线程池经常满载,可以考虑增加线程池的容量或优化任务的处理逻辑,减少长时间运行的任务。

实战案例:性能优化实践

让我们通过一个真实的案例来具体化上述策略的应用。

背景

假设我们正在优化一个在线购物网站,该网站使用微服务架构,包含用户服务、订单服务和商品服务。随着用户量的增长,性能瓶颈开始显现,用户反馈页面加载缓慢,订单处理时间过长。

识别瓶颈

通过监控工具(如Prometheus和Grafana),我们发现:

  • 用户服务的响应时间平均为600ms,主要由数据库查询引起。
  • 订单服务的处理时间在高峰期经常超过2秒,导致用户体验不佳。

优化过程

  1. 数据库优化

    • 针对用户服务中的慢查询,使用慢查询日志找出问题SQL,并建立适当的索引。
    • 将读操作分配到从库,缓解主库压力。
  2. 服务间通信优化

    • 在用户下单时,采用消息队列处理邮件发送,避免直接调用邮件服务导致的阻塞。

微服务性能优化的其他重要维度

在前面我们讨论了服务间通信、数据库、线程池和缓存优化的关键点,除此之外,微服务性能优化还有许多其他重要维度需要考虑。接下来我们将深入探讨其他几个关键领域:自动扩展与弹性架构、网络优化、日志与监控优化等。这些方面的优化可以让我们的微服务架构更加健壮、灵活,并能够从容应对不同的负载和突发流量。

5. 自动扩展与弹性架构

微服务架构的优势之一在于其能够实现按需扩展,也就是根据流量动态增加或减少资源。自动扩展和弹性架构设计可以帮助系统在高峰时段保持稳定的性能,而在流量低时减少资源消耗,降低成本。

优化策略:
  • 使用容器编排工具实现自动扩展:工具如Kubernetes、Docker Swarm支持根据流量动态调整实例数量。当负载增加时,可以自动扩展微服务实例,减轻现有实例的负载;当负载减少时,则自动缩减实例数量,节约资源。

    案例展示:Kubernetes的自动扩展

    Kubernetes支持基于CPU、内存或自定义指标的水平自动扩展(HPA)。例如,设置基于CPU使用率的自动扩展:

  apiVersion: autoscaling/v1kind: HorizontalPodAutoscalermetadata:name: my-app-hpaspec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: my-appminReplicas: 2maxReplicas: 10targetCPUUtilizationPercentage: 80

my-app的CPU使用率超过80%时,Kubernetes将自动扩展Pod实例数,确保性能不会因为资源不足而受损。

  • 无状态服务设计:为了更好地支持自动扩展,微服务应尽量设计为无状态服务,即请求可以分配到任意服务实例上而不受影响。这避免了状态同步的问题,使得扩展和缩减更加灵活。通过将会话数据存储在外部数据库或缓存中(如Redis),而不是依赖服务实例的内存,可以实现无状态服务。

    案例展示:无状态会话管理

    在电商系统中,用户的购物车信息不应保存在服务实例的内存中,而是存储在Redis或数据库中。这保证了即使当前的服务实例被终止或扩展,用户的购物车状态依然保持不变。

6. 网络优化

微服务通过网络进行通信,而网络延迟和不稳定性是影响系统性能的重要因素之一。特别是在分布式架构中,服务间的调用频繁,如何优化网络通信是提高性能的重要环节。

优化策略:
  • 选择合适的通信协议:对于微服务间的通信,选择高效的协议可以显著提高性能。HTTP/REST是一种常见的选择,但在高并发场景下,使用更高效的通信协议如gRPC、HTTP/2等可以减少延迟,提升吞吐量。

    案例展示:gRPC在微服务中的应用

    gRPC基于HTTP/2协议,支持双向流和高效的二进制传输,在高性能需求的微服务架构中被广泛采用。通过gRPC进行服务间通信,性能通常比传统的REST API要高。

  • 减少不必要的服务调用:通过减少跨服务调用的次数,可以显著降低网络延迟。例如,在进行复杂数据处理时,可以将多个服务的调用合并为一个批量处理请求,避免多次往返网络通信的开销。

  • 使用服务发现与负载均衡:服务发现机制帮助系统自动找到各个微服务实例的位置,而负载均衡则确保流量均匀分配到各个实例。Kubernetes的服务发现与负载均衡机制可以有效减少网络中的瓶颈问题。反向代理工具如Nginx、Traefik也可以用来实现负载均衡。

7. 日志与监控优化

日志和监控是性能调优和问题排查的重要工具。虽然它们并不直接提高性能,但它们帮助开发者实时监控系统的运行状况,迅速定位性能瓶颈并采取相应措施。因此,日志和监控的优化对于确保系统在高并发场景下的稳定性和可维护性非常重要。

优化策略:
  • 集中式日志管理:微服务架构通常包含多个服务,分布式服务产生的日志应该集中管理。借助 ELK(Elasticsearch、Logstash、Kibana)等日志聚合工具,可以将所有服务的日志集中到一个平台进行搜索和分析。

    案例展示:ELK 集成

    可以通过Logstash将分布式微服务的日志汇集到Elasticsearch中,使用Kibana进行可视化分析。这不仅能帮助快速定位问题,还可以实时监控各服务的状态。

  • 日志采样与异步处理:对于高频的请求,如果将所有日志实时写入磁盘或发送到日志服务器,可能会影响系统性能。可以对日志进行采样,减少非关键日志的采集频率,或将日志处理改为异步,以减少对主业务的影响。

    案例展示:使用异步日志框架

    使用如Logback的异步日志框架,可以异步写日志,避免同步写日志时带来的性能开销:

  <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"><appender-ref ref="FILE" /></appender>
  • 实时监控与告警:通过Prometheus和Grafana等监控工具,对系统的CPU、内存、网络流量、服务响应时间等关键指标进行实时监控,并设置阈值告警。出现性能问题时,及时得到通知并采取措施,避免对用户造成严重影响。

    案例展示:Prometheus与Grafana集成

    在微服务架构中,可以通过Prometheus监控各个服务的运行状态,并在Grafana中设置阈值告警。例如,如果某个服务的响应时间超过设定的阈值,将自动触发告警并发送到指定的Slack频道:

  groups:- name: response_time_alertrules:- alert: HighResponseTimeexpr: rate(http_request_duration_seconds_sum[5m]) > 0.5for: 2mlabels:severity: criticalannotations:summary: "High response time detected"description: "Service response time has exceeded the threshold for the last 5 minutes."

8. 配置优化

应用的配置管理也是性能优化的关键,特别是在生产环境中,优化配置可以帮助系统更好地利用资源并提高吞吐量。

优化策略:
  • 环境特定的配置:为不同的环境(如开发、测试、生产)制定不同的配置文件,确保每个环境都能使用最合适的配置。例如,在生产环境中,可以根据实际负载配置合适的线程池大小和连接池参数。

    案例展示:Spring Boot配置文件

    使用Spring Boot的application.properties文件,针对不同环境配置不同的资源限制:

  # Production-specific configurationspring.datasource.hikari.maximum-pool-size=50server.tomcat.threads.max=200
  • 动态调整资源限制:使用现代云平台(如AWS、GCP)提供的资源自动调整功能,根据系统的实际负载动态调整CPU、内存等资源限制,以确保性能的同时,避免资源浪费。

总结与最佳实践

微服务性能优化是一个系统化的过程,涉及到通信、数据库、缓存、网络、日志监控和自动扩展等多个方面。通过合理的优化策略,微服务架构可以在大规模、高并发的场景下保持高效、稳定的运行。下面是一些优化的最佳实践总结:

  1. 减少服务间的同步调用,尽可能采用异步通信或消息队列处理非实时任务。
  2. 对数据库查询进行优化,使用索引和连接池,确保读写分离,减轻主数据库压力。
  3. 合理配置线程池、缓存和其他资源参数,确保系统在负载高峰时能够有效利用资源。
  4. 利用自动扩展功能,根据流量动态调整服务实例,确保系统弹性和成本优化。
  5. 通过监控和日志聚合工具,实时跟踪系统运行状态,并在出现问题时快速响应。

通过这些优化手段,您可以显著提升微服务架构的性能,为大规模、高并发的业务场景提供可靠保障。

预告:11.1 微服务的测试与质量保证

在下一节【11.1 微服务的测试与质量保证】中,我们将深入探讨如何

通过单元测试、集成测试、端到端测试等手段,确保微服务的高质量交付。我们还将介绍常见的测试工具与自动化测试策略,帮助您构建一个高质量、稳定的微服务系统。

相关文章:

滚雪球学SpringCloud[10.2讲]:微服务项目的性能优化与调优

全文目录: 前言性能优化与调优概述性能优化的核心目标常见的性能瓶颈来源 性能瓶颈分析与调优策略1. 服务间通信优化优化策略&#xff1a; 2. 数据库优化优化策略&#xff1a; 3. 线程池优化优化策略&#xff1a; 4. 缓存优化优化策略&#xff1a; 常见问题的排查与解决1. 慢查…...

EasyExcel将数据库里面的数据生成excel文件

EasyExcel官方文档 1.在model模块导入依赖 <!-- 生成报表--> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version> </dependency> 2.修饰实体类 package…...

【YOLO学习】YOLOv1详解

文章目录 1. 概述2. 算法流程3. 网络结构4. 损失函数 1. 概述 1. YOLO 的全称是 You Only Look Once: Unified, Real-Time Object Detection。YOLOv1 的核心思想就是利用整张图作为网络的输入&#xff0c;直接在输出层回归 bounding box 的位置和 bounding box 所属的类别。简单…...

HarmonyOS应用开发(组件库)--组件模块化开发、工具包、设计模式(持续更新)

致力于&#xff0c;UI开发拿来即用&#xff0c;提高开发效率 常量格式枚举enum格式正则表达式...手机号校验...邮箱校验 文件判断文件是否存在 网络下载下载图片从沙箱中图片转为Base64格式从资源文件中读取图片转Base64 组件输入框...矩形输入框...输入框堆叠效果&#xff08;…...

python测试开发---前后端交互Axios

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;常用于浏览器和 Node.js 中发送 HTTP 请求。它封装了 XMLHttpRequest 和 Node.js 的 http 模块&#xff0c;使得处理网络请求更加简单和直观&#xff0c;尤其适合处理异步请求。以下是 Axios 的基础概念和使用方法&#xf…...

删除视频最后几帧 剪切视频

删除视频最后几帧 剪切视频 remove_last.py import subprocess def remove_last_frame(input_file, output_file, frame_rate):command_duration [ffprobe,-v, error,-show_entries, formatduration,-of, defaultnoprint_wrappers1:nokey1,input_file]try:total_duration fl…...

SSM框架学习(四、SpringMVC实战:构建高效表述层框架)

目录 一、SpringMVC简介和体验 1.介绍 2.主要作用 3.核心组件和调用流程理解 4.快速体验 二、SpringMVC接收数据 1.访问路径设置 &#xff08;1&#xff09;精准路径匹配 &#xff08;2&#xff09;模糊路径匹配 &#xff08;3&#xff09;类和方法上添加 RequestMapp…...

戴尔笔记本电脑——重装系统

说明&#xff1a;我的电脑是戴尔G3笔记本电脑。 第一步&#xff1a;按照正常的装系统步骤&#xff0c;配置并进入U盘的PE系统 如果进入PE系统&#xff0c;一部分的硬盘找不到&#xff0c;解决办法&#xff1a;U盘PE系统——出现部分硬盘找不到的解决办法 第二步&#xff1a;磁…...

领夹麦克风哪个品牌音质最好,主播一般用什么麦克风

在这个信息爆炸的时代&#xff0c;清晰的声音传达显得尤为重要。无论是激情澎湃的演讲&#xff0c;还是温馨动人的访谈&#xff0c;一款优质的无线领夹麦克风都能让声音清晰的传播。但市场上产品繁多&#xff0c;如何挑选出性价比高、性能卓越的无线领夹麦克风呢&#xff1f;本…...

华为静态路由(route-static)

静态路由的组成 在华为路由器中&#xff0c;使用ip route-static命令配置静态路由。 一条静态路由主要包含以下要素&#xff1a; 目的地址&#xff1a;数据包要到达的目标IP地址 子网掩码&#xff1a;用于指定目的地址的网络部分和主机部分 下一跳地址&#xff08;可选&#…...

Focalboard开源项目管理系统本地Windows部署与远程访问协同办公

文章目录 前言1. 使用Docker本地部署Focalboard1.1 在Windows中安装 Docker1.2 使用Docker部署Focalboard 2. 安装Cpolar内网穿透工具3. 实现公网访问Focalboard4. 固定Focalboard公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…...

Java如何操作Elasticsearch

目录 前言 Procuct实体类 一、操作索引 二、操作文档 三、查询文档 四、复杂条件查询 五、分页查询 六、结果排序 本文文章介绍的是通过template的方法操作elasticsearch&#xff0c;他的话直接本地注入使用就行&#xff0c;repository方法还需要实现接口&#xff0c;所…...

cpu路、核、线程、主频、缓存

路&#xff1a;主板插口实际插入的 CPU 个数&#xff0c;也可以理解为主板上支持的CPU的数量。每个CPU插槽可以插入一个物理处理器芯片。例如&#xff0c;一台服务器可能有2路或4路插槽&#xff0c;这意味着它最多可以安装2个或4个物理处理器。 核&#xff1a;单块 CPU 上面能…...

【AI算法岗面试八股面经【超全整理】——深度学习】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…...

STL——map和set【map和set的介绍和使用】【multimap和multiset】

目录 map和set1.关联式容器2.键值对3.树形结构的关联式容器3.1set3.1.1set的介绍3.1.2set的使用3.1.2.1set的模版参数列表3.1.2.2set的构造3.1.2.3set的迭代器3.1.2.4set基本接口的使用3.1.2.5set使用案例 3.2map3.2.1map介绍3.2.2map的使用3.2.2.1map的构造3.2.2.2map的迭代器…...

【笔记】神领物流配置本地hosts无法访问域名(排除DNS 排除文件编码问题)已解决

第一次看着文档准备项目 踩坑不少 一遇到问题总是想着先自己解决 其实文档里就有解决方法 看文字总是喜欢跳过 导入虚拟机的时候忘记了给它设置ip地址 按照文档来就好了 配置完之后立刻就可以通过域名访问了 以防万一写一个本地hosts文件的路径在这里 通常来说都是&#xff…...

Java | Leetcode Java题解之第424题替换后的最长重复字符

题目&#xff1a; 题解&#xff1a; public class Solution {public int characterReplacement(String s, int k) {int len s.length();if (len < 2) {return len;}char[] charArray s.toCharArray();int left 0;int right 0;int res 0;int maxCount 0;int[] freq n…...

Xcode 16 Pod init 报错

pod init failed in Xcode 16 Issue #12583 CocoaPods/CocoaPods GitHub 根据你提供的步骤&#xff0c;以下是详细的操作指南来解决 CocoaPods 的问题&#xff1a; ### 步骤 1&#xff1a;在 Xcode 中转换项目文件夹为组 1. 打开你的 Xcode 项目。 2. 在左侧的项目导航器…...

【数据结构】Java的HashMap 和 HashSet 大全笔记,写算法用到的时候翻一下,百度都省了!(实践篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…...

Docker 教程:如何查看容器的最后 300 行实时日志

Docker 教程&#xff1a;如何查看容器的最后 300 行实时日志 文章目录 Docker 教程&#xff1a;如何查看容器的最后 300 行实时日志Docker 日志简介查看容器日志的基本命令查看最后 300 行实时日志的具体命令参数解释 实际案例演示示例输出 常见问题解答如何退出实时日志的查看…...

Qwen2-VL论文阅读笔记

第1章介绍 论文亮点&#xff1a; 1、 the Naive Dynamic Resolution mechanism 2、Multimodal Rotary Position Embedding (M-RoPE) 2D Rotary Position Embedding 3、统一图片和视频的处理范式、增i强视觉感知能力 4、LVLMs的scaling laws&#xff1a;2B、8B、72B 5、 dynamic…...

APScheduler、Django实现定时任务,以及任务动态操作

环境&#xff1a;Windows 11、python 3.12.3、Django 4.2.11、 APScheduler 3.10.4 背景&#xff1a;工作需要使用且用法较为复杂&#xff0c;各种功能基本都使用了 事件&#xff1a;20240920 说明&#xff1a;记录&#xff0c;方便后期自己查找 1、搭建基础环境 文件结构图…...

SpringBoot开发——整合Apache POI轻松生成精美的Excel报表

文章目录 1、准备工作2、编写代码2.1 创建实体类2.2 创建Excel生成服务2.3 创建控制器 3、测试4、结论 在许多企业应用程序中&#xff0c;导出数据到Excel表格是一项常见的需求。Spring Boot提供了许多库来简化这个过程&#xff0c;其中包括Apache POI和Spring Boot的相关模块。…...

海信智能电视的使用心得

买了海信智能电视(型号:32E2F)有一段时间了&#xff0c;要使用这个智能电视还真能考验你的智商。海信电视有很多优点&#xff0c;它的屏幕比较靓丽&#xff0c;色彩好看&#xff0c;遥控器不用对着屏幕就能操作。但也有不少缺点。 1. 海信智能电视会强迫自动更新操作系统&…...

【YashanDB知识库】客户端字符集与数据库字符集兼容问题

本文转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7352675.html?templateId1718516 问题现象 客户端yasql配置字符集为GBK&#xff0c;服务端yasdb配置字符集为UTF8&#xff0c;之后执行语句&#xff1a; 会发现&#xff1a; 期望是两个都…...

Session和Cookie是什么?有什么区别?分布式Session问题又是什么?

Session和Cookie是什么&#xff1f;有什么区别&#xff1f;分布式Session问题又是什么&#xff1f; Cookie&#xff1a;是服务器发送到浏览器并保存在本地的数据。在浏览器下一次向同一服务器再次发送请求时&#xff0c;将Cookie也发送给服务器&#xff0c;并以此来判定这个请…...

项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142454993 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…...

CSS开发全攻略

目录 一、CSS基础入门&#xff08;一&#xff09;CSS概述1.CSS的定义与作用2.CSS的历史与发展3.CSS的核心概念&#xff08;1&#xff09;选择器&#xff08;Selector&#xff09;&#xff08;2&#xff09;声明&#xff08;Declaration&#xff09;&#xff08;3&#xff09;规…...

OpenCV运动分析和目标跟踪(3)计算图像序列的加权平均值函数accumulateWeighted()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 更新一个运行平均值。 该函数计算输入图像 src 和累积器 dst 的加权和&#xff0c;使得 dst 成为帧序列的运行平均值&#xff1a; dst ( x , y…...

vue3中echarts柱状图横轴文字太多放不下怎么解决

问题&#xff1a;在做数据展示的时候&#xff0c;使用的是echarts&#xff0c;遇到了个问题&#xff0c;就是数据过多&#xff0c;但是设置的x轴的文字名称又太长&#xff0c;往往左边第一个或右边最后一个的名称展示不全&#xff0c;只有半个。 从网上找到了几种办法&#xff…...