Feign也叫伪装:
Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
作用于服务消费方调用。
1、导入启动器依赖(前提是已经导入了spirngCloud的依赖);
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、开启Feign功能;
在springBoot启动类里开启Feign功能
@EnableFeignClients
3、编写Feign客服端;
package com.itgod.consumer.client;
import com.itgod.consumer.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
//声明当前类是一个Feign客户端,指定服务名为user-service
@FeignClient("user-service")
public interface UserClient {
@GetMapping("/user/{id}")
User queryById(@PathVariable(value = "id") Long id);
}
4、编写一个处理器ConsumerFeignController,注入Feign客服端并使用;
package com.itgod.consumer.controller;
import com.itgod.consumer.client.UserClient;
import com.itgod.consumer.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: xiaomahuhu
* @Date: 2020/8/29 10:44
* @Version 1.0
*/
@RestController
@RequestMapping("/cfc")
public class ConsumerFeignController {
@Autowired
private UserClient userClient;
@RequestMapping("/{id}")
public User queryById(@PathVariable Long id){
return userClient.queryById(id);
}
}
Feign也可以内置ribbon的配置项和Hystrix熔断的Fallback配置
负载均衡
Feign内置的ribbon默认设置了请求超时时长,默认是1000,我们可以通过手动配置来修改这个超时时长(ribbon内部有重试机制,一旦超时,会自动重新发起请求,可添加如下配置):
在consumer服务消费端的 application.yml下配置如下:
ribbon:
CnnectTimeout: 1000 #链接超时时长
ReadTimeout: 2000 #数据通信超时时长
MaxAutoRetries: 0 #当前服务器的重试次数
MaxAutoRetriesNextServer: 0 #重试多少次服务
OkToRetryOnAllOperations: false #是否对所有的请求方式都重试
服务熔断
需要在consumer服务消费端的 application.yml下配置如下:
feign:
hystrix:
enabled: true #开启Feign的熔断功能 默认是false
创建一个服务降级类:
package com.itgod.consumer.client.fallback;
import com.itgod.consumer.client.UserClient;
import com.itgod.consumer.pojo.User;
import org.springframework.stereotype.Component;
@Component
public class UserClientFallback implements UserClient {
@Override
public User queryById(Long id) {
User user = new User();
user.setId(id);
user.setName("用户异常");
return user;
}
}
然后需要改造之前我们写的Feign客服端:
将之前的:
@FeignClient("user-service")
改成:
@FeignClient(value = "user-service",fallback = UserClientFallback.class)
请求压缩
只需要在服务消费端application.yml下配置:
feign:
compression: #压缩请求
request:
enabled: true #开启请求压缩
mime-types: text/html,application/xml,application/json #设置压缩的数据类型
min-request-size: 2048 #设置触发压缩的大小下限
response:
enabled: true
日志级别
通过logging.level.xx=debug来设置的日志级别对Feign客户端是不起作用的。因为@FeignClinet注解修改的客户端在被代理是,都会创建一个新的Feign.Logger实例。我们需要额外指定这个日志的级别才可以。
服务消费端application添加配置级别(com.itgod包下所有的日志级别):
logging:
level:
com.itgod: debug
在consumer-demo(服务消费端)编写 FeignConfig配置类,定义日志级别:
package com.itgod.consumer.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
//记录所有请求和响应的明细,包括头信息,请求体,元数据
return Logger.Level.FULL;
}
}
这里指定的Level级别是Full,Feign支持4中级别:
- NONE:不记录任何日志信息,这是默认值;
- BASIC:仅记录请求的方法,URL以及影响状态码和执行时间;
- HEADERS:在BASIC基础上,额外记录了请求和响应的头信息;
- FULL:记录所有请求和响应的明细,包括头信息,请求体,元数据
最后在Feign客服端(UserClient)上加上:
configuration = FeignConfig.class
该FeignClient注解变为:
@FeignClient(value =**加粗样式** "user-service",fallback = UserClientFallback.class,configuration = FeignConfig.class)