2020-12-30

老项目升级从dubbo.2.5.6升级dubbo2.7.7 碰到的问题

最近一个维护的一个老项目,因为dubbo序列化的漏洞问题,甲方要求必须强制升级到dubbo服务到2.7.7或以上版本.本来这种项目如果没有特别的需求是不需要进行版本升级的,出力不讨好,但是现在政治任务下来了,必须要升级,那就来吧.


这里还是提一嘴漏洞的情况:

漏洞说明:

20200626_Apache Dubbo Provider默认反序列化远程代码执行漏洞(CVE-2020-1948)具体内容请点击:https://mp.weixin.qq.com/s/iKQbdWrMG00Arg0aEUbrXQ

Apache Dubbo发布安全公告披露Provider默认反序列化导致的远程代码执行漏洞(CVE-2020-1948),攻击者可以发送带有无法识别的服务名或方法名及某些恶意参数负载的RPC请求,当恶意参数被反序列化时将导致代码执行。

受影响版本

Apache Dubbo 2.7.0 - 2.7.6

Apache Dubbo 2.6.0 - 2.6.7

Apache Dubbo 2.5.x 所有版本 (官方不再支持)

不受影响版本

Apache Dubbo >= 2.7.7

项目的框架情况

  1. spring版本是 3.2.17.RELEASE
  2. dubbo版本2.5.6
  3. 无springboot
  4. jdk1.8和jdk1.7都有,一个工程分为了两个部署包,一个rpc,一个对外API.对外API是1.7版本部署在jboss4.2.3GA.
  5. 使用zookeeper作为注册中心.

升级替换的jar包

  1. dubbo 直接升级到2.7.7.注意dubbo2.7已经属于apache管理了,maven坐标已经换掉了

    <dependency>
                <groupId>org.apache.dubbogroupId>
                <artifactId>dubboartifactId>
                <version>2.7.7version>
            dependency>
    
  2. jdk版本必须是1.8版本了,也就意味着如果你是低版本的jdk,需要升级.虽然官网的文档写的是1.6+,但是你查看dubbo包的MF文件,是根据1.8的jdk编译的.

  3. 需要引入必须的jar包,spring的版本需要升级.

    [INFO] +- com.alibaba:dubbo:jar:2.5.9-SNAPSHOT:compile
    [INFO] |  +- org.springframework:spring-context:jar:4.3.10.RELEASE:compile
    [INFO] |  +- org.javassist:javassist:jar:3.21.0-GA:compile
    [INFO] |  \- org.jboss.netty:netty:jar:3.2.5.Final:compile
    
  4. 针对使用zk作为注册中心,以下也基本上是必须的.

     <dependency>
                <groupId>org.apache.curatorgroupId>
                <artifactId>curator-frameworkartifactId>
                <version>2.12.0version>
            dependency>
            <dependency>
                <groupId>org.apache.curatorgroupId>
                <artifactId>curator-clientartifactId>
                <version>2.12.0version>
            dependency>
            <dependency>
                <groupId>org.apache.curatorgroupId>
                <artifactId>curator-recipesartifactId>
                <version>2.12.0version>
            dependency>
    

    dubbo的官方文档也给了一个可选依赖列表

    **可选依赖 **

    以下依赖,在主动配置使用相应实现策略时用到,需自行加入依赖。

    • netty-all 4.0.35.Final
    • mina: 1.1.7
    • grizzly: 2.1.4
    • httpclient: 4.5.3
    • hessian_lite: 3.2.1-fixed
    • fastjson: 1.2.31
    • zookeeper: 3.4.9
    • jedis: 2.9.0
    • xmemcached: 1.3.6
    • hessian: 4.0.38
    • jetty: 6.1.26
    • hibernate-validator: 5.4.1.Final
    • zkclient: 0.2
    • curator: 2.12.0
    • cxf: 3.0.14
    • thrift: 0.8.0
    • servlet: 3.0 5
    • validation-api: 1.1.0.GA 5
    • jcache: 1.0.0 5
    • javax.el: 3.0.1-b08 5
    • kryo: 4.0.1
    • kryo-serializers: 0.42
    • fst: 2.48-jdk-6
    • resteasy: 3.0.19.Final
    • tomcat-embed-core: 8.0.11
    • slf4j: 1.7.25
    • log4j: 1.2.16

调整启动脚本

start.sh 脚本com.alibaba.dubbo.container.Main 需要调整 为 org.apache.dubbo.container.Main

碰到的问题

  1. 错误日志
Caused by: java.lang.IllegalStateException: zookeeper not connected
	at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.(CuratorZookeeperClient.java:80)

代码地址

   public CuratorZookeeperClient(URL url) {
     
        super(url);
        try {
     
            int timeout = url.getParameter(TIMEOUT_KEY, DEFAULT_CONNECTION_TIMEOUT_MS);
            int sessionExpireMs = url.getParameter(ZK_SESSION_EXPIRE_KEY, DEFAULT_SESSION_TIMEOUT_MS);
            CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
                    .connectString(url.getBackupAddress())
                    .retryPolicy(new RetryNTimes(1, 1000))
                    .connectionTimeoutMs(timeout)
                    .sessionTimeoutMs(sessionExpireMs);
            String authority = url.getAuthority();
            if (authority != null && authority.length() > 0) {
     
                builder = builder.authorization("digest", authority.getBytes());
            }
            client = builder.build();
            client.getConnectionStateListenable().addListener(new CuratorConnectionStateListener(url));
            client.start();
            boolean connected = client.blockUntilConnected(timeout, TimeUnit.MILLISECONDS);
            if (!connected) {
     
                throw new IllegalStateException("zookeeper not connected");
            }
        } catch (Exception e) {
     
            throw new IllegalStateException(e.getMessage(), e);
        }
    }

需要调整超时时间 默认的timeout=“3000” 设置为10000 .

<dubbo:config-center address="192.168.110.75:2181" protocol="zookeeper" port="2181" configFile="dubbo.properties" check="true" timeout="3000" group="dubbo" highestPriority="false" />

<dubbo:registry id="provider-zk" protocol="zookeeper"
                    address="${dubbo.registry.address}" timeout="10000"/>

  1. 在linux启动的时候报错 报无法初始化类org.springframework.beans.factory.BeanCreationException
2020-12-29 20:44:52,811 WARN [org.springframework.context.support.ClassPathXmlApplicationContext] - Exception thrown from ApplicationListener handling ContextClosedEvent
java.lang.NoClassDefFoundError: Could not initialize class org.springframework.beans.factory.BeanCreationException
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1154)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1099)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)

这不是问题,因为Spring Framework中有很多API使用Java反射或递归调用,因此它们的堆栈需要更多空间。

把 -Xss512k 调大

参考 https://github.com/apache/dubbo/issues/5658

参考文档

http://dubbo.apache.org/zh/docs/v2.7/

你可能感兴趣的:(技术分享,java)