1、Feign介绍
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
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帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
上面的可能太官方了,我们来看看白话文:
现在我们有两个服务,A和B,我们A需要去调用B的功能请求,但是我们如果手动实现,可以使用例如HttpClient等工具也可以实现,但缺点也很致命,例如当服务地址发生改变、请求数据很多、返回数据过于复杂等,而且我们手动网络请求代码会很繁杂,很大的增加了开发的难度,所以我们可以使用Feign这个HTTP客户端框架,它可以自动的到注册中心中拉取我们需要调用的服务的地址,然后我们通过定义接口的形式将被调用端的controller方法定义给复制过来,然后feign就会自动的解析,并在请求的时候封装参数和返回解析数据等。
使用Feign举个例子:
服务A有一个请求方法,且A已在注册中心注册,服务名为A:
@GetMapping("/a/sayHello")
public Map<String,String> sayHello(){
Map<String,String> resultMap = new HashMap<String,String>();
resultMap.put("msg","SUCCESS");
resultMap.put("data","Hello你好哇!");
return resultMap;
}
然后我们需要在服务B去调用服务A:
1、首先加入依赖
2、启动类加入@EnableFeignClients代表本服务可以为Feign客户端
3、定义接口AClient,用于调用服务A的请求方法,我们定义接口,实际的实现是Feign做的。
4、定义接口的内容:
@FeignClient("A") /*此处需要加入此注解并写入A的服务名*/
@Component
public interface VodClient {
/**
* A的sayHello请求
*/
@GetMapping("/a/sayHello")
Map<String,String> sayHello();
}
5、然后我们在B服务的任意地方需要其调用A的sayHello请求的话,只需要在代码中将VodClient注入到你的代码中即可。
虽然我们定义的是接口,但是具体实现Feign会完成,**这就是我们用Feign的理由**。
2、基本使用
1、引入依赖:
<!--Spring Cloud依赖版本-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在客户端启动类上加入注解
@EnableFeignClients
3、创建Client接口
/**
* xxx服务的客户端
*/
@FeignClient("需要调用的服务的名称") /*开启客户端注解*/
@Component /*装载到Spring,可不加,有时候ide认为你这个类没装载到Spring,那你就加上,将就一下ide*/
public interface VodClient {
/*
此处:
我们接口方法的定义要和服务端的controller完全一致,当然如果是swagger注解就不要了,还有要注意的
是如果是restful风格,那么@PathVariable比如要指定参数名。
*/
@PostMapping("/vod/upload")
R upload(MultipartFile file);
}
4、调用
在需要使用服务的地方将我们定义的Client接口注入即可。
5、注意
1、调用的服务必须要存在于注册中心
2、注册中心可以使用nacos,Eureka、Zookeeper等
3、注意client中路径不要写错
4、Feign是基于Ribbon实现的,具体的集群服务寻找其合适服务,负载均衡都是由ribbon实现,feign只是将调用方式封装为接口的方式。
5、注册中心可以看我上一篇博客:https://www.cnblogs.com/daihang2366/p/13647365.html