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

《当微服务遇上Ribbon:一场负载均衡的华丽舞会》

在微服务的厨房里,如何确保每一道服务都恰到好处?揭秘Spring Cloud Ribbon如何像大厨一样精心调配资源,让负载均衡变得像烹饪艺术一样简单!

文章目录

  • Spring Cloud Ribbon 详解
    • 1. 引言
      • 微服务架构中的负载均衡需求
      • Spring Cloud Ribbon的角色与意义
    • 2. 背景介绍
      • 2.1 微服务架构概览
      • 2.2 Spring Cloud生态体系
    • 3. Spring Cloud Ribbon基础
      • 3.1 Ribbon概述
      • 3.2 快速开始
      • 3.3 负载均衡策略
    • 4. 高级特性与配置
      • 4.1 读取远程配置
      • 4.2 超时与重试机制
      • 4.3 客户端负载均衡与服务发现
    • 5. 实战应用与最佳实践
      • 5.1 故障隔离与降级策略
      • 5.2 性能调优与监控
      • 5.3 安全策略集成
    • 6. 经典问题与解决方案
      • 6.1 服务调用延迟或失败
      • 6.2 负载不均现象
      • 6.3 高并发下的稳定性
      • 6.4 配置不生效问题
      • 6.5 服务实例信息不准确
    • 7. 结论
      • Spring Cloud Ribbon的核心价值
      • 对微服务架构的贡献与局限性
    • 8. 参考文献
      • 官方文档
      • 社区博客和教程
      • 在线教程和视频
      • 开源项目
      • 论坛和社区

Spring Cloud Ribbon 详解

1. 引言

微服务架构中的负载均衡需求

想象一下,你是一个餐厅的大厨,你的厨房里有很多助手,他们各自擅长不同的菜系。随着顾客越来越多,你开始意识到单靠一个助手来处理所有的订单是不够的。这时候,你需要一个系统,能够根据每个助手的忙碌程度和特长,合理分配顾客的订单。这就是微服务架构中负载均衡的现实写照。

在微服务架构中,我们把一个大型应用拆分成许多小的、独立的服务,每个服务负责处理特定的业务逻辑。随着服务数量的增加,如何合理地分配请求,确保系统的高效和稳定运行,就成了一个重要的问题。这时,负载均衡器就像那位聪明的餐厅经理,帮助我们管理这些服务,确保每个服务都能在最佳状态下工作。

Spring Cloud Ribbon的角色与意义

现在,让我们来谈谈Spring Cloud Ribbon,这位微服务架构中的“餐厅经理”。Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它与Spring Cloud紧密集成,为我们提供了一种简单而强大的方法来实现服务之间的负载均衡。

想象一下,你是一位顾客,走进了一家装饰华丽的餐厅,你并不知道哪个厨师最擅长做你喜欢的菜。这时,Ribbon就像那位热情的服务员,他会根据厨师的忙碌程度、以往的表现和你的喜好,为你推荐最合适的厨师。这样,你不仅能享受到美味的菜肴,还能确保整个餐厅的运作流畅。

Ribbon的主要功能包括:

  • 服务发现:它能够感知到系统中所有可用的服务实例,就像服务员知道哪些厨师正在工作。
  • 客户端负载均衡:它根据预设的规则(如轮询、随机等)来分配请求,确保服务的负载均衡。
  • 故障转移:当某个服务实例出现问题时,Ribbon能够自动将请求转发到其他健康的服务实例,就像服务员会将你的订单重新分配给另一位厨师。

通过Ribbon,我们可以轻松地实现服务的高可用性和伸缩性,让微服务架构更加健壮和灵活。

Spring Cloud Ribbon 不仅仅是一个技术组件,更是微服务架构中的一位重要角色,帮助我们构建更加稳定和高效的系统。接下来,我们将深入了解Ribbon的背景、基础以及高级特性,一起探索这位“餐厅经理”的更多奥秘。

在这里插入图片描述

2. 背景介绍

2.1 微服务架构概览

在微服务的王国里,每个服务都是一个独立的小王国,它们各自为政,却又相互依赖。微服务架构就像是一场盛大的宴会,每个服务都是宴会上的一道佳肴,它们共同构成了一场丰富多彩的盛宴。

微服务架构特点

  • 独立性:每个服务都是独立的,拥有自己的数据库和业务逻辑。
  • 灵活性:服务可以独立部署和扩展,适应快速变化的业务需求。
  • 技术多样性:不同的服务可以使用不同的技术栈,以最适合的方式解决问题。

挑战

  • 服务发现:如何在众多服务中找到需要的服务。
  • 负载均衡:如何合理分配请求,避免某些服务过载。
  • 数据一致性:多个服务之间的数据如何保持一致性。

服务治理的重要性
在微服务架构中,服务治理就像是宴会的总指挥,确保每道菜都能按时上桌,每位客人都能得到满意的服务。服务治理包括服务的注册、发现、配置管理、监控等,是微服务架构稳定运行的基石。

2.2 Spring Cloud生态体系

Spring Cloud是微服务架构中的瑞士军刀,它提供了一整套工具和运行时来简化分布式系统的开发。Spring Cloud就像是微服务王国的皇家总管,为各个服务提供支持和协调。

Spring Cloud核心组件介绍

  • Eureka:服务注册与发现的中心,就像是宴会的菜单,让客人知道有哪些服务可用。
  • Hystrix:断路器,防止服务雪崩效应,就像是宴会上的应急计划,确保服务的稳定运行。
  • Zuul:API网关,统一的请求入口,就像是宴会的迎宾员,引导客人进入正确的服务区域。
  • Config:配置中心,集中管理配置信息,就像是宴会的食谱,统一调配食材和调料。

Ribbon在Spring Cloud中的位置
Ribbon在Spring Cloud生态中扮演着负载均衡器的角色。它与Eureka紧密集成,当Eureka发现服务时,Ribbon就会根据服务列表进行负载均衡,确保请求被合理分配。Ribbon就像是宴会上的智能点餐系统,根据客人的喜好和厨师的忙碌程度,推荐最合适的菜品。

咱们了解了Spring Cloud Ribbon在微服务架构中的重要性,它不仅仅是一个简单的负载均衡器,更是整个服务治理体系中不可或缺的一部分。接下来,我们将深入了解Ribbon的基础,探索如何在这个微服务的宴会中,让每一位“客人”都享受到最佳的服务体验。

3. Spring Cloud Ribbon基础

3.1 Ribbon概述

想象一下,你是一个乐队的指挥家,你的任务是确保每个乐手都能在正确的时间发出正确的音符。在微服务架构中,Ribbon就像是那个指挥家,它确保每个服务都能在正确的时刻接收到正确的请求。

主要功能

  • 客户端负载均衡:Ribbon能够根据服务的健康状况和响应时间等因素,智能地分配请求到不同的服务实例。
  • 与Eureka集成:Ribbon可以与Eureka服务注册中心无缝集成,自动发现服务实例的变化,并更新负载均衡策略。

工作原理

  • 当一个请求到来时,Ribbon会先询问Eureka,获取当前可用的服务实例列表。
  • 然后,Ribbon会根据配置的负载均衡策略(比如轮询、随机或基于响应时间的加权),选择一个服务实例来处理请求。

3.2 快速开始

让我们来点实际的,就像你第一次下厨,跟着食谱一步步来。

添加依赖
在你的Spring Boot项目中,加入Ribbon和Eureka的依赖。如果你使用的是Maven,你的pom.xml文件应该包含类似这样的配置:

<dependencies><!-- Spring Cloud Starter --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency>
</dependencies>

配置
application.propertiesapplication.yml中,配置Eureka和Ribbon的相关属性:

# Eureka配置
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/# Ribbon配置
server.port=8080

实现服务调用
在你的服务中,使用@LoadBalanced注解来创建一个负载均衡的RestTemplate,这样就可以通过Ribbon来调用其他服务了。

@Configuration
public class RibbonConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

3.3 负载均衡策略

现在,让我们来谈谈Ribbon的负载均衡策略,就像选择乐队中的乐手一样,我们希望每个乐手都能得到公平的展示机会。

默认策略
Ribbon默认使用轮询策略,就像乐队指挥家轮流点名乐手一样,确保每个服务都有机会处理请求。

自定义策略
如果你想要更精细的控制,Ribbon允许你自定义负载均衡策略。比如,你可以根据服务的响应时间来加权分配请求,就像乐队指挥家根据乐手的表现来调整他们的演奏频率。

健康检查与过滤机制
Ribbon还会进行健康检查,就像指挥家检查乐手的状态一样,确保只有健康的服务实例才会接收到请求。你可以通过配置文件或编程方式来定义哪些服务实例被认为是健康的。


通过这个基础介绍,我们可以看到Ribbon是如何在微服务架构中扮演负载均衡器的角色的。就像乐队指挥家一样,Ribbon确保每个服务都能在最佳状态下工作,同时提供灵活性和可定制性,以适应不同的业务需求。接下来,我们将探索Ribbon的高级特性,看看如何让这个乐队的演出更加精彩。

4. 高级特性与配置

4.1 读取远程配置

想象一下,你是一位厨师,每天的菜单都由远在千里之外的总厨通过信鸽传来。在Spring Cloud的世界中,Spring Cloud Config就扮演着这位总厨的角色,而Ribbon和其它服务就像是那些等待菜单的厨师。

Spring Cloud Config集成
通过Config Server,我们可以集中管理配置信息,就像总厨管理着整个餐厅的菜单。Ribbon可以通过Config Server读取配置信息,实现动态调整负载均衡策略。

动态配置更新
当总厨更新了菜单,厨师们需要立即知道。同样,当Config Server更新了配置,Ribbon可以通过刷新机制动态获取最新的配置,无需重启服务。

4.2 超时与重试机制

在厨房中,如果一道菜迟迟未上,顾客可能会不耐烦。在服务调用中,如果请求迟迟未响应,我们也需要采取措施。

设置连接与读取超时
Ribbon允许你为服务调用设置超时时间,就像给厨师设定完成菜品的时间限制。如果超出了这个时间,Ribbon会认为服务不可用,转而调用其他服务。

异常重试策略
就像厨师在准备菜品时可能会遇到小问题,需要重新尝试一样,Ribbon也可以配置重试策略。当服务调用失败时,Ribbon可以自动重试,直到成功或者达到重试次数上限。

在这里插入图片描述

4.3 客户端负载均衡与服务发现

想象一下,你是一位餐厅经理,你不仅需要知道哪些厨师在工作,还需要知道他们的工作状态,以便合理分配顾客。

与Eureka的深度集成
Ribbon与Eureka的集成,让Ribbon能够实时获取服务实例的信息。就像餐厅经理通过监控系统了解厨师的工作状态。

自定义服务列表获取逻辑
Ribbon允许你自定义获取服务列表的逻辑,就像餐厅经理可以根据顾客的特殊需求,选择特定的厨师来准备菜品。


通过这些高级特性,Ribbon不仅能够实现基本的负载均衡,还能够根据实时的配置更新、服务状态和业务需求,动态调整其行为。就像一个高级餐厅,不仅提供美味的食物,还能根据顾客的反馈和偏好,不断优化服务。

接下来,我们将深入实战应用,看看如何将这些高级特性应用到实际场景中,让Ribbon成为微服务架构中的超级明星。

5. 实战应用与最佳实践

5.1 故障隔离与降级策略

想象一下,你是一位船长,你的船在茫茫大海中航行,突然遇到了暴风雨。这时,你需要迅速采取措施保护船只和船员。在微服务架构中,故障隔离和降级策略就像是你的救生圈和备用帆。

Hystrix与Ribbon的协同
Hystrix是一个断路器,当某个服务出现问题时,它可以防止问题扩散到整个系统。而Ribbon则可以与Hystrix协同工作,当检测到某个服务实例出现问题时,Ribbon会将其从服务列表中移除,直到该实例恢复正常。

服务降级处理
服务降级是一种策略,当系统负载过高或某些服务不可用时,系统会提供简化版本的服务。就像在暴风雨中,船长可能会决定放弃一些货物,以保证船只和船员的安全。

5.2 性能调优与监控

想象一下,你是一位赛车手,你需要不断调整你的赛车,以确保它在赛道上的表现最佳。在微服务架构中,性能调优和监控就像是你的赛车调校工具和仪表盘。

性能指标监控
通过监控工具,如Prometheus或Spring Boot Actuator,你可以实时监控服务的性能指标,如响应时间、吞吐量等。这就像是赛车手通过仪表盘监控赛车的速度和油耗。

调优建议与案例分析
根据监控数据,你可以对服务进行调优。比如,你可能需要增加服务实例的数量,或者优化服务的代码和配置。就像赛车手根据赛道情况调整赛车的设置。

5.3 安全策略集成

想象一下,你是一位银行的保安,你的任务是保护银行的安全。在微服务架构中,安全策略集成就像是你的安全系统和监控摄像头。

身份验证与授权
通过集成OAuth2、JWT等安全机制,你可以确保只有授权的用户和服务才能访问你的服务。这就像是银行的保安检查进入者的身份证和访问权限。

安全最佳实践
遵循安全最佳实践,如使用HTTPS、定期更新安全证书、限制访问权限等,可以提高系统的安全性。这就像是银行保安定期进行安全演练,确保在紧急情况下能够迅速响应。


通过这些实战应用和最佳实践,我们可以确保微服务架构的稳定性、性能和安全性。就像一个经验丰富的船长、赛车手和银行保安,我们通过不断的学习和实践,提高我们的技能,以应对各种挑战。

接下来,我们将探讨一些经典问题及其解决方案,看看如何在实际应用中解决这些问题,让我们的微服务架构更加健壮和可靠。

6. 经典问题与解决方案

6.1 服务调用延迟或失败

想象一下,你是一个快递小哥,每天骑着你的小摩托穿梭在城市的大街小巷。但是有一天,你发现有些包裹总是送不到,或者送得特别慢。在微服务的世界里,服务调用的延迟或失败,就像是这些送不出去的包裹。

网络问题排查
首先,你需要检查网络连接,就像检查你的小摩托的油路和电路一样。在服务调用中,这可能意味着检查网络延迟、丢包率等。

负载策略调整
如果发现某些服务实例响应特别慢,可能需要调整Ribbon的负载均衡策略。比如,你可以尝试更换为基于响应时间的加权策略,就像选择一条不那么拥堵的路线。

6.2 负载不均现象

再想象一下,你是一个农场主,你的农场有很多奶牛。但是有一天,你发现有些奶牛挤奶挤得特别频繁,而有些奶牛却几乎没被挤过。在微服务中,这就像是负载不均。

配置不当分析
首先,你需要检查Ribbon的配置,看看是否有不当之处。比如,检查服务实例的权重是否设置得当,或者是否有服务实例被错误地标记为不健康。

均衡策略优化
你可能需要优化负载均衡策略,比如引入更智能的算法,或者根据服务的实时性能数据动态调整权重。

6.3 高并发下的稳定性

想象你是一个游乐场的管理员,你的任务是确保在游客高峰时段,所有的游乐设施都能稳定运行。

并发控制策略
在高并发情况下,你可能需要实施并发控制策略,比如限制同时访问服务的请求数量,或者使用限流算法来控制请求的速率。

熔断与限流机制
就像游乐场在游客过多时会限制进入某些区域的人数一样,熔断和限流机制可以帮助保护服务不被过多的请求压垮。

6.4 配置不生效问题

想象你是一个摄影师,你已经调整好了所有的设置,但是拍出来的照片还是不理想。在微服务中,配置不生效就像是这些不理想的照片。

配置刷新机制理解
你需要理解Spring Cloud Config的配置刷新机制,确保你的服务能够及时获取到最新的配置。

环境与上下文问题排查
检查服务的环境和上下文设置,确保配置项被正确地加载和应用。

6.5 服务实例信息不准确

想象你是一个图书馆管理员,你需要确保每本书的位置信息都是准确的,以便读者能够快速找到。

Eureka服务注册与发现故障处理
如果服务实例信息不准确,可能是因为Eureka服务注册与发现出现了问题。检查Eureka服务器的日志,看看是否有异常或错误。

Ribbon服务列表缓存问题
Ribbon可能会缓存服务列表,如果服务实例有变动,需要确保Ribbon能够及时更新其缓存。


通过这些生动的例子和解决方案,我们可以看到,在微服务架构中,遇到问题并不可怕,关键是要有正确的方法和工具来诊断和解决问题。就像生活中的各种角色,我们通过不断学习和实践,变得更加专业和高效。接下来,我们将总结Spring Cloud Ribbon的核心价值,以及它对微服务架构的贡献与局限性。

在这里插入图片描述

7. 结论

Spring Cloud Ribbon的核心价值

想象一下,你是一位园丁,你的花园里种满了各式各样的花朵。为了让花园看起来更加和谐美丽,你需要精心地修剪和照料每一朵花。在微服务的花园中,Ribbon就像那位园丁,它精心地照料着每一个服务,确保整个系统的健康和平衡。

核心价值

  • 简化负载均衡:Ribbon为客户端提供了一种简单而强大的负载均衡能力,让开发者可以专注于业务逻辑,而不必过多地担心服务之间的调用问题。
  • 与Spring Cloud生态的无缝集成:Ribbon与Eureka、Hystrix等组件的紧密集成,使得在Spring Cloud生态中构建高可用的微服务架构变得更加容易。
  • 灵活性和可扩展性:Ribbon支持自定义负载均衡策略,开发者可以根据业务需求灵活地调整和优化服务调用。

对微服务架构的贡献与局限性

贡献

  • Ribbon通过其负载均衡能力,显著提高了微服务架构的伸缩性和可用性。
  • 它与服务发现组件的集成,使得服务实例的动态管理变得更加简单。
  • 通过与Hystrix等断路器的配合,Ribbon帮助系统在面对故障时能够更加优雅地降级和恢复。

局限性

  • 作为一个客户端负载均衡器,Ribbon需要与服务发现组件(如Eureka)配合使用,这可能会增加系统的复杂性。
  • 在某些场景下,Ribbon可能不如服务端负载均衡器(如Nginx)那样高效,特别是在处理大规模服务集群时。
  • 随着微服务架构的不断发展,Ribbon可能需要不断更新和优化,以适应新的技术和业务需求。

就像园丁精心照料花园一样,Ribbon以其核心价值和贡献,精心照料着微服务架构的每一个角落。虽然它有其局限性,但通过不断的学习和实践,我们可以更好地利用Ribbon,让微服务的花园绽放出更加绚丽的花朵。

随着技术的发展,我们有理由相信,Ribbon和Spring Cloud生态将继续进化,为我们带来更多的可能性和惊喜。让我们拭目以待,看看未来它们将如何帮助我们构建更加强大和灵活的微服务架构。


8. 参考文献

官方文档

  1. Spring Cloud官方文档
    Spring Cloud官网
    这是最权威的资源,提供了关于Spring Cloud各个方面的详细信息。

  2. Spring Cloud Ribbon官方文档
    Ribbon文档
    详细介绍了Ribbon的使用方法和配置选项。

社区博客和教程

  1. 《微服务设计》
    作者:Sam Newman
    这本书深入探讨了微服务架构的设计原则和模式。

  2. 《Spring Cloud与Docker微服务架构实战》
    作者:翟永超
    结合实战案例,详细介绍了Spring Cloud和Docker在微服务架构中的应用。

  3. 《深入理解Spring Cloud与微服务构建》
    作者:周立
    深入分析了Spring Cloud的核心组件和微服务构建的关键技术。

在线教程和视频

  1. InfoQ - Spring Cloud专题
    InfoQ Spring Cloud
    InfoQ上有许多关于Spring Cloud的高质量文章和访谈。

  2. YouTube - Spring Cloud系列教程
    Spring Cloud Tutorials
    YouTube上有许多视频教程,适合初学者和进阶学习者。

开源项目

  1. GitHub - Spring Cloud Samples
    Spring Cloud Samples
    GitHub上的官方示例项目,包含了许多Spring Cloud组件的使用示例。

  2. GitHub - Spring Cloud Netflix Ribbon
    Ribbon GitHub Repo
    Ribbon的GitHub仓库,可以查看源码和提交记录,了解其内部实现。

论坛和社区

  1. Stack Overflow - Spring Cloud标签
    Stack Overflow
    Stack Overflow上有许多关于Spring Cloud的问题和讨论,是解决实际问题的好去处。

  2. Spring Cloud Gitter聊天室
    Gitter
    Spring Cloud的官方Gitter聊天室,可以与开发者和其他用户实时交流。

相关文章:

《当微服务遇上Ribbon:一场负载均衡的华丽舞会》

在微服务的厨房里&#xff0c;如何确保每一道服务都恰到好处&#xff1f;揭秘Spring Cloud Ribbon如何像大厨一样精心调配资源&#xff0c;让负载均衡变得像烹饪艺术一样简单&#xff01; 文章目录 Spring Cloud Ribbon 详解1. 引言微服务架构中的负载均衡需求Spring Cloud Rib…...

简单随机数据算法

文章目录 一&#xff0c;需求概述二&#xff0c;实现代码三、测试代码四、测试结果五、源码传送六、效果演示 一&#xff0c;需求概述 系统启动时&#xff0c;读取一组图片数据&#xff0c;通过接口返回给前台&#xff0c;要求&#xff1a; 图片随机相邻图片不重复 二&#…...

js画思维导图代码2

这段代码是一个使用Vue.js和D3.js构建的树形图组件。它是一个Vue组件&#xff0c;用于创建和显示一个交互式的树形结构图。下面是对这段代码的简要分析&#xff1a; 模板部分 (<template>): 定义了组件的HTML结构&#xff0c;包括一个隐藏的提示框(#tooltip)和一个用于显…...

使用 Flask 实现异步请求处理

文章目录 为什么需要异步请求处理&#xff1f;在 Flask 中实现异步请求处理使用 Flask-Cors 扩展 总结 在开发 Web 应用程序时&#xff0c;异步请求处理是提高性能和并发能力的重要方法之一。Flask 是一个轻量级的 Web 框架&#xff0c;它提供了易于使用的工具来实现异步请求处…...

关于c++的通过cin.get()维持黑框的思考

1.前言 由于本科没有学过c语言&#xff0c;研究生阶段接触c上手有点困难&#xff0c;今天遇到关于通过cin.get()来让黑框维持的原因。 2.思考 cin.get()维持黑框不消失的原因一言蔽之就是等待输入。等待键盘的输入内容并回车&#xff08;一般是回车&#xff09;后cin.get()才…...

fastadmin接口输出图片 自动拼接网站URL

先自定义常量 1.文件接口路径 修改核心文件 application\common\controller\Api.php/*** 构造方法* access public* param Request $request Request 对象*/public function __construct(Request $request null){$this->request is_null($request) ? Request::instance…...

VMware Workstation 不可恢复错误:(vmui) 错误代码0xc0000094

软件版本 vmware 17 错误情况 VMware Workstation 不可恢复错误&#xff1a;(vmui) Exception 0xc0000094 has occurred. 问题原因 VMware升级到17.0后&#xff0c;将虚拟机环境的【硬件兼容性】升级至Workstation 17.X后&#xff0c;无法修改设备参数。 解决办法 打开需…...

DockerNetwork

Docker Network Docker Network 是 Docker 引擎提供的一种功能&#xff0c;用于管理 Docker 容器之间以及容器与外部网络之间的网络通信。它允许用户定义和配置容器的网络环境&#xff0c;以便容器之间可以相互通信&#xff0c;并与外部网络进行连接。 Docker Network 提供了以…...

QT学习(20):QStyle类

Qt包含一组QStyle子类&#xff0c;这些子类&#xff08;QWindowsStyle&#xff0c;QMacStyle等&#xff09;模拟Qt支持的不同平台的样式&#xff0c;默认情况下&#xff0c;这些样式内置在Qt GUI模块中&#xff0c;样式也可以作为插件提供。 Qt的内置widgets使用QStyle来执行几…...

hadoop学习之MapReduce案例:输出每个班级中的成绩前三名的学生

hadoop学习之MapReduce案例&#xff1a;输出每个班级中的成绩前三名的学生 所要处理的数据案例&#xff1a; 1500100001 施笑槐,22,女,文科六班,406 1500100002 吕金鹏,24,男,文科六班,440 1500100003 单乐蕊,22,女,理科六班,359 1500100004 葛德曜,24,男,理科三班,421 15001…...

【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk

背景&#xff1a;部分客户需求将自己网站打包成app&#xff0c;供用户在浏览器安装使用、 网页网址快速生成app 准备材料操作流程第一步&#xff1a;打开HBuilder X新建项目第二步创建Wap2App项目第三步修改App图标第四步发布app第五步查看apk 准备材料 1.需要打包的网页 2.ap…...

学习thinkphp的循环标签

1.FOREACH标签 foreach标签的用法和PHP语法非常接近&#xff0c;用于循环输出数组或者对象的属性&#xff0c;用法如下&#xff1a; $list User::all(); View::assign(list,$list); 模板文件中可以这样输出 {foreach $list as $key>$vo } {$vo.id}:{$vo.name} {/foreac…...

根据标签名递归读取xml字符串中element

工具类&#xff1a; /*** 根据标签名递归读取xml字符串中element* 例&#xff1a;* String xml * "<req>\n" * "<tag1></tag1>\n" * "<tag2>\n" * " <tag4></tag4>\n" * "</tag2>\n&…...

Ovid医学库文献如何在家查找下载

今天讲的数据库是一个知名医学库——Ovid Ovid隶属于威科集团的健康出版事业集团&#xff0c;与LWW、Adis等公司属于姊妹公司。Ovid数据库在医学外文文献数据库方面占据绝对地位&#xff0c;目前已有包涵人文、科技等多领域数据库300个&#xff0c;其中80多个是生物医学数据库…...

在已创建的git工程中添加.gitignore

有些代码创建git时&#xff0c;为了方便将所有文件都加入了git管理&#xff0c;但实际有些库的Makefile文件和编译目录的文件不需要加入管理&#xff0c;否则每次提交或编译后&#xff0c;git diff将看到非常多的冗余信息。而我们修改的核心代码都淹没在这些大量无用的信息里面…...

MR混合现实情景实训教学系统在临床医学课堂上的应用

MR混合现实情景实训教学系统在临床医学课堂上的应用可以带来许多积极的影响&#xff0c;具体表现在以下几个方面&#xff1a; 1. 增强教学的真实感和互动性&#xff1a;MR混合现实技术能够创建出高度逼真的模拟临床环境&#xff0c;使学生能够身临其境地体验临床实践。这种技术…...

就说说开一家公司的流程和成本

本人在进互联网公司和外企前&#xff0c;也和一位老板合作做&#xff0c;在一家小微公司里做过技术负责人&#xff0c;所以也了解开办一家公司的流程以及公司运作的成本。 通过本文大家其实能看到创业的难度。具体来讲&#xff0c;开办并维持着一家公司&#xff0c;其实需要操…...

【前端】面试八股文——数组扁平化的实现

【前端】面试八股文——数组扁平化的实现 数组扁平化是指将一个多维数组转换为一维数组。在前端开发中&#xff0c;处理这样的数组结构是很常见的需求。本文将详细介绍几种实现数组扁平化的方法&#xff0c;以帮助读者更好地理解和应用这些技术。 1. 使用 Array.prototype.fl…...

2005-2022年各省全体居民人均可支配收入数据(无缺失)

2005-2022年各省全体居民人均可支配收入数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;2005-2022年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;全体居民人均可支配收入 4、范围&#xff1a;31省 5、缺失情况&#xff1a;无缺失 6、指标解释…...

JVM调优,何时调优,怎么调优,面试的时候调优

一般Java面试的时候&#xff0c;面试官都喜欢问一个面试题&#xff0c;就是JVM调优的面试题&#xff0c;相信超过99%的小伙伴都没有过JVM调优的经历。说实话&#xff0c;我以前也没有相关的调优经验&#xff0c;也非常喜欢百度&#xff0c;这个问题到底想问什么&#xff0c;应该…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...