Feign
Feign概述
前面的可以发现当我们通过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的操作
1.导包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.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); }
3.调用
@Autowired private UserFeignClient userFeignClient; UserDto user = userFeignClient.getById(1);
Feign的配置
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