使用Feign实现远程调用

2023-09-21 14:45:27

概述

Feign 是一个基于注解的 HTTP 客户端库,它允许您将 HTTP 请求转换为声明式的 Java 接口。您可以使用类似于 Spring MVC 的注解来定义接口的方法,然后 Feign 会自动处理 HTTP 请求的创建和执行。

Feign 还与 Spring Cloud 集成得非常好,它可以与 Ribbon(用于负载均衡)和 Eureka(用于服务发现)等一起使用,以便于构建弹性的微服务应用程序。

官方地址:https://github.com/OpenFeign/feign

1、引入依赖

首先,确保在你的项目中添加了 Spring Cloud Feign 依赖。如果你正在使用 Maven,可以在 pom.xml 文件中添加以下依赖:

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

2、启用 Feign

在主应用程序类上添加 @EnableFeignClients 注解,以启用 Feign 客户端。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class YourApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

3、创建 Feign 接口

接下来,你需要创建一个 Feign 客户端接口,该接口定义了远程服务的方法。这个接口类似于 Spring Data 的 Repository 接口,但它用于远程服务调用。

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "remoteservice")  // 指定要调用的服务名称
public interface RemoteServiceClient {
	@GetMapping("/api/resource/{id}")
    Resource getResourceById(@PathVariable("id") Long id);
    
    @PostMapping("/api/resource")
    Resource createResource(@RequestBody Resource resource);
}

在上面的示例中,RemoteServiceClient 接口使用 @FeignClient 注解指定了远程服务的名称(在 Eureka 或Nacos注册中心中注册的名称),并定义了一个用于获取资源的方法。

4、使用 Feign 客户端

现在可以在其它服务中使用 Feign 客户端来调用远程服务。

@Service
public class MyService {

    private final ExampleFeignClient feignClient;

    @Autowired
    public MyService(ExampleFeignClient feignClient) {
        this.feignClient = feignClient;
    }

    public Resource getResourceById(Long id) {
        return feignClient.getResourceById(id);
    }

    public Resource createResource(Resource resource) {
        return feignClient.createResource(resource);
    }
}

在上面的示例中,MyController 类通过构造函数注入了 RemoteServiceClient,然后可以使用它来调用远程服务的方法。

5、配置 Feign 客户端

Feign 提供了多种自定义配置方式,以便你根据项目需求来调整 Feign 客户端的行为。
一般情况下,默认值就能满足使用,如果要自定义,只需要创建自定义的@Bean覆盖默认Bean即可。

5.1、全局配置文件

你可以在应用的 application.properties 或 application.yml 文件中配置全局的 Feign 客户端属性。

feign:
  client:
    config:
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        connectTimeout: 5000 # 连接超时时间
        readTimeout: 5000    # 读取超时时间
        loggerLevel: FULL #  日志级别 

日志的级别分为四种:

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

5.2、Feign 客户端接口

在 Feign 客户端接口中,你可以使用注解为特定的方法配置属性。例如,你可以设置某个方法的超时时间。

@FeignClient(name = "remoteservice")
public interface RemoteServiceClient {

    @GetMapping("/api/resource")
    @RequestLine("GET /api/resource")
    @Headers("Accept: application/json")
    @Timeout(3000) // 设置超时时间为 3 秒
    String getResource();
}

5.3、自定义配置类

你可以创建一个自定义的 Feign 配置类,并在该类中配置 Feign 的属性。然后,通过 @FeignClient 注解的 configuration 属性引用该配置类。

@Configuration
public class FeignConfig {

	@Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC; // 日志级别为BASIC
    }

    @Bean
    public Request.Options requestOptions() {
        return new Request.Options(5000, 5000); // 设置连接超时和读取超时时间
    }
}

5.4、自定义属性文件

你可以创建一个属性文件(例如,feign-custom.properties),并在其中配置 Feign 客户端的属性。然后,在应用的主配置文件中,使用 @PropertySource 注解引用该属性文件。

@PropertySource("classpath:feign-custom.properties")
@SpringBootApplication
@EnableFeignClients
public class YourApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

在 feign-custom.properties 中配置属性:

feign.client.config.default.connectTimeout=5000
feign.client.config.default.readTimeout=5000

总结

Feign 是一个强大且易于使用的声明式 HTTP 客户端库,它在 Spring Cloud 微服务架构中起到了关键作用。通过创建 Feign 接口并使用注解来定义 HTTP 请求,您可以轻松地调用其他微服务的 RESTful API。同时,Feign 还集成了负载均衡和服务发现,使得构建弹性微服务应用程序更加容易。

更多推荐

WPF中DataGrid控件绑定数据源

步骤创建数据源:首先,我们需要创建一个数据源,可以是一个集合(如List、ObservableCollection等),也可以是一个DataTable对象。数据源中的每个元素代表一行数据。设置DataGrid的ItemsSource属性:在XAML中,我们可以通过设置DataGrid的ItemsSource属性来将数据

视频汇聚/视频云存储/视频监控管理平台EasyCVR分发rtsp流起播慢优化步骤详解

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,可拓

​LeetCode解法汇总2490. 回环句

目录链接:力扣编程题-解法汇总_分享+记录-CSDN博客GitHub同步刷题项目:https://github.com/September26/java-algorithms原题链接:力扣描述:句子是由单个空格分隔的一组单词,且不含前导或尾随空格。例如,"HelloWorld"、"HELLO"、"helloworldh

Docker从认识到实践再到底层原理(五)|Docker镜像

前言那么这里博主先安利一些干货满满的专栏了!首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。高质量博客汇总然后就是博主最近最花时间的一个专栏《Docker从认识到实践再到底层原理》希望大家多多关注!Docker从认识到实践再到底层原理第五章-镜像Docker镜像

飞行动力学 - 基础点摘要整理

飞行动力学-基础点摘要整理随着飞行动力学视频完整看了一遍,大体对飞行动力学有了基本的了解。从其根本原理和概念来看,并不是非常复杂,将经典力学用于飞机,进行了各种飞行场景的解析。当然,一遍也只能知道一个大概,不过对于从来没有接触过飞行动力学的我来说,是一个全新的角度对于经典力学的应用。顺便也对于之前整理的一些摘要或者说课

KMP,ACM集训

目录831.KMP字符串输入格式输出格式数据范围输入样例:输出样例:解析:KMP模板D-CyclicNacklace解析:KMP-next数组应用+循环字符串判断F-PowerStrings解析:KMP-next数组应用+循环字符串判断H-Countthestring解析:next数组理解J-StringProblem

软件设计师笔记系列(四)

😀前言随着技术的快速发展,软件已经成为我们日常生活中不可或缺的一部分。从智能手机应用到大型企业系统,软件都在为我们提供便利、增强效率和创造价值。然而,随之而来的是对软件质量的日益增长的关注。软件的质量不仅关乎其功能性和性能,还涉及其可靠性、使用性、可维护性和可移植性。为了更好地理解和评估软件的质量,我们需要一个结构化

day49:QT day2,信号与槽、对话框

一、完善登录框点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。如果账号和密码匹配,则弹出信息对话框,给出提

比特币 ZK 赏金系列:第 1 部分——支付解密密钥

以前,我们使用零知识赏金(ZKB)来支付比特币上的数独解决方案。在本系列中,我们将使用ZKB来解决范围更广的更实际的问题。在第1部分中,我们应用ZKB来支付解密密钥。假设Alice使用对称密钥K加密她的文件。为了安全起见,她联系了在线备份服务Bob,以保留K的副本。她不想让Bob知道K,所以她使用门限秘密共享方案将K分

FPGA 图像缩放 千兆网 UDP 网络视频传输,基于88E1518 PHY实现,提供工程和QT上位机源码加技术支持

目录1、前言版本更新说明免责声明2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择UDP协议栈UDP视频数据组包UDP协议栈数据发送UDP协议栈数据缓冲I

【华为OD机试python】模拟消息队列【2023 B卷|100分】

【华为OD机试】-真题!!点这里!!【华为OD机试】真题考点分类!!点这里!!题目描述让我们来模拟一个消息队列的运作,有一个发布者和若干消费者,发布者会在给定的时刻向消息队列发送消息若此时消息队列有消费者订阅,这个消息会被发送到订阅的消费者中优先级最高(输入中消费者按优先级升序排列)的一个。若此时没有订阅的消费者,该消

热文推荐