升级dubbo2.7.15版本报找不到JSONValidator问题处理

 现象:

由于安全漏洞,升级dubbo 2.7.15版本时,报找不到com/alibaba/fastjson/JSONValidator,导致某个服务无法启动,但有些服务确实正常启动。

具体错误信息如下:

Caused by: java.lang.NoClassDefFoundError: com/alibaba/fastjson/JSONValidator
        at org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser.isJsonArray(ConfigParser.java:221) ~[dubbo-2.7.15.jar:2.7.15]
        at org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser.parseConfigurators(ConfigParser.java:47) ~[dubbo-2.7.15.jar:2.7.15]
        at org.apache.dubbo.registry.integration.AbstractConfiguratorListener.genConfiguratorsFromRawRule(AbstractConfiguratorListener.java:78) ~[dubbo-2.7.15.jar:2.7.15]
        at org.apache.dubbo.registry.integration.AbstractConfiguratorListener.initWith(AbstractConfiguratorListener.java:48) ~[dubbo-2.7.15.jar:2.7.15]
        at org.apache.dubbo.registry.integration.RegistryProtocol$ProviderConfigurationListener.<init>(RegistryProtocol.java:753) ~[dubbo-2.7.15.jar:2.7.15]
        at org.apache.dubbo.registry.integration.RegistryProtocol.<init>(RegistryProtocol.java:142) ~[dubbo-2.7.15.jar:2.7.15]
        at org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol.<init>(InterfaceCompatibleRegistryProtocol.java:38) ~[dubbo-2.7.15.jar:2.7.15]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_251]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_251]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_251]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_251]
        at org.apache.dubbo.common.extension.ExtensionLoader.createExtension(ExtensionLoader.java:661) ~[dubbo-2.7.15.jar:2.7.15]

 原因

经过跟踪代码调试,发现问题的关键。
(1)在AbstractConfiguratorListener初始化治理信息时,会调dubbo-admin中治理信息;
(2)如果存在治理规则,会调ConfigParser.isJsonArray方法判断规则是否为JSONArray,其中使用的fastjson的JSONValidator。
(3)而我们的parent-pom排除了fastjson,所以会报错,导致应用无法启动。
(4)2.7.15版本对代码做了升级,如下:

 

为什么其他服务启动成功了呢?

原因是,我们这个服务之前由于内部测试,在admin中增加了权重规则。 

在应用启动,从ZK中读取/dubbo/config/dubbo/loan-user-account.configurators时,获取到了值,如下
 
configs:
- addresses:
  - *******
  enabled: true
  parameters:
    weight: 0
  side: provider
  type: weight
enabled: false
key: *******
scope: application
 
将规则删除前后,ZK数据变化如下:
 

 

 

 

然后服务启动成功,这也是为什么其他服务升级没问题,这个服务升级出现问题的原因。 

 

最后的解决办法

方法一:删除admin中的配置,但admin后续使用需要注意,可能应用会起不来。
方法二:增加JSONValidator的门面,替代fastjson。

 

出现问题不可怕,关键是具备势必解决问题的心态和方法。--- me 

 

posted @ 2022-05-25 11:03  水木竹水  阅读(473)  评论(0编辑  收藏  举报