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

迁移方案

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

  • 两步迁移
    1. 将 HSF+ EDAS 注册中心迁移到 Dubbo+ EDAS 注册中心。
    2. EDAS 注册中心迁移到 Nacos。

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

  • 直接迁移

    将 HSF+ EDAS 注册中心直接迁移到 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 包部署的描述符。

迁移主要是修改 3 个 XML 文件。

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 服务注册到 EDAS 注册中心,以及以 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 和端口可以维持开发态,部署的时候 EDAS 会自动替换成线上的地址。
    • 需要增加 <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 应用能够注册到本地的注册中心,需要修改 host 文件(例如 /etc/host), 添加如下条目到 host 文件中。
        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 文件中搜索 800 5和 8080 端口,将其修改为互不冲突的端口。
      5. 访问轻量级配置及注册中心(http://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 的标准输出,发现以下内容:
        Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
        Received: Hello hsf, response from dubbo provider: 30.5.124.128:20880
        Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
        Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
        Received: Hello hsf, response from dubbo provider: 30.5.124.128:20880
        Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
        Received: Hello hsf, response from dubbo provider: 30.5.124.128:20880
        Received: Hello hsf, response from dubbo provider: 30.5.124.128:20880
        Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
        Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
        Received: Hello hsf, response from hsf provider: /30.5.124.128:62385

        表示 HSF 客户端同时调用到了 Dubbo 和 HSF 提供的服务。

迁移服务消费者

基于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-comsumer-beans.xml。
  4. 本地验证。
    本地验证包括两部分:验证服务是否注册到轻量级配置及注册中心和验证能否正常调用 HSF 和 Dubbo 服务。
    1. 将上述工程打包为 edas-dubbo-demo-consumer.war,部署到 Apache Tomcat 下。
      注意 请避免端口冲突。
    2. 登录轻量级配置及注册中心的控制台,是否存在 Dubbo 服务消费者注册上来。
      如果有,表示服务注册成功。服务注册成功
    3. 使用 curl 命令访问http://localhost:8280/edas-dubbo-demo-consumer/index.htm
      curl http://localhost:8280/edas-dubbo-demo-consumer/index.htm
    4. 观察客户端 Apache Tomcat 的标准输出。
      Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
      Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
      Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
      Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
      Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
      Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
      Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
      Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
      Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
      Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
      Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
      Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
      Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880

      表示 Dubbo 服务消费者消费了 HSF 和 Dubbo 的服务。

将应用部署到 EDAS 并验证

本文采用 ECS 集群方式部署,在 EDAS 中创建 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 个应用中。详情请参见部署应用到EDAS
  2. 执行以下命令,测试服务消费者edas-hsf-demo-consumer能够调用到 HSF 和 Dubbo 的服务提供者。
    curl http://39.106.76.128:8080/index.htm
  3. 在 edas-hsf-demo-consumer 应用的 Ali-Tomcat 的标准输出中查看日志,如 /home/admin/taobao-tomcat-production-7.0.59.3/logs/catalina.out
     Ali-Tomcat 的标准输出中查看日志

    表示 HSF 服务消费者消费到了 HSF 和 Dubbo 的服务。

  4. 执行以下命令,测试 edas-dubbo-demo-consumer 能否调用到 HSF 和 Dubbo 的 Provider。
    curl http://39.106.74.16:8080/index.htm
  5. 在 edas-dubbo-demo-consumer 应用 Apache Tomcat 的标准输出中查看日志,例如 /home/admin/apache-tomcat-7.0.91/logs/catalina.out
    Apache Tomcat 的标准输出中查看日志

    表示 Dubbo 服务消费者消费到了 HSF 和 Dubbo 的服务。

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.0.48]
            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。