问题描述
近期改造服务调用,需要使用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的使用流程:
- 业务对Apollo的访问都基于 L5 的方式
- 目前业务工程使用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
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
|
-
参数说明
- -c classLoader的hash值
- –name 要修改的日志名
- –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
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获取方式对机器还是有要求的
解决问题
定位好问题后,可行两种解决方案:
- 修改cloudl5问题
- 换成polaris方式获取
考虑到cloudl5的维护成本与可靠性问题,决定采用集团统一 polaris 方式进行L5地址的获取,这样即符合公司的技术方案升级策略,又能保证业务的稳定性。
参考
https://arthas.aliyun.com/en/doc/logger.html