本文为博主原创,未经允许不得转载:
1. Feign 日志级别配置
2. Feign client 封装调用
3. Feign 定义熔断降级方法
4. 通过 FallbackFactory 工厂 实现降级
5. 配置 @FeignClient 的 configuration 属性
6. 配置http 连接池
7. feign 配合 hystrix 超时熔断配置
Feign 是NetFlix 开源的声明式的 HTTP 客户端。一般在服务消费端实现 Feign 的客户端,进行服务调用。
1. Feign 日志级别配置
Feign 默认实现调用时,不会打印调用的请求日志。配置 feign client 调用日志打印:
feign:
client:
config:
# 全局配置
default:
loggerLevel: full
Feign 日志级别及打印内容:
日志级别 | 打印内容 |
NONE(默认值) | 不打印任何日志 |
BASIC | 仅记录请求方法,url,响应状态以及执行时间 |
HEADERS | 在BASIC的基础上,记录了请求和响应的HEADER |
FULL | 记录请求和响应的header,body和元数据 |
2.Feign client 封装调用:
2.1 添加 feign 的pom 依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
2.2 定义Feign client接口,并在启动类添加 @EnableFeignClients 注解
import com.contentcenter.domain.dto.user.UserDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "user-center") // name为调用的服务模块名称
public interface UserCenterFeignClient {
/**
* http://user-center/users/{id}
*
* @param id
* @return
*/
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}
2.3 非用户中心可通过在自己侧封装的 Feign client 进行调用,获取用户数据:
@Autowire
private UserCenterFeignClient userFeignClient;
@Test
public void test(){
UserDTO userDto = userFeignClient.findById(11);
system.out.println(JSON.toJsonString(userDto));
}
3. Feign 定义熔断降级方法
3.1 自定义实现 FeignClient 的接口返回
@Component
public class UserCenterFeignClientFallback implements UserCenterFeignClient {
@Override
public UserDTO findById(Integer id) {
UserDTO userDTO = new UserDTO();
userDTO.setWxNickname("流控/降级返回的用户");
return userDTO;
}
}
3.2 在定义Feign client 时指定 fallback 方法
import com.contentcenter.domain.dto.user.UserDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "user-center",fallback = UserCenterFeignClientFallback.class)
public interface UserCenterFeignClient {
/**
* http://user-center/users/{id}
*
* @param id
* @return
*/
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}
4. 通过 FallbackFactory 工厂 实现降级
通过 FallbackFactory 实现的降级可以捕获 熔断的异常信息,而通过方法实现的熔断,则不能获取熔断的异常信息。
所以推荐使用 FallbackFactory 进行降级实现。
import com.contentcenter.domain.dto.user.UserDTO;
import com.contentcenter.feignclient.UserCenterFeignClient;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class UserCenterFeignClientFallbackFactory implements FallbackFactory<UserCenterFeignClient> {
@Override
public UserCenterFeignClient create(Throwable cause) {
return new UserCenterFeignClient() {
// 当 UserCenterFeignClient 有多个方法时,在这里逐个重写实现即可
@Override
public UserDTO findById(Integer id) {
log.warn("远程调用被限流/降级了", cause);
UserDTO userDTO = new UserDTO();
userDTO.setWxNickname("流控/降级返回的用户");
return userDTO;
}
};
}
}
调用方式:
@FeignClient(name = "user-center",fallbackFactory = UserCenterFeignClientFallbackFactory.class)
5. 配置 @FeignClient 的 configuration 属性
通过@FeignClient 的 configuration 属性可以实现对 feign请求的自定义封装。如实现拦截配置,对 feign 请求添加认证请求头,添加 ssl 认证等等。
具体可参考我的这篇文章: spring cloud 通过feign请求设置请求头 javascript:void(0)
6. 配置http 连接池
添加依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
添加配置:
feign:
httpclient:
# 让feign使用apache httpclient做请求;而不是默认的urlconnection
enabled: true
# feign的最大连接数
max-connections: 200
# feign单个路径的最大连接数
max-connections-per-route: 50
7. feign 配合 hystrix 超时熔断配置:
Spring Cloud Feign HTTP请求异常 Fallback
容错机制,它是基于Hystrix实现的,所以要通过配置参数 feign.hystrix.enabled=true
开启该功能,以及配置 hystrix 超时时间。
feign:
hystrix:
enabled:true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 1000