springcloud----负载均衡--Feign与OpenFeign

本文详细介绍了Feign和OpenFeign的概念及其在微服务架构中的应用。Feign是一种声明性的Web服务客户端,简化了Java HTTP客户端的编写。OpenFeign在此基础上增加了对Spring MVC注解的支持,如@RequestMapping等,通过动态代理方式生成实现类,实现服务间的负载均衡调用。

什么是 Feign

Feign是声明性Web服务客户端。它使编写Web服务客户端更加容易。要使用Feign,请创建一个接口并对其进行注释。它具有可插入注释支持,包括Feign注释JAX-RS注释。Feign还支持可插拔编码器解码器。Spring Cloud添加了对Spring MVC注释的支持,并支持使用HttpMessageConvertersSpring Web默认使用的注释。Spring Cloud集成了RibbonEureka以及Spring Cloud LoadBalancer,以在使用Feign时提供负载平衡的http客户端


GitHub地址: https://github.com/spring-cloud/spring-cloud-openfeign

Feign 能干什么

Feign 旨在使编写 Java HTTP 客户端变得更加容易。

前面在使用 Ribbon + RestTemplate 时, 利用 RestTemplate 请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,对于服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常会针对每个微服务自行封装一些客户端类来包装这些服务依赖的调用。所以,Feign 在此基础上除了进一步封装,由他来帮助我们定义实现依赖服务接口的定义。在Feign 的实现下,我们只需要创建一个接口,并使用注解的方式来配置它(以前是Dao 接口上main标注 Mapper 注解,现在是一个微服务接口上面标注一个Feign 注解即可),即可完成对一个服务提供方的接口绑定,简化了使用 Spring cloud Ribbon 时, 自动封装服务调用客户端

Feign 集成了 Ribbon

利用 Ribbon 维护了服务方的服务列表信息,并且通过轮询实现了客户端的负载均衡,而 Ribbon 不同的是,通过Feign 只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

Feign 与 OpenFeign 的区别

Feign

feign 是 spring cloud 组件中的一个轻量级 RESTful的HTTP 服务客户端 Reign 内置了 Ribbon, 用来做客户端服务在均衡,去调用服务注册中心的服务,Feign 的使用方式是:使用Feign 注解自定义接口,调用这个接口,就可以低哦啊用服务注册中心的服务。

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

openfeign 是 spring cloudfeign 的基础上支持 spring mvc注解 ,如 @RequestMapping 等等,OpenFeign 的@FeignClient 可以解析Spring MVC 的 @RequestMapping注解下的接口,并通过动态代理的方式生产实现类 ,实现类中做负载均衡并且 低耦合调用其他服务。

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

使用

1、模块名 cloud-consumer-feign-order80
2、pml.xml (web、actuator以及其他的java自行导入)
<!--openfeign  也整合了ribbon-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3、yml 配置文件
server:
  port: 80
spring:
  application:
    name: cloud-order-consumer
eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
4、主启动
@SpringBootApplication
@EnableFeignClients  // 开启使用Fegin
public class OrderFeignMain80 {
    public static void main(String[] args){
        SpringApplication.run(OrderFeignMain80.class,args) ;
    }
}

服务接口

@FeignClient(value = "CLOUD-PAYMENT-SERVICE")   // 微服务名
@Component
public interface PaymentFeignService {
    @GetMapping("/payment/get/{id}")
    CommonResult getPaymentById(@PathVariable("id") Long id) ;

    @GetMapping("/payment/feign/timeout")
    String paymentFeignTimeout();
}

本服务接口

@RestController
public class PaymentFeignController {
    @Autowired
    private PaymentFeignService paymentFeignService ;

    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
        System.out.println("feign-------"+id);
        return paymentFeignService.getPaymentById(id) ;
    }

    @GetMapping("/consumer/payment/feign/timeout")
    public String paymentFeignTimeout(){
        return paymentFeignService.paymentFeignTimeout() ;
    }
}
5、测试

OpenFeign 的超时控制

在配置文件中进行配置

ribbon: 
  ReadTimeout: 5000
  ConnectTimeout: 5000

参数说明

ribbon.ReadTimeout: 指建立连接所用时间,适用于网络状况正常情况下,两端连接所有时间(毫秒)
ribbon.ConnectTimeout: 指建立连接后从服务器读到可用资源所用时间

OpenFeign 日志打印

Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Fegin 中 HTTP 请求的细节。说白了就是对Feign 接口的调用情况进行监控和输出

日志级别
日志级别内容
NONE默认,不显示任何日志 ;
BASIC仅记录请求方法、URL、响应状态码和执行时间
HEADERSBASIC + 请求头和响应头
FULLHEADERS+ 请求和响应的正文及元数据

1、yml配置

logging:
  level:
#    feign 日志以什么级别监控那个接口
    com.aqiang9.springcloud.service.PaymentFeignService: debug

2、配置类

@Configuration
public class FeignConfig {
    /**
     * 配置日志级别
     * @return
     */
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
<think> 我们被要求提供Spring Cloud OpenFeign的官方文档信息。根据引用内容,我们知道OpenFeign是一个声明式的HTTP客户端,用于简化服务间的HTTP调用。在Spring Cloud中,它集成了服务发现(如Eureka)负载均衡(如Ribbon或Spring Cloud LoadBalancer)。 根据引用[2][4],我们得知在Spring Cloud项目中,我们通过`@EnableFeignClients`注解来启用Feign客户端,并通过`@FeignClient`注解来声明一个Feign客户端接口。同时,配置可以通过配置文件(如application.yml)进行。 但是,用户现在需要的是官方文档的地址。在引用[1]中,我们看到了一个GitHub地址官方文档地址的提示,但引用中并没有给出具体的URL。 实际上,Spring Cloud OpenFeign的官方文档是Spring Cloud官方文档的一部分。我们可以根据Spring Cloud的版本,在官方网站上找到对应的文档。 通常,Spring Cloud OpenFeign的官方文档地址为: https://spring.io/projects/spring-cloud-openfeign 或者,针对特定版本的文档,例如Hoxton.SR12版本(对应Spring Cloud 2.2.x),文档地址为: https://docs.spring.io/spring-cloud-openfeign/docs/2.2.12.RELEASE/reference/html/ 由于用户没有指定Spring Cloud的版本,我们可以提供主版本当前常用版本的文档链接。 另外,引用[1]中提到了一个GitHub地址,通常是Spring Cloud OpenFeign的GitHub仓库: https://github.com/spring-cloud/spring-cloud-openfeign 因此,我们可以这样回答: ### Spring Cloud OpenFeign 官方文档 1. **项目主页**(包含最新版本信息概述): - [https://spring.io/projects/spring-cloud-openfeign](https://spring.io/projects/spring-cloud-openfeign) 2. **参考文档**(根据版本选择): - 最新版本:https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/ - 如果您使用的是特定版本(例如Hoxton.SR12对应的2.2.x),请将URL中的版本号替换为实际版本: `https://docs.spring.io/spring-cloud-openfeign/docs/{version}/reference/html/` 3. **GitHub仓库**(源代码问题追踪): - [https://github.com/spring-cloud/spring-cloud-openfeign](https://github.com/spring-cloud/spring-cloud-openfeign) ### 使用提示 - 在Spring Boot项目中,您可以通过`@EnableFeignClients`注解启用Feign客户端[^3]。 - 每个Feign客户端接口需要使用`@FeignClient(name = "service-name")`注解,其中`service-name`是服务提供者在服务注册中心(如Eureka)中注册的名称[^4]。 ### 注意事项 - 请确保您的Spring Cloud版本OpenFeign版本兼容。通常,Spring Cloud版本OpenFeign子项目的版本保持一致(例如Spring Cloud Hoxton.SR12对应spring-cloud-openfeign 2.2.12.RELEASE)[^1]。 --- §§相关问题§§ 1. 如何查看当前项目中使用的Spring Cloud OpenFeign版本? 2. Spring Cloud OpenFeignSpring Cloud Netflix Feign有什么区别? 3. 如何在Spring Cloud Alibaba中使用OpenFeign? </think> 以下是 Spring Cloud OpenFeign 的官方文档资源及相关使用指南: --- ### 一、官方文档地址 1. **主文档**(最新版本) [https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/](https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/) *包含完整配置、注解说明高级特性* 2. **GitHub 仓库** [https://github.com/spring-cloud/spring-cloud-openfeign](https://github.com/spring-cloud/spring-cloud-openfeign) *源码、示例 Issue 追踪* 3. **Spring Cloud 官方文档** [https://spring.io/projects/spring-cloud#overview](https://spring.io/projects/spring-cloud#overview) *在 "Spring Cloud OpenFeign" 部分查看集成指南* --- ### 二、核心使用步骤(基于官方文档) #### 1. 添加依赖 ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>3.1.7</version> <!-- 最新版本 --> </dependency> ``` #### 2. 启用 Feign 客户端 ```java @SpringBootApplication @EnableFeignClients // 关键注解 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 3. 声明服务接口 ```java @FeignClient(name = "user-service") // 服务名一致 public interface UserClient { @GetMapping("/users/{id}") User getUser(@PathVariable("id") Long id); } ``` #### 4. 配置文件示例(application.yml) ```yaml spring: cloud: openfeign: client: config: default: # 全局配置 connectTimeout: 5000 readTimeout: 10000 loggerLevel: basic user-service: # 指定服务配置 connectTimeout: 3000 ``` --- ### 三、关键特性文档目录 | **章节** | **内容** | **官方文档位置** | |----------|----------|------------------| | 服务降级 | `fallback` `fallbackFactory` | Section 2.4.5 | | 自定义编码器 | 文件上传/二进制流处理 | Section 2.2.8 | | 请求拦截器 | 添加认证头等操作 | Section 2.2.9 | | 日志配置 | 四级日志级别控制 | Section 2.3.1 | | Ribbon 集成 | 负载均衡配置 | Section 2.1.4 | | 错误处理 | `ErrorDecoder` 自定义 | Section 2.2.11 | --- ### 四、注意事项(官方建议) 1. **服务发现集成** 默认支持 Eureka/Nacos,需确保 `@FeignClient` 的 `name` 注册中心的服务 ID 一致[^4] 2. **包扫描规则** 若 Feign 接口不在主启动类包路径下,需指定扫描路径: ```java @EnableFeignClients(basePackages = "com.example.clients") ``` 3. **版本兼容性** Spring Cloud 2020.0.x+ 已移除 Ribbon,需显式添加负载均衡器: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> ``` ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值