• 使用Feign实现远程调用


    概述

    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.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在上面的示例中,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);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在上面的示例中,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 #  日志级别 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    日志的级别分为四种:

    • 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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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); // 设置连接超时和读取超时时间
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    feign.client.config.default.connectTimeout=5000
    feign.client.config.default.readTimeout=5000
    
    • 1
    • 2

    总结

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

  • 相关阅读:
    诚迈科技旗下智达诚远亮相2023世界新汽车技术合作生态展
    STM32F103VET6基于STM32CubeMX 配置非DMA方式获取内部温度
    Web前端:JavaScript-->流程控制语句*笔记
    新160个CrackMe分析-第2组:11-20(下)
    Linux 文件系统与inode,软硬链接
    laravel引入element-ui后,blade模板中使用elementui时,事件未生效问题(下载element-ui到本地直接引入项目)
    Win10系统总是重复安装更新怎么办?
    软件架构设计(四) 基于服务的架构(SOA)
    南大通用数据库-Gbase-8a-学习-12-Gbase8a常用运维命令(持续更新哈)
    带你用两万字了解Thymeleaf
  • 原文地址:https://blog.csdn.net/weixin_53902288/article/details/133129498