SpringCloud: OpenFeign

OpenFeign基于NetflixFeign,简化了微服务间的HTTP通信。开发者定义接口和注解,OpenFeign自动生成请求。Feign整合Ribbon和SpringMvc,实现声明式REST调用,支持服务熔断和降级。文中通过创建支付服务,展示了如何配置Feign客户端,实现负载均衡和日志调试,并介绍了开启GZIP压缩以优化网络开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要

OpenFeign建立在Netflix Feign之上,它通过使用注解和接口定义来隐藏底层的HTTP通信细节,使得开发者可以更加方便地调用远程服务。开发者只需要定义一个接口,并使用注解来描述接口的各个方法,OpenFeign将自动解析注解并生成实际的HTTP请求。

什么是Feign

Feign是一个声明式的http客户端,使用Feign可以实现声明式REST调用,它的目的就是让Web Service调用更加简单。Feign整合了Ribbon和SpringMvc注解,这让Feign的客户端接口看起来就像一个Controller。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。同时Feign整合了Hystrix,可以很容易的实现服务熔断和降级。

编码实战

我们这里想要实现的效果和之前学习Ribbon案例的效果一样:
在这里插入图片描述
这里我们是在前面Eureka的项目里面进行添加,搭建新工程“支付服务”来演示Feign。那在这里支付服务和订单服务充当的角色一样,都是服务消费者,通过调用用户服务来获取数据。

1.创建工程

springCloud-netflixt //父项目
springCloud-netflix-eureka //注册中心EurekaServer
springCloud-netflix-servers-user //用户服务EurekaClient ,提供者
springCloud-netflix-servers-order //订单服务EurekaClient ,消费者
springCloud-netflix-pojo-user //公共user模块
springCloud-netflix-servers-pay //支付服务EurekaClient ,消费者

2.导入依赖

导入Openfeign,Eureka Client和web的依赖包,同时依赖pojo-user模块 ,具体的 pom.xml如下:

<dependencies>
    <!-- 在项目中引入Spring Cloud中的Eureka Client组件 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
    <!-- 在项目中引入Spring Cloud中的openfeign依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

    <!-- web的基础依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- 导入公共user模块 -->
    <dependency>
        <groupId>cn.ms</groupId>
        <artifactId>springCloud-netflix-pojo-user</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

3.配置类如下

3.1.yml配置:
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:10011/eureka/ # 注册地址
  instance:
    instance-id: payServer # 实例Id

server:
  port: 10041 # 端口号

spring:
  application:
    name: payServer # 服务名
3.2.主配置类:
@SpringBootApplication
// 会去扫描指定包下的@FeignClient注解
@EnableFeignClients // 开启feign的客户端
public class PayApp {
    public static void main(String[] args) {
        SpringApplication.run(PayApp.class,args);
    }

    // 使用负载均衡中的随机算法
    @Bean
    public RandomRule randomRule(){
        return new RandomRule();
    }
}

4.编写Feign的客户端接口

Feign的客户端接口是用来调用微服务的,我这里就编写了一个用来调用用户服务的客户端接口,如下:

// userServer被调用服务的服务名
@FeignClient("userServer")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getById(@PathVariable("id")Long id);
}

5.编写Controller使用Feign接口

通过注入UserClient ,直接发起调用

@RestController
public class PayController {
    @Autowired
    private UserClient userClient;

    @GetMapping("/pay/{id}")
    public User getById(@PathVariable("id")Long id){
        return userClient.getById(id);
    }
}

6.测试

依次启动注册中心springcloud-eureka-server-1010 ,两个用户服务springcloud-user-server-1020 , 启动支付服务 springcloud-pay-server-1040 ,
通过浏览器访问pay-server的controller:http://localhost:1040/pay/1,多次请求发现负载均衡算法已经不再是默认的轮询了,而是变成随机算法了:
在这里插入图片描述

Feign开启日志调试

有的时候我们需要看到Feign的调用过程中的参数及相应,我们可以对Feign的日志进行配置,Feign支持如下几种日志模式来决定日志记录内容多少:

  • NONE,不记录(DEFAULT)。
  • BASIC,仅记录请求方法和URL以及响应状态代码和执行时间。
  • HEADERS,记录基本信息以及请求和响应标头。
  • FULL,记录请求和响应的标题,正文和元数据。

创建Feign配置类

// Feign配置
@Configuration
public class FeignPayConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;	//打印Feign的所有日志
    }
}

配置日志打印级别

配置UserClient 的日志打印级别,上面的配置打印Feign的那些内容,下面这个是配置日志框架打印日志的级别,不修改可能打印不出来日志,DEBUG打印日志调试信息。

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:10011/eureka/ # 注册地址
  instance:
    instance-id: payServer # 实例Id

server:
  port: 10041 # 端口号

spring:
  application:
    name: payServer # 服务名

# 配置日志打印级别
logging:
  level:
    cn.ms: debug # 日志级别为debug

Feign开启GZIP

可以通过开启Feign的数据压缩传输来节省网络开销,但是压缩数据会增加CPU的开销,所以太小的数据没必要压缩,可以通过压缩大小阈值来控制,配置如下:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:10011/eureka/ # 注册地址
  instance:
    instance-id: payServer # 实例Id

server:
  port: 10041 # 端口号

spring:
  application:
    name: payServer # 服务名

logging:
  level:
    cn.ms: debug # 日志级别为debug

# Feign开启GZIP
feign:
  compression:
    request:
      enabled: true
      min-request-size: 1024 #最小阈值,小于这个不压缩
      mime-types: text/xml,application/xml,application/json #压缩哪些类型的数据
    response:
      enabled: true

小结

OpenFeign是一个功能强大、易于使用的RESTful客户端框架,可以简化和加速微服务间的通信和开发工作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值