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

Feign

一、基于Feign远程调用

RestTemplate方式调用存在的问题

String url="http://userservice/user/"+userId;User user=restTemplate.getForObject(url,User.class);

存在下面的问题:

1.代码可读性差,编程体验不统一

2.参数复杂URL难以维护

1.定义和使用Feign客户端

1.引入依赖

<!--        feign客户端依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

2.在order-service的启动类添加注解开启Feign的功能

3.编写Feign客户端:

    @Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 2.用feign远程调用User user = userClient.findById(order.getUserId());System.out.println("user:"+user);// 3.封装user到orderorder.setUser(user);// 4.返回return order;}

二、自定义配置

方式一:基于配置文件

全局:

feign:client:config:default: # 配置全局的 feign 的策略loggerLevel: full

针对某个微服务:

feign:client:config:userservice: # 配置指定服务的 feign 的策略loggerLevel: full

方式二:基于java代码

局部有效:

全局有效:

三、Feign的性能优化

调整连接池配置 默认情况下Feign使用HTTPURLConnection,性能较差。建议替换为Apache HttpClient或OKHttp,通过连接池复用减少TCP连接建立的开销。

日志级别尽量用basic

1.引入依赖

<!--        httpclient依赖--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>

2.配置文件开启httpClient功能,设置连接池参数:

feign:httpclient:enabled: true # 开启 httpclientmax-connections: 200 # 最大连接数max-connections-per-route: 50 # 每个路径的最大连接数

四、Fegin的最佳实现

方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准

方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的PO10、默认的Feign配置都放到这个模块中,提供给所有消费者使用

方式二实现:

1.首先创建一个module,命名为feign-api,然后引入feign的starter依赖

2.引入feign的starter依赖

   <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies>

3.将order-service中编写的UserClient,User,DefaultFeignConfiguration都复制到feign-api项目中

4.在order-service中引入feign-api的依赖

    <dependency><groupId>cn.itcast</groupId><artifactId>feign-api</artifactId><version>1.0</version></dependency>

5.修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包

6.重启测试

http://www.dtcms.com/a/394136.html

相关文章:

  • SPA小说集之三《森林城市反甩锅战:ERP的权责边界》
  • Qt(模态对话框和非模态对话框)
  • 【无标题】物联网 frid卡控制
  • 【LLM LangChain】 模型绑定工具+调用工具(手动调用/LangGraph/AgentExecutor)+相关注意事项
  • 图神经网络(GNN)入门:用PyG库处理分子结构与社会网络
  • 【C++】编码表 STL简介:STL是什么,版本,六大组件,重要性以及学习方法总结
  • show_interrupts函数的进一步解析及irq_desc结构体
  • Kafka面试精讲 Day 19:JVM调优与内存管理
  • 10.vector容器
  • Linux系统介绍
  • MFC中的CMFCDynamicLayout类的介绍
  • UniScene 统一驾驶场景 | 生成语义占据 | 生成多视角视频 | 生成激光点云 CVPR2025
  • Git 简明教程:从原理到实战
  • 【设计模式】中介者模式
  • nginx添加modsecurity插件
  • 代码上传Github:SSH法
  • 【iOS】AFNetworking初步了解及使用
  • JVM实战-G1参数调优
  • 超简单的视频分割脚本
  • 基于51单片机电子钟闹钟12/24小时制LCD显示( proteus仿真+程序+设计报告+讲解视频)
  • 在 Windows 系统上安装官方 Codex CLI 教程
  • Redis 配置与优化全攻略
  • 二分查找左右边界写法
  • Oracle体系结构-Large Pool详解
  • Elasticsearch面试精讲 Day 19:磁盘IO与存储优化
  • 【AI智能体】Dify 搭建数据分析应用实战操作详解
  • Nginx localtion / 、/a、/a/ 的区别
  • 【C++】string的使用与模拟实现
  • 新手向 算法 希尔排序-yang
  • 如何用RAG增强的动态能力与大模型结合打造企业AI产品?