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

SpringCloudAlibaba微服务调用组件-Feign

SpringCloudAlibaba微服务调用组件-Feign

本项目代码与笔记已存放在Gitee仓库 地址: 代码,笔记

文章目录

  • SpringCloudAlibaba微服务调用组件-Feign
    • 1. 什么是Feign
      • 1.1 优势
    • 2. Spring Cloud Alibaba快速整合OpenFeign
      • 1)引入依赖
      • 2)编写调用接口+@FeignClient注解
      • 3)调用端在启动类上添加@EnableFeignClients注解(不加的话会找不到客户端service)
      • 4)发起调用,像调用本地方式一样调用远程服务
    • 3. Spring Cloud Feign的自定义配置及使用
      • 3.1 日志配置
      • 3.2 契约配置 (可以把openFeign还原为feign使用feign的原生注解)
      • 3.3 超时时间配置
      • 3.4自定义拦截器实现认证逻辑

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客户端**(feign是声明在服务消费端的)**,其灵感来自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)引入依赖

<!--openfeign远程调用-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2)编写调用接口+@FeignClient注解

/*** Create with IntelliT IDEA** @Author: zhengmingzhe* @Date: 2023/03/15/21:15* @Description: 调用stock-service服务service*/
/*name 指定调用的rest接口的服务名,比如这里调用库存服务stock-service* path 指定rest接口所在的StockController指定的@RequestMapping("/stock")*  **/
@FeignClient(name = "stock-service", path = "/stock")
public interface StockFeignService {//声明需要调用的rest接口对应的方法,直接复制过来,对应的就行(不用写实现类)@RequestMapping("/reduct")String reduct();
}

3)调用端在启动类上添加@EnableFeignClients注解(不加的话会找不到客户端service)

@SpringBootApplication
@EnableDiscoveryClient   //启动nacos的客户端 不加也行在后续的版本这个注解可不用手动添加
@EnableFeignClients
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}

4)发起调用,像调用本地方式一样调用远程服务

@RestController
@RequestMapping("/order")
public class OrderController {@AutowiredStockFeignService stockService;@RequestMapping("/add")public String add() {System.out.println("下单成功");String msg = stockService.reduct();return "Hello Feign!" + msg;}
}

3. Spring Cloud Feign的自定义配置及使用

Feign 提供了很多的扩展机制,让用户可以更加灵活的使用。

3.1 日志配置

有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要

配置 Feign 的日志了,以此让 Feign 把请求信息输出来。

1)定义一个配置类,指定日志级别

/*  全局配置:当使用@Configuation会将配置作用于所有的服务提供方*   局部配置: 如果只想针对某一个服务进行配置,就不要加@Configuration*/
@Configuration
public class FeignConfig {/*** 日志级别* <p>*  @return*/@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.BASIC;}
}

通过源码可以看到日志等级有 4 种,分别是:

NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。

BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及

执行时间。

HEADERS:记录BASIC级别的基础上,记录请求和响应的header。

FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body

和元数据。

2) 局部配置,让调用的微服务生效,在@FeignClient 注解中指定使用的配置类(如果是全局配置就不用加)

@FeignClient(name = "stock-service", path = "/stock", configuration = FeignConfig.class)
public interface StockFeignService {//声明需要调用的rest接口对应的方法,直接复制过来,对应的就行(不用写实现类)@RequestMapping("/reduct")String reduct();
}

3) 在yml配置文件中执行 Client 的日志级别才能正常输出日志,格式是"logging.level.feign接口包路径

=debug" (找到对应的service所在的包右键copy reference)

logging:level:com.zmz.order.feign: debug

就会显示BASIC级别的日志信息

下单成功
2023-03-15 22:39:48.867 DEBUG 23504 — [nio-8040-exec-1] com.zmz.order.feign.StockFeignService : [StockFeignService#reduct] —> GET http://stock-service/stock/reduct HTTP/1.1
2023-03-15 22:39:48.871 DEBUG 23504 — [nio-8040-exec-1] com.zmz.order.feign.StockFeignService : [StockFeignService#reduct] <— HTTP/1.1 200 (3ms)

补充:局部配置可以在yml中配置

对应属性配置类:

org.springframework.cloud.openfeign.FeignClientProperties.FeignClientConfiguration

#feign日志局部配置
feign:client:config:stock-service:loggerLevel: FULL

3.2 契约配置 (可以把openFeign还原为feign使用feign的原生注解)

Spring Cloud 在 Feign 的基础上做了扩展,使用 Spring MVC 的注解来完成Feign的功 能。原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的 注解方式来定义客户端也是可以的,通过配置契约来改变这个配置,Spring Cloud 中默认的 是 SpringMvcContract。 Spring Cloud 1 早期版本就是用的原生Fegin. 随着netflix的停更替换成了Open feign 。

    /*** 修改契约配置,支持Feign原生的注解*  @return*/@Beanpublic Contract feignContract() {return new Contract.Default();}

注意:修改契约配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原 生的注解 。

@FeignClient(name = "stock-service", path = "/stock", configuration = FeignConfig.class)
public interface StockFeignService {//声明需要调用的rest接口对应的方法,直接复制过来,对应的就行(不用写实现类)
//    @RequestMapping("/reduct")
//    String reduct();@RequestLine("GET/reduct")  // @RequestLine替换@RequestMapping加上请求方式GETString reduct();   
}

3)补充,也可以通过yml配置契约

  #feign日志局部配置
feign:client:config:stock-service:loggerLevel: FULLcontract: feign.Contract.Default  #设置为默认的契约(还原成原生注解)

3.3 超时时间配置

通过 Options 可以配置连接超时时间和读取超时时间,Options 的第一个参数是连接的超时 时间(ms),默认值是 2s;第二个是请求处理的超时时间(ms),默认值是 5s。

 /*设置feign调用超时时间*/@Beanpublic Request.Options options() {return new Request.Options(5000, 10000);}

yml中配置

feign:client:config:stock-service:loggerLevel: FULLcontract: feign.Contract.Default  #设置为默认的契约(还原成原生注解)connectTimeout: 5000readTimeout: 3000

补充说明: Feign的底层用的是Ribbon,但超时时间以Feign配置为准

3.4自定义拦截器实现认证逻辑

在消费端调用提供端的时候起作用(要验证认证Authorization的时候把feign日志级别设置为FULL)

public class FeignAuthRequestInterceptor implements RequestInterceptor {Logger logger = LoggerFactory.getLogger(this.getClass());@Overridepublic void apply(RequestTemplate template) {logger.info("feign拦截器----");
// 业务逻辑String access_token = UUID.randomUUID().toString();template.header("Authorization", access_token);}
}
//@Configuration
public class FeignConfig {/*** 日志级别* <p>*  @return*/@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.FULL;}/*定义拦截器*/@Beanpublic FeignAuthRequestInterceptor feignAuthRequestInterceptor() {return new FeignAuthRequestInterceptor();}
}

相关文章:

SpringCloudAlibaba微服务调用组件-Feign

SpringCloudAlibaba微服务调用组件-Feign 本项目代码与笔记已存放在Gitee仓库 地址&#xff1a; 代码&#xff0c;笔记 文章目录SpringCloudAlibaba微服务调用组件-Feign1. 什么是Feign1.1 优势2. Spring Cloud Alibaba快速整合OpenFeign1&#xff09;引入依赖2&#xff09;编写…...

高效学习方法论

2023.03.17 《程序员的三门课&#xff1a;技术精进、架构修炼、管理探秘 / 于君泽等著》学习笔记 学会学习一、高效学习的方法1、管理好自己的目标1&#xff09;评估能力2&#xff09;制定目标3&#xff09;评估目标2、利用好碎片时间3、在同一时间只做一件事二、高效学习的途径…...

C语言结构体(一篇学会)

C语言结构体 在C语言中&#xff0c;结构体是一种自定义的数据类型&#xff0c;它允许用户将不同类型的数据组合在一起。结构体由多个变量组成&#xff0c;这些变量称为结构体的成员。结构体成员可以是不同的数据类型&#xff0c;如整数、浮点数、字符或其他结构体等。 结构体…...

嵌入式软件开发之Linux下C编程

目录 前沿 Hello World&#xff01; 编写代码 编译代码 GCC编译器 gcc 命令 编译错误警告 编译流程 Makefile 基础 何为 Makefile Makefile 的引入 前沿 在 Windows 下我们可以使用各种各样的 IDE 进行编程&#xff0c;比如强大的 Visual Studio。但是在Ubuntu 下如何进…...

普通Java工程师 VS 优秀架构师

1 核心能力 1.1 要成为一名优秀的Java架构师 只懂技术还远远不够&#xff0c;懂技术/懂业务/懂管理的综合型人才&#xff0c;才是技术团队中的绝对核心。 不仅仅是架构师&#xff0c;所有的技术高端岗位&#xff0c;对人才的综合能力都有较高的标准。 架构路线的总设计师 规…...

Java:SpringBoot实现ApplicationEvent事件的监听和发布

通过发布订阅模式实现数据的异步处理&#xff0c;比如异步处理邮件发送 新建SpringBoot项目 项目结构 . ├── pom.xml └── src└── main├── java│ └── com│ └── example│ └── demo│ ├── Application.java│ …...

星戈瑞-Sulfo-Cyanine3 azide?磺酸基-Cy3-N3叠氮基水溶性染料

Sulfo-Cyanine3 azide&#xff1f; 品牌&#xff1a;星戈瑞 CAS号&#xff1a;2055138-89-9 外观&#xff1a; 暗红色晶体 分子量&#xff1a;720.83 分子式&#xff1a;C34H45N6NaO8S2 纯度&#xff1a;95% 储藏条件&#xff1a;-20C 下避光保存 Sulfo-Cyanine3 azide 是一种…...

十大经典排序算法(下)

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 HTML和CSS3 目录 1.6 快速排序 1. 算法步骤 2. 动图演示 3.代码实现 1.7 堆排序 1. 算法步骤 2. 动图演示 3. 代码实现 1.8 计数排…...

网络协议分析期末复习(四)

目录 0.前言 1.IP层对改善TCP性能支持的机制 2.TCP防止半开放连接的机制 3.TCP协议中强推位&#xff08;P&#xff09;和紧急位&#xff08;U&#xff09;的用法 4.TCP的流量控制和拥塞控制的异同点 异&#xff1a; &#xff08;1&#xff09;两者的特点不同&#xff1a;…...

Matlab对图像和视频的简单处理(图像视频文件读取和输出,转灰度图,取指定帧的图像)

文章目录1.图像文件的读取2.图像效果展示3.将彩色图转换为灰度图4.视频文件的读取5.读取视频中指定帧的图像6.图片文件的报错1.图像文件的读取 语法介绍&#xff1a; A imread(filename) A imread(filename, fmt)参数介绍&#xff1a; filename&#xff1a;要读取的图像文…...

ArrayList源码分析

ArrayList源码分析目标:一、 ArrayList的简介二、ArrayList原理分析2.1 ArrayList的数据结构源码分析2.2 ArrayList默认容量&最大容量2.3 为什么ArrayList查询快&#xff0c;增删慢&#xff1f;2.4 ArrayList初始化容量1、创建ArrayList对象分析&#xff1a;无参数2、创建A…...

SpringBoot IOC、DI、@Autowired、@Resource、作用域

一、初识Spring1.1 Spring是什么Spring是一个轻量级Java开发框架&#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的开源框架&#xff0c;为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构&#xff0c;Java开发者可以专…...

链表相关oj题

1.Leetcode203 移除链表元素 解题思路&#xff1a;从头节点开始进行元素删除&#xff0c;每删除一个元素&#xff0c;需要重新链接节点 struct ListNode* removeElements(struct ListNode* head, int val){struct ListNode*dummyheadmalloc(sizeof(struct ListNode));dummyhea…...

【Linux】操作系统(Operator System)

操作系统&#xff08;Operator System &#xff09;一、操作系统的概念二、操作系统的作用三、系统调用和库函数一、操作系统的概念 操作系统是一组控制和管理计算机软硬件资源&#xff0c;为用户提供便捷使用的计算机程序的集合&#xff0c;是配置在计算机硬件系统上的第一层…...

机器学习自学笔记——感知机

感知机预备知识 神经元 ​ 感知机算法最初是由科学家从脑细胞的神经凸起联想而来。如下图&#xff0c;我们拥有三个初始xxx值&#xff0c;x1,x2,x0x_1,x_2,x_0x1​,x2​,x0​。其中x01x_01x0​1为一个初始的常量&#xff0c;专业上称作“偏置”。每个xxx的值都会乘上一个权重…...

C++ Primer第五版_第三章习题答案(21~30)

文章目录练习3.21练习3.22练习3.23练习3.24练习3.25练习3.26练习3.27练习3.28练习3.29练习3.30练习3.21 请使用迭代器重做3.3.3节的第一个练习。 #include <vector> #include <iterator> #include <string> #include <iostream>using std::vector; usi…...

colmap+openmvs进行三维重建流程全记录

window下的colmapopenmvs进行三维重建流程全记录 1.colmap安装与配置 可参考&#xff1a;https://blog.csdn.net/weixin_44153180/article/details/129334018?spm1001.2014.3001.5501 2.openmvs安装与配置 可参考&#xff1a;https://blog.csdn.net/rdw1246010462/article…...

yolov8命令行运行参数详解

序言 整理来自yolov8官方文档常用的一些命令行参数&#xff0c;官方文档YOLOv8 Docs yolov8命令行的统一运行格式为&#xff1a; yolo TASK MODE ARGS其中主要是三部分传参&#xff1a; TASK(可选) 是[detect、segment、classification]中的一个。如果没有显式传递&#xf…...

分布式锁简介

Redis因为单进程、性能高常被用于分布式锁&#xff1b;锁在程序中作用是同步工具&#xff0c;保证共享资源在同一时刻只能被一个线程访问。 Java中经常用的锁synchronized、Lock&#xff0c;但是Java的锁智能保证单机的时候有效&#xff0c;分布式集群环境就无能为力了&#xf…...

【嵌入式Linux学习笔记】Linux驱动开发

Linux系统构建完成后&#xff0c;就可以基于该环境方便地进行开发了&#xff0c;相关的开发流程与MCU类似&#xff0c;但是引入了设备树的概念&#xff0c;编写应用代码要相对复杂一点。但是省去了很多配置工作。 学习视频地址&#xff1a;【正点原子】STM32MP157开发板 字符…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...