Feign概述
注意事项 feign的版本跟 springCloud springboot 很容易有版本依赖冲突 ..在一定注意依赖版本
前面的可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻。
Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Sentinel(关于Sentinel我们后面再讲),可以让我们不再需要显式地使用这两个组件
Feign具有如下特性:
- 可插拔的注解支持,包括Feign注解和JAX-RS注解;
- 支持可插拔的HTTP编码器和解码器;
- 支持Sentinel和它的Fallback;
- 支持Ribbon的负载均衡;
- 支持HTTP请求和响应的压缩;
这看起来有点像我们springmvc模式的Controller层的RequestMapping映射。这种模式是我们非常喜欢的。Feign是用@FeignClient来映射服务的。
Feign是以接口方式进行调用,而不是通过RestTemplate来调用,feign底层还是ribbon,它进行了封装,让我们调用起来更加happy.总结,就是feign通过一个本地对服务接口的代理,进行对注册到注册中心的服务调用,对于调用者来说,就像调用本地接口一样。
Feign的操作
导包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
feign接口编写
@FeignClient(name = "接口对应需要调用的服务名")
public interface UserFeignClient {
@GetMapping("/getUser")
public String getUserByNewsId(@RequestParam(required = false) Integer nid);
@GetMapping("/test1")
public String test1(@RequestParam("p1") String p1, @RequestParam("p2") Integer p2);
@GetMapping("/query")
public List<UserDto> query(@SpringQueryMap/*表单参数注解*/ UserDto user);
@PostMapping("/queryJson")
public UserDto queryJson(@RequestBody UserDto user);
@GetMapping("/list")
public List<UserDto> list();
@GetMapping("/getById/{id}")
public UserDto getById(@PathVariable Integer id);
}
调用 ```html @Autowired private UserFeignClient userFeignClient;
UserDto user = userFeignClient.getById(1);
<a name="C1Hfh"></a>
## Feign的配置
<a name="umq8d"></a>
### Java配置
1. 编写配置类
```java
@Configuration
public class FeignConfig {
//Feign的日志级别配置
@Bean
public Level createLevel() {
return Level.FULL;
}
}
在主配置类指定
@FeignClient(configuration = FeignConfig.class)
public class BaseConfig {}
属性配置
feign:
client:
config:
default: #这里可以换成服务名进行局部配置
logger-level: full
httpclient:
enabled: true #开启httpclient连接池配置
max-connections: 200
max-connections-per-route: 50
connection-timeout: 200000
Feign的原理: 通过定义的接口信息使用java动态代理生成执行对象,该对象ivcation方法里面会分封装一个RequestTemplate,该对象用来完成请求响应,在请求的时候它会调clientAPI(可能是HttpClient,okHttp),我们可以去选择开启谁,并且导入相关jar包,在发请求该对象会先去把配置的拦截器(RequestIntercepotor)执行了,还做做负载均衡服务发现处理,最后发请求
注意:普通的参数必须跟上@RequestParam
- JSON参数跟上@RequestBody
- 对象或则map的查询参数必须跟上@SpringQueryMap