Spring Cloud Eureka - 高可用服务注册与发现解决方案

在微服务架构中,服务注册与发现是确保系统动态扩展和高效通信的关键。Eureka 作为 Spring Cloud 生态的核心组件,不仅提供去中心化的服务治理能力,还通过自我保护、健康检查等机制提升系统的稳定性,使其成为微服务架构中的重要支撑。

解析 Eureka 的核心原理,并通过实战演示高可用集群搭建、元数据定制及跨区域部署策略,确保系统具备更强的容错性和稳定性。

一、Eureka 介绍

Eureka:是一个服务发现框架,提供了一个 RESTful API 来帮助微服务注册并发现其他服务。它是由 Netflix 开发的,作为一个微服务架构的核心组成部分,通常用来实现服务间的自动化发现和负载均衡。

1.1 Eureka 组件

Eureka 的核心组件

1. Eureka Server(服务注册中心)

• 负责维护所有微服务的注册信息,相当于服务的“电话簿”。

• 允许微服务注册(REGISTER)和发现(GET 服务列表)其他服务。

• 支持自我保护机制,避免因网络波动误删除健康的服务。

2. Eureka Client(微服务实例)

• 集成于微服务中,负责向 Eureka Server 注册自身信息。

• 定期发送心跳(默认30秒)以维持服务存活。

• 从 Eureka Server 拉取服务列表实现动态发现,支撑负载均衡调用。

1.2 Eureka 运行机制

Eureka Client 与 Eureka Server 交互流程图,包括服务注册、续约、获取和剔除:

在这里插入图片描述

流程说明:

服务注册:微服务启动后,Eureka Client 向 Eureka Server 发送 REGISTER请求,将自身信息注册到服务中心。

服务续约:Eureka Client定期(如每 30 秒)向 Eureka Server 发送心跳(RENEW 请求),表明自己是存活状态。

服务获取:微服务需要调用其他服务时,Eureka Client会向 Server 发送GET请求,以获取可用服务列表。

服务剔除:如果 Server 90 秒未收到Eureka Client的 RENEW, Eureka Server 默认Eureka Client 已失效并将其移除(除非Eureka Server启用了自我保护模式)。

二、Eureka 高可用集群:告别单点故障

2.1 集群架构设计原理

Eureka1[Eureka Server 节点1] -->|相互注册| Eureka2[Eureka Server 节点2]
Eureka2 -->|相互注册| Eureka3[Eureka Server 节点3]
Eureka3 -->|相互注册| Eureka1

核心机制:

• 去中心化架构(Peer Awareness):

每个 Eureka Server既是服务端也是客户端,它们相互注册并同步服务信息,避免单点故障。

• 最终一致性(Eventual Consistency):

注册信息通过HTTP 复制机制进行同步,虽然不会强制保证实时一致性,但能在短时间内达到最终一致性,确保高可用。

• 容错与自我保护:

当网络故障或部分节点失联时,Eureka 采用自我保护模式,避免误剔除健康服务,增强系统稳定性。

2.2 三节点集群搭建实战

1.集群配置完整步骤

步骤1:配置集群

Eureka Server 1 配置:

在eureka1实例的application.yml文件中,配置 Eureka Server 的服务名称、端口及相互注册的 Eureka Server 地址。

server:port: 8761spring:application:name: eureka-server  # 集群统一名称eureka:instance:hostname: eureka1  # 必须配置 DNS 或 hosts 解析client:register-with-eureka: true  # 允许自身注册到 Eurekafetch-registry: true  # 允许从 Eureka 拉取注册信息service-url:defaultZone: http://eureka2:8762/eureka,http://eureka3:8763/eureka  # 另2个 Eureka Server 的地址

其他节点配置

• eureka2(端口8762)和eureka3(端口8763)的service-url需要指向除自身以外的两个 Eureka Server。

• 例如eureka2的service-url配置应为:

service-url:defaultZone: http://eureka1:8761/eureka,http://eureka3:8763/eureka

在这里插入图片描述

步骤2:配置 Eureka Client 连接集群
在微服务的application.yml文件中,配置多个 Eureka Server 的地址:

eureka:client:service-url:defaultZone: http://eureka1:8761/eureka,http://eureka2:8762/eureka,http://eureka3:8763/eureka

预期结果:在所有三个 Eureka 控制台均能看到该服务实例。

步骤3:启动集群

java -jar eureka-server.jar --server.port=8761 --eureka.instance.hostname=eureka1
java -jar eureka-server.jar --server.port=8762 --eureka.instance.hostname=eureka2
java -jar eureka-server.jar --server.port=8763 --eureka.instance.hostname=eureka3

启动后,eureka1、eureka2和eureka3会互相注册,互相发现对方的存在,形成一个高可用的 Eureka 集群。

步骤4:访问控制台验证集群

打开浏览器访问:

• http://eureka1:8761

• http://eureka2:8762

• http://eureka3:8763

预期效果:每个节点的控制台应显示另外两个节点为已注册状态。

eureka1:8761 控制台展示:(其他2个节点控制台展示类似)

Eureka Server 控制台 - eureka1:8761
-------------------------------------------------------
集群节点信息:
-----------------------------------------
1. eureka1:8761 (状态: UP)
2. eureka2:8762 (状态: UP)
3. eureka3:8763 (状态: UP)
-----------------------------------------集群节点分布:
-----------------------------------------
"eureka1:8761" : 1
"eureka2:8762" : 1
"eureka3:8763" : 1
-----------------------------------------已注册的微服务实例:
-----------------------------------------
client1:8080
状态: UP
注册时间: 2025-03-02 12:30:45
应用类型: Microservice
可用区域: defaultZone
端口: 8080
主机: localhost
-----------------------------------------应用信息:
-----------------------------------------
1. 微服务实例: client1
2. 应用状态: UP
3. 主机名: localhost
4. 服务端口: 8080
-----------------------------------------

这样微服务可以同时连接多个 Eureka Server 进行服务注册与发现。当一个 Eureka Server 不可用时,能够自动切换到另一个 Eureka Server。从而实现高可用,避免单点故障。

2.3 常见集群配置错误排查
在这里插入图片描述

2.4 安全加固

在生产环境中,为了确保Eureka Server和Eureka Client之间的通信安全,建议进行以下安全加固措施:

1. 基本认证 (Basic Authentication)

• 作用:确保Eureka Server和Eureka Client间的通信只能由授权用户访问,防止未授权的访问。这是保护敏感信息、控制接口访问权限的一个基本措施。

• 配置:涉及Eureka Server和Eureka Client的配置,在application.yml中设置用户凭证(如user:password),从而对访问接口(如注册、查询等)进行身份验证。

基本认证配置示例:

步骤1:Eureka Server 配置

spring:security:user:name: user  # 设置基本认证的用户名password: password  # 设置基本认证的密码

集群配置:

单一认证信息

• 集群中所有Eureka Server节点都配置相同的基本认证信息。

• 适用于安全要求较低的环境。

多套认证信息

• 集群中每个节点使用不同的认证信息。每个节点配置独立的用户名和密码。

• 适用于对安全性要求较高的环境。

步骤2:Eureka Client 配置

在Eureka Client的application.yml中,配置 Eureka Server 的地址,并加入基本认证信息以进行连接认证。

eureka:client:service-url:defaultZone: https://user:password@eureka1:8761/eureka,https://user:password@eureka2:8762/eureka,https://user:password@eureka3:8763/eureka  # 配置多个 Eureka Server 地址,并添加基本认证信息

完成如上基本认证配置后,只有被授权的Eureka Client 才能访问Eureka Server,有效保护了 Eureka Server 接口,防止未授权访问。

2. 启用 HTTPS 通信

为了确保Eureka Server和Eureka Client之间的数据传输安全,启用HTTPS通信是一个关键步骤。

作用:启用 HTTPS 通信可以确保Eureka Server和Eureka Client之间的数据传输加密,防止数据在传输过程中被窃听或篡改,增强通信的安全性。

配置: 配置 SSL/TLS 证书以启用 HTTPS,确保所有通信过程都经过加密。

启用 HTTPS 通信示例:

在Eureka Server的application.yml中,配置 SSL 证书和 HTTPS 通信:

server:port: 8761  # 监听端口为 8761ssl:key-store: classpath:keystore.jks  # SSL 证书的存储路径key-store-password: your-password  # 密钥库密码key-store-type: JKS  # 证书类型key-alias: your-alias  # 证书别名eureka:instance:hostname: eureka1  # 当前服务器的 hostnameclient:register-with-eureka: true  # 允许自己注册到 Eurekafetch-registry: true  # 允许从 Eureka 拉取注册信息service-url:defaultZone: https://eureka2:8762/eureka,https://eureka3:8763/eureka  # 配置其他 Eureka Server 的 HTTPS 地址

集群中,其他节点(如eureka2 )的配置,类似于eureka1节点, 主要是端口和hostname发生变化,还有 defaultZone 配置 需要同其他节点实现互相注册。

步骤2:Eureka Client 配置

在Eureka Client的application.yml中,配置 Eureka Server 的 HTTPS 地址。客户端可以连接到多个 Eureka Server 节点,增加系统的容错能力和高可用性:

eureka:client:service-url:defaultZone: https://eureka1:8761/eureka,https://eureka2:8762/eureka,https://eureka3:8763/eureka  # 配置多个 Eureka Server 地址

完成如上配置后, HTTPS 通信被启动,可以有效保障数据传输安全。

2.5 生产环境建议

• 跨机房部署:将 Eureka 节点部署在不同物理机房或可用区,确保故障隔离和容灾能力。

• 健康检查:集成 Spring Boot Actuator 的/health端点,实时监控 Eureka Server 节点的健康状态,确保快速响应故障。

• 安全加固:启用 HTTPS 通信保障数据传输安全,启用基本认证)保护 Eureka Server 接口,防止未授权访问。

三、健康检查与自我保护:构建服务稳定性的双保险

3.1 健康检查机制:精准剔除故障节点

核心原理:

Eureka 通过健康检查机制,确保仅存活的服务能够被发现。Spring Boot Actuator 提供了/actuator/health端点(默认暴露),Eureka Server 可以定期访问该端点检查服务状态。

实现步骤:

1.启用健康检查

在Eureka Client的application.yml中配置:

eureka:client:healthcheck:enabled: true  # 开启健康检查

2.健康端点响应

Spring Boot Actuator 默认暴露/actuator/health端点:

// 健康检查响应示例
{"status": "UP","components": {"diskSpace": {"status": "UP"},"ping": {"status": "UP"}}
}

3. 关键参数调优

在Eureka Client和Eureka Server的application.yml 文件中设置相关的参数进行调优:

Eureka Client 端调优参数

在这里插入图片描述

Eureka Server 端调优参数
在这里插入图片描述

3.2 自我保护模式:突发故障的容错机制

触发机制详解:

Eureka 的自我保护模式旨在防止在网络不稳定或短期故障期间,服务被错误地标记为不可用。该模式会在接收到的心跳数低于预期值时自动触发,从而保留现有服务实例,避免系统不稳定。

工作流程:

1.每分钟心跳总数会与最近 15 分钟的心跳丢失率进行对比。

2.如果丢失率超过15%,触发自我保护模式,保留所有实例并发出警告。

3.如果丢失率低于15%,维持正常模式,并定期清理失效实例。

A[每分钟心跳总数] --> B{统计最近15分钟<br>心跳丢失率}
B -->|丢失率 >15%| C[触发保护模式]
B -->|丢失率 ≤15%| D[正常模式]
C --> E[保留所有实例]
C --> F[控制台警告提示]
D --> G[定期清理失效实例]

配置与优化:

1.基础配置:

在Eureka Server的application.yml配置文件中启用自我保护模式:

eureka:server:enable-self-preservation: true    # 开启保护模式renewal-percent-threshold: 0.85   # 触发阈值(85%心跳正常)eviction-interval-timer-in-ms: 60000  # 清理周期

2.阈值计算公式:

触发条件 = (当前心跳总数 / 预期心跳数) <renewal-percent-threshold

预期心跳数 = 服务实例数 × (900秒 /lease-renewal-interval)

3.生产环境建议:

• 阈值调整:网络不稳定环境可降低至 0.75。

• 告警集成:通过/actuator/metrics监控eureka.server.isSelfPreservationModeActive指标。

• 紧急处理:保护模式下可手动调用/pause端点临时停止服务注册。

3.3 健康检查与保护模式的联动机制

综合工作流:

journeytitle 健康状态全生命周期管理section 正常状态心跳正常 --> 健康检查通过 --> 服务可用section 异常状态心跳丢失 --> 触发健康检查 --> 检查失败 --> 标记为DOWNsection 网络抖动批量心跳丢失 --> 触发保护模式 --> 保留所有实例 --> 网络恢复后自动恢复

最佳实践:

1.分级健康检查:

在application.yml中配置:

management:endpoint:health:group:readiness:include: "db,redis"   # 就绪检查:检查依赖服务状态(启动时检查)liveness:include: "diskSpace,ping"   # 存活检查:基础资源监控(每30秒)

• 存活检查(Liveness):基础资源监控(每30秒)

• 就绪检查(Readiness):依赖服务状态(启动时检查)

2.保护模式优化策略:

在这里插入图片描述

通过健康检查与自我保护机制的协同工作,Eureka 能够实现:

• 分钟级故障检测(通过 90秒心跳超时 + 健康检查)

• 秒级异常隔离(保护模式即时触发)

• 智能恢复机制(网络恢复后自动同步状态)

四、元数据定制:解锁高级治理能力

Eureka 支持向服务注册信息中附加元数据(Metadata ),如版本号、环境标识等。

4.1 配置元数据 (Eureka Metadata)

在 Eureka Client(微服务)的 application.yml中定义元数据:

server:port: 8081  # 订单服务的端口spring:application:name: order-service  # 微服务名称eureka:client:register-with-eureka: true   fetch-registry: true         service-url:defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/instance:metadata-map:  # 定义元数据version: v1.0.0   # 版本号zone: cn-east-1   # 所在区域priority: high      # 路由优先级

4.2 读取元数据

Eureka Client 可通过 InstanceInfo读取元数据:

@Autowired
private DiscoveryClient discoveryClient; // 注入 Eureka 发现客户端,用于获取注册的服务信息public void getServiceMetadata() {// 获取指定服务 ("my-service") 的所有实例List<ServiceInstance> instances = discoveryClient.getInstances("my-service");// 遍历实例,打印每个实例的元数据for (ServiceInstance instance : instances) {System.out.println("Service Metadata: " + instance.getMetadata());}
}

解析:

• @Autowired:自动注入DiscoveryClient,用于与 Eureka Server 交互。

4.3 使用场景

• 灰度发布:网关根据version路由流量。

• 区域亲和:优先调用同region的实例,即分区(Zone)策略。

• 负载策略:Ribbon负载均衡 按priority分配流量权重。

五、多区域部署:构建跨地域容灾体系

5.1 Zone 概念

在跨区域部署的微服务架构中,不同区域(Zone)的服务需要相互发现。Eureka 允许微服务按区域注册,并优先发现同区域的实例。减少跨区域通信,降低延迟。

Zone 表示服务所在的物理区域或数据中心。

5.2 多区域配置

1.配置 Eureka Server

亚洲区域 Eureka Server 配置:

server:port: 8761spring:application:name: eureka-servereureka:instance:hostname: eureka-asia1metadata-map:zone: zone-asia  # 声明本 Eureka Server 处于 "zone-asia"client:register-with-eureka: false  # Eureka Server 不注册到自己fetch-registry: false  # Eureka Server 不拉取服务列表service-url:defaultZone: http://eureka-europe1:8762/eureka  # 互相注册

欧洲区域 Eureka Server 配置:

server:port: 8762spring:application:name: eureka-servereureka:instance:hostname: eureka-europe1metadata-map:zone: zone-europe  # 声明本 Eureka Server 处于 "zone-europe"client:register-with-eureka: falsefetch-registry: falseservice-url:defaultZone: http://eureka-asia1:8761/eureka  # 互相注册

关键点:

• Eureka Server 声明自己的 Zone(metadata-map.zone),让 Eureka Client 能够感知区域信息。

• 区域间 Eureka Server 互相注册构成集群,实现同步服务实例信息,实现高可用。

2.配置Eureka Client

Eureka Client(微服务)的application.yml配置:

• 指定自身 Zone

• 正确配置 Eureka Server 地址

• 启用 prefer-same-zone-eureka 以优先访问本区域

亚洲区域的服务配置:

eureka:instance:metadata-map:zone: zone-asia  # 声明当前微服务属于 "zone-asia"client:service-url:defaultZone: http://eureka-asia1:8761/eureka, http://eureka-europe1:8762/eurekaprefer-same-zone-eureka: true  # 优先访问同区域的 Eureka Server

欧洲区域的服务配置:

eureka:instance:metadata-map:zone: zone-europe  # 声明当前微服务属于 "zone-europe"client:service-url:defaultZone: http://eureka-europe1:8762/eureka, http://eureka-asia1:8761/eurekaprefer-same-zone-eureka: true

关键点:

1.Eureka Client 通过 metadata-map.zone 声明自身所在区域。

2.service-url 配置了多个 Eureka Server 地址,确保跨区域发现。

3.prefer-same-zone-eureka: true,Eureka Client优先注册和发现本区域的 Eureka Server,仅在同区域不可用时才会跨区域访问。

5.3 跨区域故障转移

graph LRUser[Asia 客户端] -->|首选| Asia[亚洲区服务]Asia|故障|  --> Europe[欧洲区服务]

容灾策略

自动切换:当同区域实例不可用时,系统自动切换至其他区域。

故障告警:当响应时间异常增加时,触发区域切换告警。

六、总结

6.1 核心要点总结

服务治理核心:

• 基于注册、心跳、动态发现机制,支撑微服务自动化通信与负载均衡。

高可用与容错:

• 去中心化集群(Peer Awareness)避免单点故障。

• 健康检查精准剔除异常实例,自我保护模式防止误删健康节点。

高级能力扩展:

• 元数据定制(版本/区域)支持灰度发布与区域亲和路由。

• 多 Zone 部署实现跨机房容灾与低延迟调度。

生产级实践:

• HTTPS 加密、Basic 认证、跨区域健康监控,确保安全与稳定性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity屏幕适配——立项时设置

项目类型&#xff1a;2D游戏、竖屏、URP 其他类型&#xff0c;部分原理类似。 1、确定设计分辨率&#xff1a;750*1334 为什么是它&#xff1f; 因为它是 iphone8 的尺寸&#xff0c;宽高比适中。 方便后续适配到真机的 “更长屏” 或 “更宽屏” 2、在场景…

深度学习中LayerNorm与RMSNorm对比

LayerNorm不同于BatchNorm&#xff0c;其与batch大小无关&#xff0c;均值和方差 在 每个样本的特征维度 C 内计算&#xff0c; 适用于 变长输入&#xff08;如 NLP 任务中的 Transformer&#xff09; 详细的BatchNorm在之前的一篇文章进行了详细的介绍&#xff1a;深度学习中B…

使用WireShark解密https流量

概述 https协议是在http协议的基础上&#xff0c;使用TLS协议对http数据进行了加密&#xff0c;使得网络通信更加安全。一般情况下&#xff0c;使用WireShark抓取的https流量&#xff0c;数据都是加密的&#xff0c;无法直接查看。但是可以通过以下两种方法&#xff0c;解密抓…

数字化转型 - 数据驱动

数字化转型 一、 数据驱动1.1 监控1.2 分析1.3 挖掘1.4 赋能 二、数据驱动案例2.1 能源工业互联网&#xff1a;绿色节能的数字化路径2.2 光伏产业的数字化升级2.3 数据中心的绿色转型2.4云迁移的质效优化2.5 企业数字化运营的实践2.6数字化转型的最佳实践 一、 数据驱动 从数…

解决 Docker 镜像拉取超时问题:配置国内镜像源

在使用 Docker 的过程中&#xff0c;经常会遇到镜像拉取超时的问题&#xff0c;尤其是在国内网络环境下。这不仅会浪费大量的时间&#xff0c;还可能导致一些项目无法顺利进行。今天&#xff0c;我将分享一个简单而有效的解决方法&#xff1a;配置国内镜像源。 环境 操作系统 c…

Linux命令基础,创建,输入,输出,查看,查询

什么是命令、命令行 命令行&#xff1a;即&#xff1a;Linux终端&#xff08;Terminal&#xff09;&#xff0c;是一种命令提示符页面。以纯“字符”的形式操作操作系统&#xff0c;可以使用各种字符化命令对操作系统发出操作指令。 命令&#xff1a;即Linux程序。一个命令就…

【GNU Radio】ZMQ模块学习

【GNU Radio】ZMQ模块学习 ZMQ 介绍前置知识Socket通信模型PUB/SUB&#xff08;发布/订阅&#xff09;模型PUSH/PULL&#xff08;推/拉&#xff09;模型REQ/REP&#xff08;请求/响应&#xff09;模型 ZMQ 详解基于通信模型分析基于数据格式分析Data BlocksMessage Blocks ZMQ …

【笔记】深度学习模型训练的 GPU 内存优化之旅:综述篇

开设此专题&#xff0c;目的一是梳理文献&#xff0c;目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化&#xff0c;所以最初思考的专题名称是“显存突围&#xff1a;深度学习模型训练的 GPU 内存优化之旅”&#xff0c;英文缩写是 “MLSys_GPU_Memory_Opt”。…

Vue 3 Diff 算法深度解析:与 Vue 2 双端比对对比

文章目录 1. 核心算法概述1.1 Vue 2 双端比对算法1.2 Vue 3 快速 Diff 算法 2. 算法复杂度分析2.1 时间复杂度对比2.2 空间复杂度对比 3. 核心实现解析3.1 Vue 2 双端比对代码3.2 Vue 3 快速 Diff 代码 4. 性能优化分析4.1 性能测试数据4.2 内存使用对比 5. 使用场景分析5.1 Vu…

神经网络的基本知识

感知机 输入&#xff1a;来自其他 n 个神经元传递过来的输入信号 处理&#xff1a;输入信号通过带权重的连接进行传递, 神经元接受到总输入值将与神经元的阈值进行比较 输出&#xff1a;通过激活函数的处理以得到输出 感知机由两层神经元组成, 输入层接受外界输入信号传递给…

UE5与U3D引擎对比分析

Unreal Engine 5&#xff08;UE5&#xff09;和Unity 3D&#xff08;U3D&#xff09;是两款主流的游戏引擎&#xff0c;适用于不同类型的项目开发。以下是它们的主要区别&#xff0c;分点整理&#xff1a; 1. 核心定位 UE5&#xff1a; 主打3A级高画质项目&#xff08;如主机/P…

C++相关基础概念之入门讲解(上)

1. 命名空间 C中的命名空间&#xff08;namespace&#xff09;是用来避免命名冲突问题的一种机制。通过将类、函数、变量等封装在命名空间中&#xff0c;可以避免不同部分的代码中出现相同名称的冲突。在C中&#xff0c;可以使用namespace关键字来定义命名空间。 然后我们在调…

网络协议栈

网络协议栈的位置 用户在应用层的各种请求最终会下达给操作系统&#xff0c;操作系统内除了进程管理、文件管理、内存管理、驱动管理之外&#xff0c;还有一个内嵌的软件协议栈&#xff0c;协议栈将用户的数据进行各种封包后&#xff0c;通过网卡将数据传递到网络当中&#xf…

C#索引器基础到实践

1. 封装和隐藏内部实现 数组是一个简单的数据结构,它的内部实现是固定的(基于连续内存)。而索引器可以隐藏内部的实现细节,允许开发者使用更复杂的数据结构来存储数据,同时对外提供类似数组的访问方式。 示例: 假设你有一个类,内部使用 Dictionary 或 List 来存储数据…

C++之list类(超详细)

在上一节中我们学习了STL中的vector这个容器&#xff0c;这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…

mysql、oracle、SQLserver之间的区别和优势

MySQL、Oracle和SQL Server都是常见的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它们在某些方面有一些区别和优势。 MySQL&#xff1a; MySQL是一种开源的RDBMS&#xff0c;由Oracle公司开发和维护。它具有快速、稳定和易于使用的特点。MySQL适用于中小型…

Python依赖包迁移到断网环境安装

首先&#xff0c;我应该确认两台电脑的操作系统都是Windows&#xff0c;所以架构和版本应该兼容。Python版本必须一致&#xff0c;否则可能会有问题。比如&#xff0c;如果电脑B用的是Python 3.8.5&#xff0c;电脑A也得装同样的版本&#xff0c;否则有些包可能不兼容。所以第一…

75.HarmonyOS NEXT ImageItemView组件深度剖析:手势交互与动画实现(二)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT ImageItemView组件深度剖析&#xff1a;手势交互与动画实现(二) 一、手势系统架构 .gesture(GestureGroup(GestureMode.Exclusiv…

Qt 控件概述 QWdiget

Qt为我们提供了很多控件&#xff0c;这些控件拿过来就可以使用 目录 QWidget 属性 WindowFrame的影响 QWidget Qt中所有的组件都是继承自QWidget Qt Creator中的右侧可以看到QWidget的各种属性 其中各种属性都可以在Qt文档中找到说明 ​ 属性 enabled&#xff1a;描述该组…

适合企业内训的AI工具实操培训教程(37页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读&#xff1a;适合企业内训的 AI 工具实操培训教程 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术迅速发展&#xff0c;深度融入到各个领域&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;更是成…