Spring Cloud — Feign

文章介绍了OpenFeign在SpringCloud中的使用,包括其基本概念、如何通过注解简化HTTP客户端调用、与Ribbon和Hystrix的整合实现负载均衡和熔断机制,以及Feign的优化配置如连接池、请求压缩和超时设置。此外,文章还阐述了Feign的工作原理,解释了为何只需编写接口就能实现远程服务调用。
摘要由CSDN通过智能技术生成

夜里被帅到失眠,早上又被帅醒,当我睁开眼的一瞬间,又是被帅醒的一天,
接下来给大家介绍一下巨帅的Spring Cloud — Feign:

介绍OpenFeign

OpenFeign的基本使用

Feign整合Ribbon

Feign整合Hystrix

Feign优化配置

Feign工作原理

介绍OpenFeign

  1. Feign是在RestTemplate基础上封装的,使用注解的方式来声明一组与服务提供者Rest接口所对应的本地Java API接口方法。
  2. Feign将远程Rest接口抽象成一个声明式的FeignClient(Java API)客户端,并且负责完成FeignClient客户端和服务提供方的Rest接口绑定。
  3. Feign 使用了动态代理,使用@FeignClient调用接口的本质就是调用Feign创建的动态代理,然后根据接口上的@RequestMapping等注解,来动态构造出要请求的服务的地址并对这个地址发起请求、解析响应。
  4. Feign具备可插拔的注解支持,包括Feign注解和JAX-RS注解。同时,对于Feign自身的一些主要组件,比如编码器和解码器等,也以可插拔的方式提供,在有需求时方便扩张和替换它们。
  5. 在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问 HTTP 请求。接下来介绍一下 Feign 的特性,具体如下:
    可插拔的注解支持,包括 Feign 注解和AX-RS注解。
    支持可插拔的 HTTP 编码器和解码器。
    支持 Hystrix 和它的 Fallback。
    支持 Ribbon 的负载均衡。
    支持 HTTP 请求和响应的压缩。
  6. 它整合了 Ribbon 和 Hystrix,从而不需要开发者针对 Feign 对其进行整合。Feign 还提供了 HTTP 请求的模板,通过编写简单的接口和注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。Feign 会完全代理 HTTP 的请求,在使用过程中我们只需要依赖注入 Bean,然后调用对应的方法传递参数即可。
  7. 总结1.之前微服务之间调用使用的RestTemplate,调用比较复杂,URL需要拼接,使用不太方便 2.Feign是SpringCloud提供的声明式的HTTP客户端,只用编写接口,就能够通过http请求实现服务的调用                                                                                                               3.OpenFeign是Feign的扩展,能够支持SpringMVC的注解                                                     4.OpenFeign = RestTemplate + Ribbon + Hystrix

OpenFeign的基本使用

1)使用Feign的第1步是在项目的pom.xml文件中添加Feign依赖:


<!--添加Feign依赖--> 
<dependency> 
	<groupId>org.springframework.cloud</groupId> 
	<artifactId>spring-cloud-starter-openfeign</artifactId> 
</dependency> 

2) 编写Feign客户端接口

/**
 * 调用商品服务的Feign客户端
 * @FeignClient需要设置调用的服务名
 */
@FeignClient("product-service")
public interface ProductServiceFeignClient{
​
    /**
     * 调用商品id查询
     * @param id
     * @return
     */
    @GetMapping("/product/{id}")
    ResponseEntity<Product> getProductById(@PathVariable Long id);
}

3) 启动类加注解扫描feign接口 @EnableFeignClients(basePackages = "com.blb.orderservice.feign")

4) 调用服务时

@Autowired
private ProductServiceFeignClient productServiceFeignClient;
​
​
//使用feign客户端调用服务
ResponseEntity<Product> entity = productServiceFeignClient.getProductById(order.getProductId());

练习:在订单服务中调用商品服务的所有接口(增删改查+分页)

package com.blb.common.feign;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.blb.common.entity.Product;
import com.blb.common.entity.ResponseResult;
import com.blb.common.fallback.ProductServiceFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

/**
 * 调用商品服务的客户端
 */
@FeignClient(value = "product-service",fallback = ProductServiceFallback.class)
public interface ProductServiceClient {

    @GetMapping("product/{id}")
    Product getProductById(@PathVariable Long id);

    @GetMapping("product-page")
    ResponseResult<Page<Product>> getProductPage(@RequestParam(required = false, defaultValue = "1") Long current,
                                                 @RequestParam(required = false, defaultValue = "10") Long size);

    @PostMapping("product")
    ResponseResult<String> addProduct(@RequestBody Product product);

    @PutMapping("product")
    ResponseResult<String> updateProduct(@RequestBody Product product);

    @DeleteMapping("product/{id}")
    ResponseResult<String> removeProduct(@PathVariable Long id);
}

Feign整合Ribbon

Feign默认整合了Ribbon实现负载均衡

  • 全局配置

    ribbon.属性 = 值

  • 指定服务配置

    服务名称.ribbon.属性 = 值

Ribbon常用配置:

  • ConnectionTimeout 连接超时

  • ReadTimeout 读取超时

  • OkToRetryOnAllOperations 对所有操作启动重试机制 true/false

  • MaxAutoRetries 最大重试次数

  • MaxAutoRetriesNextServer 最大重试下个服务器次数

Feign整合Hystrix

Feign默认整合了Hystrix的熔断机制

Feign可以单独定义类,编写降级方法

实现:

1)定义降级处理类,实现对应的FeignClient接口

2)实现接口中的方法,所有方法均为降级方法

/**
 * 降级处理类
 */
@Component
public class ProductServiceFallback implements ProductServiceFeignClient {
​
    /**
     * 降级方法返回兜底数据
     */
    @Override
    public ResponseEntity<Product> getProductById(Long id) {
        Product product = new Product(id,"降级数据", BigDecimal.valueOf(0),"测试");
        return ResponseEntity.ok(product);
    }
​
}

3)在FeignClient注解中配置降级方法处理类

@FeignClient(value = "product-service",fallback = ProductServiceFallback.class)

4)启动Feign的Hystrix特性

feign.hystrix.enabled=true

PS: 如果feign接口和降级类和服务提供者项目不是同一个项目,需要加包的扫描

@SpringBootApplication(scanBasePackages = {"com.blb.orderservice","com.blb.common"})

Feign优化配置

1. 优化连接池

Feign是基于HTTP协议,HTTP协议基于TCP协议,TCP具有三次握手四次挥手机制,频繁的创建连接比较消耗系统的资源和时间,降低系统的吞吐量。

使用连接池可以减少网络连接的创建,提高连接的使用效率,提高系统吞吐量。

Feign默认使用JDK自带的HttpURLConnection,没有连接池。

可以使用HttpClient或OkHttp

使用步骤:

1)导入feign-httpclient依赖

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

2)feign.httpclient.enable=true

2. 请求压缩优化

Feign可以对网络数据进行GZIP压缩,减少网络流量,提高速度

启动压缩:

#启动请求压缩 
feign.compression.request.enabled=true 
#启动响应压缩 
feign.compression.response.enabled=true 
#设置请求压缩的多媒体类型 
feign.compression.request.mime-types=text/html,application/xml,application/json 
#设置请求压缩的下限 (默认2048)
feign.compression.request.min-request-size=1024 

3. 使用日志对连接过程进行监控

1)开启debug日志

logging.level.包名.FeignClient接口名=DEBUG

2)定义配置类,配置日志

/** Feign日志配置  */ 
@Configuration 
public class FeignLoggerConfig {      
    /**  返回日志类型,NONE没有日志,BASIC基本信息(请求方法,URL,响应代码等),HEADERS(头部信息),FULL(基本+头部)*/     
    @Bean     
    public Logger.Level level(){         
        return Logger.Level.BASIC;     
    } 
} 

4. 超时优化

Ribbon是具有重试机制的,就是连接失败后进行重连,问题是:Hystrix的超时时间默认是小于Ribbon的超时,Hystrix会提前熔断,Ribbon无法进行重试

Hystrix的超时要大于Ribbon的超时

# hystrix的超时 
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000 
# ribbon的超时 
ribbon.ConnectionTimeout=1000 
ribbon.ReadTimeout=3000

Feign工作原理

为什么Feign只需要编写接口就能完成远程服务的调用

关键技术:

  1. IOC

  2. 动态代理

  3. HTTP网络连接

实现步骤:

1) 添加@EnableFeignClients后,对Feign接口进行扫描,加载FeignClient接口信息到IOC容器中

2) 使用JDK动态代理创建FeignClient接口的实现类

3) 在JDK动态代理的InvocationHandler中的invoke方法实现方法的调用,创建RequestTemplate对象

4) 将RequestTemplate对象交给负载均衡器处理,对请求进行编码,发送HTTP请求

5) 获得响应,对响应进行解码,返回数据

FeignInvocationHandler



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值