Netflix Feign 简介

前面章节介绍了 Eureke、Ribbon、Hystrix,本章节将介绍 Feign 工具的用法。使用 Feign 工具可以简化 HTTP API 接口的调用。

什么是 Feign?

Feign 是 Netflix 开发的声明式、模板化的 HTTP 客户端,Feign 可以帮助我们更快捷、优雅地调用 HTTP API。

在 Spring Cloud 中,使用 Feign 非常简单。步骤如下:

(1)创建一个接口;

(2)在接口上添加 @FeignClient 注解;

(3)在 Controller 类中注入上面接口,然后调用目标服务即可;

注意:Feign 支持多种注解,如:Feign 自带的注解或者 JAX-RS 注解等。

Spring Cloud 对 Feign 进行了增强,使 Feign 支持了 Spring MVC 注解,并整合了 Ribbon 和 Eureka,从而让 Feign 的使用更加方便、同时也支持负载均衡功能。

Spring Cloud Feign 是基于 Netflix feign 实现,整合了 Spring Cloud Ribbon 和 Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的 Web 服务客户端定义的方式。

Spring Cloud Feign 具备可插拔的注解支持,支持 Feign 注解、JAX-RS 注解和 Spring MVC 的注解。

实例下面创建了一个名为 DemoFeignClient  的 Feign 客户端,它只提供了一个 info() 接口。代码如下:

// 什么当前类是一个 Feign 客户端,指定服务名为
@FeignClient("USER")
public interface DemoFeignClient {

    // 相当于为我们拼接了调用的完整URL地址
    // String url = "http://USER/info";
    @GetMapping("/info")
    String info();

}

如何引入Feign?

要将 Feign 引入到您的项目中,只需在项目中添加如下依赖即可。

maven 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

gradle 依赖

implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign', version: '2.1.0.RELEASE'

注意:上面依赖的 feign 版本根据自己的需要自行调整。

开启 Feign 客户端

你可以在 Spring Boot 的 Application 类上面添加 @EnableFeignClients 注解实现开启 Feign 客户端,代码如下:

@SpringBootApplication
@EnableFeignClients
public class AppApplication {

    public static void main(String[] args) {
        SpringApplication.run(AppApplication.class, args);
    }

}

创建 Feign 客户端

利用 Feign 的 @FeignClient 注解创建 Feign 客户端,代码如下:

@FeignClient("stores")
public interface StoreClient {

    @RequestMapping(method = RequestMethod.GET, value = "/stores")
    List<Store> getStores();

    @RequestMapping(method = RequestMethod.GET, value = "/stores")
    Page<Store> getStores(Pageable pageable);

    @RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
    Store update(@PathVariable("storeId") Long storeId, Store store);

}

在 @FeignClient 注解上,字符串值(“ stores”)是一个任意的客户端名称(服务名,可以从注册中心获取),用于创建功能区负载均衡器或 Spring Cloud LoadBalancer。您还可以使用 url 属性(绝对值或仅是主机名)来指定 URL 地址。在应用程序上下文中,bean 的名称是接口的标准名称。要指定自己的别名值,可以使用 @FeignClient 注解的 qualifier 值。

上面的负载均衡器客户端将希望发现“stores”服务的物理地址。如果您的应用程序是 Eureka 客户端,则它将在 Eureka 服务注册表中解析该服务。如果您不想使用 Eureka,只需使用SimpleDiscoveryClient 在外部配置中配置服务器列表即可。

注意

为了保持向后兼容性,被用作默认的负载均衡器实现。但是,Spring Cloud Netflix Ribbon 现在处于维护模式,因此我们建议改为使用 Spring Cloud LoadBalancer。为此,请将spring.cloud.loadbalancer.ribbon.enabled 的值设置为 false。

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号