Spring Cloud Feign声明式服务调用

一、前言

在上一篇文章 《Spring Cloud Ribbon客户端负载均衡》 中介绍了 Ribbon 使用负载均衡调用微服务,但存在一个问题:消费端每个请求方法中都需要拼接请求服务的 URL 地址,存在硬编码问题且不符合面向对象编程思想。如果服务名称发生变化,消费端也需要跟着修改。
本篇文章将介绍 Feign 来解决上边的问题。

二、简单介绍

Feign 是一个声明式的 Web Service 客户端。使用 Feign 能让编写 Web Service 客户端更加简单,同时支持与Eureka、Ribbon 组合使用以支持负载均衡。
Spring Cloud 对 Feign 进行了封装,使其支持了 Spring MVC 标准注解和 HttpMessageConverters。
Feign 的使用方法是定义一个接口,然后在其上边添加 @FeignClient 注解。

三、实战演练

本次测试案例基于之前发表的文章中介绍的案例进行演示,不清楚的读者请先转移至 《Spring Cloud Ribbon客户端负载均衡》 进行浏览。

3.1 添加依赖

在 common-api 和 user-web 项目中添加依赖:

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

使用 @FeignClient 注解指定调用的微服务名称,封装了调用 USER-SERVER 的过程,作为消费方调用模板。

3.3 修改服务消费方

修改 user-web 控制层代码:

    @Autowired
    private UserFeignService userFeignService;

    @RequestMapping("getFeign/{id}")
    public User getFeign(@PathVariable("id") Integer id) throws Exception {
        // 使用 Feign 封装的模板
        return this.userFeignService.get(id);
    }

直接使用 Feign 封装模板调用服务方,从而实现面向对象编程。

3.4 启动 Feign 功能

在启动类上添加 @EnableEeignClients 注解:

@EnableFeignClients(basePackages = {"com.wno704.cloud"})
@EnableEurekaClient
@SpringBootApplication
public class UserWebApplication {

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

}

打开浏览器访问 user-web 项目,请求结果如下图:
image.png

四、Feign其他配置

除了Ribbon和Hystrix配置之外,Feign也有一些自个儿的配置。

4.1 请求压缩

Spring Cloud Feign支持对请求与响应进行GZIP压缩,以减少通信过程中的性能损耗:

feign:
  compression:
    request:
      enabled: true
    response:
      enabled: true

同时,我们还能对请求压缩做一些更细致的设置,比如下面的配置内容指定了压缩的请求数据类型,并设置了请求压缩的大小下限,只有超过这个大小的请求才会对其进行压缩:

feign:
  compression:
    request:
      enabled: true
      mime-types: text/xml,application/xml,application/json
      min-request-size: 2048
    response:
      enabled: true

4.2 日志配置

Feign提供了日志打印的功能,Feign的日志级别分为四种:
NONE: 不记录任何信息。
BASIC: 仅记录请求方法、URL以及响应状态码和执行时间。
HEADERS: 除了记录BASIC级别的信息之外,还会记录请求和响应的头信息。
FULL: 记录所有请求与响应的明细,包括头信息、请求体、元数据等。
日志级别默认为NONE,要改变级别需要定义一个日志配置Bean:

public class FeignConfigurarion {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

然后在yml中配置Feign客户端的日志级别为debug,Feign日志记录仅响应debug级别:

logging:
  level:
    com:
      wno704:
        cloud: debug

posted on 2026-08-10 15:30  爱河  阅读(2)  评论(0)    收藏  举报

导航