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中作出任何操作需要创建各种类来对应不同参数