8.1、分析
之前我们通过RestTemplate调用Rest服务,代码是这样的:虽然使用了Ribbon和Hystrix可以实现负载均衡和容错处理,但是这个编码在实现大量业务时会显得太过于冗余(如,多参数得URL拼接)。
8.2、Feign简介
官网:https://github.com/OpenFeign/feign
Feign是一个Netflix开发得声明式、模块化得HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可以帮助我们更加便捷、优雅地调用HTTP API。
在Spring Cloud中,使用Feign非常简单————创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
8.3、快速入门
在订单微服务中增加Feign的支持。
8.3.1、导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
8.3.2、创建一个ItemFeignClient接口
package cn.zuoqy.springclouddemoorder.feign;
import cn.zuoqy.springclouddemoorder.model.Item;
import [org.springframework.cloud.netflix.feign](http://org.springframework.cloud.netflix.feign/).FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* Created by zuoqy on 17:24 2018/10/26.
*/
@FeignClient(value = "springcloud-demo-item")//声明这是一个Feign客户端,并且指明服务器id
public interface ItemFeignClient {
// 这里定义了类似于SpringMvc用法的方法,就可以进行Restful的调用了
@RequestMapping(value = "/item/query/{id}", method=RequestMethod.GET)
public Item queryItemById(@PathVariable("id") Long id);
}
8.3.3、改造ItemService
ItemService.png8.3.4、在启动类中添加@EnableFeignClients注解
启动类.png8.3.5、重启测试
重启测试.png测试结果,一切正常。
8.4、流程分析
1、由于我们在入口@EnableFeignClients注解,Spring启动后会扫描标注了@FeignClient注解的接口,然后生成代理类。
2、我们在@FeignClient接口中指定了value,其实就是指定了在Eureka中的服务名称
3、在FeignClient中定义方法以及使用了Spring Mvc的注解,Feign就会根据注解中的内容生成对应的url,然后基于Ribbon的负载均衡去调用REST服务
- a)、为什么使用的是SpringMVC的注解?
i.其实,Feign是有自己的注解的,是因为SpringCloud对Feign做了增强,兼容了SpringMVC的注解,使我们的学习成本更低
i png
ii.专业的解释是这样的:
org.springframework.cloud.netflix.feign.FeignClientsConfiguration
ii.png
设置默认的契约是SpringMVC契约
网友评论