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

Java大师成长计划之第23天:Spring生态与微服务架构之服务发现与注册中心

📢 友情提示:

本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。

在微服务架构中,服务发现和注册中心扮演着至关重要的角色。在分布式系统中,各个微服务可能会部署在不同的服务器上,其地址和端口也会因负载均衡或伸缩而变化。为了实现服务间的动态通信,服务发现机制应运而生。本文将详细介绍如何使用Eureka和Consul作为服务发现和注册中心。

一. 服务发现的概述

在微服务架构中,各个微服务应用可能分布在不同的机器或容器中,每个微服务的实例数量、IP地址和端口号也可能动态变化。为了让各个微服务能够互相通信并且对外提供服务,必须有一种机制来动态地发现和访问这些服务,这就是服务发现

服务发现通常是通过服务注册与注册中心的配合来实现的。服务注册中心负责维护服务的注册信息,微服务实例向注册中心注册自己的信息,而客户端则向注册中心查询需要访问的服务信息。这样就能实现服务的动态管理和自动发现,大大简化了微服务间的通信。

服务发现的实现模式

服务发现可以通过以下两种主要的实现模式来完成:

  1. 客户端负载均衡模式(Client-side Load Balancing) :
    在客户端负载均衡模式中,微服务客户端通过注册中心获取服务的真实地址和端口,然后直接与服务进行通信。客户端通常会使用负载均衡算法(如轮询、加权、最小连接数等)来选择一个服务实例进行访问。客户端负载均衡的好处是分担了服务端的压力,避免了单点故障,但也增加了客户端的复杂性。

  2. 服务端负载均衡模式(Server-side Load Balancing) :
    在服务端负载均衡模式中,客户端发送请求到一个API网关负载均衡器,然后由网关或负载均衡器根据负载均衡算法选择一个健康的微服务实例,并将请求转发给它。服务端负载均衡的好处是客户端无需关心服务实例的动态变化,简化了客户端的复杂性。

服务发现的关键组成部分

服务发现机制通常由以下几个核心组件组成:

  • 服务注册中心:服务注册中心是服务发现机制的核心,负责存储和管理所有服务的注册信息,通常是一个中心化的服务,如Eureka、Consul等。

  • 服务提供者:微服务应用作为服务提供者,会向服务注册中心注册自己的信息(如服务名称、IP地址、端口等)。在服务提供者启动时,它会将自己的信息注册到服务注册中心;当服务停止时,注册信息也会被注销。

  • 服务消费者:服务消费者通过服务注册中心查询需要访问的服务实例,并通过负载均衡算法选择一个服务实例进行通信。

  • 心跳机制:为了确保服务实例的可用性,服务提供者会定期向注册中心发送心跳信息。如果心跳未收到,注册中心会认为该服务不可用,并将其从服务列表中移除。

  • 健康检查:服务注册中心一般会提供健康检查功能,定期检查注册的服务实例的健康状况。如果某个服务实例不可用,注册中心会将其标记为不可用。

通过这种方式,服务间可以根据需求动态发现和访问,极大提高了微服务架构的灵活性和可扩展性。

二、Eureka 介绍

Eureka 是 Netflix 开源的一款服务发现工具,在 Spring Cloud 生态系统中被广泛使用,成为微服务架构中不可或缺的一部分。Eureka 主要提供了服务的注册与发现功能,分为两个主要组件:

  • Eureka Server:负责接收来自各个微服务的注册请求,维护一个服务列表,向客户端提供服务发现功能。

  • Eureka Client:微服务客户端通过 Eureka Client 向 Eureka Server 注册自己的信息,并能够从 Eureka Server 查询到其他服务的信息。

2.1 Eureka Server 的搭建

Eureka Server 作为服务注册中心,负责集中管理所有微服务的注册信息。下面是如何搭建一个简单的 Eureka Server。

  1. 创建 Spring Boot 项目
    使用 Spring Initializr 创建一个新的 Spring Boot 项目。在依赖中选择 “Eureka Server” 作为依赖项。Eureka Server 是一个 Spring Boot 应用程序,使用 @EnableEurekaServer 注解来启动服务注册中心。

  2. 配置 Eureka Server
    在 application.yml 中配置 Eureka Server 的相关信息,例如端口号和是否启用客户端注册功能。

    yaml

    server:port: 8761  # Eureka Server 监听的端口eureka:client:register-with-eureka: false  # 关闭 Eureka Server 自己的注册功能fetch-registry: false  # 关闭从其他 Eureka Server 获取服务列表的功能
  3. 启动类的注解
    在主类上添加 @EnableEurekaServer 注解,表示该服务为 Eureka Server。

    java

    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);}
    }
  4. 运行 Eureka Server
    运行 Eureka Server 后,可以通过浏览器访问 http://localhost:8761 来查看 Eureka 控制台。此时,Eureka Server 已经成功启动并开始监听服务注册请求。

2.2 Eureka Client 的配置

Eureka Client 是微服务实例,它通过向 Eureka Server 注册自己的信息来完成服务的注册功能。Eureka Client 还可以通过 Eureka Server 获取到其他服务的信息。

  1. 创建 Eureka Client 项目
    创建一个新的 Spring Boot 项目,选择 “Eureka Discovery” 作为依赖项。在该项目中,我们将配置 Eureka Client,使其能够自动注册到 Eureka Server。

  2. 配置 Eureka Client
    在 application.yml 配置文件中,我们需要指定 Eureka Server 的地址,以及微服务的名称等信息。以下是 application.yml 的配置示例:

    yaml

    server:port: 8080  # 微服务的端口spring:application:name: microservice-provider  # 微服务的名称eureka:client:service-url:defaultZone: http://localhost:8761/eureka/  # Eureka Server 的地址instance:preferIpAddress: true  # 注册时使用 IP 地址而非主机名
  3. 启动类的注解
    在启动类上添加 @EnableEurekaClient 注解,表示该应用是 Eureka Client,能够向 Eureka Server 注册服务并获取其他服务的信息。

    java

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
    @EnableEurekaClient  // 启动 Eureka Client
    public class MicroserviceProviderApplication {public static void main(String[] args) {SpringApplication.run(MicroserviceProviderApplication.class, args);}
    }
  4. 验证服务注册
    启动微服务后,可以通过访问 Eureka 控制台(http://localhost:8761)查看已注册的微服务实例。如果一切顺利,微服务的名称 microservice-provider 应该会出现在服务列表中。

2.3 Eureka 的高可用和集群配置

为了保证 Eureka Server 的高可用性,通常会将 Eureka Server 部署为集群模式。在集群模式下,多个 Eureka Server 实例可以组成一个注册中心,彼此同步服务注册信息,从而避免单点故障。

  • 集群配置:每个 Eureka Server 启动时,都需要配置 eureka.client.service-url.defaultZone,指向其他 Eureka Server 的地址,形成一个集群。
  • 数据同步:Eureka Server 集群内的每个实例都会定期将服务信息同步给其他实例,确保服务信息一致性。

这种高可用架构能有效防止由于单个 Eureka Server 宕机而导致服务发现失败的情况。

通过上面的内容,我们介绍了如何搭建和使用 Eureka Server 和 Eureka Client,实现了微服务的注册与发现。接下来,我们可以深入探讨 Eureka 的一些高级特性,如健康检查、负载均衡等功能。

三. Consul 介绍

在微服务架构中,Consul 是一个强大的服务发现和配置管理工具,由 HashiCorp 提供。与 Eureka 相比,Consul 的特点在于它不仅提供服务发现功能,还集成了健康检查、KV 存储、以及多数据中心支持等功能。Consul 在大规模、分布式系统中,特别是跨数据中心的微服务架构中,具有独特的优势。

3.1 Consul 的核心功能

Consul 主要提供以下几个关键功能:

  • 服务发现:Consul 提供了类似 Eureka 的服务发现功能,能够让服务注册到 Consul Server,并允许其他服务根据服务名称进行查询。

  • 健康检查:Consul 支持服务健康检查机制,能够实时监控服务的可用性。如果某个服务不可用,Consul 会自动将该服务从注册中心移除,防止客户端访问失败的服务。

  • Key-Value 存储:Consul 提供分布式的 Key-Value 存储功能,可以用来存储配置、元数据或者其他需要共享的数据。

  • 多数据中心支持:Consul 支持跨数据中心部署,能够使不同数据中心中的服务相互发现,适合于全球分布式系统的需求。

  • DNS 和 HTTP 接口:Consul 提供 DNS 和 HTTP API 接口,支持基于 DNS 查询服务和进行其他操作,方便开发人员与 Consul 交互。

3.2 Consul 的架构

Consul 的架构由以下几个主要组件组成:

  1. Consul Agent:Consul Agent 是每个服务所在主机上运行的组件,负责与 Consul Server 通信,执行服务注册和健康检查。每个 Consul Agent 负责注册本机的服务实例,并定期向 Consul Server 报告服务的健康状态。

  2. Consul Server:Consul Server 是集群中的核心组件,负责存储和管理所有的服务信息、健康状态、配置等。Consul Server 通过 Raft 协议来保证数据的强一致性,并支持多节点部署来提高可用性。

  3. Consul Client:Consul Client 是一种轻量级代理,它在服务所在主机上运行,负责向 Consul Server 注册服务和执行健康检查。Consul Client 还可以提供 HTTP API 接口,方便开发者通过 API 操控服务信息。

  4. Consul UI:Consul 提供一个基于 Web 的用户界面,用于查看服务的注册状态、健康检查情况等。通过 UI,开发人员可以方便地监控和管理服务。

  5. 健康检查机制:Consul 提供了强大的健康检查机制,能够定期检测服务实例的健康状态。如果某个实例失效,Consul 会将该实例从服务列表中移除。

3.3 Consul 的搭建

与 Eureka 类似,Consul 的部署和使用也比较简单。下面是如何在本地环境搭建 Consul 服务发现的基本步骤。

3.3.1 安装 Consul

首先,您需要在机器上安装 Consul。可以从 Consul 官网 下载对应操作系统的安装包。

对于 macOS 用户,您可以使用 Homebrew 安装:

brew install consul

对于 Linux 用户,可以直接下载并解压:

bash

wget https://releases.hashicorp.com/consul/1.12.0/consul_1.12.0_linux_amd64.zip
unzip consul_1.12.0_linux_amd64.zip
sudo mv consul /usr/local/bin/
3.3.2 启动 Consul Agent

启动 Consul Agent 并将其运行在开发模式下(-dev 参数是开发模式,适合本地测试):

consul agent -dev

这时,Consul Agent 会启动并监听在默认的 8500 端口。您可以通过访问 http://localhost:8500 来访问 Consul 的 Web UI。

3.3.3 启动微服务并注册到 Consul

在微服务应用中,您需要引入 Spring Cloud Consul Discovery 依赖,并通过配置文件连接到 Consul。

  1. 添加依赖

     

    在 pom.xml 中添加 Spring Cloud Consul 的依赖:

    xml

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
  2. 配置文件 application.yml

     

    配置 Consul 连接信息,以及服务的注册信息:

    yaml

    spring:application:name: microservice-provider  # 服务名称cloud:consul:host: localhost  # Consul Server 的地址port: 8500  # Consul Server 的端口discovery:enabled: true  # 启用 Consul 服务发现
  3. 启用 Consul Client

     

    在 Spring Boot 启动类中添加 @EnableDiscoveryClient 注解,表示该微服务是 Consul Client。

    java

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
    @EnableDiscoveryClient  // 启用 Consul 服务发现
    public class MicroserviceProviderApplication {public static void main(String[] args) {SpringApplication.run(MicroserviceProviderApplication.class, args);}
    }
  4. 验证服务注册

     

    启动微服务后,访问 Consul Web UI (http://localhost:8500/ui) 可以看到注册的服务列表。如果微服务成功注册到 Consul 中,您会看到名为 microservice-provider 的服务。

3.3.4 健康检查

Consul 的健康检查是其强大功能之一,它能够确保只将健康的服务实例纳入负载均衡池中。您可以在微服务中配置 HTTP 健康检查端点,Consul 会定期访问这个端点以确认服务的健康状态。

  1. 添加健康检查配置

     

    假设微服务有一个 /actuator/health 端点用于暴露健康信息。在 application.yml 中添加如下配置:

    yaml

    spring:cloud:consul:discovery:health-check-path: /actuator/health  # 健康检查端点health-check-interval: 10s  # 健康检查的频率
  2. 配置 Actuator

     

    如果没有健康检查端点,需要引入 Spring Boot Actuator 来提供 health 端点:

    xml

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    启动微服务后,Consul 将定期访问 /actuator/health 端点,确保服务实例的健康状态。如果某个实例不可用,Consul 会自动将其从注册列表中移除。

3.4 Consul 与 Eureka 的对比

特性EurekaConsul
服务发现支持基本的服务注册与发现功能提供服务注册、发现和健康检查功能
健康检查支持基础的健康检查(需要配置)支持高级健康检查,能够自动处理不健康服务
配置管理不提供配置管理提供分布式的 Key-Value 存储,可用于配置管理
多数据中心支持支持多区域,但配置较为复杂内置跨数据中心支持,适合全球分布式环境
性能与可扩展性适用于中小规模的服务发现需求适用于大规模和跨数据中心的分布式系统

3.5 小结

Consul 是一个强大的服务发现与配置管理工具,特别适合于复杂的分布式系统和跨数据中心的微服务架构。它除了提供基础的服务注册和发现功能外,还支持健康检查、分布式存储和多数据中心支持,能够帮助开发者更好地管理和监控微服务。在微服务的应用场景中,Consul 提供了更加灵活和高效的服务治理方案,是许多企业选择的服务发现工具之一。

四. 服务发现的优势

服务发现是微服务架构中的一个核心概念,它通过解决微服务实例的动态变化问题,实现了服务之间的自动化发现和通信。无论是使用 Eureka 还是 Consul,服务发现机制都为微服务架构带来了许多显著的优势。以下是服务发现机制带来的几个关键优势:

4.1 动态注册与发现

在传统的单体应用中,服务之间的调用通常是静态的,服务的地址和端口固定,且服务之间的通信方式也较为简单。然而,在微服务架构中,服务的数量和部署位置常常是动态变化的。这种动态性要求微服务之间能够自动发现对方,从而保证它们能够持续高效地进行通信。

服务发现的优势:

  • 动态服务注册与注销:微服务实例启动时会将自己的信息注册到注册中心,停止时会自动注销。这样,注册中心能够随时更新服务实例的健康状态和位置信息,确保服务消费者始终能找到有效的服务实例。

  • 自动适应服务的变化:随着服务实例的增加或减少,服务消费者不需要进行任何配置调整,只需依赖服务发现机制,就能自动适应系统规模的变化。

  • 高可用性:通过定期向注册中心发送心跳,服务实例可以保持与注册中心的连接,确保服务能够及时更新状态信息。如果某个服务失效,注册中心会自动将其移除,避免将请求发送到不可用的实例。

4.2 提高系统的可扩展性

微服务架构的一个主要优势就是能够根据业务需求横向扩展服务。服务发现机制使得微服务的扩展变得更加简单和灵活,尤其是在高并发和大规模系统中。

服务发现的扩展性优势:

  • 自动化扩容和缩容:服务实例的扩展和收缩是微服务架构常见的操作。例如,当系统负载增加时,可以通过启动更多的服务实例来应对,而服务发现机制会自动将这些新增的服务实例纳入到注册中心。当负载减轻时,服务实例可以被销毁或下线,服务发现机制会自动更新服务列表,确保负载均衡。

  • 弹性负载均衡:服务发现配合负载均衡器使用,能够根据实时的服务实例数量和健康状况自动调整流量分配,实现流量的智能分发,避免单一服务实例的过载。

  • 动态服务路由:通过服务发现,微服务消费者可以动态地获得可用的服务实例信息,无论服务实例部署在哪个数据中心或容器中,消费者都能够自动找到并连接到服务。这让系统在多数据中心、跨区域部署时,能够无缝扩展。

4.3 故障容忍与容错

在分布式系统中,服务实例的故障是不可避免的。传统的单体应用通常依赖静态配置的方式来处理服务实例的变化,这种方式往往导致服务不可用或难以维护。服务发现机制通过健康检查、故障转移和自动恢复,增强了系统的容错能力。

服务发现的容错性优势:

  • 故障转移:当某个服务实例不可用时,服务发现机制能够及时从服务注册中心移除该实例,确保请求不会被发送到不可用的服务。当一个服务实例发生故障时,注册中心可以自动将流量导向其他健康的实例,从而提高系统的容错能力。

  • 健康检查:服务发现系统通常会与健康检查机制结合使用,定期检查服务实例的健康状况。如果某个实例未能通过健康检查,注册中心会将其标记为不可用,防止客户端访问到故障的实例。这样,可以避免系统中的故障传播,减少整体服务不可用的概率。

  • 自动恢复:当服务实例恢复正常后,注册中心会重新将其纳入到可用的服务实例列表中,确保服务能够及时恢复并继续提供业务。

4.4 减少人工干预与维护成本

传统的服务注册和管理方式通常需要大量的人工干预和配置管理。在微服务架构中,服务的增加和减少是非常频繁的,手动管理这些服务变得非常复杂且容易出错。服务发现机制的引入自动化了这个过程,大大减少了人工操作。

服务发现的自动化管理优势:

  • 自动注册与注销:微服务实例无需人工干预即可自动注册到服务注册中心,并在服务停止时自动注销。这避免了开发人员或运维人员需要手动更新服务配置文件的麻烦,减少了人为错误的发生。

  • 动态更新配置:服务注册中心会实时监控服务实例的状态并根据需要动态更新服务信息,服务消费者无需关注服务实例的具体变化,只需通过服务发现机制获取最新的服务实例。

  • 简化运维管理:由于服务发现机制能够自动监控和管理服务实例的生命周期,运维人员无需手动管理服务的注册和发现,降低了运维管理的复杂度和错误率。

4.5 支持跨数据中心与多地域部署

在全球化的业务场景中,系统需要支持跨多个数据中心或地域的服务部署,以提升可用性、响应速度和灾难恢复能力。传统的服务发现机制通常只支持单一数据中心或地域内的服务发现,而服务发现机制如 Consul 提供了跨数据中心的支持,使得微服务在多个地理位置之间的服务发现变得更加简单和高效。

服务发现的跨地域部署优势:

  • 跨数据中心支持:Consul、Eureka 等服务发现系统支持跨数据中心的部署,使得分布在全球不同数据中心的微服务能够互相发现,并通过服务发现机制实现通信。这对于跨国企业或分布式系统尤为重要,能够实现全球范围内的微服务治理。

  • 全局负载均衡:通过服务发现机制,跨数据中心的负载均衡能够根据实时流量和服务健康状态自动调整请求路由。这能够有效减少用户的访问延迟,并提高系统的可用性。

  • 灾难恢复:跨数据中心的服务发现机制使得当某个数据中心发生故障时,流量可以迅速切换到其他数据中心的健康实例上,从而实现灾难恢复和高可用性。

4.6 提升开发效率与系统可维护性

在微服务架构中,开发人员通常需要关注每个微服务的功能实现和接口设计,而不必过多考虑服务如何发现和通信。服务发现机制能够将这些底层的通信和配置管理任务交给框架处理,开发人员只需专注于业务逻辑的开发。这不仅提升了开发效率,还提高了系统的可维护性。

服务发现的开发效率优势:

  • 解耦服务之间的通信:服务发现机制使得服务消费者无需关心其他服务的具体位置和配置,完全通过注册中心来获取服务信息。这样,服务的扩展和变动不会影响到消费者,系统变得更加灵活和可维护。

  • 自动化的服务注册与发现:服务注册与发现机制的自动化降低了开发人员的工作量。在微服务开发过程中,开发人员不再需要手动配置服务地址或端口,所有的服务信息都由注册中心自动管理和提供。

  • 简化微服务架构的设计:使用服务发现机制,可以让开发者将服务调用的实现集中化,简化了微服务之间的通信方式,使得架构设计更加清晰和易于管理。

服务发现机制通过动态服务注册、健康检查、负载均衡、自动化管理等功能,使得微服务架构具备了高度的可扩展性、容错性和高可用性。服务发现不仅减少了开发和运维的工作量,还为跨数据中心、全球化部署等复杂场景提供了强大的支持。随着微服务架构的广泛应用,服务发现机制已经成为现代分布式系统中不可或缺的一部分,帮助企业实现更加高效、灵活、可维护的系统。

五. 结论

今天的内容中,我们深入探讨了在微服务架构中,Eureka 和 Consul 作为服务发现和注册中心的使用方法。通过合理利用服务发现机制,可以大大简化微服务的管理和维护,为后续的微服务治理奠定基础。希望大家通过这个实践,能够更深入地理解Spring生态和微服务架构的核心概念。下次再见!

相关文章:

Java大师成长计划之第23天:Spring生态与微服务架构之服务发现与注册中心

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4-turbo模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在微服务架构中&#xff0c;服务发现…...

list简单模拟实现

成员变量迭代器&#xff08;重点&#xff09;ListIterator运算符重载begin、end 插入、删除inserterase头插、尾插、头删、尾删 operator->const_iterator拷贝构造operator析构函数完整代码 由于前面已经模拟实现了vector&#xff0c;所以这里关于一些函数实现就不会讲的过于…...

undefined reference to `typeinfo for DeviceAllocator‘

出现“undefined reference to typeinfo”链接错误的原因及解决方法如下&#xff1a; class DeviceAllocator { public:explicit DeviceAllocator(DeviceType device_type){};virtual void* allocate(size_t n) 0;virtual void deallocate(void* p) 0;~DeviceAllocator() d…...

动态规划问题 -- 多状态模型(买股票的最佳时机II)

目录 动态规划分析问题五步曲题目概述利用状态机推导状态转移方程式代码编写 动态规划分析问题五步曲 不清楚动态规划分析问题是哪关键的五步的少年们可以移步到 链接: 动态规划算法基础 这篇文章非常详细的介绍了动态规划算法是如何分析和解决问题的 题目概述 链接: 买股票的最…...

【落羽的落羽 C++】进一步认识模板

文章目录 一、非类型模板参数二、模板的特化1. 函数模板特化2. 类模板特化 三、模板的编译分离 一、非类型模板参数 模板参数可以分为类型参数和非类型参数。我们之前使用的都是类型参数&#xff0c;即出现在模板参数列表中&#xff0c;跟在class或typename之类的参数类型名称…...

Java爬虫能处理京东商品数据吗?

Java爬虫完全可以处理京东商品数据。通过Java爬虫技术&#xff0c;可以高效地获取京东商品的详细信息&#xff0c;包括商品名称、价格、图片、描述等。这些信息对于市场分析、选品上架、库存管理和价格策略制定等方面具有重要价值。以下是一个完整的Java爬虫示例&#xff0c;展…...

#跟着若城学鸿蒙# web篇-初探

前言 先看下官方介绍&#xff0c;这里总结了比较重要的几点Web组件基础&#xff1a;加载与渲染网页全面解析Web组件是现代应用开发中不可或缺的重要元素&#xff0c;它允许开发者在原生应用中无缝集成Web内容。本文将全面介绍Web组件的基本功能&#xff0c;包括多种内容加载方…...

Top-p采样:解锁语言模型的创意之门

Top - p采样 是什么&#xff1a;核采样&#xff1a;排序&#xff0c;累计到0.7&#xff0c;随机选择 在自然语言生成和大规模语言模型推理中&#xff0c;Top - p采样&#xff08;又叫核采样&#xff0c;Nucleus Sampling&#xff09;是一种基于累积概率的采样策略。 Top - p介…...

周赛好题推荐

这周周赛很有质量的&#xff0c;上了一个很有意思的数学题目&#xff0c;推了半天..... 给定一个区间[l,r]&#xff0c;求出区间内所有满足x mod 2^i !k的所有正整数&#xff08;最后全部进行异或&#xff09; 首先我们不妨先算出[l,r]区间所有数字的异或&#xff0c;然后在算…...

【RabbitMQ】实现RPC通信的完整指南

文章目录 RPC 通信创建相关队列客户端代码声明队列发送请求接收响应完整代码 服务端代码设置同时只能获取一个消息接收消息完整代码 运行程序启动客户端启动服务端 RPC 通信 RPC (Remote Procedure Call), 即远过程调用。它是一种通过网络从远程计算机上请求服务&#xff0c;而…...

CK3588下安装linuxdeployqt qt6 arm64

参考资料&#xff1a; Linux —— linuxdeployqt源码编译与打包&#xff08;含出错解决&#xff09; linux cp指令报错&#xff1a;cp: -r not specified&#xff1b; cp: omitting directory ‘xxx‘&#xff08;需要加-r递归拷贝&#xff09; CMake Error at /usr/lib/x86_64…...

滑动窗口之二(优先队列)

原本滑动窗口的板子用的是数组和双指针模拟&#xff0c;我嫌麻烦还不好懂找了双端队列。但其实还是不太好使&#xff0c;比如今天的这道题就处理起来很麻烦。但是如果用优先队列的话就可以一直保证整个窗口是有序的&#xff0c;只需判断一下是否在窗口内即可。但是&#xff01;…...

小刚说C语言刷题—1088求两个数M和N的最大公约数

1.题目描述 求两个正整数 M 和 N 的最大公约数(M&#xff0c;N都在长整型范围内&#xff09; .输入 输入一行&#xff0c;包括两个正整数。 输出 输出只有一行&#xff0c;包括1个正整数。 样例 输入 45 60 输出 15 2.参考代码(C语言版) #include <stdio.h> …...

pytorch训练可视化工具---TensorBoard

一、目的&#xff1a;为什么使用 TensorBoard 调控模型 使用 TensorBoard 可以帮我们&#xff1a; 实时查看 loss / acc 曲线 → 判断是否过拟合、欠拟合&#xff1b; 对比不同模型或超参数的效果&#xff1b; 可视化模型结构 → 帮助调试模型设计&#xff1b; 查看权重/梯…...

丝杆升降机限位失灵深度剖析:从故障机理到智能监测方案

在工业自动化与精密机械传动领域&#xff0c;丝杆升降机凭借高精度、大推力的特性&#xff0c;成为产线设备的核心执行部件。然而&#xff0c;限位系统的可靠性直接决定设备安全运行与生产连续性。本文将从技术原理、故障诊断到智能监测方案&#xff0c;系统性解析丝杆升降机限…...

系统集成项目管理工程师学习笔记

第九章 项目管理概论 1、项目基本要素 项目基础 项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目具有临时性、独特性、渐进明细的特点。项目的“临时性”是指项目只有明确的起点和终点。“临时性”并一定意味着项目的持续时间短。 项目可宣告结束的情况&…...

RDD的自定义分区器-案例

对电商订单数据进行处理&#xff0c;订单数据包含用户 ID 和订单金额&#xff0c;不同地区的用户有不同的 ID 范围。我们会按照地区对订单数据进行分区&#xff0c;这样做能让相同地区的订单数据处于同一分区&#xff0c;便于后续按地区进行统计金额分析。 订单数据如下&#x…...

牛客网NC231954:斐波那契数列 (简单的数列问题)

牛客网NC231954:斐波那契数列 (简单的数列问题&#xff09; 题目描述 本题要求我们计算斐波那契数列的第n项&#xff0c;斐波那契数列定义如下&#xff1a; f(1) 1f(2) 1f(n) f(n-1) f(n-2)&#xff0c;当n ≥ 3 给定整数n&#xff0c;求f(n)的值。 算法思路 斐波那契…...

中国近代史3

辛亥革命 1.同盟会&#xff1a;建立 1905年&#xff0c;东京&#xff0c;第一个全国性的资产阶级革命政党&#xff1b;同盟会纲领“驱除鞑虏&#xff0c;恢复中华&#xff0c;建立民国&#xff0c;平均地权” “民族”“民生”“民权” 2.武昌起义 ①爆发&#xff1a;1911.10…...

晶振的核心参数

目录 1.简介 2.晶振核心参数详解 3.晶振的抖动&#xff08;jitter&#xff09; 4.抖动的三种测量方式 5.抖动的其他资料 1.简介 再看一些晶振的手册时&#xff0c;经常遇到一些类似或相近的参数&#xff0c;今天借此机会&#xff0c;做一个小姐。 2.晶振核心参数详解 1…...

北京孙河傲云源墅:限量典藏的主城墅居臻品

在限墅令的背景下&#xff0c;北京主城的墅居产品日益稀缺&#xff0c;而傲云源墅作为孙河墅区的杰出之作&#xff0c;凭借其独特的价值&#xff0c;成为了众多高端置业者的理想选择。 傲云源墅所处的孙河地区&#xff0c;是北京公认的高价值板块。其地位在 2025 年孙河 2902 …...

驱动-Linux定时-timer_list

了解内核定时相关基础知识 文章目录 简要介绍timer_list 特点API 函数实验测试程序 - timer_mod.c编译文件-Makefile实验验证 注意事项总结 简要介绍 硬件为内核提供了一个系统定时器来计算流逝的时间&#xff08;即基于未来时间点的计时方式&#xff0c; 以当前时刻为计时开始…...

从理论到实战:模糊逻辑算法的深度解析与应用实践

从理论到实战&#xff1a;模糊逻辑算法的深度解析与应用实践 一、模糊逻辑的核心概念与数学基础 模糊逻辑&#xff08;Fuzzy Logic&#xff09;是一种处理不确定性的数学工具&#xff0c;其核心思想是将传统布尔逻辑的“非黑即白”扩展为连续的隶属度函数。例如&#xff0c;在…...

涨薪技术|0到1学会性能测试第65课-SQL捕获阻塞事件

前面的推文我们掌握了JVM调优技术。今天给大家分享MS SQL数据库监控与调优技术。后续文章都会系统分享干货&#xff0c;带大家从0到1学会性能测试。 01SQL捕获阻塞事件 在SQL Server 2005之前的版本&#xff0c;分析哪些进程产生阻塞以及哪些进程被阻塞&#xff0c;都需要使用脚…...

SQL实战:06交叉日期打折问题求解

文章目录 概述题目&#xff1a;交叉打折问题求解题解第一步&#xff1a;使用滑动窗口统计当前活动前的最大结束日期步骤二&#xff1a;拆分出交叉部分步骤三&#xff1a;计算每次活动的持续天数步骤四&#xff1a;分组统计最终结果完整SQL 概述 最近刷题时遇到一些比较有意思的…...

Linux云计算训练营笔记day09(MySQL数据库)

Linux云计算训练营笔记day09&#xff08;MySQL数据库&#xff09; 目录 Linux云计算训练营笔记day09&#xff08;MySQL数据库&#xff09;外键约束数据的导入和导出数据的导出数据的导入 DQL 数据查询语言查指定字段查所有字段where 过滤条件and 和 orin 和 not inbetween...an…...

docker 学习记录

docker pull nginx docker 将本地nginx快照保存到当前文件夹下 docker save -o nginx.tar nginx:latestdocker 将本地nginx 加载 docker load -i nginx.tar docker运行nginx在80端口 docker run --name dnginx -p 80:80 -d nginxredis启动 docker run --name mr -p 6379:6379 -…...

Kind方式部署k8s单节点集群并创建nginx服务对外访问

资源要求 请准备好doker环境&#xff0c;尽量用比较新的版本。我的docker环境如下 docker 环境&#xff1a; Docker version 20.10.21, build 20.10.21-0ubuntu1~18.04.3 安装kind kind表现上就是一个二进制程序&#xff0c;下载对应版本并增加执行权限即可&#xff1a; cu…...

Da14531蓝牙特征值1读没有回调解决

一. 我们调试中发现user_peripheral.c中的回调&#xff0c;一直都没有回调。&#xff08;大家可以通过打印去排查&#xff09; void user_catch_rest_hndl(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { //此处省…...

journal of Electronic Imaging(JEI)投稿咨询

研究生投的第二篇论文-CV方向&#xff0c;由于太菜了&#xff0c;到处被拒&#xff0c;最后选择了Journal of Electronic Imaging(JEI) 审稿了三个月&#xff0c;最近突然变了状态&#xff0c;之前催稿说才一个审稿人&#xff0c;这样子是不是要被拒了&#xff0c;有没有知道的…...

upload-labs靶场通关详解:第6-9关

目录 第六关&#xff1a;大小写绕过 一、分析源代码 二、解题思路 三、解题步骤 第七关&#xff1a;空格绕过 一、分析源代码 二、解题思路 三、解题步骤 第八关&#xff1a;点号绕过 一、分析源代码 二、解题思路 三、解题步骤 第九关&#xff1a;::$DATA字符串绕…...

算法图表总结:查找、排序与递归(含 Mermaid 图示)

算法图表总结&#xff1a;查找、排序与递归&#xff08;含 Mermaid 图示&#xff09; 分类标签&#xff1a;算法、数据结构、Mermaid、技术图表 关键词&#xff1a; 算法可视化、Mermaid 图表、数据结构、二分查找、快速排序、递归树 摘要&#xff1a; 本文通过 Mermaid 图表…...

在文件检索方面doris和elasticsearch的区别

apache Doris 与 Elasticsearch 在文件检索领域的差异源于技术架构与定位目标的本质区别,以下从核心维度对比分析二者的技术特性: 一、 ‌架构设计与定位差异‌ ‌维度‌‌Apache Doris‌‌Elasticsearch‌‌核心架构‌分布式 MPP 列式分析引擎,面向 OLAP 优化分布式倒排索…...

linux系统服务

Linux 系统服务&#xff08;System Services&#xff09; 是在后台持续运行的进程&#xff08;守护进程&#xff0c;即 daemon&#xff09;&#xff0c;用于提供核心功能或支持其他应用程序&#xff08;如网络管理、日志记录、定时任务等&#xff09;。它们通常在系统启动时自动…...

大语言模型三大演进方向:记忆增强、工具集成与多模态突破

目录 一、方向演进:从通用模型到记忆增强系统 1.1 技术瓶颈分析 1.2 记忆增强技术路径 1.3 企业级应用架构 二、工具调用:从语言理解到行动执行 2.1 工具调用协议演进 2.2 工具编排范式比较 三、多模态突破:跨模态统一建模 3.1 多模态架构演进 3.2 医学多模态应用…...

嵌入式学习笔记DAY21(双向链表、Makefile)

一、双向链表 1.概念 双向链表&#xff08;Doubly Linked List&#xff09; 是一种链式数据结构&#xff0c;每个节点包含 两个指针&#xff08;前驱指针 prev 和后继指针 next&#xff09;&#xff0c;分别指向 前一个节点 和 后一个节点&#xff0c;形成双向连接。 头节点&…...

Vue 学习随笔系列二十三 -- el-date-picker 组件

el-date-picker 组件 文章目录 el-date-picker 组件el-date-picker 只有某些日期可选 el-date-picker 只有某些日期可选 <template><div><el-form ref"form" size"mini":model"form" :rules"rules"label-width"8…...

IEEE出版|连续多年稳定检索|第三届信号处理与智能计算国际学术会议(SPIC2025)

【重要信息】 会议官网&#xff1a; www.ic-spic.com 会议日期&#xff1a;2025年11月28-30日 会议地点&#xff1a;中国 广州 截稿日期&#xff1a;2025年11月10日 接受或拒绝通知日期&#xff1a;提交后7个工作日 【征稿主题】 人工智能和机器学习 计算机系统和架构 …...

用Python代码绘制动态3D爱心效果

引言 介绍Python在创意编程中的应用&#xff0c;特别是如何通过简单的代码实现视觉上的美感。引出本文将分享的爱心代码&#xff0c;并简要说明其实现原理。 爱心代码的基本实现 展示一个简单的Python代码示例&#xff0c;使用字符画的方式在控制台中绘制一个爱心图案。 pr…...

牛客网刷题:NC208813求逆序数

牛客网刷题&#xff1a;NC208813求逆序数 问题描述 在排序和数据结构分析中&#xff0c;逆序数是一个重要的概念。对于一个数列来说&#xff0c;如果一对数的前后位置与大小顺序相反&#xff08;即前面的数大于后面的数&#xff09;&#xff0c;那么它们就称为一个逆序对。一个…...

Day 21 训练

Day 21 训练 常见的降维算法数据预处理无监督降维PCA&#xff08;主成分分析&#xff09;主成分分析&#xff08;PCA&#xff09;作用和优势应用场景t-SNE&#xff08;t-分布随机邻域嵌入&#xff09;t-SNE&#xff08;t-分布随机邻域嵌入&#xff09;为什么 t-SNE 特别适用于高…...

1267, “Illegal mix of collations (latin1_swedish_ci,IMPLICIT

python 执行数据迁移报错 mysql : 1267, "Illegal mix of collations (latin1_swedish_ci,IMPLICIT 解决方法&#xff1a; 替换TABLE 后面的表名为你自己的表名&#xff0c;mysql 黑窗口执行。 以下是我的表名&#xff0c;仅作参考 ALTER TABLE book CONVERT TO CHARACTE…...

【C#】Thread.Join()、异步等待和直接join

JogThread.Join() 是 .NET 中 System.Threading.Thread 类的一个方法&#xff0c;用来让当前调用线程暂停执行&#xff0c;直到目标线程&#xff08;这里是 JogThread&#xff09;终止为止。以下是它的核心语义和你在 UI 代码里需要注意的几个相关知识点。 1. Thread.Join() 的…...

Malformed input or input contains unmappable characters解决

JDK 17 文件上传编码异常解决方案技术文档 1. 问题背景 在 JDK 17 环境下&#xff0c;文件上传过程中可能抛出 Malformed input or input contains unmappable characters 错误。此问题通常由以下原因触发&#xff1a; 文件路径/名称包含非 ASCII 字符&#xff08;如中文、日…...

PYTHON训练营DAY26

一、函数 &#xff08;一&#xff09;不带参数的函数 # 定义一个简单的问候函数 def greet():"""打印一句问候语。"""message "大家好&#xff01;欢迎学习Python函数定义&#xff01;"print(message)greet()&#xff08;二&#x…...

奇变偶不变,符号看象限

三角函数诱导公式口诀详解&#xff1a;奇变偶不变&#xff0c;符号看象限 口诀解析 1. 口诀含义 奇变偶不变&#xff1a; 奇/偶&#xff1a;指角度加减的是π/2&#xff08;90&#xff09;的奇数倍还是偶数倍 奇数倍&#xff08;如π/2, 3π/2&#xff09;→ 函数名改变&…...

基于SpringBoot的家政服务系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

Makefile 在 Go 项目中的实践

在 Go 项目中&#xff0c;Makefile 是一个强大的工具&#xff0c;用于自动化构建、测试和部署流程。它不仅能减少重复命令输入&#xff0c;还能确保团队开发环境的一致性。本文以 CoreDNS&#xff08;一个高性能 DNS 服务器&#xff09;的 Makefile 为例&#xff0c;解析其设计…...

关闭所有Nginx进程

要关闭所有Nginx进程&#xff0c;可以使用以下命令。这些命令适用于不同的操作系统。 在Linux/Unix系统中 在Linux或Unix系统中&#xff0c;可以使用killall命令来关闭所有Nginx进程。 sudo killall nginx 在Windows系统中 在Windows系统中&#xff0c;可以使用taskkill命…...

开源模型应用落地-模型上下文协议(MCP)-Resources-资源的使用逻辑

一、前言 在大型语言模型与外部世界交互的探索中&#xff0c;如何高效、灵活地接入多样化数据始终是核心命题。MCP&#xff08;Model Context Protocol&#xff09;协议中的Resources 机制&#xff0c;正是为这一问题提供了优雅的解决方案。通过URI&#xff08;统一资源标识符&…...