1:Feign是什么
Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,只需要创建一个接口,然后在上面添加注解即可。官网:https://github.com/OpenFeign/feign
2:Feign能干什么
- Feign旨在使编写Java Http客户端变得更容易。
- 前面在使用Spring Cloud Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。
- Spring Cloud Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Spring Cloud Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了使用Spring cloud ribbon时,自动封装服务调用客户端的开发量。
- Spring Cloud Feign具备可插拔的注解支持,包括Feign注解和JAX-RS注解,同时还扩展了Spring MVC的注解支持。同时还集成Ribbon和Eureka,以在使用Feign时提供Http客户端的负载均衡;集成了Hystrix以提供熔断、降级等功能。
- 另外,对于Feign自身的一些主要组件,比如说编码器和解码器等,都支持可插拔的方式,在有需要的时候可以方便地扩展和替换它们。
3:Feingn特性
- 可插拔的注解支持,包括Feign注解和JAX-RS注解
- 支持可插拔的HTTP编码器和解码器
- 支持Hystrix和它的Fallback
- 支持Ribbon的负载均衡
- 支持HTTP请求和响应的压缩
4: Feign集成
4.1:加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
4.2:启动类
需要添加开启feign的注解,示例如下:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
4.3:定义接口,示例如下:
@FeignClient(value = "userService")
public interface UserService {
@RequestMapping(value = "/userServiceProvider", method = RequestMethod.GET)
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
4.4:配置文件
基本类似于Ribbon的配置, application.properties示例如下:
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
server.port=8770
spring.application.name=service-feign
4.5:调用服务的Controller类
- Feign集成了Ribbon,依然是利用了Ribbon维护了userService的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口,以声明式的方法,优雅而简单的实现了服务调用
- Spring Cloud Feign只支持spring mvc 3.x系列的, springmvc4.0出现的一系列注解比如@GetMapping,@PostMapping,@PutMapping等等是Feign是不支持的