解析Eureka的架构

1. 引言

1.1 Eureka的定义与背景

Eureka是由Netflix开发的一个RESTful服务,用于服务发现。它是微服务架构中的一个核心组件,主要用于管理服务的注册和发现。Eureka允许服务提供者注册自己的服务信息,同时也允许服务消费者查询可用的服务,以便进行通信和数据交互。Eureka的设计目标是简化微服务之间的相互通信,提高系统的灵活性和可扩展性。

1.2 在微服务架构中的重要性

在微服务架构中,服务数量庞大且动态变化,服务实例可能随时上线或下线。Eureka通过提供服务注册和发现功能,使得微服务之间的调用变得更加简单和高效。具体来说,Eureka的重要性体现在以下几个方面:

  • 动态服务管理:Eureka支持服务的动态注册和注销,允许微服务在运行时自我管理,确保系统能够适应变化。
  • 负载均衡:通过Eureka,服务消费者可以获取多个服务实例的信息,从而实现负载均衡,提高系统的可用性和性能。
  • 容错处理:Eureka具备故障检测能力,能够在服务不可用时及时更新服务列表,保证服务调用的可靠性。
  • 简化配置:Eureka集成了许多配置管理功能,减少了开发和运维的复杂度,使得微服务的部署和维护更加便捷。

通过Eureka,微服务架构能够实现高可用、高扩展性的系统设计,为现代应用程序的开发提供了强有力的支持。

2. Eureka架构概述

Eureka是一个RESTful服务,用于中间层服务的注册与发现。它是Netflix开源的一个组件,广泛用于微服务架构中,帮助服务实例相互发现。

2.1 Eureka Server与Eureka Client的角色

Eureka Server:

  • 服务注册中心:Eureka Server充当服务注册中心,负责管理所有服务实例的注册信息。
  • 提供服务发现:Eureka Server能够提供服务实例的信息,供其他服务进行调用和访问。
  • 高可用性:Eureka Server可以部署多个实例,以实现负载均衡和高可用性。通过使用客户端负载均衡,Eureka能够保证在某个实例不可用时,服务仍然可以被发现。

Eureka Client:

  • 服务注册:每个微服务实例作为Eureka Client,启动时会向Eureka Server注册自身的信息(如服务名、实例ID、IP地址、端口等)。
  • 心跳机制:Eureka Client定期向Eureka Server发送心跳,以维持注册状态。如果某个客户端停止发送心跳,Eureka Server会在一定时间后将其标记为下线。
  • 服务发现:Eureka Client能够从Eureka Server获取其他服务实例的信息,从而实现服务调用。

2.2 服务注册与发现流程

服务注册流程:

  1. 服务启动:微服务实例启动时,会初始化Eureka Client。
  2. 发送注册请求:Eureka Client向Eureka Server发送注册请求,包含服务实例的信息。
  3. Eureka Server接收注册:Eureka Server接收注册请求,并将服务实例信息存储在其注册表中。
  4. 返回注册结果:Eureka Server返回注册成功的响应给Eureka Client,服务实例开始向Eureka Server定期发送心跳。

服务发现流程:

  1. 服务请求:当微服务需要调用其他服务时,首先会向Eureka Server请求服务列表。
  2. 获取服务实例:Eureka Server返回当前注册的服务实例列表。
  3. 负载均衡选择:Eureka Client根据负载均衡策略,从服务实例列表中选择一个实例进行调用。
  4. 服务调用:Eureka Client向选定的服务实例发送请求,完成服务调用。

3. Eureka的核心特性

3.1 自我保护机制

Eureka的自我保护机制可以有效防止由于网络抖动或临时性故障导致的服务实例不可用情况。当Eureka Server发现某个服务实例在一定时间内未能心跳(即未定期向Eureka Server发送状态更新),它并不会立即将该实例从注册列表中移除。相反,Eureka会启动自我保护模式,允许服务实例在短时间内保持“存活”状态,防止服务的意外下线。这种机制的主要目的是避免因短暂的网络问题而导致的服务大规模宕机,从而提高系统的稳定性。

3.2 客户端负载均衡

Eureka实现了客户端负载均衡的功能,使得客户端能够在请求服务时根据注册的服务实例动态选择一个合适的实例。Eureka与Spring Cloud Ribbon等负载均衡组件紧密集成,允许开发者通过配置来选择负载均衡策略(如轮询、随机等)。客户端在获取服务实例列表后,可以选择最适合的实例进行请求,从而提高系统的吞吐量和响应速度,优化资源的利用。

3.3 服务实例的健康检查

Eureka提供了服务实例的健康检查机制,以确保客户端请求的服务实例是可用的。每个注册的服务实例在向Eureka Server发送心跳的同时,也可以在心跳请求中包含健康状态信息。Eureka Server会根据这些信息来判断服务实例的健康状态,并在必要时将不可用的实例从服务列表中剔除。这样,客户端在进行负载均衡时就能避免将请求发送到不可用的服务实例,提高了整个系统的可靠性和可用性。

4. Eureka的使用场景

4.1 微服务架构中的应用示例

在微服务架构中,各个服务通常是独立运行的,但它们需要通过网络进行通信和协作。Eureka的服务注册与发现机制为这些服务提供了一个动态的、中心化的注册表,便于服务之间的相互发现和通信。以下是一些典型应用场景:

  • 动态服务发现:当一个服务实例上线时,它会自动注册到Eureka Server,其他需要调用此服务的服务实例可以通过Eureka Server获取其详细信息。这样,服务提供者和服务消费者都不需要硬编码服务地址,增强了系统的灵活性和动态扩展能力。
  • 弹性扩展:在系统负载增加时,可以部署更多的服务实例,它们会自动注册到Eureka Server,从而实现服务的无缝扩展。当负载下降时,多余的实例可以被下线并从Eureka Server中移除。
  • 故障转移:如果某个服务实例宕机,Eureka会在健康检查中发现,并将该实例从可用服务列表中剔除,使得服务消费者可以自动选择其他可用实例进行调用,保证了系统的高可用性。

4.2 与Spring Cloud的集成

Eureka在与Spring Cloud集成时,可以实现更加强大的功能和更便捷的配置。Spring Cloud Netflix是Spring Cloud生态系统中提供Eureka功能的模块。以下是Eureka与Spring Cloud集成的优势和示例:

  • 快速启动和配置:通过Spring Boot和Spring Cloud的自动配置功能,开发者可以快速配置Eureka Server和Eureka Client。只需在application.propertiesapplication.yml文件中添加必要的配置,即可启动Eureka。
  • 服务注册与发现的自动化:Spring Cloud Netflix Eureka使服务在启动时自动注册到Eureka Server。消费者可以通过简单的声明式注解或配置,从Eureka Server获取服务实例列表,实现服务发现。
  • Spring Cloud Ribbon负载均衡:Eureka与Spring Cloud Ribbon无缝集成,提供客户端负载均衡功能,使得请求可以根据负载策略选择服务实例。
  • Spring Cloud Feign支持:通过与Feign结合,开发者可以实现更简洁的服务调用,Feign会自动使用Eureka的服务发现功能来调用远程服务,使服务间调用代码更加简洁和可维护。

例如,一个简单的Eureka Server配置可以如下实现:

# application.yml for Eureka Server
server:
  port: 8761

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
  server:
    enable-self-preservation: true

一个Eureka Client的配置示例如下:

# application.yml for Eureka Client
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

通过这些配置,开发者可以轻松搭建一个支持服务注册与发现的微服务架构。Spring Cloud与Eureka的结合为开发者提供了强大的功能,简化了微服务的管理和交互流程。

5. Eureka的配置

5.1 基本配置示例

在设置Eureka时,基本配置包括Eureka Server和Eureka Client的简单配置,以确保服务能够正常注册和发现。

Eureka Server的基本配置
application.yml中,Eureka Server的基础配置如下:

server:
  port: 8761  # Eureka Server运行的端口

eureka:
  client:
    register-with-eureka: false  # 不向自身注册
    fetch-registry: false        # 不从注册中心获取注册表
  server:
    enable-self-preservation: true  # 开启自我保护机制

Eureka Client的基本配置
Eureka Client需要在application.ymlapplication.properties中进行配置,以便与Eureka Server通信。

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # 指定Eureka Server的URL
  instance:
    prefer-ip-address: true  # 使用IP地址进行服务注册

上述配置适用于将Eureka Server和Client部署在本地环境中的基本场景。

5.2 高级配置选项

为了应对复杂场景,Eureka提供了一些高级配置选项,以实现更高的灵活性和可用性。

高级配置选项示例

  1. 自定义实例ID
    配置服务实例的唯一ID,以便于在注册表中识别。

    eureka:
      instance:
        instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
    
  2. 心跳间隔和超时设置
    自定义Eureka Client发送心跳的频率和超时参数,以确保服务的状态更新及时。

    eureka:
      client:
        lease-renewal-interval-in-seconds: 10  # 心跳间隔(默认30秒)
        lease-expiration-duration-in-seconds: 90  # 超时期限(默认90秒)
    
  3. 服务过滤和注册管理
    配置只允许某些服务注册到Eureka Server。

    eureka:
      server:
        registry-sync-retries: 3  # 注册表同步重试次数
        eviction-interval-timer-in-ms: 60000  # 实例剔除间隔时间
    
  4. 自我保护机制设置
    可以启用或禁用自我保护机制,以防止网络故障时大规模服务下线。

    eureka:
      server:
        enable-self-preservation: false  # 禁用自我保护
    
  5. 配置多区域支持
    在跨数据中心或多区域部署时,可以配置Eureka以支持多区域注册表同步。

    eureka:
      client:
        availability-zones:
          default: us-east-1, us-west-2  # 多个可用区域
        service-url:
          us-east-1: http://eureka-east-1.example.com/eureka/
          us-west-2: http://eureka-west-2.example.com/eureka/
    

通过以上基本和高级配置示例,开发者可以根据不同的需求灵活调整Eureka的配置,以满足生产环境下的高可用性、稳定性和扩展性需求。

6. Eureka的监控与管理

6.1 Eureka Dashboard介绍

Eureka Dashboard是Eureka Server提供的一个可视化界面,用于监控和管理已注册的服务实例。通过该Dashboard,运维人员和开发者可以直观地查看服务注册中心的状态、注册的服务列表、每个服务的实例信息及其状态。

主要功能

  • 服务列表:显示所有已注册的服务,包括服务名、实例ID、IP地址、端口、状态等。
  • 实例详情:点击某个服务,可以查看其注册的实例详情,如实例的健康状态、最后一次心跳时间等。
  • 自我保护状态:Dashboard还会显示Eureka Server当前是否处于自我保护模式,并提示潜在的问题。
  • 状态检查:提供了Eureka Server自身的状态检查信息,如是否处于UP状态,以及一些统计数据。

如何访问

  • 默认情况下,Eureka Server的Dashboard可以通过http://<Eureka-Server-Host>:<port>访问。例如,如果Eureka Server运行在本地的8761端口上,访问地址为http://localhost:8761
  • 该界面不需要额外的配置,只需确保Eureka Server正确启动。

6.2 常见的监控指标

Eureka在运行中会暴露一系列监控指标,用于监控Eureka Server和Eureka Client的性能和健康状态。以下是一些常见和关键的监控指标:

  1. 注册实例数量

    • 已注册实例总数:显示当前在Eureka Server上注册的所有服务实例数量。
    • 可用实例数量:显示目前被认为健康、可用的实例数量。
  2. 心跳和续租

    • 心跳频率:监控Eureka Client发送到Eureka Server的心跳频率,以确保客户端的健康状态。
    • 续租失败次数:统计未能成功续租(心跳)请求的次数,用于识别客户端可能存在的连接或网络问题。
  3. 自我保护模式

    • 自我保护触发状态:监控Eureka Server是否已进入自我保护模式。如果心跳失败次数超过一定阈值,自我保护模式会被触发以防止大规模实例下线。
    • 心跳丢失阈值:用于监控是否达到触发自我保护的条件。
  4. 请求和响应延迟

    • 服务注册请求延迟:统计Eureka Client注册到Eureka Server的请求延迟。
    • 服务发现请求延迟:统计客户端请求服务实例列表的平均响应时间。
    • 实例取消注册延迟:监控服务实例取消注册时的延迟。
  5. 健康检查状态

    • 健康检查结果:显示所有实例的健康检查状态,用于确定哪些实例在心跳检测中被认为是不可用的。
    • 健康检查失败次数:记录检测到服务实例不健康的次数。

这些监控指标可以帮助开发者和运维人员快速定位和排查问题,确保Eureka的运行状况良好。借助这些数据,可以采取必要的措施来优化Eureka Server和客户端的配置,提升系统的可靠性和可用性。

7. Eureka的性能优化

7.1 调整心跳间隔

Eureka Client和Eureka Server通过心跳机制来维护服务实例的注册状态。心跳间隔的调整对于优化Eureka的性能和系统的整体稳定性至关重要。

心跳间隔的优化策略

  • 缩短心跳间隔:如果需要更加实时地反映服务的健康状态,可以缩短心跳间隔,使Eureka Client更频繁地发送心跳。这样Eureka Server能够更快地检测到服务的状态变化,但这会增加网络和Eureka Server的负载。
  • 延长心跳间隔:在稳定性和网络带宽要求较高的场景中,可以适当延长心跳间隔,减少Eureka Client和Eureka Server之间的通信频率,从而降低系统资源的消耗。

配置示例
在Eureka Client的application.ymlapplication.properties中调整心跳间隔:

eureka:
  client:
    lease-renewal-interval-in-seconds: 10  # 心跳间隔,单位为秒,默认是30秒
    lease-expiration-duration-in-seconds: 90  # 服务过期时间,默认是90秒

通过调整这些参数,可以在性能和服务可用性之间取得平衡。需要根据具体应用场景进行压力测试,以选择最合适的配置。

7.2 服务实例数量的管理

Eureka Server需要处理大量的服务注册和发现请求,因此优化服务实例的数量和分布可以显著提高Eureka的性能和稳定性。

优化策略

  • 服务实例分组:在大型系统中,将服务实例按功能或区域分组,并使用多个Eureka Server实例来分别管理这些组。这样可以减轻单个Eureka Server的负载,提高系统的扩展性和容错能力。
  • 合理配置实例数量:在高负载的系统中,应确保Eureka Server有足够的资源来处理所有服务实例的心跳和注册请求。可以通过垂直扩展(增加Eureka Server的资源)或水平扩展(增加Eureka Server的数量)来优化性能。
  • 实例剔除策略:确保Eureka Server能及时剔除不再活跃的服务实例,以防止注册表冗余和性能下降。定期检查服务实例的健康状态,并在必要时移除长时间未发送心跳的实例。

配置示例
在Eureka Server中,可以调整实例剔除的间隔时间和策略:

eureka:
  server:
    eviction-interval-timer-in-ms: 60000  # 实例剔除间隔,默认是60秒

负载均衡与缓存策略

  • 本地缓存:Eureka Client可以启用本地缓存,减少对Eureka Server的频繁访问,降低Eureka Server的负载。客户端会定期从缓存中获取服务实例列表,确保请求在短时间内不会多次访问Eureka Server。
  • 负载均衡器的使用:结合Ribbon或其他负载均衡器,均衡请求的流量,避免某些实例过载。

通过调整心跳间隔和管理服务实例数量,可以实现Eureka的高效运转,确保微服务架构在高并发场景下的稳定性和性能。

8. 常见问题与解决方案

8.1 服务无法注册的原因

  1. 网络问题:检查服务实例与Eureka Server之间的网络连接是否正常。
  2. 配置错误:确保服务实例的Eureka配置(如eureka.client.serviceUrl.defaultZone)正确指向Eureka Server的地址。
  3. 服务端未启动:确认Eureka Server是否正在运行,并监听正确的端口。
  4. 注册信息不完整:确保服务实例的元数据(如应用名、实例ID等)正确配置。
  5. 过期时间设置:检查Eureka的心跳配置,确保服务实例的注册信息未过期。

8.2 Eureka Server的高可用性配置

  1. 集群部署:在多台机器上部署多个Eureka Server实例,配置eureka.client.registerWithEurekaeureka.client.fetchRegistryfalse以避免自我注册。
  2. 负载均衡:使用负载均衡器(如Nginx或HAProxy)在客户端与Eureka Server之间实现请求分发,增强可用性。
  3. 数据复制:配置Eureka Server之间的复制,确保注册信息在所有实例中保持一致,通过eureka.client.serviceUrl.defaultZone指定其他Eureka Server的地址。
  4. 监控与报警:使用监控工具监控Eureka Server的状态,及时处理故障。

这些解决方案能够帮助快速定位和解决服务注册中的常见问题,并提高Eureka Server的可用性。

9. 总结

9.1 Eureka 的优缺点

优点:

  1. 简化服务注册与发现: Eureka 提供了简单易用的 API,使得微服务的注册和发现变得轻松,无需复杂的配置。
  2. 高可用性: Eureka 通过服务的自我注册和心跳机制,实现了高可用性。当某个实例下线时,其他实例能够快速知晓并进行处理。
  3. 与 Spring Cloud 的集成: Eureka 是 Spring Cloud 的核心组件之一,与 Spring Boot 的集成非常顺畅,适合微服务架构的开发。
  4. 灵活的负载均衡: Eureka 支持客户端负载均衡,能够根据注册信息动态调整流量分配。
  5. 可扩展性: 可以轻松添加和删除服务实例,适应服务规模的变化。

缺点:

  1. 单点故障问题: 默认的 Eureka Server 如果没有配置高可用集群,可能成为单点故障,影响服务的可用性。
  2. 性能瓶颈: 当服务实例数量增多时,Eureka 可能面临性能瓶颈,需要进行合理的资源分配和监控。
  3. 复杂的网络配置: 在多区域或多云环境中,Eureka 的网络配置可能较为复杂,需要额外的设置以确保服务之间的通信顺畅。
  4. 服务发现延迟: 在实例注册与更新过程中,可能存在一定的延迟,导致客户端获取的服务信息不是实时的。
  5. 与 Kubernetes 的兼容性: 在 Kubernetes 环境中,Eureka 的角色和使用场景可能会有所不同,可能需要结合其他工具来实现最佳效果。

9.2 未来的发展方向

  1. 提升高可用性: 加强 Eureka 的高可用性设计,支持更简单的集群配置和故障转移机制,确保在多节点环境下的稳定性。
  2. 性能优化: 对于大规模微服务架构,继续优化性能,减少服务发现和注册的延迟,提高处理效率。
  3. 与云原生架构的集成: 进一步与 Kubernetes、Service Mesh(如 Istio)等云原生架构整合,提升微服务的灵活性和可管理性。
  4. 多租户支持: 开发多租户功能,使得多个团队或项目可以在同一个 Eureka 实例上安全地运行,互不干扰。
  5. 智能路由与负载均衡: 集成智能路由和负载均衡功能,提升服务调用的效率和准确性,满足更复杂的业务需求。
  6. 监控与管理工具: 提供更友好的监控和管理界面,帮助开发和运维人员实时监控服务状态,快速定位和解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/911349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器被病毒入侵如何彻底清除?

当服务器遭遇病毒入侵时&#xff0c;彻底清除病毒是确保系统安全和数据完整性的关键步骤。这一过程不仅需要技术上的精准操作&#xff0c;还需要严密的计划、合理的资源调配以及后续的防范措施。以下是一篇关于如何在服务器被病毒入侵时彻底清除病毒的详细指南。 一、初步响应与…

修改 title标题图标

路径 \web\views\webclient_templates.xml \web\static\src\webclient\webclient.js 再升级web模块

docker安装zookeeper,以及zk可视化界面介绍

1. zookeeper 1.1. zookeeper简单介绍 ZooKeeper 是一个分布式的开源协调服务&#xff0c;最初由 Apache Hadoop 项目开发&#xff0c;用于构建分布式应用程序。它提供了一个简单的接口&#xff0c;允许开发人员实现诸如配置维护、域名服务、分布式同步、组服务等常见任务。Z…

Excel 无法打开文件

Excel 无法打开文件 ‘新建 Microsoft Excel 工作表.xlsx",因为 文件格式或文件扩展名无效。请确定文件未损坏&#xff0c;并且文件扩展名与文件的格式匹配。

idea配置maven仓库

下载Maven并配置文件内容 maven下载网址&#xff1a;Maven – Download Apache Maven 下载到D盘&#xff1a;D:\apache-maven-3.9.9 创建maven-repository文件夹作为本地仓库 修改conf文件夹下的setting.xml文件内容 在里面添加一条&#xff0c;指定本地仓库&#xff0c;下载…

L1G3000 提示工程(Prompt Engineering)

什么是Prompt(提示词)? Prompt是一种灵活、多样化的输入方式&#xff0c;可以用于指导大语言模型生成各种类型的内容。什么是提示工程? 提示工程是一种通过设计和调整输入(Prompts)来改善模型性能或控制其输出结果的技术。 六大基本原则: 指令要清晰提供参考内容复杂的任务拆…

C#与C++交互开发系列(十九):跨进程通信之套接字(Sockets)

1、前言 套接字&#xff08;Sockets&#xff09;是一种强大的通信方式&#xff0c;可以在同一台设备或网络上的不同设备之间进行通信。C# 和 C 都支持套接字编程&#xff0c;这使得在它们之间实现跨进程通信成为可能。本文将介绍如何通过套接字实现 C# 和 C 程序的跨进程通信&…

Python | Leetcode Python题解之第538题把二叉搜索树转换为累加树

题目&#xff1a; 题解&#xff1a; class Solution:def convertBST(self, root: TreeNode) -> TreeNode:def getSuccessor(node: TreeNode) -> TreeNode:succ node.rightwhile succ.left and succ.left ! node:succ succ.leftreturn succtotal 0node rootwhile nod…

几个docker可用的镜像源

几个docker可用的镜像源 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; sudo rm -rf /etc/docker/daemon.json sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://d…

java ssm 校园快递物流平台 校园快递管理系统 物流管理 源码 jsp

一、项目简介 本项目是一套基于SSM的校园快递物流平台&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&#x…

Sentinel通过限流对微服务进行保护

目录 雪崩问题 解决雪崩问题的方法&#xff1a; 我们使用sentinel组件实现微服务的保护 一&#xff1a;下载sentinel 二.启动sentinel 三.访问&#xff1a;localhost:8080 默认的账号和密码都是sentinel 微服务整合sentinel 一.导入sentinel依赖 二.在application.yml配…

【Linux】冯诺依曼体系、再谈操作系统

目录 一、冯诺依曼体系结构&#xff1a; 1、产生&#xff1a; 2、介绍&#xff1a; 二、再谈操作系统&#xff1a; 1、为什么要管理软硬件资源&#xff1a; 2、操作系统如何进行管理&#xff1a; 3、库函数&#xff1a; 4、学习操作系统的意义&#xff1a; 一、冯诺依曼…

斗破QT编程入门系列之二:GUI应用程序设计基础:UI文件(四星斗师)

斗破Qt目录&#xff1a; 斗破Qt编程入门系列之前言&#xff1a;认识Qt&#xff1a;Qt的获取与安装&#xff08;四星斗师&#xff09; 斗破QT编程入门系列之一&#xff1a;认识Qt&#xff1a;初步使用&#xff08;四星斗师&#xff09; 斗破QT编程入门系列之二&#xff1a;认识…

ffmpeg命令

1. 修改视频的数据速率 ffmpeg.exe -i video.mp4 -r 30 -c:v libx264 -b:v 1500k output.mp42. mp4与h264互相转换 ffmpeg.exe -i a.mp4 -vcodec h264 output.h264 ffmpeg.exe -i output.h264 -vcodec mpeg4 output.mp4

前端三件套-css

一、元素选择器 元素选择器&#xff1a;利用标签名称。p,h1-h6...... 行内样式&#xff08;内联样式&#xff09;&#xff1a;例如<p style"color:red;font-size:50px"> id选择器&#xff1a;针对某一个特定的标签来使用。以#定义。 class&#xff08;类&a…

c++设计模式demo

模式设计原则 依赖倒置原则 ⾼层模块不应该依赖低层模块&#xff0c;⼆者都应该依赖抽象 &#xff1b; 抽象不应该依赖具体实现&#xff0c;具体实现应该依赖于抽象&#xff1b; ⾃动驾驶系统公司是⾼层&#xff0c;汽⻋⽣产⼚商为低层&#xff0c;它们不应该互相依赖&#x…

操作系统学习笔记-4.1文件管理

文章目录 文件的逻辑结构1. 顺序结构特点应用场景示例 2. 索引结构特点应用场景示例 3. 链接结构特点应用场景示例 总结 文件目录文件的物理结构1. 连续分配&#xff08;Contiguous Allocation&#xff09;2. 链接分配&#xff08;Linked Allocation&#xff09;隐式链接 3. 索…

ES文档:文档操作_doc(7.9.2)

用心记录技术&#xff0c;走心分享&#xff0c;始于后端&#xff0c;不止于后端&#xff0c;励志成为一名优秀的全栈架构师&#xff0c;真正的实现码中致富。 ElasticSearch文档的操作&#xff1b; 添加文档 新建一个索引 goboy-blog&#xff0c;如果添加文档索引不存在则会创…

深入解析 WinForms MVVM 模式中的事件驱动与数据驱动

前言 在传统的 WinForms 开发中&#xff0c;事件驱动模型&#xff08;Event-Driven Model&#xff09;是核心&#xff0c;它通过控件的事件&#xff08;如点击按钮、改变文本等&#xff09;触发业务逻辑。然而&#xff0c;MVVM 模式引入了数据驱动&#xff08;Data-Driven&…

Python中的 if __name__ == ‘__main__

在Python中&#xff0c;if __name__ __main__: 这行代码有一个特定的用途和含义。为了理解它&#xff0c;我们需要先了解Python中的__name__变量以及Python脚本是如何执行的。 __name__变量 每个Python模块&#xff08;python文件&#xff09;都有一个内置的属性__name__。当…