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

服务间的“握手”:OpenFeign声明式调用与客户端负载均衡

现在,假设我们有一个新的order-service,它在创建订单时需要获取用户信息。

如果order-service直接硬编码user-service的IP和端口进行调用,会面临以下问题:

  • 缺乏弹性: 如果user-service实例的IP或端口发生变化(在云环境或容器化部署中很常见),order-service就得修改代码并重新部署。

  • 无法负载均衡: 如果user-service有多个实例来处理高并发,order-service不知道该调用哪一个,也无法将请求均匀分发。

幸运的是,Spring Cloud生态系统为此提供了优雅的解决方案:Spring Cloud OpenFeign 结合 服务发现 (Eureka) 和 客户端负载均衡 (Spring Cloud LoadBalancer)

工作流程预览:

  1. order-service(消费者)通过一个使用@FeignClient注解的Java接口来声明它想调用user-service(提供者)的API。

  2. 当order-service调用这个Feign接口的方法时,OpenFeign会介入。

  3. OpenFeign结合服务发现客户端 (Eureka Client,在order-service中也需要配置) 从Eureka Server获取user-service所有可用实例的列表。

  4. 客户端负载均衡器 (Spring Cloud LoadBalancer) 从实例列表中选择一个健康的实例(例如,通过轮询策略)。

  5. OpenFeign构造HTTP请求,并将其发送到选定的user-service实例。

  6. user-service处理请求并返回响应,OpenFeign将响应转换回Java对象给order-service。

这一切对order-service的业务代码来说几乎是透明的,它就像在调用一个本地方法一样。

读完本文,你将学会:

  • 在服务消费者项目中集成Spring Cloud OpenFeign。

  • 定义Feign客户端接口来声明对其他微服务的调用。

  • 理解OpenFeign如何与Eureka和客户端负载均衡器协同工作。

  • 实现一个服务调用另一个微服务的简单场景。

  • (可选) 了解Feign的一些常用配置,如超时、日志等。

准备好让你的微服务们优雅地“握手”了吗?

一、创建服务消费者 (例如 order-service) 并集成OpenFeign

1. 创建Spring Boot项目 (order-service):
使用Spring Initializr或IDE创建一个新的Spring Boot项目,包含以下依赖:

  • Spring Web: 提供自身的REST API (如果需要)。

  • Eureka Discovery Client: 使其能够从Eureka Server发现服务。

  • OpenFeign: 核心依赖,用于声明式REST调用。

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

Maven依赖 (pom.xml - order-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.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Spring Cloud BOM (确保与Eureka Server和user-service项目使用相同的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和OpenFeign:
在order-service的主启动类上添加@EnableDiscoveryClient和@EnableFeignClients注解。

package com.example.orderservice;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; // 导入@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现
@EnableFeignClients   // 启用OpenFeign客户端
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}

3. 配置order-service (application.yml):
与user-service类似,order-service也需要注册到Eureka Server,并指定其自己的应用名和端口。

# application.yml for order-service
server:port: 8082 # order-service运行的端口 (确保与eureka-server和user-service不同)spring:application:name: order-service # 服务名称eureka:client:service-url:defaultZone: http://localhost:8761/eureka/ # Eureka Server地址instance:# (可选) prefer-ip-address: true # 注册时使用IP地址而不是主机名 (某些网络环境可能需要)# hostname: localhost# (可选) Feign的全局配置 (也可以在FeignClient接口或代码中配置)
# feign:
#   client:
#     config:
#       default: # 默认配置, 应用于所有Feign客户端
#         connectTimeout: 5000 # 连接超时时间 (毫秒)
#         readTimeout: 5000    # 读取超时时间 (毫秒)
#         loggerLevel: full    # Feign日志级别 (NONE, BASIC, HEADERS, FULL)
#   # 如果使用了Hystrix (旧版) 或 Resilience4j (推荐) 作为熔断器, 这里可以配置
#   # hystrix:
#   #   enabled: true
#   circuitbreaker:
#      enabled: true # 如果需要启用熔断 (需要额外依赖 spring-cloud-starter-circuitbreaker-resilience4j)# 为了方便演示, 如果user-service的User类在不同包, order-service需要能访问到
# 这通常通过共享DTO模块或API模块解决, 这里暂时不展开

二、定义Feign客户端接口

现在,order-service需要定义一个接口来声明它将如何调用user-service的API。

假设user-service的UserController中有如下API (回顾上一篇):

// UserController.java in user-service
@RestController
@RequestMapping("/users")
public class UserController {// ...@GetMapping("/{id}")public String getUserById(@PathVariable Long id) { // 假设返回String以便于简单演示return "User details for ID " + id + " (from port: " + serverPort + ")";}
}

注意: 为了简单起见,我们这里假设getUserById返回一个String。在实际应用中,它应该返回一个User对象(DTO),那么order-service中也需要能访问到这个User类(通常通过共享的API/DTO模块)。

在order-service项目中创建UserClient接口:

package com.example.orderservice.client; // 建议放在单独的client包下import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;// @FeignClient注解用于声明这是一个Feign客户端
// name/value属性: 指定要调用的目标服务的名称 (必须与目标服务在Eureka中注册的spring.application.name一致, 大小写不敏感但建议一致)
// path属性 (可选): 如果目标服务的所有API都有一个公共的基础路径 (如 user-service 的 /users), 可以在这里指定
// fallback属性 (可选): 用于指定熔断降级时的处理类 (需要Hystrix或Resilience4j支持)
@FeignClient(name = "user-service") // 指向在Eureka注册的服务名 "user-service"
// 或者如果 user-service 的 API 都在 /users 下:
// @FeignClient(name = "user-service", path = "/users")
public interface UserClient {// 方法签名需要与目标服务的Controller方法尽量保持一致 (路径、HTTP方法、参数、返回值类型)// @PathVariable的名称也需要匹配@GetMapping("/users/{id}") // 完整的请求路径是: http://user-service实例/users/{id}// 如果在@FeignClient中指定了path="/users", 这里就应该是 @GetMapping("/{id}")String getUserById(@PathVariable("id") Long userId);// 如果目标方法返回的是User对象, 这里也应该是:// UserDTO getUserById(@PathVariable("id") Long userId);// 并且OrderService需要能够访问UserDTO类
}

核心注解解释:

  • @FeignClient(name = "user-service"):

    • name (或 value): 极其重要! 必须填写目标服务在Eureka Server上注册的服务名 (Service ID),通常是目标服务的spring.application.name的值(例如user-service)。OpenFeign会使用这个服务名去Eureka查找实例。

    • path (可选): 如果目标服务的所有API都有一个共同的父路径(如user-service的Controller类上可能有@RequestMapping("/users")),可以在这里指定,那么接口方法上的路径就是相对于这个path的。

    • url (可选, 不推荐与服务发现混用): 可以直接指定目标服务的硬编码URL,这样会绕过服务发现和负载均衡。通常仅用于调用不在Eureka注册的外部服务。

    • fallback / fallbackFactory (可选): 用于配置熔断降级逻辑,我们将在后续文章中详细介绍。

  • 方法签名:Feign接口中的方法签名(包括@GetMapping, @PostMapping等注解、方法名、参数、返回值类型)需要与你要调用的目标服务的Controller方法尽可能保持一致。

    • @PathVariable, @RequestParam, @RequestBody等注解的使用方式也与Spring MVC Controller中类似。

三、在order-service中使用Feign客户端

现在可以在order-service的业务逻辑中注入并使用UserClient了。

创建OrderController (或OrderService业务类):

package com.example.orderservice.controller;import com.example.orderservice.client.UserClient; // 导入Feign客户端
import org.springframework.beans.factory.annotation.Autowired;
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("/orders")
public class OrderController {private final UserClient userClient; // 注入UserClient@Autowiredpublic OrderController(UserClient userClient) {this.userClient = userClient;}@GetMapping("/create/{userId}")public String createOrder(@PathVariable Long userId) {System.out.println("Attempting to create order for user ID: " + userId);// 调用UserClient的方法, 就像调用本地方法一样!// OpenFeign会自动处理服务发现、负载均衡和HTTP请求的发送String userInfo = userClient.getUserById(userId);if (userInfo != null) {// 实际业务中, 这里会根据userInfo创建订单String orderDetails = "Order created for user: [" + userInfo + "]";System.out.println(orderDetails);return orderDetails;} else {String errorMessage = "Failed to create order: User not found for ID " + userId;System.err.println(errorMessage);return errorMessage;}}
}

看到吗?在OrderController中,我们就像调用一个普通的本地接口方法一样调用userClient.getUserById(userId)。OpenFeign在底层为我们处理了所有复杂的网络通信、服务发现和负载均衡的细节。

四、测试服务调用

  1. 启动Eureka Server: 确保eureka-server应用正在运行 (端口8761)。

  2. 启动user-service: 确保user-service应用正在运行 (端口8081) 并已注册到Eureka。

    • 可以启动多个user-service实例(例如,修改application.yml中的server.port为8082或0让其随机分配,然后通过不同配置启动多个实例),以观察负载均衡效果。

  3. 启动order-service: 启动order-service应用 (端口8082,如果上面user-service用了8082,这里换一个,例如8083)。确保它也注册到Eureka。

现在,通过浏览器或curl访问order-service的API:
http://localhost:8082/orders/create/1 (假设order-service运行在8082端口)

预期行为:

  1. order-service的OrderController接收到请求。

  2. 它调用userClient.getUserById(1L)。

  3. OpenFeign通过Eureka Client从Eureka Server获取到user-service的实例列表。

  4. Spring Cloud LoadBalancer(默认集成)从实例列表中选择一个(如果只有一个实例,就选它;如果有多个,会轮询或其他策略)。

  5. OpenFeign向选中的user-service实例 (如 http://<user-service-ip>:<user-service-port>/users/1) 发送GET请求。

  6. user-service的UserController处理请求,返回类似 "User details for ID 1 (from port: 8081)" 的字符串。

  7. order-service收到响应,并组装最终的订单信息返回给客户端。

观察日志:
你可以在user-service和order-service的控制台日志中看到请求被处理的痕迹。如果启动了多个user-service实例,并多次调用order-service的API,你会看到请求被分发到不同的user-service实例端口上,这就是客户端负载均衡在起作用。

五、客户端负载均衡器:Spring Cloud LoadBalancer

Spring Cloud早期使用Netflix Ribbon作为客户端负载均衡器。但Ribbon已进入维护模式。现在,Spring Cloud LoadBalancer 是官方推荐的替代方案,并且它默认与OpenFeign集成

当你添加spring-cloud-starter-openfeign和任何一个服务发现客户端依赖(如spring-cloud-starter-netflix-eureka-client)时,Spring Cloud LoadBalancer的自动配置就会生效。

默认的负载均衡策略是轮询 (Round Robin)。 你也可以自定义负载均衡策略,但这超出了本入门篇的范围。

重要的是理解:负载均衡的决策是在客户端(服务消费者,如order-service)进行的,而不是像Nginx那样的服务器端负载均衡。

六、Feign的常见配置 (可选,供参考)

  • 超时设置:

    feign:client:config:# 可以为特定Feign客户端(按其name)配置,也可以配置defaultuser-service: # 这里的 'user-service' 是 @FeignClient(name = "user-service") 中的nameconnectTimeout: 5000 # 连接超时 (ms)readTimeout: 10000   # 读取超时 (ms)# default: # 如果没有特定配置,则使用默认配置#   connectTimeout: 2000#   readTimeout: 5000

  • 日志级别:
    Feign的日志可以帮助调试请求和响应的详细信息。

    // 在@Configuration类中配置
    import feign.Logger;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;@Configuration
    public class FeignConfig {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL; // NONE, BASIC, HEADERS, FULL}
    }

    然后在application.yml中为Feign客户端接口所在的包配置日志级别:

    logging:level:com.example.orderservice.client: DEBUG # 或者 TRACE for FULL Feign logging

  • 请求/响应压缩:
    可以配置Feign启用GZIP压缩。

    feign:compression:request:enabled: truemime-types: text/xml,application/xml,application/json # 对哪些类型的内容进行压缩min-request-size: 2048 # 请求体达到多大时才压缩 (bytes)response:enabled: true

  • 拦截器 (Interceptors):
    可以添加自定义的RequestInterceptor来修改请求头(如添加认证token)、请求参数等。

  • 错误解码器 (ErrorDecoder):
    可以自定义ErrorDecoder来处理来自目标服务的错误响应(如4xx, 5xx状态码),将其转换为自定义异常。

七、总结:让服务调用如丝般顺滑

Spring Cloud OpenFeign提供了一种极其优雅和简便的方式来实现微服务之间的同步HTTP调用。通过声明式的接口定义,它将复杂的网络通信、服务发现和客户端负载均衡对开发者透明化,让我们能够像调用本地方法一样调用远程服务。

结合Eureka实现服务注册与发现,OpenFeign和Spring Cloud LoadBalancer共同构成了微服务架构中服务间通信的关键基础设施,使得构建松耦合、高可用的分布式系统成为可能。

相关文章:

服务间的“握手”:OpenFeign声明式调用与客户端负载均衡

现在&#xff0c;假设我们有一个新的order-service&#xff0c;它在创建订单时需要获取用户信息。 如果order-service直接硬编码user-service的IP和端口进行调用&#xff0c;会面临以下问题&#xff1a; 缺乏弹性: 如果user-service实例的IP或端口发生变化&#xff08;在云环境…...

蓝桥杯11届国B 答疑

题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下&#xff1a; 首先进入办公室&#xff0c;编号为 i 的同学需要 si​ 毫秒的时间。然后同学问问题老…...

【单机版OCR】清华TH-OCR v9.0免费版

今天向大家介绍一款非常好用的单机版OCR图文识别软件&#xff0c;它不仅功能多&#xff0c;识别能力强&#xff0c;而且还是免费使用的。OCR软件为什么要使用单机版&#xff0c;懂得都懂&#xff0c;因为如果使用在线识别的OCR软件&#xff0c;用户需要将文档上传互联网服务器的…...

蓝牙耳机什么牌子好?倍思值得冲不?

最近总被问“蓝牙耳机什么牌子好”&#xff0c;作为踩过无数坑的资深耳机党&#xff0c;必须安利刚入手的倍思M2s Pro主动降噪蓝牙耳机&#xff01;降噪、音质、颜值全都在线&#xff0c;性价比直接拉满。 -52dB降噪&#xff0c;通勤摸鱼神器 第一次开降噪就被惊到&#xff01…...

Java卡与SSE技术融合实现企业级安全实时通讯

简介 在数字化转型浪潮中,安全与实时数据传输已成为金融、物联网等高安全性领域的核心需求。本文将深入剖析东信和平的Java卡权限分级控制技术与浪潮云基于SSE的大模型数据推送技术,探索如何将这两项创新技术进行融合,构建企业级安全实时通讯系统。通过从零到一的开发步骤,…...

使用Spring Boot和Spring Security构建安全的RESTful API

使用Spring Boot和Spring Security构建安全的RESTful API 引言 在现代Web开发中&#xff0c;安全性是构建应用程序时不可忽视的重要方面。本文将介绍如何使用Spring Boot和Spring Security框架构建一个安全的RESTful API&#xff0c;并结合JWT&#xff08;JSON Web Token&…...

Win11下轻松搭建wiki.js,Docker.desktop部署指南(mysql+elasticsearch+kibana+wiki.js)

Docker.desktop部署wiki.js指南 前言环境和要求介绍提前准备 1. elasticsearch1.1 部署容器1.2 参数说明1.3 验证容器是否部署成功 2. kibana2.1 部署容器2.2 验证是否部署成功2.3 安装IK分词器 3. MySql3.1 部署容器3.2 增加数据库和wiki.js所需要的账号 4. wiki.js4.1 部署容…...

【JavaWeb】MySQL

1 引言 1.1 为什么学&#xff1f; 在学习SpringBootWeb基础知识(IOC、DI等)时&#xff0c;在web开发中&#xff0c;为了应用程序职责单一&#xff0c;方便维护&#xff0c;一般将web应用程序分为三层&#xff0c;即&#xff1a;Controller、Service、Dao 。 之前的案例中&am…...

数据库实验报告 数据定义操作 3

实验报告&#xff08;第3次&#xff09; 实验名称 数据定义操作 实验时间 10月12日1-2节 一、实验内容 1、本次实验是用sql语句创建库和表&#xff0c;语句是固定的&#xff0c;要求熟记这些sql语句。 二、源程序及主…...

寻找树的中心(重心)

题目&#xff1a; 思路&#xff1a; “剥洋葱”&#xff1a;每次剥掉一层叶子结点&#xff0c;直到最后剩余不多于2个节点&#xff0c;这些节点就是树的中心&#xff08;重心&#xff09;。 解释&#xff1a; 1、根据图论的知识可以知道&#xff0c;一颗树的中心&#xff08…...

Oracle 高水位线(High Water Mark, HWM)

1. 高水位线&#xff08;HWM&#xff09;的定义 基本概念&#xff1a;HWM 是 Oracle 数据库中一个段&#xff08;如表、索引&#xff09;中已分配并被格式化&#xff08;Formatted&#xff09;的存储空间的最高位置。它标识了该段历史上曾达到的最大数据块使用量。 物理意义&a…...

Redis学习专题(二)事务和锁机制

目录 引言 1、事务三特性 2、事务相关指令 &#xff1a;Multi、Exec、discard 快速入门 注意&#xff1a; 3、事务冲突 解决办法&#xff1a; 1.悲观锁 2.乐观锁 3.watch & unwatch 引言 Redis 的事务是什么? 1、Redis 事务是一个单独的隔离操作&#xff1a;事…...

多平台!像素艺术的最佳选择 , 开源像素画工具

项目简介 如果你喜欢作像素风格的游戏或动画&#xff0c;那么这款Pixelorama或许是你的好帮手。它是一款免费开源的像素画编辑器&#xff0c;功能丰富&#xff0c;操作便捷&#xff0c;支持多平台使用&#xff08;Windows、macOS、Linux&#xff09;。无论你是像素新手还是老手…...

使用 Kotlin 和 Jetpack Compose 开发 Wear OS 应用的完整指南

环境配置与项目搭建 1. Gradle 依赖配置 // build.gradle (Module) android {buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion "1.5.3"} }dependencies {def wear_compose_version "1.2.0"implementation "androidx.…...

JavaScript【5】DOM模型

1.概述&#xff1a; DOM (Document Object Model)&#xff1a;当页面被加载时&#xff0c;浏览器会创建页面的文档对象模型&#xff0c;即dom对象&#xff1b;dom对象会被结构化为对象树&#xff0c;如一个HTML文档会被分为head&#xff0c;body等部分&#xff0c;而每个部分又…...

【诊所电子处方专用软件】佳易王个体诊所门诊电子处方开单管理系统:零售药店电子处方服务系统#操作简单#诊所软件教程#药房划价

一、软件试用版资源文件下载说明 &#xff08;一&#xff09;若您想体验软件功能&#xff0c;可通过以下方式获取软件试用版资源文件&#xff1a; 访问头像主页&#xff1a;进入作者头像主页&#xff0c;找到第一篇文章&#xff0c;点击文章最后的卡片按钮&#xff0c;即可了…...

【OpenCV】帧差法、级联分类器、透视变换

一、帧差法&#xff08;移动目标识别&#xff09;&#xff1a; 好处&#xff1a;开销小&#xff0c;不怎么消耗CPU的算力&#xff0c;对硬件要求不高&#xff0c;但只适合固定摄像头 1、优点 计算效率高&#xff0c;硬件要求 响应速度快&#xff0c;实时性强 直接利用连续帧…...

OpenCV 特征检测全面解析与实战应用

在计算机视觉领域&#xff0c;特征检测是从图像中提取关键信息的核心技术&#xff0c;这些关键特征是图像匹配、目标识别、场景理解等复杂任务的基础。OpenCV 作为计算机视觉领域最受欢迎的开源库之一&#xff0c;提供了丰富且高效的特征检测算法。本文将深入介绍 OpenCV 中多种…...

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月17日第80弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀6-8个和值&#xff0c;可以做到100-300注左右。 (1)定…...

IDEA反斜杠路径不会显示JUnit运行的工作目录配置问题

1. 当在IDEA基准目录下创建junit-reflect-annotation-proxy-app\\src\\data.txt时&#xff0c;如果是Mac电脑&#xff0c;这种\\文件路径时&#xff0c;IDEA里面不会显示&#xff0c;但在Finder下会显示&#xff0c;是直接创建了文件名为junit-reflect-annotation-proxy-app\sr…...

Linux517 rsync同步 rsync借xinetd托管 配置yum源回顾

计划测试下定时服务 同步成功 是否为本地YUM源内容太少&#xff1f;考虑网络YUM源 单词拼错了 计划后面再看下 MX安装 参考 计划回顾配置YUM源 配置本地YUM源配置外网YUM源配置仓库YUM源&#xff08;不熟&#xff09; 参考 参考阿里云 配置完毕 本地yum源配置 先备份 再…...

【论文阅读】A Survey on Multimodal Large Language Models

目录 前言一、 背景与核心概念1-1、多模态大语言模型&#xff08;MLLMs&#xff09;的定义 二、MLLMs的架构设计2-1、三大核心模块2-2、架构优化趋势 三、训练策略与数据3-1、 三阶段训练流程 四、 评估方法4-1、 闭集评估&#xff08;Closed-set&#xff09;4-2、开集评估&…...

大型语言模型中的QKV与多头注意力机制解析

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

React Flow 节点事件处理实战:鼠标 / 键盘事件全解析(含节点交互代码示例)

本文为《React Agent&#xff1a;从零开始构建 AI 智能体》专栏系列文章。 专栏地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。项目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代码示​例与实战源&#xff09;。完整介绍…...

AIGC在电商行业的应用:革新零售体验

AIGC在电商行业的应用&#xff1a;革新零售体验 引言 人工智能生成内容&#xff08;AIGC&#xff09;正在深刻改变电商行业的格局。从个性化推荐到智能客服&#xff0c;从产品描述生成到虚拟试衣&#xff0c;AIGC技术正在为电商平台带来前所未有的创新和效率提升。本文将深入探…...

【数据结构】线性表--队列

【数据结构】线性表--队列 一.什么是队列二.队列的实现1.队列结构定义&#xff1a;2.队列初始化函数&#xff1a;3.队列销毁函数&#xff1a;4.入队列函数&#xff08;尾插&#xff09;&#xff1a;5.出队列函数&#xff08;头删&#xff09;&#xff1a;6.取队头元素&#xff…...

CSS- 4.1 浮动(Float)

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点…...

Node.js 源码架构详解

Node.js 的源码是一个庞大且复杂的项目&#xff0c;它主要由 C 和 JavaScript 构成。要完全理解每一部分需要大量的时间和精力。我会给你一个高层次的概述&#xff0c;并指出一些关键的目录和组件&#xff0c;帮助你开始探索。 Node.js 的核心架构 Node.js 的核心可以概括为以…...

OpenCV级联分类器

概念 OpenCV 级联分类器是一种基于 Haar 特征、AdaBoost 算法和级联结构的目标检测方法&#xff0c;通过多阶段筛选快速排除非目标区域&#xff0c;实现高效实时检测&#xff08;如人脸、行人等&#xff09;。 加载级联分类器 // 加载级联分类器CascadeClassifier cascade;// …...

远程主机状态监控-GPU服务器状态监控-深度学习服务器状态监控

远程主机状态监控-GPU服务器状态监控-深度学习服务器状态监控 ⭐️ 推荐文章: DockerPyCharm远程调试&环境隔离解决方案 1. 整体架构 在本监控系统中&#xff0c;我们采用了Prometheus作为核心监控解决方案&#xff0c;并结合Node Exporter和Grafana构建了一个完整的监控体…...

谈谈未来iOS越狱或巨魔是否会消失

2024年10月的预测&#xff0c;先说结论&#xff1a; 巨魔iOS17.1消失概率为99%。 因为巨魔强依赖的漏洞就是一个签名漏洞&#xff0c;攻击面有限又经过2轮修复&#xff0c;第3次出现漏洞的概率极低。而越狱的话由于系统组件和服务较多&#xff0c;所以出现漏洞概率高攻击面多&…...

【OpenGL学习】(二)OpenGL渲染简单图形

文章目录 【OpenGL学习】&#xff08;二&#xff09;OpenGL渲染简单图形OpenGL渲染图形流程顶点&#xff0c;图元和片元VAO&#xff0c;VBO &#xff0c;EBO着色器示例&#xff1a;使用OpenGL渲染三角形 【OpenGL学习】&#xff08;二&#xff09;OpenGL渲染简单图形 OpenGL渲…...

学习深度学习是否要先学习机器学习?

有小伙伴问我&#xff0c;最近做毕设要做一个神经网络的课题&#xff0c;想请教一下需不需要把机器学习也都学习一遍&#xff1f; 永远正确的回答是&#xff1a;建议先学机器学习&#xff0c;再学深度学习。 上面那句你从哪都挑不出毛病&#xff0c;毕竟机器学习是深度学习的基…...

六、绘制图片

文章目录 1.创建一个红色图片2.加载bmp图片3.加载png、jpg图片 前面的几个示例&#xff0c;我们已经展示过如果在Linux系统下使用xlib接口向窗口中绘制文本、线、矩形&#xff1b;并设置文本、线条的颜色。并利用xlib提供的接口结合事件处理机制完成了一个自绘按钮控件功能。有…...

【OpenCV】基本数据类型及常见图像模式

是什么&#xff1f;能做什么&#xff1f;解决什么问题&#xff1f;为什么用它&#xff1f; OpenCV:是一个基于开源发行的跨平台计算机视觉库&#xff0c;实现 一、应用场景&#xff1a; 目标识别&#xff1a;人脸、车辆、车牌...自动驾驶医学影像分析视频内容理解与分析&…...

C# WPF .NET Core和.NET5之后引用System.Windows.Forms的解决方案

双击项目名称打开工程文件&#xff08;.csporj&#xff09;添加“Microsoft.WindowsDesktop.App.WindowsForms”引用&#xff1b; <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><OutputType>WinExe</OutputType><TargetFramework&g…...

Mysql 8.0.32 union all 创建视图后中文模糊查询失效

记录问题,最近在使用union all聚合了三张表的数据,创建视图作为查询主表,发现字段值为中文的筛选无法生效.......... sql示例: CREATE OR REPLACE VIEW test_view AS SELECTid,name,location_address AS address,type,"1" AS data_type,COALESCE ( update_time, cr…...

PYTHON训练营DAY28

类 &#xff08;一&#xff09;题目1&#xff1a;定义圆&#xff08;Circle&#xff09;类 要求&#xff1a; 包含属性&#xff1a;半径 radius。包含方法&#xff1a; calculate_area()&#xff1a;计算圆的面积&#xff08;公式&#xff1a;πr&#xff09;。calculate_circ…...

pytorch小记(二十一):PyTorch 中的 torch.randn 全面指南

pytorch小记&#xff08;二十一&#xff09;&#xff1a;PyTorch 中的 torch.randn 全面指南 PyTorch 中的 torch.randn 全面指南一、接口定义二、参数详解三、常见使用场景四、位置参数 vs. Tuple 传参 —— 数值示例五、必须用关键字传入小结 PyTorch 中的 torch.randn 全面指…...

LeetCode 第 45 题“跳跃游戏 II”

好的&#xff0c;我来帮你解释一下 LeetCode 第 45 题“跳跃游戏 II”&#xff0c;这是一道经典的贪心算法题目。 题目描述&#xff1a; 给你一个非负整数数组 nums&#xff0c;你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用…...

【leetcode】逐层探索:BFS求解最短路的原理与实践

前言 &#x1f31f;&#x1f31f;本期讲解关于力扣的几篇题解的详细介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…...

副业小程序YUERGS,从开发到变现

文章目录 我为什么写这个小程序网站转小程序有什么坑有什么推广渠道个人开发者如何变现简单介绍YUERGS小程序给独立开发者一点小建议 我为什么写这个小程序 关注我的粉丝应该知道&#xff0c;我在硕士阶段就已经掌握了小程序开发技能&#xff0c;并写了一个名为“约球online”…...

Vue-键盘事件

键盘事件 回车事件 回车输出Input控件输入的内容 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>键盘事件</title><!-- 引入Vue --><script type"text/javascript&quo…...

区块链可投会议CCF C--IPCCC 2025 截止6.7 附录用率

Conference&#xff1a;44th IEEE -- International Performance Computing and Communications Conference CCF level&#xff1a;CCF C Categories&#xff1a;计算机网络 Year&#xff1a;2025 Conference time&#xff1a;Nov 21 – 23, 2025 Austin, Texas, USA 录用率…...

Linux `mkdir` 命令深度解析与高阶应用指南

Linux `mkdir` 命令深度解析与高阶应用指南 一、核心功能解析1. 基本作用2. 与类似工具对比二、选项系统详解1. 常用基础选项2. 高级选项组合三、高阶应用场景1. 自动化部署系统2. 安全审计合规3. 容器环境初始化4. 多用户协作体系四、特殊文件处理1. 符号链接处理2. 挂载点管理…...

JVM 调优实战入门:从 GC 日志分析到参数调优

手把手教你理解 GC 日志、识别性能瓶颈并合理配置 JVM 参数&#xff01; 你是否曾遇到线上系统莫名卡顿、内存暴涨甚至频繁 Full GC&#xff1f; 本篇文章将带你从实际 GC 日志出发&#xff0c;深入剖析 JVM 性能问题&#xff0c;并学会如何通过参数调优提升系统稳定性和吞吐能…...

论文解读:ICLR2025 | D-FINE

[2410.13842] D-FINE: Redefine Regression Task in DETRs as Fine-grained Distribution Refinement D-FINE 是一款功能强大的实时物体检测器&#xff0c;它将 DETRs 中的边界框回归任务重新定义为细粒度分布细化&#xff08;FDR&#xff09;&#xff0c;并引入了全局最优定位…...

Kafka 生产者工作流程详解

以下是 Kafka 生产者工作流程的清晰分步解释&#xff0c;结合关键机制与用户数据&#xff1a; 1. 生产者初始化与数据发送 主线程创建生产者对象&#xff0c;调用 send(ProducerRecord) 发送消息。 拦截器&#xff08;可选&#xff09;&#xff1a;可添加自定义逻辑&#xff08…...

leetcode 239. 滑动窗口最大值

暴力解法是一种简单直接的方法&#xff0c;虽然效率较低&#xff0c;但可以帮助你更好地理解问题的逻辑。以下是使用暴力解法解决“滑动窗口最大值”问题的 C 实现。 暴力解法的思路 遍历每个滑动窗口&#xff1a; 使用一个外层循环&#xff0c;从数组的起始位置开始&#xff…...

第3章 自动化测试:从单元测试到硬件在环(HIL)

在前两章中,我们已完成从环境搭建到流水线编译的自动化配置。为了真正保障软件质量、降低回归风险,本章将聚焦测试自动化,涵盖从最基础的单元测试,到集成测试,再到硬件在环(Hardware-in-the-Loop, HIL)测试的全流程。通过脚本驱动、测试报告可视化和与 CI 平台深度集成,…...