Spring Cloud—八、使用Feign实现声明式的Rest调用

8.1、分析

之前我们通过RestTemplate调用Rest服务,代码是这样的:
Spring Cloud—八、使用Feign实现声明式的Rest调用_第1张图片

虽然使用了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、导入依赖

    org.springframework.cloud
    spring-cloud-starter-feign

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
Spring Cloud—八、使用Feign实现声明式的Rest调用_第2张图片
ItemService.png
8.3.4、在启动类中添加@EnableFeignClients注解
Spring Cloud—八、使用Feign实现声明式的Rest调用_第3张图片
启动类.png
8.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的注解,使我们的学习成本更低
    Spring Cloud—八、使用Feign实现声明式的Rest调用_第4张图片
    i png

    ii.专业的解释是这样的:
    org.springframework.cloud.netflix.feign.FeignClientsConfiguration
    ii.png

    设置默认的契约是SpringMVC契约

8.5、Feign的多参数构造

Spring Cloud—八、使用Feign实现声明式的Rest调用_第5张图片
多参数构造.png

Spring Cloud—一、微服务架构
Spring Cloud—二、Spring Cloud简介
Spring Cloud—三、使用Spring Cloud实现微服务
Spring Cloud—四、Spring Cloud快速入门
Spring Cloud—五、注册中心Eureka
Spring Cloud—六、使用Ribbon实现负载均衡
Spring Cloud—七、容错保护:Hystrix
Spring Cloud—八、使用Feign实现声明式的Rest调用
Spring Cloud—九、服务网关Spring Cloud Zuul
Spring Cloud—十、使用Spring Cloud Config统一管理微服务
Spring Cloud—十一、使用Spring Cloud Bus(消息总线)实现自动更新

demo源码

你可能感兴趣的:(Spring Cloud—八、使用Feign实现声明式的Rest调用)