前面章节介绍了 Eureke、Ribbon、Hystrix,本章节将介绍 Feign 工具的用法。使用 Feign 工具可以简化 HTTP API 接口的调用。
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 引入到您的项目中,只需在项目中添加如下依赖即可。
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 版本根据自己的需要自行调整。
你可以在 Spring Boot 的 Application 类上面添加 @EnableFeignClients 注解实现开启 Feign 客户端,代码如下:
@SpringBootApplication @EnableFeignClients public class AppApplication { public static void main(String[] args) { SpringApplication.run(AppApplication.class, args); } }
利用 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。