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

微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现

在上一篇中,我们理解了微服务架构的核心理念以及Spring Cloud为我们提供的强大工具集。我们提到,微服务架构的一个核心挑战在于,服务实例的网络位置是动态的,服务之间需要一种机制来互相定位。

想象一下,你开了一家新店(一个微服务实例),你希望顾客(其他服务或客户端)能找到你。你会怎么做?

  1. 注册: 你会去工商局(服务注册中心)登记你的店名、地址、联系方式等信息。

  2. 发现: 顾客想找你这家店时,会去工商局查询你的信息,然后根据地址找过来。

  3. 健康检查/心跳: 你需要定期向工商局报告你还在正常营业(发送心跳),如果长时间不报告,工商局可能会认为你的店关门了,就不会再把你的信息给顾客。

Spring Cloud Netflix Eureka (简称 Eureka) 就是这样一个“工商局”。它包含两个核心组件:

  • Eureka Server (服务注册中心): 提供服务注册和发现的功能。所有服务提供者(Eureka Client)启动时向Eureka Server注册自己的信息(服务名、IP、端口、健康状况等),并定期发送心跳来维持注册状态。Eureka Server会维护一个所有已注册服务实例的清单。

  • Eureka Client (服务提供者/消费者):

    • 作为服务提供者,它会向Eureka Server注册自己。

    • 作为服务消费者,它会从Eureka Server拉取注册表信息,缓存到本地,并根据服务名(通常结合客户端负载均衡器如Spring Cloud LoadBalancer)找到目标服务的实例地址进行调用。

Eureka的核心优势在于其AP(可用性优先)设计哲学 (基于CAP理论)。 即使部分Eureka Server节点失效,只要客户端缓存了注册表信息,仍然可以进行服务调用。Eureka Server之间也会互相复制注册信息,实现高可用。

读完本文,你将能够:

  • 搭建一个独立的Eureka Server。

  • 将一个Spring Boot应用配置为Eureka Client,并将其注册到Eureka Server。

  • 理解服务注册、服务发现和心跳机制的基本工作流程。

  • 通过Eureka Server的Web界面查看已注册的服务。

准备好为你的微服务们建立一个可靠的“导航系统”了吗?

一、搭建Eureka Server (服务注册中心)

Eureka Server本身也是一个Spring Boot应用。

1. 创建Spring Boot项目 (Eureka Server):
使用Spring Initializr (start.spring.io) 或你的IDE创建一个新的Spring Boot项目,包含以下依赖:

  • Spring Web: Eureka Server提供Web界面和REST API。

  • Eureka Server: 核心依赖,用于构建Eureka注册中心。

Maven依赖 (pom.xml):

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><!-- Spring Cloud BOM (Bill of Materials) for version management -->
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version> <!-- 例如: 2022.0.4 --><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

注意: 务必在<dependencyManagement>中引入spring-cloud-dependencies BOM来统一管理Spring Cloud各个组件的版本。spring-cloud.version需要与你的Spring Boot版本兼容(参考Spring Cloud官网的版本对应关系)。

2. 启用Eureka Server (@EnableEurekaServer):
在主启动类上添加@EnableEurekaServer注解。

package com.example.eurekaserver;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; // 导入@SpringBootApplication
@EnableEurekaServer // 标记这个应用是一个Eureka Server
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

3. 配置Eureka Server (application.yml 或 application.properties):

# application.yml for Eureka Server
server:port: 8761 # Eureka Server的默认端口spring:application:name: eureka-server # 应用名称, 会显示在Eureka管理界面eureka:instance:hostname: localhost # Eureka实例的主机名 (单机配置)# (可选) instance-id: ${spring.application.name}:${server.port}client:# 对于单机Eureka Server, 这两项通常设为false, 因为它自己就是注册中心, 不需要注册自己或从其他地方获取注册信息register-with-eureka: false # 是否将自己注册到Eureka Server (自己就是server, 所以是false)fetch-registry: false       # 是否从Eureka Server获取注册信息 (自己就是server, 所以是false)service-url:# 对于单机模式, 这个地址指向自己 (通常不需要, 因为上面两项为false)# 但如果要搭建集群, 这里会配置其他Eureka Server节点的地址defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/# (可选) 关闭自我保护模式 (开发时方便快速看到服务下线, 生产环境不建议关闭)# server:#   enable-self-preservation: false#   eviction-interval-timer-in-ms: 5000 # 清理无效节点的时间间隔 (毫秒)

核心配置解释:

  • server.port: Eureka Server运行的端口,约定俗成为8761。

  • spring.application.name: 应用名,会显示在Eureka的管理界面。

  • eureka.client.register-with-eureka: false: 因为这个应用本身就是Eureka Server,所以它不需要向自己注册。

  • eureka.client.fetch-registry: false: 同理,它不需要从自己这里获取注册表。

  • eureka.client.service-url.defaultZone: 指定Eureka Server的地址。对于单机模式,这个配置虽然写了,但因为上面两项为false,实际作用不大。在Eureka Client端配置这个地址才至关重要。 当搭建Eureka Server集群时,这里会配置其他Peer节点的地址,用于节点间同步注册信息。

  • eureka.server.enable-self-preservation: Eureka的自我保护模式。在网络分区等情况下,如果Eureka Server在短时间内丢失了大量服务实例的心跳,它会进入自我保护模式,不再剔除这些“暂时失联”的实例,以防止因网络问题导致大量可用服务被错误移除。开发时为了快速看到服务下线效果,有时会临时关闭它,但生产环境通常应保持开启

4. 运行Eureka Server:
启动这个Spring Boot应用。如果一切顺利,你可以在浏览器中访问 http://localhost:8761/,看到Eureka的Web管理界面。此时,界面上应该还没有任何服务实例注册。

二、创建服务提供者 (Eureka Client)

现在我们来创建一个简单的Spring Boot应用,并让它作为服务提供者注册到刚才搭建的Eureka Server上。

1. 创建Spring Boot项目 (例如 user-service):
包含以下依赖:

  • Spring Web: 提供REST API。

  • Eureka Discovery Client: 核心依赖,用于将应用注册为Eureka客户端。

  • (可选) Spring Boot Actuator: 用于健康检查。

Maven依赖 (pom.xml - user-service):

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> <!-- 用于健康检查 --></dependency><!-- Spring Cloud BOM (确保与Eureka Server项目使用相同的BOM版本) -->
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

2. 启用Eureka Client (@EnableDiscoveryClient 或 @EnableEurekaClient):
在主启动类上添加注解。@EnableDiscoveryClient是Spring Cloud提供的更通用的服务发现注解(可用于Eureka, Consul, Nacos等),而@EnableEurekaClient是专门针对Eureka的。推荐使用@EnableDiscoveryClient。

package com.example.userservice;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; // 推荐使用@SpringBootApplication
@EnableDiscoveryClient // 标记这个应用是一个服务发现客户端 (可以注册和发现服务)
// 或者 @EnableEurekaClient // 仅适用于Eureka
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}
}

3. 配置Eureka Client (application.yml - user-service):

# application.yml for user-service
server:port: 8081 # 服务提供者运行的端口 (确保与Eureka Server端口不同)spring:application:name: user-service # 服务名称, 这是注册到Eureka Server上的关键标识!# 服务消费者会通过这个名称来查找服务实例eureka:client:# register-with-eureka: true # (默认即为true) 是否将自己注册到Eureka Server# fetch-registry: true       # (默认即为true) 是否从Eureka Server获取注册信息service-url:defaultZone: http://localhost:8761/eureka/ # 指定Eureka Server的地址!instance:# (可选) 自定义实例ID, 默认为 ${spring.application.name}:${server.port}# instance-id: ${spring.application.name}:${random.value} # 可以使用随机值避免端口冲突时的ID冲突hostname: localhost # (可选) 如果需要让Eureka Server显示特定的主机名# (可选) 配置健康检查URL, Actuator的/actuator/health端点会自动被Eureka使用# health-check-url-path: /actuator/health# status-page-url-path: /actuator/info# (可选) 配置心跳间隔 (默认30秒)# lease-renewal-interval-in-seconds: 10# (可选) 配置服务过期时间 (默认90秒, 即如果90秒内没收到心跳, 实例被剔除)# lease-expiration-duration-in-seconds: 30

核心配置解释:

  • server.port: 这个服务提供者运行的端口,确保与Eureka Server的端口不同。

  • spring.application.name: 极其重要! 这是服务注册到Eureka Server时使用的服务名 (Service ID)。其他服务将来会通过这个服务名来发现和调用它。

  • eureka.client.service-url.defaultZone: 必须正确配置! 指向你的Eureka Server的地址。

  • eureka.instance.*: 可以配置实例相关的元数据,如实例ID、主机名、健康检查路径等。如果引入了spring-boot-starter-actuator,Eureka Client会自动使用/actuator/health端点作为健康检查URL。

4. (可选)创建一个简单的REST Controller (user-service):

package com.example.userservice.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/users")
public class UserController {@Value("${server.port}") // 注入当前服务端口, 方便演示private String serverPort;@GetMapping("/{id}")public String getUserById(@PathVariable Long id) {return "User details for ID " + id + " (from port: " + serverPort + ")";}
}

5. 运行服务提供者 (user-service):
启动这个user-service应用。稍等片刻(默认心跳间隔30秒,注册可能需要一点时间),然后刷新Eureka Server的管理界面 (http://localhost:8761/)。

你应该能在 "Instances currently registered with Eureka" 部分看到名为 USER-SERVICE (通常是大写) 的服务,以及它的实例信息(IP、端口、状态等)。状态初始可能是STARTING,之后会变为UP(如果健康检查通过)。

三、理解核心机制

  • 服务注册 (Registration): Eureka Client(如user-service)启动后,会向eureka.client.service-url.defaultZone配置的Eureka Server地址发送注册请求,包含自己的服务名、IP、端口、健康状况等信息。

  • 服务续约/心跳 (Renewal/Heartbeat): Client会定期(默认30秒)向Server发送心跳,告知Server自己仍然存活。如果Server在一定时间内(默认90秒)没有收到某个实例的心跳,会认为该实例已下线,并将其从注册表中剔除(除非开启了自我保护模式且触发了保护条件)。

  • 服务发现 (Discovery): 其他Client(服务消费者)启动时或定期(默认30秒)从Eureka Server拉取最新的服务注册表信息,并缓存到本地。当需要调用某个服务时,它会从本地缓存的注册表中根据服务名查找可用的实例列表。

  • 服务下线 (Cancellation): Client在正常关闭时,会向Server发送一个取消注册的请求。

四、高可用Eureka Server集群 (简述)

在生产环境中,单个Eureka Server节点是单点故障。通常会搭建Eureka Server集群来实现高可用。

配置集群的关键在于让每个Eureka Server节点知道其他节点的存在,并通过eureka.client.service-url.defaultZone互相指定对方的地址(但仍然将register-with-eureka和fetch-registry设为true,因为它们既是Server也是Client,需要同步注册信息)。

例如,两个节点的集群配置 (application-peer1.yml):

server:port: 8761
spring:application:name: eureka-server
eureka:instance:hostname: peer1 # 或真实IP/域名client:register-with-eureka: true # 注册到其他peerfetch-registry: true       # 从其他peer获取信息service-url:defaultZone: http://peer2:8762/eureka/ # 指向另一个节点

application-peer2.yml 对应配置 peer1:8761。
客户端的defaultZone则配置所有Eureka Server节点的地址,用逗号分隔。

五、总结:迈出微服务的第一步

通过搭建Eureka Server和配置Eureka Client,我们成功地让一个微服务实例(user-service)注册到了服务注册中心,并且可以通过Eureka的Web界面查看到它的状态。这为后续的服务间调用打下了坚实的基础。

Spring Cloud Netflix Eureka提供了一种相对简单且经过广泛验证的服务注册与发现解决方案。虽然Netflix已将其置于维护模式,但它在许多现有系统中仍被大量使用,并且其AP设计理念对于理解服务发现非常重要。

在后续的文章中,我们将看到服务消费者如何利用从Eureka获取到的信息,结合客户端负载均衡器来调用这个user-service。我们也会在适当的时候介绍更新的服务发现组件,如Nacos或Consul。

相关文章:

微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现

在上一篇中&#xff0c;我们理解了微服务架构的核心理念以及Spring Cloud为我们提供的强大工具集。我们提到&#xff0c;微服务架构的一个核心挑战在于&#xff0c;服务实例的网络位置是动态的&#xff0c;服务之间需要一种机制来互相定位。 想象一下&#xff0c;你开了一家新…...

Linux之初见进程

1. 冯诺依曼体系结构 冯诺依曼体系结构是计算机的基本设计原则之一&#xff0c;也被认为是现代计算机的基础。它由美国数学家约翰冯诺伊曼在20世纪40年代后期提出。冯诺依曼体系结构包括存储程序概念、将数据和指令存储在同一存储器中、按照顺序执行指令等关键特征。 具体来说…...

Docker入门教程:常用命令与基础概念

目录 简介常用命令Docker 常用命令汇总docker run 命令格式与参数解析 简介 Docker 是一个客户端-服务器&#xff08;client-server&#xff09;架构的应用程序&#xff0c;其中包含两个主要组件&#xff1a;Docker 客户端和 Docker 守护进程&#xff08;也称为 Docker Daemon…...

内核深入学习3——分析ARM32和ARM64体系架构下的Linux内存区域示意图与页表的建立流程

内核深入学习3——ARM32/ARM64在Linux内核中的实现&#xff08;2&#xff09; ​ 今天我们来讨论的是一个硬核的内容&#xff0c;也是一个老生常谈的话题——那就是分析ARM32和ARM64体系架构下的Linux内存区域示意图的内容。对于ARM64的部分&#xff0c;我们早就知道一个基本的…...

vim 练习题

文章目录 前言&#xff1a;学习了vim基础命令&#xff0c;上机实操下吧命令模式练习插入模式练习末行模式练习视图模式练习高级操作练习 总结 前言&#xff1a;学习了vim基础命令&#xff0c;上机实操下吧 命令模式练习 打开任意文本文件&#xff0c;使用gg跳转到首行&#x…...

CSS3 选择器完全指南:从基础到高级的元素定位技术

CSS3选择器完全指南&#xff1a;从基础到高级的元素定位技术 一、基本选择器&#xff1a;精准定位的基石 &#xff08;一&#xff09;元素选择器 通过元素标签名直接匹配页面元素&#xff0c;语法简洁直观&#xff1a; p { color: #333; } /* 选择所有<p>元素 */ div…...

从SAM看交互式分割与可提示分割的区别与联系:Interactive Segmentation Promptable Segmentation

SAM的火爆也带来了一项新的任务&#xff1a;Promptable Segmentation&#xff0c;并且作者在文中对比了交互式分割Interactive Segmentation&#xff0c;并且在训练过程中也参考了交互式分割的训练方法&#xff0c;那么可提示分割与交互式分割有什么区别&#xff1f; 个人观点…...

k8s初始化时候,报错无法通过 CRI(容器运行时接口)与 containerd 通信

报错主要信息处 [reset] Unmounting mounted directories in “/var/lib/kubelet” W0513 11:34:19.818023 27124 cleanupnode.go:134] [reset] Failed to evaluate the “/var/lib/kubelet” directory. Skipping its unmount and cleanup: lstat /var/lib/kubelet: no such f…...

k8s之k8s集群部署

一、kubernetes基础环境搭建 1.安装虚拟机 2. 基础环境配置 2.1 关闭防火墙 更改主机名 #系统更新 sudo dnf update -y # 关闭防火墙 sudo systemctl stop firewalld sudo systemctl disable firewalld # 临时关闭 SELinux sudo setenforce 0 # 永久关闭 SELinux sudo sed -i…...

百度智能云千帆携手联想,共创MCP生态宇宙

5月7日&#xff0c;2025联想创新科技大会&#xff08;Tech World&#xff09;在上海世博中心举行&#xff0c;本届大会以“让AI成为创新生产力”为主题。会上&#xff0c;联想集团董事长兼CEO杨元庆展示了包括覆盖全场景的超级智能体矩阵&#xff0c;包括个人超级智能体、企业超…...

黑白浮生项目测试报告

文章目录 一、项目背景二、项目功能三、测试计划1. 功能测试1.1 注册页面1.1.1 正常注册1.1.2 异常注册 1.2 登录页面1.2.1 正常登录1.2.2 异常登录 1.3 游戏大厅页面1.3.1 开始匹配1.3.2 取消匹配 1.4 游戏房间页面1.4.1 落子1.4.2 游戏结束 2. 自动化测试2.1 创建浏览器驱动类…...

《操作系统真象还原》第十四章(2)——文件描述符、文件操作基础函数

文章目录 前言文件描述符简介文件描述符原理文件描述符实现修改thread.h修改thread.c 文件操作相关的基础函数inode操作相关函数文件相关函数编写file.h编写file.c 目录相关函数完善fs/dir.h编写fs/dir.c 路径解析相关函数实现文件检索功能修改fs.h继续完善fs.c makefile 结语 …...

k8s v1.26 实战csi-nfs 部署

一 前言 使用自开发的一键k8s基础环境部署后&#xff0c;存储需要解决&#xff0c;就是测试环境故选择nfs比较简单&#xff0c;翻阅很多网上资料感觉都不是很全面&#xff0c;结合网上资料折腾了一天&#xff0c;总算是完成了csi-nfs部署。其实之前也部署过&#xff0c;经过一…...

测试集群的功能-执行wordcount程序

具体的操作步骤如下&#xff1a; 确保hadoop是正确运行的。hdfs和yarn都正常启动了。在集群根目录下创建wcinput目录&#xff0c;并在它的下面上传两个文本文件word1.txt, word2.txt&#xff0c;其中保存了要测试的单词信息。在任意一台设备中&#xff0c;进入到hadoop的主目录…...

聊一聊Electron中Chromium多进程架构

Chromium 多进程架构概述 Chromium 的多进程架构是其核心设计之一&#xff0c;旨在提高浏览器的稳定性、安全性和性能。Chromium 将不同的功能模块分配到独立的进程中&#xff0c;每个进程相互隔离&#xff0c;避免了单进程架构中一个模块的崩溃导致整个浏览器崩溃的问题。 在…...

虹科技术 | 简化汽车零部件测试:LIN/CAN总线设备的按键触发功能实现

汽车零部件测试领域对操作的便捷性要求越来越高&#xff0c;虹科Baby-LIN-RC系列产品为这一需求提供了完美的解决方案。从基础的按键设置到高级的Shift键应用&#xff0c;本文将一步步引导您了解虹科Baby-LIN-RC系列产品的智能控制之道。 虹科Baby-LIN-3-RC 想象一下&#xff0…...

前端开发避坑指南:React 代理配置常见问题与解决方案

前端开发避坑指南:React 代理配置常见问题与解决方案 一、为什么需要配置代理?二、使用 create-react-app 默认配置代理三、使用 http-proxy-middleware 配置复杂代理四、高级代理配置五、生产环境中的代理配置一、为什么需要配置代理? React 应用在开发过程中经常需要与后端…...

43、Server.UrlEncode、HttpUtility.UrlDecode的区别?

Server.UrlEncode 和 HttpUtility.UrlDecode 是 .NET 中用于处理 URL 编码/解码的两个不同方法&#xff0c;主要区别在于所属命名空间、使用场景和具体行为。以下是详细对比&#xff1a; 1. 所属类库与命名空间 Server.UrlEncode 属于 System.Web.HttpServerUtility 类。通常…...

Azure 应用的托管身份与服务主体

Microsoft Entra ID -- 前称 Azure Active Directory -- 提供强大的身份验证和授权功能。托管身份和服务主体通过限制凭据暴露的风险来帮助确保对 Azure 资源的访问安全。 托管身份为Azure原生应用程序自动管理身份&#xff0c;而服务主体则非常适合需要访问Azure资源的外部应…...

音频特征工具Librosa包的使用

深入探索Mamba模型架构与应用 - 商品搜索 - 京东 DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 要使用深度学习与语音特征进行抽取&#xff0c;首先需要准备能够对语音特征进行解析的工具。 Librosa是一个用于音频、音乐分析与处理的Python工具包&#x…...

Mapreduce初使用

&#xff08;一&#xff09;MapReduce的定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个…...

Samtec助力电视广播行业

【摘要前言】 现代广播电视技术最有趣的方面之一就是界限的模糊。过去&#xff0c;音频和视频是通过射频电缆传输的模拟技术采集的&#xff0c;而现在&#xff0c;数字世界已经取代了模拟技术。物理胶片和磁带已让位于数字存储设备和流媒体。 在这个过程中&#xff0c;连接器…...

根据输入的数据渲染柱形图

背景&#xff1a;根据不同季度的销售额&#xff0c;生成对应的柱形图&#xff0c;直观的看出差异 效果&#xff1a; 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatibl…...

Three.js模型材质调整与性能优化实战

一、材质基础调整 1.1 颜色与透明度控制 通过Material.color属性可直接修改材质颜色&#xff1a; material.color new THREE.Color(0xff0000); // 红色结合opacity属性实现透明效果&#xff1a; material.opacity 0.5; // 50%透明度如需动态调整&#xff0c;可通过Color.…...

QEMU模拟32位ARM实现自定义系统调用

实现自定义系统调用 如何使用 QEMU 模拟32位 ARM 环境参考&#xff1a;使用Qemu模拟32位ARM系统 修改linux内核源码 使用 linux-4.4.240 源码&#xff0c;下载链接&#xff1a;下载链接 在 arch\arm\include\uapi\asm\unistd.h 文件下新增系统调用 sys_test&#xff1a; /…...

AWS IoT Core自定义域名配置实战指南

在使用AWS IoT Core时,配置自定义域名可以为您的IoT解决方案带来多方面的好处。本文将详细介绍如何在AWS IoT Core中设置和使用自定义域名,包括证书配置、域名设置以及DNS记录创建等关键步骤。 为什么要使用自定义域名? 使用自定义域名(也称为客户管理的域名)有以下几个主要…...

【C盘空间不足怎么办】

C 盘空间不足是一个常见的问题&#xff0c;即使感觉没怎么用&#xff0c;也可能被各种文件悄悄占满。这里分析一下常见的原因和排查方向&#xff1a; 一、 常见的空间占用大户&#xff1a; Windows 系统文件和更新&#xff1a; Windows Update 缓存&#xff1a; 系统更新后&am…...

workman进阶应用 GatewayWorker 仿微信 做聊天室

聊天室主要用到GatewayWorker &#xff0c;它是对workerman的进一步封装 GatewayWorker基于Workerman开发的一个项目框架&#xff0c;用于快速开发TCP长连接应用&#xff0c;例如app推送服务端、即时IM服务端、物联网、智能家居等等。 1. 安装环境 1.1 首先下载框架 compos…...

WebRTC技术EasyRTC嵌入式音视频通信SDK打造远程实时视频通话监控巡检解决方案

一、方案概述​ 在现代工业生产、基础设施维护等领域&#xff0c;远程监控与巡检工作至关重要。传统的监控与巡检方式存在效率低、成本高、实时性差等问题。EasyRTC作为一种先进的实时音视频通信技术&#xff0c;具备低延迟、高稳定性、跨平台等特性&#xff0c;能够有效解决这…...

window 显示驱动开发-创建分配时指定段

显示微型端口驱动程序指定并返回有关其内存段的信息&#xff0c;当视频内存管理器调用驱动程序的 DxgkDdiCreateAllocation 函数时&#xff0c;它更喜欢视频内存管理器使用这些信息。 在调用 DxgkDdiCreateAllocation 时&#xff0c;驱动程序为视频资源创建分配。 驱动程序在描…...

如何创建企业微信应用,如何给企业微信发送消息

首先打开你的企业微信 然后在下面创建应用 我创建的是 pes 设置域名和白名单 等你要开发的时候 就需要配置了 然后就能直接在本地发送企业微信消息了 切记 要配置白名单ip 如果要获取所有部门信息&#xff0c;旧得接口已经不能用了&#xff0c;只能获取所有部门id 前提是…...

WM_TIMER定时器消息优先级低,可能会被系统丢弃,导致定时任务无法正常执行

之前在优化电子白板绘制曲线功能时就遇到WM_TIMER定时器消息被丢弃的问题。原先在绘制曲线图元时&#xff0c;左键按下后一直不放&#xff0c;拖动鼠标绘制曲线&#xff08;不断绘制一些小线段形成曲线&#xff09;&#xff0c;等到左键弹起后完成一个完整曲线的绘制&#xff0…...

在Babylon.js中实现完美截图的艺术:包含Canvas和HTML覆盖层

在现代Web 3D应用开发中&#xff0c;Babylon.js作为强大的3D引擎被广泛应用。一个常见的需求是实现场景截图功能&#xff0c;特别是当场景中包含HTML覆盖层(如UI控件、菜单等)时。本文将深入探讨如何在Babylon.js中实现完整的截图方案。 问题背景 这里我是希望实现一个渐隐的…...

mac 10.15.7 svn安装

macOS 版本推荐 SVN 安装方式≤10.14Homebrew 安装独立 SVN≥10.15优先使用 CLT 自带 SVN 一、使用 brew 安装 &#xff08;没成功&#xff09; brew install subversion 这个方法安装一直不成功&#xff0c;一直在提示说版本旧或都是一些引用工具安装失败&#xff0c; 二、使…...

文件同步2

请大家思考如何使用scp命令去解决这个问题。 有两种思路&#xff1a; 第一种&#xff1a;三个文件一个一个去拷贝。缺点是操作麻烦&#xff0c;要逐一操作。 第二种&#xff1a;重新把A上的conf拷贝到B上。缺点是会重复拷贝文件1&#xff0c;2&#xff0c;3&#xff0c;4。 …...

el-select 结合 el-tree:树形下拉数据

一、单选 <template><div class"selectTree-wapper"><el-selectv-model"selectValue"placeholder"请选择"popper-class"custom-el-select-class"ref"selectRef"clearableclear"clearHandle">&…...

GOOSE 协议中MAC配置

在 GOOSE&#xff08;Generic Object Oriented Substation Event&#xff09;协议中&#xff0c;主站&#xff08;Publisher&#xff09;发送的 MAC 地址不需要与从站&#xff08;Listener&#xff09;的 MAC 地址一致&#xff0c;其通信机制与 MAC 地址的匹配逻辑取决于 GOOSE…...

11. CSS从基础样式到盒模型与形状绘制

在前端开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;是控制网页样式和布局的核心技术。整理了关于 CSS 基础样式、文本样式、盒模型以及形状绘制的一些心得。以下是详细的学习笔记。 一、基础样式设置 1. 字体样式 字体样式是网页视觉呈现的重要组成部分&#xf…...

【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一)

当前项目是用来记录下以前学习过的springcloud的dalston.sr1版本&#xff0c;该版本目前来看已经过时了&#xff0c;这里仅做下学习记录分享&#xff08;当前推荐学习spring cloud alibaba&#xff09;。 springcloud主要用于大型项目&#xff0c;比如有一个电商项目&#xff…...

集成DHTMLX 预订排期调度组件实践指南:如何实现后端数据格式转换

在企业级应用中&#xff0c;预订系统&#xff08;Booking System&#xff09;作为典型的调度类应用&#xff0c;广泛用于酒店、会议室、设备预约、医疗排班等业务场景。而DHTMLX Scheduler作为一款功能强大且高度可定制的 JavaScript 日程安排控件&#xff0c;已成为众多开发者…...

ROS多机集群组网通信(四)——Ubuntu 20.04图形化配置 Ad-Hoc组网通信指南

引言 在我之前的文章中已经讲解过Ad-Hoc网络的相关概念&#xff0c;以及如何使用网卡配置Ad-Hoc模式&#xff0c;实现局域网无中心路由通信。这篇文章主要讲解如何在ubuntu20.04上使用图形化配置工具来更方便的配置Ad-Hoc网络&#xff0c;实现组网通信。下面先复习一下之前的相…...

S7-1200 PLC与梅特勒-托利多IND360称重仪表通信

以下是使用西门子进行通信的方法及接线说明&#xff0c;基于常见的工业通信方案&#xff08;如Modbus RTU或Modbus TCP&#xff09;。由于IND360通常支持Modbus协议&#xff0c;而S7-1200需通过附加模块或库实现通信&#xff0c;以下分两种场景说明。 一、通信方案选择 Modbus …...

网络安全侦察与漏洞扫描One-Liners

在网络安全领域&#xff0c;侦察&#xff08;Reconnaissance&#xff09;和漏洞扫描是发现潜在安全风险的重要步骤。本文整合了一系列高效的命令行工具和脚本&#xff0c;涵盖子域名枚举、漏洞扫描、资产发现和信息提取等技术&#xff0c;旨在为安全研究人员和渗透测试人员提供…...

React Native告别图标体积大手动更换慢的噩梦:让图标更新像修改文字一样简单

写在前面:凌晨三点的图标战争 “所有图标都要换成圆角风格,明天上线!”——产品经理这条消息弹出时,我的保温杯差点从手中滑落。扫了一眼项目中的347个图标文件,我知道今晚又是个不眠夜。但就在绝望之际,同事发来一个GIF:他只是在终端输入了iconfont-rn --update,所有…...

【机器学习赋能的智能光子学器件系统研究与应用】

在人工智能与光子学设计融合的背景下&#xff0c;科研的边界持续扩展&#xff0c;创新成果不断涌现。从理论模型的整合到光学现象的复杂模拟&#xff0c;从数据驱动的探索到光场的智能分析&#xff0c;机器学习正以前所未有的动力推动光子学领域的革新。据调查&#xff0c;目前…...

信奥赛-刷题笔记-队列篇-T2-P1540机器翻译和P2952Cow Line S

总题单 本部分总题单如下 【腾讯文档】副本-CSP-JSNOI 题单 (未完待续) https://docs.qq.com/sheet/DSmJuVXR4RUNVWWhW?tabBB08J2 队列篇题单 P1540 [NOIP 2010 提高组] 机器翻译 https://www.luogu.com.cn/problem/P1540 题目背景 NOIP2010 提高组 T1 题目描述 小晨…...

ESP32C3连接wifi

文章目录 &#x1f527; 一、ESP32-C3 连接 Wi-Fi 的基本原理&#xff08;STA 模式&#xff09;✅ 二、完整代码 注释讲解&#xff08;适配 ESP32-C3&#xff09;&#x1f4cc; 三、几个关键点解释&#x1f51a; 四、小结 &#x1f527; 一、ESP32-C3 连接 Wi-Fi 的基本原理&a…...

nvidia驱动更新-先卸载再安装-ubuntu

显卡驱动升级前&#xff0c;卸载旧版本&#xff0c;可采用两种方式。 1.命令行 &#xff08;1&#xff09;查找已安装的 NVIDIA 驱动和相关包&#xff1a;dpkg -l | grep nvidia &#xff08;2&#xff09;完全卸载 NVIDIA 驱动&#xff1a;sudo apt remove purge nvidia-*…...

SparkSQL 连接 MySQL 并添加新数据:实战指南

SparkSQL 连接 MySQL 并添加新数据&#xff1a;实战指南 在大数据处理中&#xff0c;SparkSQL 作为 Apache Spark 的重要组件&#xff0c;能够方便地与外部数据源进行交互。MySQL 作为广泛使用的关系型数据库&#xff0c;与 SparkSQL 的结合可以充分发挥两者的优势。本文将详细…...

Tomcat与纯 Java Socket 实现远程通信的区别

Servlet 容器​​&#xff08;如 Tomcat&#xff09; 是一个管理 Servlet 生命周期的运行环境&#xff0c;主要功能包括&#xff1a; ​​协议解析​​&#xff1a;自动处理 HTTP 请求/响应的底层协议&#xff08;如报文头解析、状态码生成&#xff09;&#xff1b; ​​线程…...