1.什么是Feign
Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了Http请求的模板,通过编写简单的接口和插入注解,就可以定义好Http请求的参数、格式、地址等信息。而Feign则会完全代理Http请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理,这使得我们调用Http API更加优雅。
Feign整合了Ribbon和Hystrix,从而让Feign的使用更加方便。
2.Feign的特性
- 可插拔的注解支持,包括Feign注解和JAX-RS注解;
- 支持可插拔的HTTP编码器和解码器;
- 支持Hystrix和它的Fallback;
- 支持Ribbon的负载均衡;
- 支持HTTP请求和响应的压缩。
这看起来有点像我们springmvc模式的Controller层的RequestMapping映射。这种模式是我们非常喜欢的。Feign是用@FeignClient
来映射服务的。
Feign是以接口方式进行调用,而不是通过RestTemplate来调用,feign底层还是ribbon,并进行了封装,让我们调用起来更加方便。
3.使用Feign
对消费者服务进行改造
- 引入坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- application.yml
Feign默认不开启hystrix熔断,手动开启
server:
port: 8081
spring:
application:
name: service-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka,http://localhost:9001/eureka #多个地址用,号隔开
feign:
hystrix:
enabled: true #开启熔断功能
- 配置启动类
加上@EnableFeignClients
注解(启用Feign组件)
- 建立FeignClient接口类
使用Feign非常简单,创建一个接口,并在接口上添加一些注解。
UserClient.java
@FeignClient(value = "service-provider",fallback = UserClientFallback.class)//调用微服务的id
public interface UserClient {
//和controller里的请求路径、入参一致
@GetMapping("user/get/{id}")
public User queryUserById(@PathVariable int id);
}
UserClientFallback.java
@Component
public class UserClientFallback implements UserClient {
@Override
public User queryUserById(int id) {
User user = new User();
user.setName("服务器忙,稍后再试");
return user;
}
}
User.java
package com.pojo;
public class User {
private Integer id;
private String name;
//省略setter和getter.....
}
UserController.java
@RestController
public class UserController {
@Autowired
private UserClient userClient;
@GetMapping("user/get/{id}")
@HystrixCommand
public User queryUserById(@PathVariable int id){
return this.userClient.queryUserById(id);
}
}
访问
http://localhost:8081/user/get/1
结果: