在 OpenFeign 中,默认并没有开启数据压缩功能。但如果你在服务间单次传递数据超过 1K 字节,强烈推荐开启数据压缩功能。默认 OpenFeign 使用 Gzip 方式压缩数据,对于大文本通常压缩后尺寸只相当于原始数据的 10%~30%,这会极大提高带宽利用率。
如果应用属于计算密集型,CPU 负载长期超过 70%,因数据压缩、解压缩都需要 CPU 运算,开启数据压缩功能反而会给 CPU 增加额外负担,导致系统性能降低,这是不可取的。这种情况 建议不要开启数据的压缩功能
OpenFeign 默认使用 Java 自带的 URLConnection 对象创建 HTTP 请求,但接入生产时,如果能将底层通信组件更换为 Apache HttpClient、OKHttp 这样的专用通信组件,基于这些组件自带的连接池,可以更好地对 HTTP 连接对象进行重用与管理。
OpenFeign 使用时默认引用 Ribbon 实现客户端负载均衡,它默认的负载均衡策略是轮询策略。如果需要自定义调整需要在application.yml 中调整微服务通信时使用的负载均衡类即可。
出于性能方面的考虑,我们可以选择用权重策略或区域敏感策略来替代轮询策略,因为这样的执行效率最高。
-
RoundRobinRule 轮询策略 按顺序将请求轮流分发到各个服务实例,是Ribbon的默认策略。
-
RandomRule 随机策略 随机选择一个服务实例,将请求分发过去。
-
RetryRule 重试策略 在RoundRobinRule的基础上添加重试机制,在选择实例失败时进行重试。
-
WeightedResponseTimeRule 权重响应时间策略 考虑实例的响应时间权重,响应时间快的实例权重加大,被选中的概率增加。
-
BestAvailableRule 最低并发策略 选择并发数最低的实例。
-
AvailabilityFilteringRule 可用过滤策略 过滤掉故障实例和并发连接数超过阈值的实例,选择并发连接数最小的实例。
-
ZoneAvoidanceRule 区域避开策略 综合判断服务器的可用性、负载和区域,避开故障实例所在区域。
除此之外,我们也可以实现自定义的负载均衡策略,步骤如下:
-
实现 IRule 接口,这是负载均衡策略的规范接口。
-
添加 @RibbonClient 注解,指定服务名称与自定义策略。例如:
@RibbonClient(name = "user-service", configuration = MyRule.class)
public classribbonRuleConfig {}
-
在启动类上添加 @RibbonClients 注解,激活自定义配置。
-
将自定义策略类放入Spring Context中,如添加@Configuration注解。
openfeign 的日志级别是 debug,但是 springboot 默认日志级别是 info,因为 debug<info,所以需要也改为debug,openfeign 的日志才会生效
-
全局日志
-
局部配置日志
-
更改springboot 默认日志级别
推荐使用Resilience4j作为熔断与容错库,取代原先的Hystrix。
/actuator/health/resilience4j/熔断器名称端点来监控熔断器的状态。
Resilience4j最新版本中主要支持以下配置:
熔断器(CircuitBreaker): - failureRateThreshold:失败率阈值,默认50%
-
slowCallRateThreshold:慢调用占比阈值,默认100%
-
waitDurationInOpenState:打开状态下等待时长,默认60s
-
permittedNumberOfCallsInHalfOpenState:半开状态下允许最大调用次数,默认10
-
slidingWindowType:滑动窗口类型,默认COUNT_BASED
-
minimumNumberOfCalls:最小调用次数,默认100
-
writableStackTraceEnabled:是否启用完整堆栈跟踪,默认false
-
recordExceptions:是否记录异常,默认false
-
ignoreExceptions:忽略的异常类列表
限流器(RateLimiter):
-
limitRefreshPeriod:限流窗口刷新周期,默认500ms
-
limitForPeriod:限流窗口期限内最大请求数,默认100
-
timeoutDuration:获取令牌的超时时长,默认100ms
超时器(TimeLimiter):
-
cancelRunningFuture:是否取消正在执行的线程,默认true
-
timeoutDuration:超时时长
隔离(Bulkhead):
-
maxConcurrentCalls:并发调用数
-
waitingRoomSemaphoreMaxPermits:等待室最大许可数
-
bulkheadCpuLight:是否启用“轻量级”隔离器,只基于Semaphore实现,默认false
这些规则覆盖了熔断、限流、超时与隔离等容错场景。熟练掌握各参数的含义及如何配置可以让我们使用Resilience4j实现全面而强大的容错方案。
除此之外,Resilience4j还提供了可视化Dashboard(需额外引入resilience4j-dashboard依赖)、health indicator(通过management.endpoint.health.show-details=always开启)、metrics监控等功能。这让我们不仅可以方便配置容错规则,还可以在系统运行时可视化监控各个熔断与限流器的状态与统计数据。
Resilience4j是一个功能强大且生态完备的容错框架。要熟练使用它,需要我们理解其各模块(Circuit Breaker、Rate Limiter、Bulkhead等)的作用机制和彼此之间的关系,以及它们提供的各种配置项的含义。这需要持续学习与实践,需要我们在各种场景和项目中多次应用它,并不断总结经验。