Spring-Cloud之Feign和RestTemplate浅解

1 概述:

  • RestTemplate:
    • RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了实现。
  • Feign:
    •  一种负载均衡的HTTP客户端, 使用Feign调用API就像调用本地方法一样,从避免了 调用目标微服务时,需要不断的解析/封装json 数据的繁琐。
    • Feign是一个声明似的web服务客户端,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign。

2 RestTemplate的使用

spring-web里引入了RestTemplate

        

  • 统一方法的调用exchange
    • HttpEntity<responseType > entity=restTemplate.exchange(String url,HttpMethod method,HttpEntity requestEntity ,class responseType ,Object urlVariables[ ])
  • url:请求地址
  • method:请求方法的类型(如POST,PUT,GET,DELETE)
  • 各自请求对应的专一接口的调用:
    • POST:    
    • HttpEntity<responseType > entity=restTemplate.postforObject(String url,HttpMethod method,HttpEntity requestEntity ,class responseType )
    • PUT
    •  restTemplate.put(String url,HttpMethod method,HttpEntity requestEntity)
    • GET:
    • HttpEntity<responseType > entity=restTemplate.getForObject(String url,HttpMethod method,HttpEntity requestEntity ,class responseType )
    • DELETE:
    •  restTemplate.delete(String url,HttpMethod method )
  • requestEntity:请求实体、请求头、请求内容
  • responseType:响应实体类型(根据接口的返回类型决定)
  • urlVariables(url中的参数) 

3 Feign的使用

Spring Cloud Feign是什么

  •  Spring Cloud NetFix的微服务都是以HTTP接口的形式暴露的(现在一般都是json),所以可以使用Apache的HttpClient或Spring的RestTemplate去调用
  •  而Feign是一个使用起来更加方便的客户端,它用起来就好像调用本地方法一样,完全感觉不到时调用远程方法
  •  Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解(Dao/Sevice 层),就可以定义好HTTP请求的参数、格式、地址等信息
  •  Feign会完全代理HTTP请求,我们只需要像调用方法(1.注入 2.使用 像Controller层调用Service层)一样调用它就可以完成服务请求及相关处理
  • -Feign整合了Ribbon和Hystrix,可以让我们不再需要显式的使用这两个组件

Feign的工作原理

  • 在开发微服务应用时,我们会在主程序入口添加 @EnableFeignClients注解开启对 Feign Client 扫描加载处理。根据 Feign Client 的开发规范,定义接口并加 @FeignClient 注解
  • 当程序启动时,会进行包扫描,扫描所有 @FeignClient 的注解的类,并将这些信息注入 Spring IOC 容器中。当定义的 Feign 接口中的方法被调用时,通过 JDK代理 的方式,来生成具体的 RequestTemplate。当生成代理时,Feign 会为每个接口方法创建一个 RequestTemplate对象,该对象封装了HTTP请求需要的全部信息。
  • 然后有 RequestTemplate 生成 Request,然后把 Request 交给 Client 去处理,这里指的 Client 可以是 JDK 原生的 URLConnection、Apache 的 Http Client 也可以是 OKhttp。 最后 Client 被封装到 LoadBalanceclient 类,这各类结合 Ribbon 负载均衡发起服务之间的调用

@FeignClient的一些重要注解

  • name:指定 Feign Client的名称,如果项目使用了 Eureka,name 属性会作为微服务的名称,用于服务发现
  • url:url 一般用于调试,可以手动指定 @FeignClient 调用地址
  • decode404:当发生404错误时,如果该字段为 true,会调用 decoder 进行解码,否则抛出 Feign。
  • configuration:Feign配置类,可定义 Feign 的 Encoder、Decoder、LogLevel、Contract。
  • fallback:定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback 指定的类必须实现 @FeignClient 标记的接口
  • fallbackFactory:工厂类,用于生成 fallback 类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码。
  • path:定义当前 FeignClient 的统一前缀。

用注解+配置的方式实现Feign调用

  • @Component:spring注入bean
  • @FeignClient
    • name:bean名称
    • url:配置好的指定地址前缀
    • configuration:配置类,用于填充请求信息

  •  实现方式
    • @PostMapping 注解与正常调用接口一致的编码方式

4 Feign与RestTemplate的区别

在SpringCloud中,默认是使用http来进行微服务的通信,最常用的实现形式有两种:

  • RestTemplate
  • Feign

Feign跟RestTemplate的区别

  RestTemplate:

  • 添加相关注解参数即可,使用简单方便
  • 熔断节点易控制,方便后续基于业务作出相应调整
  • 异常捕获简单,同页面下添加对应方法即可
  • 请求更贴近httpclient,使用更有熟悉感
  • 灵活性高但是消息封装臃肿。 

   Feign:  

  • 编写方式优雅,基于面向接口的风格,但是开发起来较为繁琐
  • yml需要添加配置启动hystrix组件
  • 需要创建对应类来执行fallback方法
  • 捕获异常信息和不捕获异常实现的接口不同
  • 需要在feign注解上作出相应参数配置
  • feign中作出任何操作需要创建各种类来对应不同参数
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值