将应用从HSF架构迁移到Dubbo(Ali-Tomcat)

本文介绍如何使用Ali-Tomcat将使用HSF框架开发的应用迁移为Dubbo框架开发的应用。

迁移方案

迁移的最终目标是从HSF+SAE注册中心迁移到Dubbo+Nacos。目前有两种方案:

  • 两步迁移

    1. 将HSF+SAE注册中心迁移到Dubbo+SAE注册中心。

    2. SAE注册中心迁移到Nacos。

    优势是相对比较稳定,适合小步迭代。缺点是需要应用发布两次。

  • 直接迁移

    将HSF+SAE注册中心直接迁移到Dubbo+Nacos。

    目前HSF尚不支持Nacos,需要额外开发。

如果应用想快速迁移到Dubbo并上线,建议采用第一种方案,从稳定性角度考虑也推荐第一种方案。下文将介绍如何进行两步迁移。

迁移架构图

HSF迁移Dubbo结构图

Dubbo服务在服务注册的时候,同时注册成HSF和Dubbo的格式,保证HSF的服务消费者也发现Dubbo服务。Dubbo服务消费者在订阅的时候,同时订阅HSF和Dubbo格式的数据,保证Dubbo的消费者也能发现HSF的服务。

前提条件

迁移过程中需要依赖以下组件:

假设HSF和Dubbo服务都继承自同一个接口,将这个接口单独剥离出来,命名为edas-demo-interface,只包含一个接口声明,目录如下:

├── pom.xml
├── src
│ └── main
│     └── java
│         └── com
│             └── alibaba
│                 └── edas
│                     └── DemoService.java

迁移服务提供者

假设待迁移的HSF应用为edas-hsf-demo-provider-war,主要包含以下文件:

  • pom.xml:应用的模块之间依赖关系的配置文件。

  • DemoServiceImpl.java:DemoService的实现。

  • hsf-provider-beans.xml:HSF的Spring Bean声明文件。

  • web.xml:用于WAR包部署的描述符。

edas-hsf-demo-provider-war的目录结构如下:

├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │     └── alibaba
│ │ │         └── edas
│ │ │             └── hsf
│ │ │                 └── provider
│ │ │                     └── DemoServiceImpl.java
│ │ ├── resources
│ │ │ └── hsf-provider-beans.xml
│ │ └── webapp
│ │     └── WEB-INF
│ │         └── web.xml
  1. pom.xml中增加Dubbo相关依赖。

    HSF依赖的Spring版本建议使用4.x或其以上版本。

    1. 删除HSF的客户端依赖。

      <dependency>
                  <groupId>com.alibaba.edas</groupId>
                  <artifactId>edas-sdk</artifactId>
                  <version>1.5.4</version>
      </dependency>
    2. 增加Dubbo相关依赖。

      • edas-dubbo-extension:主要解决的是将Dubbo服务注册到SAE注册中心,以及以HSF格式方式对Dubbo服务进行注册和订阅。完整的pom.xml文件请参考示例代码。

      • dubbo:标准的Dubbo依赖。

      <dependency>
                  <groupId>com.alibaba.edas</groupId>
                  <artifactId>edas-dubbo-extension</artifactId>
                  <version>2.0.5</version>
              </dependency>
              <dependency>
                  <groupId>org.apache.dubbo</groupId>
                  <artifactId>dubbo</artifactId>
                  <version>2.7.3</version>
              </dependency>
              <dependency>
                  <groupId>log4j</groupId>
                  <artifactId>log4j</artifactId>
              </dependency>
  2. hsf-provider-beans.xml修改为dubbo-provider-beans.xml

    hsf-provider-beans.xml文件配置如下。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:hsf="http://www.taobao.com/hsf"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.taobao.com/hsf
           http://www.taobao.com/hsf/hsf.xsd" default-autowire="byName">
        <bean id="itemService" class="com.alibaba.edas.hsf.provider.DemoServiceImpl" />
    
        <!-- 提供一个服务示例 -->
        <hsf:provider id="demoService" interface="com.alibaba.edas.DemoService"
            ref="itemService" version="1.0.0">
        </hsf:provider>
    </beans>

    需要修改为dubbo-provider-beans.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <dubbo:application name="edas-dubbo-demo-provider"/>
        <dubbo:registry id="edas" address="edas://127.0.0.1:8080">
            <!-- This means Dubbo services will be registered as HSF format, so that hsf consumer can discover it. -->
            <dubbo:parameter key="hsf.enable" value="true"/>
        </dubbo:registry>
        <bean id="demoService" class="com.alibaba.edas.dubbo.provider.DemoServiceImpl"/>
        <dubbo:service interface="com.alibaba.edas.DemoService" ref="demoService" group="HSF" version="1.0.0"/>
    </beans>
    说明
    • Dubbo的注册中心需要配置为edas://127.0.0.1:8080。必须要以edas前缀开头,后续的IP地址和端口可以维持开发态,部署的时候SAE会自动替换成线上的地址。

    • 需要增加<dubbo:parameter key="hsf.enable" value="true"/>,表示Dubbo服务在注册的时候会同时注册成HSF格式和Dubbo格式,确保HSF客户端可以发现该服务。

    • 配置<dubbo:service>标签的时候,需要显示指定group和version,默认的group为HSF,版本号为1.0.0,否则HSF客户端无法正常调用。

  3. 在web.xml文件中将hsf-provider-beans.xml替换为dubbo-provider-beans.xml

    只需要将hsf-provider-beans.xml替换为dubbo-provider-beans.xml

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:dubbo-provider-beans.xml</param-value>
        </context-param>
        <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
        </listener>
    </web-app>
  4. 本地验证。

    本地验证包括两部分:验证服务注册和验证服务消费者调用。

    1. 验证服务注册。

      1. 为了使HSF应用能够注册到本地的注册中心,需要修改hosts文件(例如/etc/hosts),添加如下条目到hosts文件中。

        127.0.0.1     jmenv.tbsite.net
      2. 下载轻量级配置及注册中心,并解压后进入bin目录,执行./startup.sh命令启动轻量级配置中心。

      3. 执行mvn clean package命令将edas-hsf-demo-provider-war编译为WAR格式的程序包。

        编译完成后文件存放在应用工程的target目录下。

      4. edas-hsf-demo-provider.war部署到Ali-Tomcat下,将edas-dubbo-demo-provider.war部署到Apache Tomcat下。

        说明

        启动两个Tomcat的端口可能会冲突,请在Tomcat的conf/server.xml文件中搜索8005和8080端口,将其修改为互不冲突的端口。

      5. 访问轻量级配置及注册中心(https://127.0.0.1:8080/#/serviceManagement),查看com.alibaba.edas.DemoService:1.0.0服务。

        如果服务已经注册,而且实例数为2,说明Dubbo和HSF的服务已经被注册成同一个HSF格式的服务了。

        服务注册

    2. 验证服务消费者调用。

      请按照以下步骤验证迁移后的服务提供者是否能被消费者正常调用。

      1. 准备测试的HSF服务消费者,如edas-hsf-demo-consumer-war,目录如下:

        ├── pom.xml
        ├── src
        │ ├── main
        │ │ ├── java
        │ │ │ └── com
        │ │ │     └── alibaba
        │ │ │         └── edas
        │ │ │             └── hsf
        │ │ │                 └── consumer
        │ │ │                     └── IndexServlet.java
        │ │ ├── resources
        │ │ │ └── hsf-consumer-beans.xml
        │ │ └── webapp
        │ │     └── WEB-INF
        │ │         └── web.xml

        它提供了一个Servlet,当接收到HTTP请求的时候,发起HSF调用。

        public class IndexServlet extends HttpServlet {
        
            private DemoService demoService;
        
            @Override
            public void init() {
                WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
                this.demoService = (DemoService) wac.getBean("demoService");
            }
        
            @Override
            public void doGet( HttpServletRequest req, HttpServletResponse resp ) {
                String result = demoService.sayHello("hsf");
                System.out.println("Received: " + result);
            }
        }
      2. 执行mvn clean package命令,将edas-hsf-demo-consumer-war编译为edas-hsf-demo-consumer.war,并将其部署到另外一个Ali-Tomcat中,注意避免端口冲突。

      3. 登录轻量级配置及注册中心控制台。

        如果发现HSF服务消费者没有数据在控制台里面展现,属于正常。

      4. 启动Ali-Tomcat后,访问如下的URL:

        curl http://localhost:8280/edas-hsf-demo-consumer/index.htm
      5. 观察edas-hsf-demo-consumer.war所对应的Ali-Tomcat的标准输出。

        如果输出类似如下内容,那么表示HSF客户端同时调用到了Dubbo和HSF提供的服务。

        Received: Hello hsf, response from hsf provider: /192.168.XX.XX:62385
        Received: Hello hsf, response from dubbo provider: 192.168.XX.XX:20880
        Received: Hello hsf, response from hsf provider: /192.168.XX.XX:62385
        Received: Hello hsf, response from hsf provider: /192.168.XX.XX:62385
        Received: Hello hsf, response from dubbo provider: 192.168.XX.XX:20880
        Received: Hello hsf, response from hsf provider: /192.168.XX.XX:62385
        Received: Hello hsf, response from dubbo provider: 192.168.XX.XX:20880
        Received: Hello hsf, response from dubbo provider: 192.168.XX.XX:20880
        Received: Hello hsf, response from hsf provider: /192.168.XX.XX:62385
        Received: Hello hsf, response from hsf provider: /192.168.XX.XX:62385
        Received: Hello hsf, response from hsf provider: /192.168.XX.XX:62385

迁移服务消费者

基于edas-hsf-demo-consumer-war进行迁移,迁移为edas-dubbo-demo-consumer-war

  1. pom.xml中增加Dubbo相关依赖。

    迁移服务消费者操作和服务提供者迁移的相同,主要添加dubbo、dubbo-edas-extension依赖,删除edas-sdk依赖。具体操作请参见“迁移服务提供者”的在pom.xml中增加Dubbo相关依赖步骤。

  2. hsf-comsumer-beans.xml修改为dubbo-consumer-beans.xml

    hsf-consumer-beans.xml文件配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:hsf="http://www.taobao.com/hsf"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.taobao.com/hsf
           http://www.taobao.com/hsf/hsf.xsd" default-autowire="byName">
    
        <!-- 消费一个服务示例 -->
        <hsf:consumer id="demoService" interface="com.alibaba.edas.DemoService" version="1.0.0">
        </hsf:consumer>
    </beans>

    修改为dubbo-consumer-beans.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <dubbo:application name="edas-dubbo-demo-consumer"/>
        <dubbo:registry id="edas" address="edas://127.0.0.1:8080">
            <!-- This means Dubbo consumer will subscribe HSF services -->
            <dubbo:parameter key="hsf.enable" value="true"/>
        </dubbo:registry>
        <dubbo:reference id="demoService" interface="com.alibaba.edas.DemoService" group="HSF" version="1.0.0" check="false"/>
    </beans>
    说明
    • Dubbo的注册中心地址须以 edas://开头。

    • 配置<dubbo:service>标签,需要指定groupversion,且groupversion须与服务提供者保持一致。默认group为HSF,version为1.0.0。

    • 添加check="false"配置,表示服务消费者应用在启动时如果没有服务端地址,那么该应用不会立刻失败。

    • 增加<dubbo:parameter key="hsf.enable" value="true"/>配置,表示服务消费者订阅了服务提供者的数据。

  3. web.xml文件中将hsf-consumer-beans.xml替换为dubbo-consumer-beans.xml

  4. 本地验证。

    本地验证包括两部分:验证服务是否注册到轻量级配置及注册中心和验证能否正常调用HSF和Dubbo服务。

    1. 将上述工程打包为edas-dubbo-demo-consumer.war,部署到Apache Tomcat下。

      重要

      请避免端口冲突。

    2. 登录轻量级配置及注册中心控制台,检查Dubbo服务消费者是否成功注册。

      在控制台上如果显示注册成功的消费者服务,那么表示服务注册成功。服务注册成功

    3. 访问http://localhost:8280/edas-dubbo-demo-consumer/index.htm

      curl http://localhost:8280/edas-dubbo-demo-consumer/index.htm
    4. 观察客户端Apache Tomcat的标准输出。

      如果输出类似如下内容,那么表示Dubbo服务消费者消费了HSF和Dubbo的服务。

      Received: Hello dubbo, response from dubbo provider: 192.168.XX.XX:20880
      Received: Hello dubbo, response from dubbo provider: 192.168.XX.XX:20880
      Received: Hello dubbo, response from hsf provider: /192.168.XX.XX:12202
      Received: Hello dubbo, response from hsf provider: /192.168.XX.XX:12202
      Received: Hello dubbo, response from dubbo provider: 192.168.XX.XX:20880
      Received: Hello dubbo, response from hsf provider: /192.168.XX.XX:12202
      Received: Hello dubbo, response from hsf provider: /192.168.XX.XX:12202
      Received: Hello dubbo, response from dubbo provider: 192.168.XX.XX:20880
      Received: Hello dubbo, response from dubbo provider: 192.168.XX.XX:20880
      Received: Hello dubbo, response from hsf provider: /192.168.XX.XX:12202
      Received: Hello dubbo, response from hsf provider: /192.168.XX.XX:12202
      Received: Hello dubbo, response from dubbo provider: 192.168.XX.XX:20880
      Received: Hello dubbo, response from dubbo provider: 192.168.XX.XX:20880

将应用部署到SAE并验证

在SAE中创建4个应用:

  • edas-dubbo-demo-consumer:迁移后的服务消费者应用,运行环境为Apache Tomcat 7.0.91。

  • edas-dubbo-demo-provider:迁移后的服务提供者应用,运行环境为Apache Tomcat 7.0.91。

  • edas-hsf-demo-consumer:迁移前的服务消费者应用,运行环境EDAS-Container v3.5.4。

  • edas-hsf-demo-provider:迁移前的服务提供者应用,运行环境为EDAS-Container v3.5.4。

  1. 分别将4个WAR包部署到4个应用中。具体操作,请参见部署应用到SAE

  2. 执行以下命令,测试服务消费者edas-hsf-demo-consumer能够调用到HSF和Dubbo的服务提供者。

    curl http://39.106.XX.XXX:8080/index.htm
  3. 在edas-hsf-demo-consumer应用的Ali-Tomcat的标准输出中查看日志。如/home/admin/taobao-tomcat-production-7.0.XX.X/logs/catalina.out

    如果显示类似下图所示内容,那么表示HSF服务消费者消费到了HSF和Dubbo的服务。

     Ali-Tomcat的标准输出中查看日志

  4. 执行以下命令,测试edas-dubbo-demo-consumer能否调用到HSF和Dubbo的Provider。

    curl http://192.168.XX.XX:8080/index.htm
  5. 在edas-dubbo-demo-consumer应用Apache Tomcat的标准输出中查看日志,例如/home/admin/apache-tomcat-7.0.91/logs/catalina.out

    如果显示类似下图所示内容,那么表示Dubbo服务消费者消费到了HSF和Dubbo的服务。

    Apache Tomcat的标准输出中查看日志

FAQ

  • Dubbo服务消费者启动后,提示找不到服务提供者地址。

    问题现象

    java.lang.IllegalStateException: Failed to check the status of the service com.xxxx.xxxxx.service.xxxxxConfigService. No provider available for the service HSF/com.xxxxx.xxxxx.service.xxxxxxxxxxService:1.0.0 from the url edas://127.0.0.1:8080/org.apache.dubbo.registry.RegistryService?application=xxxx-flow-center-bj&dubbo=2.0.2&group=HSF&interface=com.xxxx.xxxxxx.service.xxxxxxxxxxService&lazy=false&methods=queryConfigs,getConfig,saveConfig&pid=11596&register.ip=xxx.xx.xx.xxx&release=2.7.3&revision=1.0.1-SNAPSHOT&side=consumer&sticky=false&timeout=2000&timestamp=1564242421194&version=1.0.0 to the consumer xxx.xx.xx.xxx use dubbo version 2.7.3

    可能原因

    注册中心的地址推送为异步推送,启动过程中Dubbo默认会检查服务提供者是否有可用地址。如果没有,则会抛出该异常。

    解决方案

    在Dubbo的<dubbo:reference> 标签中增加check="false"配置:

    <dubbo:reference id="demoService" interface="com.alibaba.edas.DemoService" group="HSF" version="1.0.0" check="false"/>

    该参数表示Dubbo启动过程中不会去检查提供者地址是否可用。但是,如果业务初始化逻辑里面有需要调用Dubbo服务的话,这种情况下业务可能会失败。

  • HSF服务消费者调用Dubbo服务异常。

    问题现象

    2019-07-28 23:07:38.005 [WARN ] [cf67433d1e7a44412a518bd190100d176-node401] [NettyServerWorker-6-1] [o.a.d.r.exchange.codec.ExchangeCodec:91] |  [DUBBO] Fail to encode response: Response [id=343493, version=HSF2.0, status=20, event=false, error=null, result=AppResponse [value=FlowControlDto(postWeightDtoHashMap={614215325=PostWeightDto(postId=614215325, weight=1.0, postSourceType=null)}), exception=null]], send bad_response info instead, cause: For input string: "", dubbo version: 2.7.3, current host: xxx.xx.xx.xxx
    java.lang.NumberFormatException: For input string: ""
      at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
      at java.lang.Integer.parseInt(Integer.java:592)
      at java.lang.Integer.parseInt(Integer.java:615)
      at org.apache.dubbo.common.Version.parseInt(Version.java:133)
      at org.apache.dubbo.common.Version.getIntVersion(Version.java:118)
      at org.apache.dubbo.common.Version.isSupportResponseAttachment(Version.java:102)
      at org.apache.dubbo.rpc.protocol.dubbo.DubboCodec.encodeResponseData(DubboCodec.java:195)
      at org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.encodeResponse(ExchangeCodec.java:283)
      at org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.encode(ExchangeCodec.java:71)
      at org.apache.dubbo.rpc.protocol.dubbo.DubboCountCodec.encode(DubboCountCodec.java:40)
      at org.apache.dubbo.remoting.transport.netty4.NettyCodecAdapter$InternalEncoder.encode(NettyCodecAdapter.java:70)
      ...

    可能原因

    Dubbo升级到2.7后,HSF对Dubbo的协议兼容性出现问题。

    解决方案

    升级EDAS-container到V3.5.5,该版本的HSF已经修复了该问题。

  • Dubbo服务消费者调用HSF服务提供者失败。

    问题现象

    java.lang.Exception: [HSF-Provider-192.168.0.46] Error log: [HSF-Provider] App [xxxxxxx-3b6f-42d3-xxxx-0ad2434xxxxx] failed to verify the caller signature [null] for [com.alibaba.edas.DemoService:1.0.0] [sayHello] from client [192.168.XX.XX]
        com.taobao.hsf.io.remoting.dubbo2.Dubbo2PacketFactory.serverCreate(Dubbo2PacketFactory.java:284)
        com.taobao.hsf.io.stream.AbstractServerStream.write(AbstractServerStream.java:25)
        com.taobao.hsf.io.RpcOutput.flush(RpcOutput.java:37)
        com.taobao.hsf.remoting.provider.ProviderProcessor$OutputCallback.operationComplete(ProviderProcessor.java:155)
        com.taobao.hsf.remoting.provider.ProviderProcessor$OutputCallback.operationComplete(ProviderProcessor.java:130)
        com.taobao.hsf.util.concurrent.AbstractListener.run(AbstractListener.java:18)
        com.taobao.hsf.invocation.AbstractContextAwareRPCCallback.access$001(AbstractContextAwareRPCCallback.java:12)
        com.taobao.hsf.invocation.AbstractContextAwareRPCCallback$1.run(AbstractContextAwareRPCCallback.java:27)
        com.taobao.hsf.util.concurrent.WrappedListener.run(WrappedListener.java:34)
        com.taobao.hsf.invocation.AbstractContextAwareRPCCallback.run(AbstractContextAwareRPCCallback.java:36)
        com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:456)
        com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:817)
        com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:595)
        com.taobao.hsf.util.concurrent.DefaultListenableFuture.addListener(DefaultListenableFuture.java:32)
        com.taobao.hsf.remoting.provider.ProviderProcessor.handleRequest(ProviderProcessor.java:55)
        com.taobao.hsf.io.remoting.dubbo2.message.Dubbo2ServerHandler$1.run(Dubbo2ServerHandler.java:65)
        java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        java.lang.Thread.run(Thread.java:748)

    可能原因

    HSF开启了调用鉴权,而Dubbo暂时不支持鉴权。

    解决方案

    在HSF服务端增加参数-DneedAuth=false,关闭调用鉴权。

  • Dubbo服务消费者调用HSF服务提供者失败。

    问题现象

    2019-08-02 17:17:15.187 [WARN ] [cf67433d1e7a44412a518bd190100d176-node401] [NettyClientWorker-4-1] [o.a.d.r.p.dubbo.DecodeableRpcResult:91] | [DUBBO] Decode rpc result failed: null, dubbo version: 2.7.3, current host: xxx.xx.xx.xxx
    java.lang.StackOverflowError: null
     at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:57)
     at sun.reflect.UnsafeByteFieldAccessorImpl.setByte(UnsafeByteFieldAccessorImpl.java:98)
     at java.lang.reflect.Field.setByte(Field.java:838)
     at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer$ByteFieldDeserializer.deserialize(JavaDeserializer.java:452)
     at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:276)
     at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:203)
     at com.alibaba.com.xxxxxx.hessian.io.SerializerFactory.readObject(SerializerFactory.java:532)
     at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2820)
     at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2743)
     at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2278)
     at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2080)
     at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2074)
     at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:406)
     at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:276)
     at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:203)
     at com.alibaba.com.xxxxxx.hessian.io.SerializerFactory.readObject(SerializerFactory.java:532)
     at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2820)
     at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2743)
     at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2278)
     at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2080)
     at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2074)
     at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:406)
        ...

    可能原因

    HSF服务提供和依赖的hessian-lite版本较低,不支持JDK 8的LocalDateTime的序列化。

    解决方案

    升级HSF服务端的EDAS-Container的版本到v3.5.5。