OpenFeign高级用法:缓存、QueryMap、MatrixVariable、CollectionFormat优雅地远程调用
微服务架构中,服务之间的通信变得尤为关键。OpenFeign,一个声明式的Web服务客户端,使得REST API的调用变得更加简单和优雅。OpenFeign集成了Ribbon和Hystrix,具有负载均衡和容错的能力,并且在Spring Cloud的加持下,可以轻松地与注册中心(nacos,Eureka)和配置中心(Spring Cloud Config,nacos)等组件集成。
目录
- 一、OpenFeign简介
 - 二、OpenFeign的使用
 - 1. 添加依赖
 - 2. 启用OpenFeign
 - 3. 定义Feign客户端
 - 4. 注入和使用Feign客户端
 
- 三、@FeignClient注解
 - 四、feign缓存
 - 1. Feign缓存的意义
 - 2. feign缓存的使用
 
- 五、@QueryMap支持
 - 使用方法
 
- 六、@MatrixVariable支持
 - 使用 `@MatrixVariable`
 - URI 结构
 
- 七、@CollectionFormat支持
 - 八、其他高级特性
 - 总结
 
一、OpenFeign简介
OpenFeign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得更简单。使用Feign,你只需要创建一个接口并用注解来配置它,Feign会自动完成接口的实现。OpenFeign具有可插拔的注解特性,同时也支持JAX-RS注解和Feign注解。此外,它还支持负载均衡和容错,通过集成Spring Cloud alibaba和Spring Cloud,可以轻松地查找服务并进行调用。
 
二、OpenFeign的使用
1. 添加依赖
首先需要在项目中添加OpenFeign的依赖。Maven可以在pom.xml文件中添加以下依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
 
2. 启用OpenFeign
在spring Boot应用主类上添加@EnableFeignClients注解,以启用OpenFeign。
@SpringBootApplication
@EnableFeignClients
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}
 
3. 定义Feign客户端
定义Feign客户端接口,并使用@FeignClient注解进行配置。假设有一个名为user-service的远程服务,可以这样定义一个Feign客户端:
@FeignClient("user-service")
public interface UserClient {@GetMapping("/users/{id}")User getUser(@PathVariable("id") Long id);
}
 
@FeignClient注解指定了要调用的远程服务的名称(在本例中是user-service),而接口中的方法则定义了具体的HTTP请求。@GetMapping注解表示这是一个GET请求,@PathVariable注解则用于从URL路径中提取参数。
4. 注入和使用Feign客户端
一旦你定义了Feign客户端接口,你就可以在你的服务中注入并使用它了。例如:
@Service
public class UserService {private final UserClient userClient;@Autowiredpublic UserService(UserClient userClient) {this.userClient = userClient;}public User getUser(Long userId) {return userClient.getUser(userId);}
}
 
在这个例子中,UserService类注入了UserClient的实例,并通过它来调用远程服务。当你调用getUser方法时,OpenFeign会自动将HTTP请求发送到指定的远程服务,并将响应映射到Java对象上。

三、@FeignClient注解
@FeignClient注解是用于标记Feign客户端接口的关键注解。通过此注解,OpenFeign能够自动生成接口的实现,使得开发者能够以声明式的方式调用远程服务。
下面是@FeignClient注解的详细参数及其用法:
-  
name:
- 含义:指定Feign客户端的名称,这个名称通常用于服务发现和服务间的负载均衡。在微服务架构中,这个名称通常与服务提供者在服务注册中心注册的服务名相对应。
 - 用法:
@FeignClient(name = "serviceName"),其中"serviceName"是远程服务的名称。 
 -  
url:
- 含义:直接指定Feign客户端的请求地址。当该参数被设置时,Feign将不再从服务注册中心获取服务地址,而是直接使用这个URL作为请求的目标地址。
 - 用法:
@FeignClient(url = "http://localhost:8080"),指定具体的服务地址。 - 注意:如果同时指定了name和url,url会覆盖name中定义的地址。
 
 -  
configuration:
- 含义:指定Feign客户端的配置类。在这个配置类中,可以自定义Feign的各种参数,如请求拦截器、编码器、解码器等。
 - 用法:
@FeignClient(configuration = CustomFeignConfiguration.class),其中CustomFeignConfiguration是自定义的配置类。 
 -  
fallback:
- 含义:指定Feign客户端的降级方案。当请求出现异常时,如远程服务不可用或请求超时,Feign会返回fallback指定的实例的数据。这通常用于实现熔断和降级逻辑,以提高系统的稳定性。
 - 用法:
@FeignClient(fallback = UserClientFallback.class),其中UserClientFallback是实现了Feign客户端接口的降级处理类。 
 -  
fallbackFactory:
- 含义:与fallback类似,但是提供了一个工厂类来创建降级逻辑的实例。这个工厂类需要实现
FallbackFactory接口,并覆盖create(Throwable cause)方法。这个方法返回一个实现了Feign客户端接口的实例,用于处理降级逻辑。 - 用法:通常与Hystrix等熔断框架结合使用,提供更灵活的降级策略。
 
 - 含义:与fallback类似,但是提供了一个工厂类来创建降级逻辑的实例。这个工厂类需要实现
 -  
path:
- 含义:定义所有方法请求的基础路径。这样可以在Feign客户端的接口方法中省略这个基础路径。
 - 用法:
@FeignClient(path = "/api/users"),指定所有请求的基础路径。 
 -  
qualifier:
- 含义:当使用Spring的自动装配功能时,可以使用qualifier参数来指定一个bean的名称,以便在多个相同类型的Feign客户端之间进行区分。
 - 用法:通常与
@Qualifier注解结合使用,用于解决自动装配时的歧义。 
 -  
decode404:
- 含义:指定当服务端返回404状态时是否抛出
FeignException。默认情况下,Feign会将404视为一个正常的响应(即不会抛出异常)。如果将此参数设置为true,则当服务端返回404状态时,Feign会抛出一个FeignException。 - 用法:在需要特殊处理404响应的场景中使用。
 
 - 含义:指定当服务端返回404状态时是否抛出
 -  
primary:
- 含义:当存在多个相同类型的bean时,将此参数设置为true可以将该bean设置为首选bean。这样,在使用
@Autowired进行自动装配时,Spring会优先选择标记为primary的bean。 - 用法:在需要指定首选bean的场景中使用。
 
 - 含义:当存在多个相同类型的bean时,将此参数设置为true可以将该bean设置为首选bean。这样,在使用
 
此外,@FeignClient注解还支持使用Spring Expression Language (SpEL) 表达式来动态地指定某些参数值。例如,可以使用${property.name}来从配置文件或环境变量中读取值。这种动态配置方式使得Feign客户端更加灵活和可配置。
四、feign缓存
1. Feign缓存的意义
在网络请求中,频繁地调用相同的接口会消耗大量的时间和资源。通过引入缓存机制,可以将一些不经常变化且查询频繁的数据存储在本地,从而减少对远程服务的调用,提高系统的响应速度和性能。
Feign 缓存是通过结合 Spring Framework 的缓存抽象来实现的。当你使用 @EnableCaching 注解时,Spring Boot 会启用对 @Cacheable、@CacheEvict、@CachePut 等缓存相关注解的支持。对于 Feign 客户端来说,这意味着你可以在 Feign 接口的方法上使用这些注解来控制缓存行为。
2. feign缓存的使用
启用缓存
首先在 Spring Boot 应用中使用 @EnableCaching 注解来启用缓存支持。这通常是在配置类或者启动类上添加的。
@EnableCaching
@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}
 
使用 @Cacheable 注解
在Feign 客户端接口中,可以使用 @Cacheable 注解来标记需要缓存的方法。这个注解指定了缓存的名称(cacheNames)和用于生成缓存键的表达式(key)。
@FeignClient("some-service")
public interface SomeServiceClient {@Cacheable(cacheNames = "infos", key = "#id")@GetMapping("/info/{id}")public Object info(@PathVariable("id") Integer id);
}
 
info 方法被标记为可缓存的。当这个方法被调用时,Spring 会检查名为 infos 的缓存中是否已经有对应 id 的缓存项。如果有,就直接返回缓存的数据;如果没有,就执行远程调用,并将结果存储到缓存中。
配置缓存管理器
通过配置文件来指定缓存管理器的类型和其他相关设置。使用了Redis 作为缓存存储,并配置了 Redis 缓存的相关参数。
spring:cache:type: redis # 指定缓存类型为 Redisredis:key-prefix: 'feign:' # 设置 Redis 缓存键的前缀time-to-live: 60s # 设置缓存的有效期为 60 秒
 
这样配置后,Feign 客户端的缓存数据会被存储到 Redis 中,并且每个缓存项的有效期为 60 秒。这意味着在 60 秒内对同一个 id 的多次请求都会直接从 Redis 缓存中获取数据,而不会触发远程调用。当缓存过期后,下一次请求会触发远程调用,并更新缓存。
五、@QueryMap支持
在Feign中使用@QueryMap或Spring Cloud OpenFeign中的@SpringQueryMap注解可以非常方便地将一个POJO(Plain Old Java Object,即简单的Java对象)或Map的属性和值映射为HTTP GET请求的查询参数。这在构建具有多个查询参数的API调用时特别有用,因为它允许你以声明式的方式组织这些参数,而不是手动构建查询字符串。
简单点说:可以将一个对象中的所有属性值以get的方式拼接到地址栏进行传递。
@QueryMap 和 @SpringQueryMap
- @QueryMap: OpenFeign原生提供的注解,用于将POJO映射为查询参数。但是,它与Spring不兼容,因为它没有
value属性。 - @SpringQueryMap: Spring Cloud OpenFeign提供的与Spring兼容的注解,功能和@QueryMap类似,但可以在Spring环境中使用。
 
使用方法
- 定义参数对象:
创建一个简单的Java类Params,并为其添加属性和getter方法。这些属性和方法将用于生成查询参数。 
   public class Params {private Long id;private String name;// getters and setters}
 
- 在Feign客户端中使用@SpringQueryMap:
在Feign客户端接口中,使用@GetMapping注解来定义一个GET请求,并使用@SpringQueryMap注解来标记你的POJO参数。 
   @FeignClient("some-service")public interface DemoFeign {@GetMapping("/format")Object format(@SpringQueryMap Params params);}
 
- 调用Feign客户端:
在服务中创建一个Params对象,设置其属性,并通过Feign客户端调用该方法。 
   @GetMapping("/format")public Object format(Params params) {return demoFeign.format(params);}
 
- 日志输出:
当调用这个方法时,Feign会自动将Params对象的属性转换为查询参数,并附加到GET请求的URL上。可以通过查看Feign的请求日志来确认这一点。 
[DemoFeign#format] ---> GET http://localhost:8088/demos/format?name=test&id=111 HTTP/1.1
 
通过这种方式,可以简洁地将复杂的查询参数组织到一个对象中,并让Feign自动处理参数到查询字符串的转换,从而简化了代码并提高了可读性。
六、@MatrixVariable支持
在Spring Cloud OpenFeign中,@MatrixVariable 注解被用来处理 URI 中的矩阵变量。矩阵变量是 URI 的一种特殊参数形式,允许你在 URI 路径段中直接包含键值对。这种形式的参数在某些 RESTful API 设计中很有用,尤其是当你需要在 URI 中传递多个参数,并且这些参数都是针对同一资源的时候。
使用 @MatrixVariable
 
@MatrixVariable 被用来接收一个映射(Map),其中键是字符串,值是字符串列表。这在处理可能包含多个值的矩阵变量时非常有用。
@GetMapping("/m3/{params}")
public Object matrix3(@MatrixVariable Map<String, List<String>> params) {// ...
}
 
{params} 是一个路径占位符,它表示这个部分将由传递的矩阵变量填充。@MatrixVariable 注解告诉 Spring,params 参数应该接收来自 URI 矩阵变量的值。
URI 结构
一个包含矩阵变量的 URI 看起来像这样:
/m3/someValue;key1=value1a,value1b;key2=value2
 
在这个 URI 中:
/m3/someValue是基本的路径。;key1=value1a,value1b;key2=value2是矩阵变量部分,其中key1和key2是矩阵变量的名称,value1a,value1b和value2是相应的值。
注意事项
- 路径占位符的名称(在这个例子中是 
{params})必须与@MatrixVariable注解的变量名一致,或者你可以在注解中明确指定名称。 - 矩阵变量的值可以是单个值,也可以是用逗号分隔的多个值,这取决于你的 API 如何设计。
 - 使用矩阵变量时,要确保你的 URI 编码和解码逻辑能够正确处理这些变量,特别是当值中包含特殊字符时。
 
七、@CollectionFormat支持
在Feign中,@CollectionFormat 注解用于指定集合参数的格式化方式。当你在Feign客户端的方法中使用集合类型的参数(如 List<String>)时,这个注解能够帮助你定义如何将集合中的元素串联起来,以便通过HTTP请求发送给服务端。
@CollectionFormat 注解接受一个 feign.CollectionFormat 枚举值,该枚举定义了不同的格式化选项。在你提供的例子中,展示了两种格式化方式:CSV 和 PIPES。
-  
CSV (Comma Separated Values):
当使用feign.CollectionFormat.CSV时,集合中的元素会使用逗号,进行分隔。这是最常见和默认的格式。示例:
@GetMapping("/cf") @CollectionFormat(feign.CollectionFormat.CSV) public Object cf(@RequestParam("ids") List<String> ids);调用该方法并传递
List.of("S1", "S2", "S3")时,生成的URL查询参数会是ids=S1,S2,S3。 -  
PIPES (
|separator):
当使用feign.CollectionFormat.PIPES时,集合中的元素会使用竖线|进行分隔。示例:
@GetMapping("/cf") @CollectionFormat(feign.CollectionFormat.PIPES) public Object cf(@RequestParam("ids") List<String> ids);同样地,调用该方法并传递
List.of("S1", "S2", "S3")时,生成的URL查询参数会是ids=S1|S2|S3。 
这个注解在处理需要特定格式的集合参数时非常有用,尤其是当服务端期望接收特定格式的集合数据时。通过使用 @CollectionFormat,你可以确保Feign客户端发送的请求符合服务端的期望,从而避免格式错误导致的问题。
@CollectionFormat 可以应用于整个Feign客户端类或者单独的方法上。如果应用于类上,它将影响该类中所有使用集合参数的方法。如果只需要对某个特定方法应用不同的集合格式,可以将注解直接应用于该方法上。
八、其他高级特性
OpenFeign还提供了许多高级特性,如负载均衡、容错、请求拦截和重试等。这些特性可以帮助构建更健壮、更可靠的微服务架构。
- 负载均衡:OpenFeign集成了Ribbon,支持多种负载均衡策略,如轮询、随机等。你可以根据需要选择合适的策略来分发请求。
 - 容错:通过与Hystrix的集成,OpenFeign提供了熔断和降级功能。当远程服务出现故障或响应过慢时,可以自动切换到降级逻辑,保证系统的稳定性。
 - 请求拦截:可以使用
RequestInterceptor接口实现自定义的请求拦截器,用于在发送请求之前或之后执行特定的逻辑,如添加认证信息、记录日志等。 - 重试机制:OpenFeign支持配置请求的重试次数和间隔,以提高系统的可靠性。
 
总结
OpenFeign是一个强大的声明式Web服务客户端,它简化了远程服务调用的复杂性,并提供了负载均衡、容错等高级特性。通过使用OpenFeign,你可以更加专注于业务逻辑的实现,而无需关心底层的HTTP通信细节。希望本文能帮助你更好地理解和使用OpenFeign,构建高效、稳定的微服务架构。

相关文章:
OpenFeign高级用法:缓存、QueryMap、MatrixVariable、CollectionFormat优雅地远程调用
码到三十五 : 个人主页 微服务架构中,服务之间的通信变得尤为关键。OpenFeign,一个声明式的Web服务客户端,使得REST API的调用变得更加简单和优雅。OpenFeign集成了Ribbon和Hystrix,具有负载均衡和容错的能力ÿ…...
python基础之函数
目录 1.函数相关术语 2.函数类型分类 3.栈 4.位置参数和关键字参数 5.默认参数 6.局部变量和全局变量 7.返回多个值 8.怀孕函数 9.匿名函数 10.可传递任意个数实参的函数 11.函数地址与函数接口 12.内置函数修改与函数包装 1.函数相关术语 函数的基本概念有函数头…...
深入理解C#中的IO操作 - FileStream流详解与示例
文章目录 一、FileStream类的介绍二、文件读取和写入2.1 文件读取(FileStream.Read)2.2 文件写入(FileStream.Write) 三、文件复制、移动和目录操作3.1 文件复制(FileStream.Copy)3.2 文件移动(…...
信息泄露--注意点点
目录 明确目标: 信息泄露: 版本软件 敏感文件 配置错误 url基于文件: url基于路由: 状态码: http头信息泄露 报错信息泄露 页面信息泄露 robots.txt敏感信息泄露 .get文件泄露 --判断: 搜索引擎收录泄露 BP: 爆破: 明确目标: 失能 读取 写入 执行 信息泄…...
位运算符
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 位运算符是把数字看作二进制数来进行计算的,因此,需要先将要执行运算的数据转换为二进制,然后才能进行执行运算。…...
云上聚智——移动云云服务器进行后端的搭建及部署
什么是移动云 移动云是指将移动设备和云计算技术相结合,为移动应用提供强大的计算和存储能力的服务模式。传统的移动应用通常在本地设备上进行计算和存储,而移动云将这些任务转移到云端进行处理。通过移动云,移动设备可以利用云端的高性能计算…...
C语言程序的编译
目录 一、预处理(预编译) 二、编译 三、汇编 四,链接 在前面讲到了宏的定义,那么宏在编译时候是如何发生替换的?接下来做一下详细的介绍C语言程序的编译过程主要包括以下几个步骤:预处理、编译、汇编和…...
滴滴三面 | Go后端研发
狠狠的被鞭打了快两个小时… 注意我写的题解不一定是对的,如果你认为有其他答案欢迎评论区留言 bg:23届 211本 社招 1. 自我介绍 2. 讲一个项目的点,因为用到了中间件平台的数据同步,于是开始鞭打数据同步。。 3. 如果同步的时候…...
深度学习之基于Yolov3的行人重识别
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 行人重识别(Person Re-Identification,简称ReID)是计算机视觉领域…...
防火墙最新技术汇总
防火墙技术持续发展,以应对日益复杂的网络安全威胁。以下是防火墙领域的一些最新技术汇总: 下一代防火墙(NGFW):NGFW结合了传统防火墙的分组过滤和状态检测功能,还集成了深度包检测(DPI…...
PikaUnsafe upfileupload
1.client check 客户端检测,前端js检测,禁用js和修改后缀名即可。 php格式不能上传,我们修改后缀上传。 蚁剑成功连接。 2.MIME type 这个就是 content-type 规定上传类型,上面的方法也能成功,也可以修改 conten-ty…...
git拉取项目前需要操作哪些?
1.输入 $ ssh-keygen -t rsa -C "秘钥说明" 按enter键 2.出现 ssh/id_rsa:(输入也可以不输入也可以) 然后按enter键 3.出现empty for no passphrase:(输入也可以不输入也可以) 然后按enter键 4.出现same passphrase again: (输入也可以不输入也…...
报名开启!2024 开源之夏丨Serverless Devs 课题已上线!
Serverless 是近年来云计算领域热门话题,凭借极致弹性、按量付费、降本提效等众多优势受到很多人的追捧,各云厂商也在不断地布局 Serverless 领域。 Serverless Devs 是一个由阿里巴巴发起的 Serverless 领域的开源项目,其目的是要和开发者们…...
DataBinding viewBinding(视图绑定与数据双向绑定)简单案例 (kotlin)
先上效果: 4个view的文字都是通过DataBinding填充的。交互事件:点击图片,切换图片 创建项目(android Studio 2023.3.1) Build.gradle(:app) 引入依赖库(完整源码) buildFeatures { vie…...
TensorFlow基于anaconda3快速构建
基于python构建太累 Installing Packages - Python Packaging User Guide 使用 pip 安装 TensorFlow 有兴趣自己学,我放弃了 -------------------------------------------------------- 下面基于anaconda 1、下载 Index of /anaconda/archive/ | 清华大学开…...
力扣72-编辑距离
题目链接 记忆化搜索: 解题关键:每次仅考虑两字符串word1、word2分别从0 - i修改成0-j下标的完全匹配(下标表示) 临界条件:当 i 或 j 小于0时,表示该字符串为空,编辑距离确定为 y1 或 x1 int dp[501][501…...
K8S 删除pod的正确步骤
在日常的k8s运维过程中,避免不了会对某些pod进行剔除,那么如何才能正确的剔除不需要的pod呢? 首先,需要查出想要删除的pod # 可通过任意方式进行查询 kubectl get pods -A |grep <podname> kubectl get pods -n <names…...
羊大师分析,羊奶健康生活的营养源泉
羊大师分析,羊奶健康生活的营养源泉 羊奶,作为一种古老的饮品,近年来因其独特的营养价值和健康益处而备受关注。今天,羊大师就来探讨一下羊奶与健康之间的紧密联系。 羊奶富含蛋白质、脂肪、维生素和矿物质等多种营养成分。羊奶…...
刷屏一天GPT-4o,发现GPT4用的都还不熟练?戳这儿
以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...
力扣HOT100 - 139. 单词拆分
解题思路: 动态规划 class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordDictSet new HashSet(wordDict);boolean[] dp new boolean[s.length() 1];dp[0] true;for (int i 1; i < s.length(); i) {…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
