问题描述

近期改造服务调用,需要使用Apollo配置进行灵活切换,上线后发现有些机器配置生效,有些配置未生效,开发小伙伴反馈此问题发生有一段时间

问题排查

机器排查

对线上机器进行排查,发现有几台机器根本没有拉取新的应用配置

指定问题机器信息

进入到问题机器查看本地Apollo文件信息

1
2
3
4
5
...
-rw-rw-r-- 1 mqq mqq  3429 May 19 15:32 main-webapp+default+CoopReader.baipai.switch.properties
-rw-r--r-- 1 mqq mqq  1621 Jul  4 15:39 main-webapp+default+CoopReader.switcher.properties
-rw-r--r-- 1 mqq mqq    89 Aug 26 11:18 main-webapp+default+CoopReader.personal.menu.properties
-rw-r--r-- 1 mqq mqq  3958 Aug 26 15:45 main-webapp+default+CoopReader.common.config.propertie

可以看到文件的最新日期在8月26日

Apollo 服务的问题?

先前小伙伴反应问过运维相关问题,得到的结论是Apollo没有改动,且服务配置不是完全不可用,此方向排除

服务的问题?

从目前得到的信息可以确认是某几台机器上的Apollo client没有去拉取最新的配置信息

为什么没有拉取到最新配置?

先来梳理一下Apollo的使用流程:

  1. 业务对Apollo的访问都基于 L5 的方式
  2. 目前业务工程使用cloudlevel5.Protocol来获取L5的信息与Apollo Portal进行交互
1
2
3
4
5
<dependency>
  <groupId>com.yuewen</groupId>
  <artifactId>userbase-l5-system</artifactId>
  <version>1.0.3.Final</version>
</dependency>

为什么业务机没有与Apollo portal交互?

怀疑与出问题的机器获取不到L5信息有关

问题猜测验证

大体知道问题出在哪了,下面就需要进行验证了。最简单的方式就是打印出Apollo的相关日志信息对猜测进行验证,但是目前业务的日志级别设置的 ERROR ,啥也看不到

修改业务日志级别?

现在需要打印aplllo相关的日志级别为 Info ,需要修改Logback中配置如下:

1
<logger name="com.ctrip.framework.apollo" level="info"/>

但是还是需要发版本上线,未免太麻烦,有没有其它办法?

Arthas动态修改日志级别

现在已经有非常成熟的线上调试工具了,Arthas就能实现对Logback的动态日志修改,二话不说,直接机器上修改验证

在问题机器上启动arthas

1
java -jar arthas-boot.jar

选择要处理的应用(10384)进入到arthas

查看当前系统日志级别

执行 logger 命令

1
logger

得到如下结果:

1
2
3
4
5
6
7
8
[arthas@10834]$ logger
 name              ROOT
 class             ch.qos.logback.classic.Logger
 classLoader       jdk.internal.loader.ClassLoaders$AppClassLoader@7aec35a
 classLoaderHash   7aec35a
 level             ERROR
 effectiveLevel    ERROR
 additivity        true

可以看到ROOT的日志级别为 ERROR

修改apollo包的日志级别为Info

1
logger -c 7aec35a --name com.ctrip.framework.apollo --level info
  • 参数说明

    1. -c classLoader的hash值
    2. –name 要修改的日志名
    3. –level 要修改的日志级别

执行后查看apllo包的日志级别

1
logger -n com.ctrip.framework.apollo

可以看到apllo包的日志级别为 Info

1
2
3
4
5
6
name              com.ctrip.framework.apollo
 class             ch.qos.logback.classic.Logger
 classLoader       jdk.internal.loader.ClassLoaders$AppClassLoader@7aec35a
 classLoaderHash   7aec35a
 level             INFO
 effectiveLevel    INFO

查看Info日志定位问题

日志级别改好了,去看日志里面有什么有用的信息

1
tail -200f info.log

输出如下:

1
2
2022-09-16 11:19:46.756 [,] [Apollo-RemoteConfigRepository-1] INFO  c.c.f.a.i.DefaultMetaServerProvider - [initMetaServerAddress,42] - Located meta services from apollo.meta configuration: http://64781377:131072!
2022-09-16 11:19:46.757 [,] [Apollo-RemoteConfigRepository-1] WARN  c.c.f.a.i.AbstractConfigRepository - [trySync,26] - Sync config failed, will retry. Repository class com.ctrip.framework.apollo.internals.RemoteConfigRepository, reason: com.ctrip.framework.apollo.core.spi.MetaServerProvider: Provider com.yuewen.cooperate.internals.L5MetaServerProvider could not be instantiated [Cause: Could not initialize class com.yuewen.cloudlevel5.Protocol]

哈哈,验证成功!! cloudlevel5.Protocol 显示cloudlevel5未初始化成功,看来这个l5获取方式对机器还是有要求的

解决问题

定位好问题后,可行两种解决方案:

  1. 修改cloudl5问题
  2. 换成polaris方式获取

考虑到cloudl5的维护成本与可靠性问题,决定采用集团统一 polaris 方式进行L5地址的获取,这样即符合公司的技术方案升级策略,又能保证业务的稳定性。

参考

https://arthas.aliyun.com/en/doc/logger.html