【SpringCloud】-OpenFeign实战及源码解析、与Ribbon结合
一、背景介绍
二、正文
OpenFeign是什么?
OpenFeign(简称Feign)是一个声明式的Web服务客户端,用于简化服务之间的HTTP通信。与Nacos和Ribbon等组件协同,以支持在微服务体系结构中方便地进行服务间的通信; OpenFeign在默认情况下集成了Hystrix,提供了服务容错和服务降级的功能。
OpenFeign的作用是什么?
按照单一职责,也为了满足可复用、可扩展的核心我们可以对整体业务拆分成不同的服务,这样涉及到的一个问题就是某一个服务的逻辑实现需要依托另一个服务的信息,这样服务和服务之间需要通信来进行消息传递,但是服务和服务之间如果直接通信的话耦合关系变强,无法达到高复用的作用。使用了OpenFeign技术来解决这个问题,如果其中一个类需要调用另一个类的某一个方法的话,直接通过OpenFeign这个第三方转发这个调用,减少直接通信带来的耦合关系
通过使用@FeignClien注解标识UserApiService这个客户端,对【internetbar-provider-user】这个服务远程调用。OpenFeign会根据接口自动创建一个实现类,发起HTTP请求去用Get的方式访问远程服务的【/userManage/getUserInfoById/{userId}】这个接口
Feign和OpenFeign的关系?
OpenFeign是对Feign的增强,对mvc注解的增强,那如何理解这句话呢?
共同点:Feign和OpenFeign都是用于简化服务之间HTTP通信的Web服务客户端
不同点:
所属不同:Feign是Netflix开发HTTP客户端;OpenFeign是SpringCloud对Feign的重新实现和增强,OpenFeign引入了SpringMVC的注解,例如:@GetMapping等注解可以类似于SpringMVC的一些效果
Hystrix集成:OpenFeign默认集成Hystrix,提供服务容错和服务降级的功能;Feign中需要显式地添加Hystrix的依赖并配置
Java还有哪些服务调用方式?
Okhttp、HttpURLConnection、RestTemplate
使用OpenFeign和不使用的区别对比?
我们先从代码形式上来看一下两者如何使用:
基于RestTemplate使用HTTP请求调用服务
基于OpenFeign调用
Feign可以根据接口的定义生成客户端所需要的代码,这部分代码被Feign封装到底层,并且底层同步的实现了负载均衡和服务发现、服务容错等功能,不需要我们像使用RestTemplate一样额外的手动去配置,一个简单的API接口就可以帮助我们做了很多事情。
实战
引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在启动类添加@EnableFeignClients注解
@EnableFeignClients(defaultConfiguration = FeignAutoConfiguration.class)
添加FeignClient接口
package cn.itcast.order.clients;import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;/*** @BelongsProject: cloud-demo* @BelongsPackage: cn.itcast.order.clients* @CreateTime: 2023-03-17 12:29* @Description: TODO* @Version: 1.0*/
@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}
修改逻辑代码
使用RestTemplate**
package cn.itcast.order.service;import cn.itcast.order.clients.UserClient;
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate template;public Order queryOrderById(Long orderId){//1、根据用户id查询用户的订单信息Order order = orderMapper.findById(orderId);//2、利用RestTemplate发起http请求,查询用户信息String url="http://userservice/user/"+order.getUserId();User forObject = template.getForObject(url, User.class);//3、将user信息封装到Order中order.setUser(forObject);// 返回return order;}
}
使用Feign接口
package cn.itcast.order.service;import cn.itcast.order.clients.UserClient;
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {//1、查询订单Order order = orderMapper.findById(orderId);//2、用Feign远程调用User user = userClient.findById(order.getUserId());//3、封装user到Orderorder.setUser(user);//4、返回return order;}
}
自定义配置
配置日志(以debug级别输出 )
当我们进行服务调用的过程中有可能出现接口调用失败的问题,或者我们想要输出请求或响应的详细信息,我们可以配置日志
日志级别有哪些?
NONE:不记录任何日志(默认值)
BASIC:记录请求方法、URL、响应状态代码及执行时间
HEADERS:记录BASIC级别的基础上,记录请求和响应的header
FULL:记录请求和响应的header、body和元数据
方式一:配置文件
全局:所有服务生效
feign:client:config:default:loggerLevel: FULL
#某服务生效
feign:client:config:userservice:loggerLevel: FULL
方式二:配置类
添加配置类
package cn.itcast.order.config;import feign.Logger;
import org.springframework.context.annotation.Bean;/*** @BelongsProject: cloud-demo* @BelongsPackage: cn.itcast.order.config* @CreateTime: 2023-03-17 13:05* @Description: TODO* @Version: 1.0*/
public class DefaultFeignConfiguration {@Beanpublic Logger.Level feignLogLevel() {return Logger.Level.BASIC;}
}
方式三:在启动类上添加注解@EnableFeignClients
全局配置:对所有生效
@EnableFeignClients(defaultConfiguration =FeignAutoConfiguration.class)
局部配置:只对userservice服务生效
@EnableFeignClients(value = “userservice”, defaultConfiguration = FeignAutoConfiguration.class)
性能优化
底层的客户端实现:
URLConnection:默认实现,不支持连接池
Apache HttpClient:支持连接池
OKHttp:支持连接池
优化包括:
使用连接池代替默认的URLConnection
日志级别,最好用basic或none
实操——Feign工程化
引入feign-httpClient依赖
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
</dependency>
配置文件开启httpClient功能,设置连接池参数
feign:client:config:default: #default全局的配置loggerLevel: BASIC #日志级别(基本的请求和响应信息)httpclient:enabled: true #开启feign对HttpClient的支持max-connections: 200 #最大的连接数max-connections-per-route: 50 #每个路径的最大连接数
目的:将公共的配置抽取出来
新建一个Maven项目,服务名叫——feign-api
引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud-demo</artifactId><groupId>cn.itcast.demo</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feign-api</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies></project>
第一步、公有接口——工程化核心
在项目中创建一个Feign客户端接口,通过使用@FeignClient注解来声明要调用的服务和服务接口
package cn.itcast.feign.clients;import cn.itcast.feign.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;/*** @BelongsProject: cloud-demo* @BelongsPackage: cn.itcast.order.clients* @CreateTime: 2023-03-17 12:29* @Description: TODO* @Version: 1.0*/
@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}
第二步、配置类—用于配置Feign客户端的一些属性,如日志级别等
package cn.itcast.feign.config;import feign.Logger;
import org.springframework.context.annotation.Bean;/*** @BelongsProject: cloud-demo* @BelongsPackage: cn.itcast.order.config* @CreateTime: 2023-03-17 13:05* @Description: TODO* @Version: 1.0*/
public class DefaultFeignConfiguration {@Beanpublic Logger.Level feignLogLevel() {return Logger.Level.BASIC;}
}
实体类
package cn.itcast.feign.pojo;import lombok.Data;@Data
public class User {private Long id;private String username;private String address;
}
orderservice服务
第三步、启动类—启用Feign客户端
在Spring Boot应用程序中,通过使用@EnableFeignClients注解启用Feign客户端,并指定要扫描的Feign客户端接口所在的包。
package cn.itcast.order;import cn.itcast.feign.clients.UserClient;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = FeignAutoConfiguration.class)public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}/*** @Description: 将RestTemplate注册到容器中* @Date: 2023/3/13 11:28* @return: org.springframework.web.client.RestTemplate**/@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}/*** @Description: 修改负载均衡策略方式* @Date: 2023/3/13 19:56* @return: com.netflix.loadbalancer.IRule**/@Beanpublic IRule randomRule() {return new RandomRule();}
}
实体类
package cn.itcast.order.pojo;import cn.itcast.feign.pojo.User;
import lombok.Data;@Data
public class Order {private Long id;private Long price;private String name;private Integer num;private Long userId;private User user;
}
Mapper类
package cn.itcast.order.mapper;import cn.itcast.order.pojo.Order;
import org.apache.ibatis.annotations.Select;public interface OrderMapper {@Select("select * from tb_order where id = #{id}")Order findById(Long id);
}
Controller类
package cn.itcast.order.web;import cn.itcast.order.pojo.Order;
import cn.itcast.order.service.OrderService;
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("/order")
public class OrderController {@Autowiredprivate OrderService orderService;@GetMapping("/{orderId}")public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {// 根据id查询订单并返回return orderService.queryOrderById(orderId);}
}
第四步、使用Feign客户端—service类
在需要调用远程服务的地方,注入Feign客户端并使用
package cn.itcast.order.service;import cn.itcast.feign.clients.UserClient;
import cn.itcast.feign.pojo.User;
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {//1、查询订单Order order = orderMapper.findById(orderId);//2、用Feign远程调用User user = userClient.findById(order.getUserId());//3、封装user到Orderorder.setUser(user);//4、返回return order;}
}
通过上述的四个步骤(公有接口、配置类、启动类—启用Feign客户端、使用Feign客户端—service类)我们就实现了Feign的工程化,以声明式的方式定义了服务调用接口,配置了Feign客户端
基于工程化的思想,所有的服务调用被抽成公共的API,单独放在一个包中,我们只需要调用公共接口,不需要写太多重复代码,哪个服务需要调用引用对应的包就可以了,避免冗余代码,这也是设计模式思想(可复用)的体现。
集成Hystrix
我们需要先了解雪崩效应,通过OpenFeign进行多服务之间调用,如果服务提供者出现了故障将会导致服务消费者不可用。比方说login服务需要调用user服务获取登录用户的基本信息,此时user服务可能服务挂掉或者被攻击了,此时login服务可能将会处于等待过程,我们可以使用Hystrix进行熔断,当远程服务调用失败或超时时,熔断器会出发,并执行降级逻辑。
关于OpenFeign和Hystrix的集成使用请等待我之后关于Hystrix的博客详解哦~~~
源码解析
1、Spring启动时初始化-生成代理类
在服务启动时,Spring会加载配置并且初始化Spring容器、扫描并加载项目当中用到的组件,此时OpenFeign的配置也会被程序加载(包括:自定义Feign配置类、负载均衡配置、熔断器配置等),扫描带有@FeignClient注解的接口,Feign会使用动态代理生成代理类并注册到Spring容器中
2、服务发现和负载均衡
Nacos注册中心:如果项目中用到了Nacos注册中心,Feign会与Nacos集成通过服务名进行服务发现
Ribbon负载均衡:如果项目中使用了Ribbon,可以实现对服务实例的负载均衡
大家可以看下面这张图片,我们点进OpenFeign的依赖,会发现里面自动集成了Ribbon
那Feign和Ribbon、RestTemplate三者之间的关系是什么样的呢?
3、请求处理
场景:服务A调用服务B
当服务A通过OpenFeign的方式调用服务B时,实际上是通过代理类最终调用LoadBalancerFeignClient的execute方法,execute方法内部整合了Ribbon去实现负载均衡,最终会找到真实要请求的服务地址,从而发送RibbonRequest请求,返回响应内容给服务A
这也是Feign的核心代码:
为什么Feign第一次调用耗时很长?
这个问题是我在网上看到的一个问题,大家也可以参考参考图中说到的原因:
三、总结
OpenFeign帮助我们简化了服务之间的通信,同时继承了负载均衡、熔断器等功能,帮助我们更好的实现服务调用。之后我将会针对OpenFeign中集成的Hystrix做分享,大家敬请期待
如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~
相关文章:

【SpringCloud】-OpenFeign实战及源码解析、与Ribbon结合
一、背景介绍 二、正文 OpenFeign是什么? OpenFeign(简称Feign)是一个声明式的Web服务客户端,用于简化服务之间的HTTP通信。与Nacos和Ribbon等组件协同,以支持在微服务体系结构中方便地进行服务间的通信;…...

走进数字金融峰会,为金融科技数字化赋能
12月20—21日,FSIDigital数字金融峰会在上海圆满召开。本次峰会包含InsurDigital数字保险峰会和B&SDigital数字银行与证券峰会2场平行峰会;吸引了近600位来自保险、银行、证券以及金融科技等行业的领导者和专家齐聚一堂,共同探讨金融业数…...

docker-compose部署kafka
docker-compose.yml配置 version: "3" services:kafka:image: bitnami/kafka:latestports:- 7050:7050environment:- KAFKA_ENABLE_KRAFTyes- KAFKA_CFG_PROCESS_ROLESbroker,controller- KAFKA_CFG_CONTROLLER_LISTENER_NAMESCONTROLLER- KAFKA_CFG_LISTENERSPLAIN…...

Spark与Hadoop的关系和区别
在大数据领域,Spark和Hadoop是两个备受欢迎的分布式数据处理框架,它们在处理大规模数据时都具有重要作用。本文将深入探讨Spark与Hadoop之间的关系和区别,以帮助大家的功能和用途。 Spark和Hadoop简介 1 Hadoop Hadoop是一个由Apache基金会…...

蓝桥杯-Excel地址[Java]
目录: 学习目标: 学习内容: 学习时间: 题目: 题目描述: 输入描述: 输出描述: 输入输出样例: 示例 1: 运行限制: 题解: 思路: 学习目标: 刷蓝桥杯题库日记 学习内容: 编号96题目Ex…...

OSPF多区域配置-新版(12)
目录 整体拓扑 操作步骤 1.基本配置 1.1 配置R1的IP 1.2 配置R2的IP 1.3 配置R3的IP 1.4 配置R4的IP 1.5 配置R5的IP 1.6 配置R6的IP 1.7 配置PC-1的IP地址 1.8 配置PC-2的IP地址 1.9 配置PC-3的IP地址 1.10 配置PC-4的IP地址 1.11 检测R5与PC1连通性 1.12 检测…...

华为---USG6000V防火墙web基本配置示例
目录 1. 实验要求 2. 配置思路 3. 网络拓扑图 4. USG6000V防火墙端口和各终端相关配置 5. 在USG6000V防火墙web管理界面创建区域和添加相应端口 6. 给USG6000V防火墙端口配置IP地址 7. 配置通行策略 8. 测试验证 8.1 逐个删除策略,再看各区域终端通信情况 …...

Ksher H5页面支付实例指导 (PHP实现)
背景 前两天,公司的项目,为了满足泰国客户的支付需求,要求使用 Ksher (开时支付) 对接任务突然就给了鄙人,一脸懵 … 通过了解客户的使用场景、以及参考官网指导 发现:Ksher支付最令人满意的便是 —— 提供了便捷的 支…...

https密钥认证、上传镜像实验
一、第一台主机通过https密钥对认证 1、安装docker服务 (1)安装环境依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 (2)设置阿里云镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/do…...

three.js使用精灵模型Sprite渲染森林
效果: 源码: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right&quo…...

什么是数据可视化?数据可视化的流程与步骤
前言 数据可视化将大大小小的数据集转化为更容易被人脑理解和处理的视觉效果。可视化在我们的日常生活中非常普遍,但它们通常以众所周知的图表和图形的形式出现。正确的数据可视化以有意义和直观的方式为复杂的数据集提供关键的见解。 数据可视化定义 数据可视化…...

2022年山东省职业院校技能大赛高职组云计算赛项试卷第二场-容器云
2022年山东省职业院校技能大赛高职组云计算赛项试卷 目录 【赛程名称】云计算赛项第二场-容器云 需要竞赛软件包以及资料可以私信博主! 【赛程名称】云计算赛项第二场-容器云 【赛程时间】2022-11-27 09:00:00至2022-11-27 16:00:00 说明:完成本任务…...
Unity3D 中播放 RTSP 监控视频
【Unity 3D】怎么在 WebGL 中低延迟播放 RTSP 监控 - 简书[Unity 3D] 开箱即食的头部监控厂商 SDK 集成框架 - 简书 Unity3d Windows播放视频(视频流)功能组/插件支持对比_ffmpeg for unity-CSDN博客Unity UMP打包黑屏问题总结-CSDN博客Unity Universal…...
[spark] DataFrame 的 checkpoint
在 Apache Spark 中,DataFrame 的 checkpoint 方法用于强制执行一个物理计划并将结果缓存到分布式文件系统,以防止在计算过程中临时数据丢失。这对于长时间运行的计算过程或复杂的转换操作是有用的。 具体来说,checkpoint 方法执行以下操作&…...

flask文件夹列表改进版--Bug追踪
把当前文件夹下的所有文件夹和文件列出来,允许点击返回上层目录,允许点击文件夹进入下级目录并显示此文件夹内容 允许点击文件进行下载 from flask import Flask, render_template, send_file, request, redirect, url_for import osapp Flask(__name_…...
Elasticsearch之常用DSL语句
目录 1. Elasticsearch之常用DSL语句 1.1 操作索引 1.2 文档操作 1.3 DSL查询 1.4 搜索结果处理 1.5 数据聚合 1. Elasticsearch之常用DSL语句 1.1 操作索引 mapping是对索引库中文档的约束,常见的mapping属性包括: - type:字段数据类…...

鸿蒙实战-库的调用(ArkTS)
整体框架搭建 主页面、本地库组件页面、社区库组件页面三个页面组成,主页面由Navigation作为根组件实现全局标题,由Tabs组件实现本地库和社区库页面的切换。 // MainPage.ets import { Outer } from ../view/OuterComponent; import { Inner } from ..…...
观察者模式学习
观察者模式(Observer Design Pattern)也被称为发布订阅模式(Publish-Subscribe Design Pattern)。在 GoF 的《设计模式》一书中,它的定义是这样的: Define a one-to-many dependency between objects so th…...

人工智能_机器学习078_聚类算法_概念介绍_聚类升维_降维_各类聚类算法_有监督机器学习_无监督机器学习---人工智能工作笔记0118
首先看一下什么是聚类,我们可以进入sklearn的官网去看看 可以看到这里,首先classification 这个分类我们学完了,然后就是regression回归我们也学完了对吧,其实我们现实生活中的,大部分问题就是 这两种问题就可以解决了. 然后我们再来看一个: clustering,这个就是聚类对吧.聚类算…...

基于AR+地图导航的景区智慧导览设计
随着科技的飞速发展,智慧旅游已经成为现代旅游业的一个重要趋势。在这个背景下,景区智慧导览作为智慧旅游的核心组成部分,正逐渐受到越来越多游客的青睐。本文将深入探讨地图导航软件在景区智慧导览中的应用,并分析其为游客和景区…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...