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.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>2.7.7</version>
            </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.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>2.12.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-client</artifactId>
                <version>2.12.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-recipes</artifactId>
                <version>2.12.0</version>
            </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.<init>(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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Python中的pandas库将时间序列数据存储到DataFrame中,然后使用pandas的to_excel()方法将其输出到Excel文件中。 首先,需要使用pandas中的date_range()函数生成时间索引,确定时间范围从2018-01-01 08:00:00到2020-12-30 00:00:00,每小时取一个值。 其次,使用pandas中的DataFrame()函数创建一个新的DataFrame并将时间索引设置为刚才生成的时间索引。 最后,使用DataFrame的to_excel()方法将其输出到Excel文件中。 代码示例如下: ``` python import pandas as pd # 生成时间索引 time_index = pd.date_range('2018-01-01 08:00:00', '2020-12-30 00:00:00', freq='H') # 创建新的DataFrame并将时间索引设置为刚才生成的时间索引 df = pd.DataFrame(index=time_index) # 输出到Excel文件 df.to_excel('output.xlsx') ``` ### 回答2: 首先,我们需要计算从2018年1月1日08:00:00到20201230日00:00:00的总小时数。我们可以使用日期时间函数来完成这个计算。 首先,计算起始日期和结束日期之间的总天数。起始日期是2018年1月1日08:00:00,结束日期是20201230日00:00:00。计算这两个日期之间的天数,可以使用以下公式: =end_date - start_date + 1 其中,"+1"是因为起始日期所占的一天也要计算在内。 接下来,计算总小时数。因为每天有24小时,所以总小时数等于总天数乘以24。公式如下: total_hours = total_days * 24 现在我们知道了从起始日期到结束日期的总小时数,我们可以使用循环来逐小时生成日期时间,并将其写入Excel文件。我们可以使用Python中的openpyxl库来实现这个功能。 首先,导入必要的库: import openpyxl from datetime import datetime, timedelta 然后,创建一个新的Excel工作簿: workbook = openpyxl.Workbook() sheet = workbook.active 接下来,设置起始日期和结束日期: start_date = datetime(2018, 1, 1, 8, 0, 0) end_date = datetime(2020, 12, 30, 0, 0, 0) 然后,用循环生成连续的日期时间,并将其写入Excel文件: current_date = start_date for i in range(total_hours): sheet.cell(row=i+1, column=1).value = current_date current_date += timedelta(hours=1) 最后,保存Excel文件: workbook.save('output.xlsx') 以上就是将2018年1月1日08:00:00到20201230日00:00:00的连续时间每小时取一个值,并输出为Excel文件的步骤。 ### 回答3: 要将2018-01-01 08:00:00到2020-12-30 00:00:00这个时间范围内每小时连续取一个值,并输出到Excel文件中,可以使用Python编程语言中的pandas和openpyxl库来实现。 首先,我们需要导入所需的库: ```python import pandas as pd from openpyxl import Workbook ``` 接下来,我们可以创建一个日期范围,从2018-01-01 08:00:00到2020-12-30 00:00:00,每小时的频率,并将其存储在一个DataFrame中: ```python start_date = pd.Timestamp('2018-01-01 08:00:00') end_date = pd.Timestamp('2020-12-30 00:00:00') date_range = pd.date_range(start=start_date, end=end_date, freq='1H') df = pd.DataFrame(date_range, columns=['Timestamp']) ``` 然后,我们可以向DataFrame中添加其他需要的列,例如年、月、日和小时: ```python df['Year'] = df['Timestamp'].dt.year df['Month'] = df['Timestamp'].dt.month df['Day'] = df['Timestamp'].dt.day df['Hour'] = df['Timestamp'].dt.hour ``` 最后,我们可以使用openpyxl库将DataFrame保存到Excel文件中: ```python output_file = 'output.xlsx' with pd.ExcelWriter(output_file, engine='openpyxl') as writer: df.to_excel(writer, index=False) ``` 完整的代码如下: ```python import pandas as pd from openpyxl import Workbook start_date = pd.Timestamp('2018-01-01 08:00:00') end_date = pd.Timestamp('2020-12-30 00:00:00') date_range = pd.date_range(start=start_date, end=end_date, freq='1H') df = pd.DataFrame(date_range, columns=['Timestamp']) df['Year'] = df['Timestamp'].dt.year df['Month'] = df['Timestamp'].dt.month df['Day'] = df['Timestamp'].dt.day df['Hour'] = df['Timestamp'].dt.hour output_file = 'output.xlsx' with pd.ExcelWriter(output_file, engine='openpyxl') as writer: df.to_excel(writer, index=False) ``` 运行这段代码将生成一个名为output.xlsx的Excel文件,其中包含从2018-01-01 08:00:00到2020-12-30 00:00:00每小时连续取一个值的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值