一、Feign简介
Feign是一个声明式Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix(关于Hystrix我们后面再讲),可以让我们不再需要显式地使用这两个组件。
总起来说,Feign具有如下特性:
- 可插拔的注解支持,包括Feign注解和JAX-RS注解;
- 支持可插拔的HTTP编码器和解码器;
- 支持Hystrix和它的Fallback;
- 支持Ribbon的负载均衡;
- 支持HTTP请求和响应的压缩。
这看起来有点像SringMVC模式的Controller层的RequestMapping映射。Feign是用@FeignClient来映射服务的。
二、Feign使用
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
application.yml配置
server:
port: 8081
spring:
application:
name: consumer #服务名
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka #注册进入eureka
instance:
instance-id: consumer_8081 #在注册中心的名字
prefer-ip-address: true #访问路径时显示ip地址
定义接口
@FeignClient("user-service")//value为注册到eureka服务器名称
public interface FeignService {
//服务中方法的映射路径
@GetMapping("/users")
List<User> list();
@GetMapping("/user/{id}")
User find(@PathVariable("id")Integer id) ;
@PutMapping("/user/{id}")
User update(User user);
}
接着在Controller层注入FeiService这个接口,进行远程服务调用
@RestController
public class ConsumerController {
@Autowired
FeignService feignService;
@RequestMapping("/list")
public String listUser(){
return feignService.list();
}
}
添加注解,主启动类上添加注解@EnableDiscoveryClient 和@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}