Feign

feign 日志

  1. 配置 yaml
logging:
  level:
    ***.***: DEBUG

日志级别:NONE ,BASIC,HEADERS,FULL

  1. 添加bean
@Configuration
public class FooConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

日常使用中建议使用basic 或者none

  1. 日志会影响性能
  2. 亲身体验:部分请求responseBody信息过于庞大会影响其他日志的查看,使用full,headers 完全没有意义

feign 优化

feign 底层实现默认是urlConnection ,是不支持连接池的。一次http请求建立连接会三次握手,断开连接四次挥手,不适用连接池性能比较差
可以使用httpClient 或者 OKHttp

pom中添加依赖

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
    </dependency>

httpclient有版本不一致问题,可能需要指定版本

yaml中配置

feign:
  client:
	config:
	  userservice: debug
  httpclient:
	enabled: true
	max-connections: 200  #  最大连接数
	max-connections-per-route: 50 #每个请求的最大连接数

最大连接数和每个请求最大连接数需要根据实际的压测结果来决定

feign的使用记录

在请求api包内 不要再接口上使用requestMapping 注解

  1. 使用了注解会使其他服务提供的接口会背当前应用扫描到,可以直接请求调用,
  2. 会影响fallback的定义

feign自定义异常

@Configuration
public class FeignClientErrorDecoder extends ErrorDecoder.Default {

    private Logger logger = LoggerFactory.getLogger(FeignClientErrorDecoder.class);


    @Override
    public Exception decode(String methodKey, Response response) {
        Exception exception = super.decode(methodKey, response);
        try {
            // 如果是FeignException,则对其进行处理,并抛出BusinessException
            if (exception instanceof FeignException && ((FeignException) exception).responseBody().isPresent()) {
                ByteBuffer responseBody = ((FeignException) exception).responseBody().get();
                String bodyText = StandardCharsets.UTF_8.newDecoder().decode(responseBody.asReadOnlyBuffer()).toString();
                FeignErrorVo errorResponseVo = JSONObject.parseObject(bodyText, FeignErrorVo.class);
                logger.error("{}错误码{}信息为: {} ",response.request().url(),errorResponseVo.getStatus() ,errorResponseVo.getMessage());
                return new BusinessException("服务出现异常,请稍后再试");
            }
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }
        return exception;
    }


}

其中 FeignErrorVo 和 BusinessException 可以自行根据业务来决定

Feign 超时配置:

openfeign-starter 中自带了hystrix,可以不用添加hystrix starter

# ribbon:
#   ReadTimeout: 5000
#   ConnectTimeout: 5000
#  feign 客户端超时配置
feign:
  client:
	config:
	  default:
		connectTimeout: 5000
		readTimeout: 5000
		
#  hystrix 超时配置			
hystrix:
  enabled: true
  command:
	default:
	  execution:
		isolation:
		  thread:
			timeoutInMilliseconds: 180000
spring: 
  cloud: 
	config: # 相同配置下优先使用本地配置 (注:需在nacos上配置才生效!) 
	  override-none: true 
	  allow-override: true 
	  override-system-properties: false

hystrix 不是使用自动装配,添加到yaml 中可能idea 会不识别。feign 执行调用时会进行添加配置

posted @ 2022-07-25 10:45  原来是晴天啊  阅读(269)  评论(0编辑  收藏  举报