SpringCloud学习--基础--5.1--Feign--介绍

Feign是SpringCloud中的声明式HTTP客户端,通过接口注解简化远程服务调用。它集成Ribbon实现负载均衡,Hystrix提供容错能力。适用于低性能要求场景,而对性能有高要求时可选择Dubbo。
摘要由CSDN通过智能技术生成

SpringCloud学习–基础–5.1–Feign–介绍


1、介绍

在这里插入图片描述

Feign是Netflix开发的声明式、模板化的HTTP客户端,可以 更便捷的调用HTTP API。
使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是 远程方法,更感知不到这是个 HTTP 请求

Feign是一个HTTP请求的轻量级客户端框架。通过 接口 + 注解的方式发起HTTP请求调用,面向接口编程。服务消费方拿到服务提供方的接口,然后像调用本地接口方法一样去调用,开发者完全感知不到这是 远程方法。更感知不到这是个 HTTP 请求。

1.1、使用方法

定义一个接口,然后在上面添加注解

package fei.zhou.consumer01.business.hello;


import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

//name:服务名称
//path:配置producer01服务的context-path
@FeignClient(name = "producer01", path = "/producer01")
public interface HelloService {


    @RequestMapping(value = "sayHello1")
    String sayHello1();


    @RequestMapping(value = "sayHello2")
    String sayHello2(@RequestParam(value = "name")String name);


}

1.2、特性

  • 采用的是基于接口可插拔的注解支持,包括Feign注解和JAX-RS注解;
  • 支持可插拔的HTTP编码器和解码器;
  • 集成了Hystrix和它的Fallback,具有熔断降级的能力;
  • 集成了Ribbon的负载均衡,具有负载均衡的能力;
  • 支持HTTP请求和响应的压缩。

2、Feign能干什么

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

// 这里是 producer01 的ip地址
private static final String server_producer01 = "http://localhost:8888/producer01/";

@RequestMapping(value = "producer01_sayHello1")
public String producer01_sayHello1(){
    RestTemplate restTemplate = new RestTemplate();

    String url = server_producer01 + "/sayHello1";
    // 是不是太麻烦了,每次都要 url、返回类型的
    return restTemplate.getForObject(url, String.class);
}

每次都调用 RestRemplate 的 API 是否太麻烦,我能不能像 调用代码一样进行各个服务间的调用呢?

我们可以使用Feign帮助我们定义和实现依赖服务接口的定义,在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它,即可完成对服务提供方的接口绑定。

3、Feign集成了Ribbon

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

4、Feign与Ribbon区别

Ribbon和Feign都是用于调用其他服务的,不过方式不同。

4.1、启动类使用的注解不同

Ribbon:用的是@RibbonClient
Feign:用的是@EnableFeignClients。

4.2、服务的指定位置不同

Ribbon:在@RibbonClient注解上声明
Feign:在定义抽象方法的接口中使用@FeignClient声明。

4.3、调用方式不同

  • Ribbon:需要自己构建http请求,模拟http请求,然后使用RestTemplate发送给其他服务,步骤相当繁琐。
  • Feign:
    • 在Ribbon的基础上进行了一次改进,采用接口的方式,将调用远程服务的方法定义成抽象方法即可,不需要自己构建http请求。
    • 注意:抽象方法的注解、方法签名要和提供服务的方法完全一致。

5、Feign和Open Feign的区别

在这里插入图片描述

5.1、Feign

Feign本身不支持Spring MVC的注解,它有一套自己的注解

5.2、OpenFeign(Spring Cloud OpenFeign)

  1. 对Feign进行了 增强,使其支持Spring MVC注解,如@RequesMapping等等
  2. 整合了Ribbon和Eureka,从而使得Feign的使用更加方便。
  3. @FeignClient可以解析SpringMVC的@RequestMapping注解下的接口, 并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

6、Feign和Dubbo的区别

  1. 相同点
    1. 都专注于远程调用这个动作。比如注册中心解耦、负载均衡、失败重试熔断、链路监控等。
  2. 不同点
    1. Dubbo除了注册中心需要进行整合,其它功能都自己实现了,Dubbo小而专一,专注于远程调用
    2. Feign大部分功能都是依赖全家桶的组件来实现的。从Spring全家桶而言,远程调用只是一个重要的功能而已。

6.1、协议支持方面

6.1.1、Feign:整体优雅简单

  • 通过REST API实现的远程调用,基于Http传输协议,服务提供者需要对外暴露Http接口供消费者调用,服务粒度是http接口级的。
  • 通过短连接的方式进行通信
  • 不适合高并发的访问
  • Feign追求的是简洁,少侵入(因为就服务端而言,在SpringCloud环境下,不需要做任何额外的操作,而Dubbo的服务端需要配置开放的Dubbo接口)。

6.1.2、Dubbo:灵活

  • 通过RPC调用实现的远程调用
  • 支持多传输协议(Dubbo、Rmi、http、redis等等),可以根据业务场景选择最佳的方式,非常灵活。
    • 默认Dubbo协议:
      • 利用Netty、TCP传输、单一、异步、长连接 来实现
      • 适用 数据量小、高并发、服务提供者远远少于消费者 的场景。
    • 从协议层选择看,Dubbo是配置化的,更加灵活。
  • Dubbo通过TCP长连接的方式进行通信,服务粒度是方法级的。

6.2、通信性能方面

6.2.1、Feign

从通信的性能上来分析,SpringCloud的通信采用Openfeign(feign)组件。
Feign基于Http传输协议,底层实现是rest。从OSI 7层模型上来看rest属于应用层。
在高并发场景下性能不够理想,成为性能瓶颈(虽然他是基于Ribbon以及带有熔断机制可以防止雪崩)。

6.2.2、Dubbo

Dubbo框架的通信协议采用RPC协议,属于传输层协议,性能上自然比rest高。提升了交互的性能,保持了长连接,高性能。
Dubbo性能更好,比如支持异步调用、Netty性能更好。
Dubbo主要是配置而无需改造。
使用SpringCloud整合Dubbo,正所谓是强强联合。

在这里插入图片描述

6.3、负载均衡方面

6.3.1、Feign

  • 默认使用Ribbon作为负载均衡的组件
  • Ribbon的负载均衡策略:随机、规则轮询、空闲策略、响应时间策略。
  • Ribbon的算法是Client级别的。需要进行全局配置,个性化配置比较麻烦。

6.3.2、Dubbo:更灵活

  • Dubbo的负载均衡策略:Dubbo支持4种算法,随机、权重轮询、最少活跃调用数、一致性Hash策略。而且算法里面引入权重的概念。
  • Dubbo可以使用路由策略,然后再进行负载均衡。
  • Dubbo配置的形式不仅支持代码配置,还支持Dubbo控制台灵活动态配置。
  • Dubbo负载均衡的算法可以精准到某个服务接口的某个方法,个性化配置比较方便。

6.4、容错机制方面

6.4.1、Feign

默认使用Hystix作为服务熔断的组件,利用熔断机制来实现容错的,与Dubbo处理的方式不一样。
Hystix提供了服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能

6.4.2、Dubbo

支持多种容错策略,FailOver、FailFast、Failsafe、FailBack、Aviailable、Broadcast、Forking策略等,以及Mock。
引入了retry次数,timeout等配置参数,Dubbo自带了失败重试的功能。

6.5、其他方面(以下方便并未进行详细整理仅做参考)

Dubbo附带了白名单功能、结果缓存、同步和异步调用的功能。

6.5.1、Dubbo支持更多更灵活的并发控制:

客户端配置actives参数,配置单个Cunsumer最大并发请求数,超出则线程阻塞等待,超时报错。
Provider 可以配置 executes参数 来限制最大的并发线程数,超出报错。
Provider 可以配置 accepts参数 来限制最大长连接数来限制最大的连接数。
Provider 可以配置 任务线程池的类型和最大线程数 来控制并发量,超负载直接丢弃。

6.5.2、路由、流量调度、ABtest方面:

  1. Feign
    1. Ribbon需自己实现,应用不灵活。
    2. Ribbon主要通过扩展AbstractLoadBalancerRule负载均衡的方法来实现,在负载均衡的部分还要进行改造升级。
  2. Dubbo更加灵活方便。
    1. Dubbo通过界面化、校本化配置路由规则,可以实现灰度发布、动态流量调度、容量计算等,方案成熟。
    2. Dubbo 还支持多版本调用。
    3. Dubbo支持更完善的监控和管理界面,SC也有Actuator等工具进行监控,但是并不是针对远程调用这一块的
    4. Dubbo支持客户端设置调用结果缓存,支持配置3种策略的结果缓存(LRU、LFU、FIO),但是要自己实现超时管理。

6.6、总结

Dubbo支持更多功能、更灵活、支持高并发的RPC框架。

SpringCloud全家桶里面(Feign、Ribbon、Hystrix),特点是非常方便。Ribbon、Hystrix、Feign在服务治理中,配合Spring Cloud做微服务,使用上有很多优势,社区也比较活跃,看将来更新发展。

业务发展影响着架构的选型,当服务数量不是很大时,使用普通的分布式RPC架构即可,当服务数量增长到一定数据,需要进行服务治理时,就需要考虑使用流式计算架构。Dubbo可以方便的做更精细化的流量调度,服务结构治理的方案成熟,适合生产上使用。

如果项目对性能要求不是很严格,可以选择使用Feign,它使用起来更方便。

如果需要提高性能,避开基于Http方式的性能瓶颈,可以使用Dubbo。

Dubbo Spring Cloud的出现,使得Dubbo既能够完全整合到Spring Cloud的技术栈中,享受Spring Cloud生态中的技术支持和标准化输出,又能够弥补Spring Cloud中服务治理这方面的短板。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值