OpenFeign介绍

一、OpenFeign概述

Feign是Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。

OpenFeign是Feign的扩展,能够支持SpringMVC的注解,OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类。

OpenFeign = RestTemplate + Ribbon + Hystrix

二、OpenFeign的使用

1)OpenFeign的依赖

<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());

 三、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只需要编写接口就能完成远程服务的调用

关键技术:

IOC

动态代理

HTTP网络连接

实现步骤:

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

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

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

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

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值