微服务调用组件Feign

JAVA 项目中如何实现接口调用?
1)Httpclient
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富 的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变 得容易,提高了开发的效率。
2)Okhttp
一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持 多种协议(HTTP/2 和 SPDY)。
3)HttpURLConnection
HttpURLConnection 是 Java 的标准类,它继承自 URLConnection,可用于向指定网站发送 GET 请求、POST 请求。HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使 用。
4) RestTemplate WebClient
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便 捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。
上面介绍的是最常见的几种调用接口的方法,我们下面要介绍的方法比上面的更简单、方便, 它就是 Feign。
1. 什么是Feign
Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可帮助我们更加便捷、优雅地调用HTTP API。
Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud openfeign 对Feign进行了增强,使其支持Spring MVC注解,另外还整合了 Ribbon和Nacos,从而使得Feign的使用更加方便
1.1 优势
Feign可以做到 使用 HTTP 请求远程服务时就像调用本地方法一样的体验 ,开发者完全感知不 到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接 口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。它解决了 让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布 式环境开发。
2. Spring Cloud Alibaba快速整合OpenFeign
1)引入依赖
<!--1. 添加openfeign依赖 -->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2)编写调用接口+@FeignClient注解
@FeignClient(value = "mall‐order",path = "/order")
 public interface OrderFeignService {

 @RequestMapping("/findOrderByUserId/{userId}")
 public String findOrderByUserId(@PathVariable("userId") Integer userId);
 }
3)调用端在启动类上添加 @EnableFeignClients 注解
/**
 * @author yanqx
 * @date 2023/11/13  14:10
 */
@SpringBootApplication
@EnableFeignClients
public class FirsrtFeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(FirsrtFeignApplication.class, args);
    }

}
4)发起调用,像调用本地方式一样调用远程服务
@RestController
 @RequestMapping("/user")
 public class UserController {

 @Autowired
 OrderFeignService orderFeignService;

 @RequestMapping(value = "/findOrderByUserId/{id}")
 public R findOrderByUserId(@PathVariable("id") Integer id) {
 //feign调用
 String result = orderFeignService.findOrderByUserId(id);
 return result;
 }
 }
3. Spring Cloud Feign的自定义配置及使用
Feign 提供了很多的扩展机制,让用户可以更加灵活的使用。
3.1 日志配置
有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要 配置 Feign 的日志了,以此让 Feign 把请求信息输出来。
1)定义一个配置类,指定日志级别
 // 注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不
能配置
 public class FeignConfig {
 /**
 * 日志级别
 *
 * @return
 */
 @Bean
 public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
通过源码可以看到日志等级有 4 种,分别是:
        NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
        BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及 执行时间。
        HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
        FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body 和元数据。
2) 局部配置,让调用的微服务生效,在 @FeignClient 注解中指定使用的配置类
3) 在yml配置文件中执行 Client 的日志级别才能正常输出日志,格式是"logging.level.feign接口包路径 =debug"
logging:
  level:
   com.yanqx.mall.feigndemo.feign: debug
3.2 契约配置
Spring Cloud 在 Feign 的基础上做了扩展,使用 Spring MVC 的注解来完成Feign的功 能。原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的 注解方式来定义客户端也是可以的,通过配置契约来改变这个配置,Spring Cloud 中默认的 是 SpringMvcContract。
Spring Cloud 1 早期版本就是用的原生Fegin. 随着netflix的停更替换成了Open feign
1)修改契约配置,支持Feign原生的注解
/**
 * 修改契约配置,支持Feign原生的注解
 * @return
 */
 @Bean
 public Contract feignContract() {
    return new Contract.Default();
 }
注意:修改契约配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原 生的注解
2)OrderFeignService 中配置使用Feign原生的注解
@FeignClient(value = "mall‐order",path = "/order")
 public interface OrderFeignService {
 @RequestLine("GET /findOrderByUserId/{userId}")
 public R findOrderByUserId(@Param("userId") Integer userId);
 }
3)补充,也可以通过yml配置契约
feign:
 client:
 config:
 mall‐order: #对应微服务
 loggerLevel: FULL
 contract: feign.Contract.Default #指定Feign原生注解契约配置
3.3 超时时间配置
通过 Options 可以配置连接超时时间和读取超时时间,Options 的第一个参数是连接的超时
时间(ms),默认值是 2s;第二个是请求处理的超时时间(ms),默认值是 5s。

/**
 * @author yanqx
 * @date 2023/12/4  16:02
 */
@Configuration
public class FeignConfig {

    @Bean
    public Request.Options options() {
        return new Request.Options(5000, 10000);
    }
}
feign:
 client:
 config:
 mall‐order: #对应微服务
 # 连接超时时间,默认2s
 connectTimeout: 5000
 # 请求处理超时时间,默认5s
 readTimeout: 10000
yml中配置
补充说明: Feign的底层用的是Ribbon,但超时时间以Feign配置为准
测试超时情况:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/216260.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 3 整合 Spring Cache 与 Redis 缓存实战

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

服务器托管与服务器租用的详细比较

​  在当今数字化时代&#xff0c;服务器托管和服务器租用成为了许多企业和个人选择的两种常见方式。它们都提供了一种将服务器放置在专业机房中的解决方案&#xff0c;但在具体实施和使用过程中存在一些差异。下面将详细比较这两种方式的优势和劣势。 1. 服务器托管 服务器托…

Wnmp本地搭建结合内网穿透实现远程访问本地Wnmp服务

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&a…

拒绝废话,直接开画!Python零基础教程之画图

引文 很多教程&#xff0c;开始教python&#xff0c;就是语法呀&#xff0c;字符类型这些基础的&#xff0c;虽说是基础&#xff0c;你也不能说没用。 但是&#xff0c;对于前期要快速成长的我们来说&#xff0c;属实不够看。 我们是新手&#xff0c;我们是菜鸟&#xff0c;但…

2、Linux_远程操作

远程操作 1.配置ifconfig 1.1输入 ifconfig 查看 ip 的命令( ifconfig ) 1.2搜索 ifconfig 命令&#xff08;yum search ifconfig&#xff09; 1.3配置网卡 进入如下目录配置网卡 cd /etc/syscofig/network-scripts编辑 ifcfg-ens33 vi ifcfg-ens33按 i 键进入编辑模式 按 …

好大夫数据爬取

好大夫数据爬取 问诊数据评论数据医生数据科普号数据医患交流数据 可按照疾病进行所有医生的数据&#xff0c;也可以抓所有问诊数据、评论数据 突破限制&#xff0c;快速交付

UI咨询公司-蓝蓝设计:顶级秘籍:提升UI设计吸引力的3大绝招

想要让你的UI设计在海量应用中脱颖而出&#xff0c;吸引用户眼球吗&#xff1f;如果你正在寻找提升UI设计吸引力的绝妙方法&#xff0c;那么你绝对不能错过本文&#xff01;我们将为你揭示顶级UI设计师都不会告诉你的3大绝招&#xff0c;让你轻松掌握提升UI设计吸引力的关键技巧…

光纤和光模块的那点事儿

你们好&#xff0c;我的网工朋友。 应该不少朋友在工作中会遇到光纤传输布线的活吧&#xff0c;不得不说&#xff0c;会遇上的问题还挺多&#xff0c;比如说…… 光纤收发器怎么接上不亮&#xff1f; 光纤收发器和交换机插光模块能不能搭配使用&#xff1f; 带光口的球机可…

润和软件HopeStage与深信服终端安全管理系统完成产品兼容性互认证

近日&#xff0c;江苏润和软件股份有限公司&#xff08;以下简称“润和软件”&#xff09;HopeStage 操作系统与深信服科技股份有限公司&#xff08;以下简称“深信服”&#xff09;终端安全管理系统完成产品兼容性测试。 测试结果表明&#xff0c;企业级通用操作系统HopeStage…

一起学docker系列之十六使用Docker Compose简化容器编排

目录 1 前言2 Docker Compose是什么&#xff1f;3 Docker Compose安装步骤3.1 **下载Compose**3.2 **设置权限**3.3 **创建符号链接&#xff08;可选但建议以便使用&#xff09;** 4 Docker Compose的核心概念4.1 **YAML文件&#xff08;docker-compose.yml&#xff09;**4.2 *…

【Spring Cloud Alibaba】1.4 Nacos服务注册流程和原理解析

文章目录 1.前言2. 服务注册的基本流程3. 服务注册的核心代码分析3.1. NacosNamingServiceNamingProxy 服务端通信的核心类NamingClientProxy nacos 2.x 版本服务端通信核心接口 3.2 NamingGrpcClientProxy 详解RpcClient类RpcClient类核心方法 start 3.3 NamingHttpClientProx…

电子书制作神器!错过等十年

众所周知&#xff0c;随着科技的飞速发展&#xff0c;电子书已成为越来越多人的首选阅读方式。但制作电子书并不费力&#xff0c;一个制作电子书的神器就能解决这些问题。 那这款神器究竟有何魅力&#xff1f;它能帮助我们制作出怎样的电子书&#xff1f; 首先&#xff0c;这款…

PyQt6 QFontComboBox字体组合框控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计35条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

Spring 声明式事务

Spring 声明式事务 1.Spring 事务管理概述1.1 事务管理的重要性1.2 Spring事务管理的两种方式1.2.1 编程式事务管理1.2.2 声明式事务管理 1.3 为什么选择声明式事务管理 2. 声明式事务管理2.1 基本用法2.2 常用属性2.2.1 propagation&#xff08;传播行为&#xff09;2.2.2 iso…

Python代码编译并生成Docker镜像

Python代码编译并生成Docker镜像 前言 实际python项目交付时往往有针对关键代码进行保护的需求&#xff0c;本文介绍了一种简单可行的方案&#xff1a;1. 在Linux系统上先将 .py 文件编译为 .so 文件&#xff0c;2. 将整个项目打包成Docker镜像&#xff08;解决 .so 文件的环…

业务场景中Hive解析Json常用案例

业务场景中Hive解析Json常用案例 json在线工具 json格式转换在线工具 https://tool.lu/json/format格式互转&#xff1a; // 格式化可以合并整行显示 {"name":"John Doe","age":35,"email":"johnexample.com"}// 格式化…

二进制动态插桩工具intel PIN的学习笔记

前言 最近两周为了课程汇报学习了intel PIN这个动态插桩&#xff08;dynamic instrument&#xff09;工具&#xff0c;总体的学习感受还是挺累的。一方面&#xff0c;这个方向比较小众&#xff0c;相关的二手资料比较少&#xff0c;能参考的也就只有官方手册这种一手资料&…

分类预测 | Matlab实现NGO-KELM北方苍鹰算法优化核极限学习机分类预测

分类预测 | Matlab实现NGO-KELM北方苍鹰算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现NGO-KELM北方苍鹰算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-KELM北方苍鹰算法优化核极限学习机分类预测&#xff08;完…

深入学习锁--Lock各种使用方法

一、什么是Lock Lock是一个接口,通常所说的可重入锁是指Lock的一个实现子类ReentrantLock 二、Lock实现步骤&#xff1a; ①创建锁对象Lock lock new ReentrantLock(); ②加锁lock.lock(); ③释放锁lock.unlock(); import java.util.concurrent.locks.Lock; import java.util…

智安网络|语音识别技术:从历史到现状与未来展望

语音识别技术是一种将语音信号转化为可识别的文本或命令的技术&#xff0c;近年来得到了广泛应用和关注。 一. 语音识别的发展现状 1.历史发展 语音识别技术的起源可以追溯到20世纪50年代&#xff0c;但直到近年来取得了显著的突破和进展。随着计算机性能的提升和深度学习算法…
最新文章