①Feign
feign 默认远程请求的网络请求框架HttpURLConnection在省缺配置BeanName为FeignClient的Bean的情况下,会自动注入Client.Default这个对象,跟踪Client.Default源码,Client.Default使用的网络请求框架是HttpURLConnection;

是否启用httpclient feign.httpclient.enabled=false
# 是否启用httpok(性能比httpclient高) feign.okhttp.enabled=true
# 是否启用hystrix feign.hystrix.enabled=true
# 请求连接超时时间(毫秒) feign.httpclient.connection-timeout=3000

②Hystrix、Ribbon
熔断时间设置,参考:
https://blog.csdn.net/dingmeinai9020/article/details/102069649 未实践
https://www.pianshen.com/article/187038775/
https://blog.csdn.net/east123321/article/details/82385816
总结
1.如果hystrix.command.default.execution.timeout.enabled为true,则会有两个执行方法超时的配置,一个就是ribbon的ReadTimeout,一个就是熔断器hystrix的timeoutInMilliseconds, 此时谁的值小谁生效;
2.如果hystrix.command.default.execution.timeout.enabled为false,则熔断器不进行超时熔断,而是根据ribbon的ReadTimeout抛出的异常而熔断,也就是取决于ribbon;
3.ribbon的ConnectTimeout,配置的是请求服务的超时时间,除非服务找不到,或者网络原因,这个时间才会生效;
4.ribbon还有MaxAutoRetries对当前实例的重试次数,MaxAutoRetriesNextServer对切换实例的重试次数, 如果ribbon的ReadTimeout超时,或者ConnectTimeout连接超时,会进行重试操作;
5.通常熔断的超时时间需要配置的比ReadTimeout长,ReadTimeout比ConnectTimeout长;
6.ribbon包含重试机制,重试次数消耗时间相加不能超过熔断时间,否则会被立即熔断;
7.MaxAutoRetries + MaxAuthRetriesNextServer ( 1 + MaxAutoRetries) 重试次数计算,*未实践
8.因为ribbon的重试机制和Feign的重试机制有冲突,所以源码中默认关闭Feign的重试机制;

③AOP
使用创建:日志添加字段、日志运行时间输出;

org.springframework.boot
spring-boot-starter-aop

@Aspect
@Component
@Slf4j
public class RunTimeAspect {

  1. @Pointcut("@annotation(util.annotation.RunTime)")<br /> private void pointcut() {}
  2. @Around("pointcut()")<br /> public Object around(ProceedingJoinPoint joinPoint) throws Throwable {<br /> // 获取目标类名称<br /> String clazzName = joinPoint.getTarget().getClass().getName();<br /> // 获取目标类方法名称<br /> String methodName = joinPoint.getSignature().getName();<br /> // 获取目标请求参数<br /> //Object[] paras = joinPoint.getArgs();<br /> long start = System._currentTimeMillis_();<br /> // 调用目标方法<br /> Object result = joinPoint.proceed();<br /> long end = System._currentTimeMillis_();<br /> long time = end - start;<br /> _log_.info("{}: {}: : 方法执行完毕总耗时: {} ms,时间区间 [ {} ,{} ] ", clazzName, methodName, time, start, end);<br /> return result;<br /> }<br />}

④自定义注解
使用场景:注解方法运行时间输出和拦截器判断是否进行Token校验;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PassToken {

  1. boolean required() default true;<br />}


HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
//检查是否有passtoken注释,有则跳过认证
if (method.isAnnotationPresent(PassToken.class)) {
PassToken passToken = method.getAnnotation(PassToken.class);
if (passToken.required()) {
return true;
}
}
….