Spring Cloud HTTP客户端 - Feign

一、Feign简介(HTTP调用)

1、Feign是一个非常好用的HTTP客户端

2、Feign很大程度上简化了HTTP调用方式

3、Feign很好地弥补了Spring Cloud的HTTP调用缺陷

二、Feign作用

1、Feign包含了多种HTTP的调用形式(例如:Spring MVC)

1)支持:@RequestMapping、@ResquestParam、@PathVariable、@RequestHeader、@RequestBody

2)不支持:@GetMapping、@POSTMapping

注意:@RequestParam无论如何都要加上;接口上使用标准标签,调用的时候按参数使用即可

2、Feign可以整合Ribbon和Hystrix

3、Feign提供了多种HTTP底层支持

三、Feign特性

1、Feign实现了可插拔注解支持,包括Feign和JAX-RS注解

2、Feign支持可插拔的HTTP编码器和解码器

3、Feign支持HTTP请求和响应的压缩

四、Feign使用步骤

1、集成Feign环境(引入openfeign依赖包、开启EnableFeignClients支持)

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

#properties:
spring:
  application:
    name: helloService

#全局配置
ribbon.ConnectTimeout=500
ribbon.ReadTimeout=5000

#指定服务配置
helloService.ribbon.ConnectTimeout=500
helloService.ribbon.ReadTimeout=2000

//启动类:
@EnableFeignClients

2、创建业务接口

1)添加FeignClient注解

name;url(注解访问目标地址:协议、host、port)

2)添加业务方法

添加URI和method支持;编写入参和返回值

五、Feign基础参数

1、name和value:给FeignClient指定名称

2、url:手动指定HTTP调用地址

3、path:接口统一前缀

六、Feign进阶参数

1、primary:多实现时指优先级

1)默认值是true

2)FeignClient注解会自动生成FeignClient接口实现类(动态代理)

Feign只有接口,为什么可以使用?自动生成FeignClient接口实现类

3)如果要自定义实现FeignClient注解的接口,要将primary置为false,在自己定义的实现类添加@Primary注解

4)primary为true,其实就是给自己的子类生成一个@Primary的注解

2、configuration:

自定义Feign配置类,在FeignClient注解使用configuration参数调用自定义的Feign配置类

//自定义Feign配置类
@Configuration
public class Configuration {
  @Bean
  public Contract feignContract() {
    return new Contract.Default();
  }
}

//在FeignClient注解使用configuration参数调用自定义的Feign配置类
@FeignClient(value = "helloService", configuration = Configuration.class)

1)针对单个接口提供不同的配置

2)Feign可自定义的内容:编解码器、日志服务、Contract...

Feign是如何支持SpringMVC的?SpringMVCContract和相匹配的编解码器

3)Feign还支持多种Contract:Default、SpringMVC、自定义

3、Fallback和Fallbackfactory:降级统一处理

1)Fallback

实现接口并且完成降级业务逻辑;添加fallback参数,并且指定fallback的实现子类

2)Fallbackfactory(优缺点:参见工厂模式)

创建工厂类并实现fallbackfactory接口;在create方法中完成fallback子类实现;添加fallbackfactory参数,并指定相应的工厂类

七、多组件集成

1、Feign可以集成Ribbon实现负载均衡

1)默认集成

2)使用name参数直接对应服务名而不使用url

URL是固定的?集成Ribbon可以直接对应服务名

3)FeignClient调用多个服务(即单个服务提供多个端口部署在不同的服务器上)时,也会实现负载均衡(负载均衡算法需要在服务消费者里定义)

2、Feign可以集成Hystrix实现命令封装和业务降级

1)Feign.hystrix.enabled=true

八、Feign之HTTP性能优化

优化方案:替换HTTP客户端,增加HTTP连接池

1、Feign默认使用JDK自带的HTTP连接方式

2、Feign最大的优化点是更换HTTP底层实现

3、目前Apache HTTPClient是非常好的选择

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

#properties:
feign:
  httpclient:
    enabled: false
  okhttp:
    enabled: true

九、Feign之HTTP解压缩

1、Feign常见优化项就是数据压缩

2、Feign可以支持Gzip的请求解压缩

注意:解压缩是把双刃剑,一定要谨慎使用,因为客户端进行压缩,服务端一定会进行解压,所以需要找这两者间的平衡点

#properties:
feign.compression.request.enabled=true
#压缩格式
feign.compression.request.mime-types=text/xml,application/xml,application/json
#最小请求限制
feign.compression.request.min-request-size=2048
feign.compression.response.enabled=true

十、实战技巧:Feign继承特性

FeignClient注解可以使用在继承了其他接口的接口上而不需要同时使用在两个有继承关系的接口上

例如:

@FeignClient(value = "HELLO-SERVICE")

public interface RefactorHelloService extends HelloService {}

1、微服务的目标是大量复用,Feign会导致重复工作量,Feign提供了继承特性帮助我们解决这个问题

2、接口复用最多只能有一层,切忌多继承

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z.haoui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值