全部产品
云市场

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

更新时间:2019-09-29 12:16:03

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

迁移方案

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

  • 两步迁移

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

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

  • 直接迁移

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

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

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

迁移架构图

迁移架构图

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

前提条件

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

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

  1. ├── pom.xml
  2. ├── src
  3. └── main
  4. └── java
  5. └── com
  6. └── alibaba
  7. └── edas
  8. └── 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的目录结构如下:

  1. ├── pom.xml
  2. ├── src
  3. ├── main
  4. ├── java
  5. └── com
  6. └── alibaba
  7. └── edas
  8. └── hsf
  9. └── provider
  10. └── DemoServiceImpl.java
  11. ├── resources
  12. └── hsf-provider-beans.xml
  13. └── webapp
  14. └── WEB-INF
  15. └── web.xml

步骤一:在 pom.xml 中增加 Dubbo 相关依赖

老版本的 HSF 采用依赖的是比较老的 Spring 版本 2.5.6,建议直接升级到 4.x 版本。

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

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

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

    • dubbo:标准的 Dubbo 依赖。

    1. <dependency>
    2. <groupId>com.alibaba.edas</groupId>
    3. <artifactId>edas-dubbo-extension</artifactId>
    4. <version>2.0.5</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.apache.dubbo</groupId>
    8. <artifactId>dubbo</artifactId>
    9. <version>2.7.3</version>
    10. </dependency>
    11. <dependency>
    12. <groupId>log4j</groupId>
    13. <artifactId>log4j</artifactId>
    14. </dependency>

步骤二:将 hsf-provider-beans.xml 修改为 dubbo-provider-beans.xml

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

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  4. xmlns="http://www.springframework.org/schema/beans"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
  6. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
  7. <dubbo:application name="edas-dubbo-demo-provider"/>
  8. <dubbo:registry id="edas" address="edas://127.0.0.1:8080">
  9. <!-- This means Dubbo services will be registered as HSF format, so that hsf consumer can discover it. -->
  10. <dubbo:parameter key="hsf.enable" value="true"/>
  11. </dubbo:registry>
  12. <bean id="demoService" class="com.alibaba.edas.dubbo.provider.DemoServiceImpl"/>
  13. <dubbo:service interface="com.alibaba.edas.DemoService" ref="demoService" group="HSF" version="1.0.0"/>
  14. </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 客户端无法正常调用。

步骤三:在 web.xml 文件中将 hsf-provider-beans.xml 替换为 dubbo-provider-beans.xml

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

  1. <!DOCTYPE web-app PUBLIC
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
  4. <web-app>
  5. <display-name>Archetype Created Web Application</display-name>
  6. <context-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:dubbo-provider-beans.xml</param-value>
  9. </context-param>
  10. <listener>
  11. <listener-class>
  12. org.springframework.web.context.ContextLoaderListener
  13. </listener-class>
  14. </listener>
  15. </web-app>

本地验证

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

验证服务注册

请按照以下步骤验证服务提供者是否能正常注册到 EDAS 轻量级配置及注册中心。

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

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

  3. 执行mvn clean package命令将,将edas-hsf-demo-provider-war打成 WAR 包。

    成功之后会在edas-hsf-demo-provider-waredas-dubbo-demo-provider-war这两个工程的 target 目录下,找到两个 WAR 包,分别对应 HSF 和 Dubbo 的服务。

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

    注意:启动两个 Tomcat 的端口可能会冲突,假设使用命令行方式部署,在 Tomcat 的conf/server.xml文件中搜索80058080端口,修改为不冲突的两个端口。

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

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

    注册验证-服务提供者

验证服务消费者调用

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

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

    1. ├── pom.xml
    2. ├── src
    3. ├── main
    4. ├── java
    5. └── com
    6. └── alibaba
    7. └── edas
    8. └── hsf
    9. └── consumer
    10. └── IndexServlet.java
    11. ├── resources
    12. └── hsf-consumer-beans.xml
    13. └── webapp
    14. └── WEB-INF
    15. └── web.xml

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

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

  3. 登录轻量级配置及注册中心控制台,发现 HSF 服务消费者并没有数据在控制台里面展现,这是正常现象。

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

    1. curl http://localhost:8280/edas-hsf-demo-consumer/index.htm
  5. 观察edas-hsf-demo-consumer.war所对应的 Ali-Tomcat 的标准输出,发现以下内容:

    1. Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
    2. Received: Hello hsf, response from dubbo provider: 30.5.124.128:20880
    3. Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
    4. Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
    5. Received: Hello hsf, response from dubbo provider: 30.5.124.128:20880
    6. Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
    7. Received: Hello hsf, response from dubbo provider: 30.5.124.128:20880
    8. Received: Hello hsf, response from dubbo provider: 30.5.124.128:20880
    9. Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
    10. Received: Hello hsf, response from hsf provider: /30.5.124.128:62385
    11. 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

步骤一:在 pom.xml 中增加 Dubbo 相关依赖

和服务提供者迁移的操作一致,主要添加dubbodubbo-edas-extension依赖,删除edas-sdk依赖。详情请参见在 pom.xml 中增加 Dubbo 相关依赖(服务端)

步骤二:将 hsf-comsumer-beans.xml 修改为 dubbo-consumer-beans.xml

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

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

需要修改为dubbo-consumer-beans.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  4. xmlns="http://www.springframework.org/schema/beans"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
  6. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
  7. <dubbo:application name="edas-dubbo-demo-consumer"/>
  8. <dubbo:registry id="edas" address="edas://127.0.0.1:8080">
  9. <!-- This means Dubbo consumer will subscribe HSF services -->
  10. <dubbo:parameter key="hsf.enable" value="true"/>
  11. </dubbo:registry>
  12. <dubbo:reference id="demoService" interface="com.alibaba.edas.DemoService" group="HSF" version="1.0.0" check="false"/>
  13. </beans>

说明

  1. Dubbo 的注册中心地址需要以为edas://开头
  2. 配置<dubbo:service>标签的时候,需要指定groupversion,且groupversion务必要和服务提供者保持一致。默认的情况下,groupHSFversion1.0.0
  3. 需要添加check="false"配置。这个参数表示服务消费者在启动的时候如果没有服务端地址不会立刻失败,因为服务提供者地址推送是异步的,地址可能会比启动流程晚一些再推送到服务消费者。
  4. 需要增加<dubbo:parameter key="hsf.enable" value="true"/>配置,表明服务消费者订阅服务提供者的数据。

步骤三:在 web.xml 文件中将 hsf-consumer-beans.xml 替换为 dubbo-comsumer-beans.xml

只需要把hsf-consumer-beans.xml替换为dubbo-consumer-beans.xml即可。

本地验证

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

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

    注意避免端口冲突。

  2. 观察轻量级配置及注册中心的控制台,发现有一个 Dubbo 服务消费者注册上来。

    注册验证-服务消费者

  3. 使用curl命令访问如下链接:

    1. curl http://localhost:8280/edas-dubbo-demo-consumer/index.htm
  4. 观察客户端 Apache Tomcat 的标准输出,发现如下内容:

    1. Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
    2. Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
    3. Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
    4. Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
    5. Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
    6. Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
    7. Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
    8. Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
    9. Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
    10. Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
    11. Received: Hello dubbo, response from hsf provider: /30.5.124.128:12202
    12. Received: Hello dubbo, response from dubbo provider: 30.5.124.128:20880
    13. 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 个应用中。详情请参见应用部署概述

    为了确保能在本地通过 HTTP 访问到 EDAS 的服务消费者,请确保服务消费者的8080端口能够被公网访问。

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

    1. 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,观察到以下日志:

    查看日志

    这说明 HSF 服务消费者消费到了 HSF 和 Dubbo 的服务。

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

    1. 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,观察到以下日志。

    查看日志-调用

    这说明 Dubbo 服务消费者消费到了 HSF 和 Dubbo 的服务。

FAQ

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

异常信息

  1. 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"配置:

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

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

2. HSF 服务消费者调用 Dubbo 服务异常

异常信息

  1. 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
  2. java.lang.NumberFormatException: For input string: ""
  3. at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  4. at java.lang.Integer.parseInt(Integer.java:592)
  5. at java.lang.Integer.parseInt(Integer.java:615)
  6. at org.apache.dubbo.common.Version.parseInt(Version.java:133)
  7. at org.apache.dubbo.common.Version.getIntVersion(Version.java:118)
  8. at org.apache.dubbo.common.Version.isSupportResponseAttachment(Version.java:102)
  9. at org.apache.dubbo.rpc.protocol.dubbo.DubboCodec.encodeResponseData(DubboCodec.java:195)
  10. at org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.encodeResponse(ExchangeCodec.java:283)
  11. at org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.encode(ExchangeCodec.java:71)
  12. at org.apache.dubbo.rpc.protocol.dubbo.DubboCountCodec.encode(DubboCountCodec.java:40)
  13. at org.apache.dubbo.remoting.transport.netty4.NettyCodecAdapter$InternalEncoder.encode(NettyCodecAdapter.java:70)
  14. ...

可能的原因

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

解决办法

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

3. Dubbo 服务消费者调用 HSF 服务提供者失败

异常信息

  1. 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]
  2. com.taobao.hsf.io.remoting.dubbo2.Dubbo2PacketFactory.serverCreate(Dubbo2PacketFactory.java:284)
  3. com.taobao.hsf.io.stream.AbstractServerStream.write(AbstractServerStream.java:25)
  4. com.taobao.hsf.io.RpcOutput.flush(RpcOutput.java:37)
  5. com.taobao.hsf.remoting.provider.ProviderProcessor$OutputCallback.operationComplete(ProviderProcessor.java:155)
  6. com.taobao.hsf.remoting.provider.ProviderProcessor$OutputCallback.operationComplete(ProviderProcessor.java:130)
  7. com.taobao.hsf.util.concurrent.AbstractListener.run(AbstractListener.java:18)
  8. com.taobao.hsf.invocation.AbstractContextAwareRPCCallback.access$001(AbstractContextAwareRPCCallback.java:12)
  9. com.taobao.hsf.invocation.AbstractContextAwareRPCCallback$1.run(AbstractContextAwareRPCCallback.java:27)
  10. com.taobao.hsf.util.concurrent.WrappedListener.run(WrappedListener.java:34)
  11. com.taobao.hsf.invocation.AbstractContextAwareRPCCallback.run(AbstractContextAwareRPCCallback.java:36)
  12. com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:456)
  13. com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:817)
  14. com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:595)
  15. com.taobao.hsf.util.concurrent.DefaultListenableFuture.addListener(DefaultListenableFuture.java:32)
  16. com.taobao.hsf.remoting.provider.ProviderProcessor.handleRequest(ProviderProcessor.java:55)
  17. com.taobao.hsf.io.remoting.dubbo2.message.Dubbo2ServerHandler$1.run(Dubbo2ServerHandler.java:65)
  18. java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  19. java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  20. java.lang.Thread.run(Thread.java:748)

可能的原因

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

解决办法

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

4. Dubbo 服务消费者调用 HSF 服务提供者失败

异常信息

  1. 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
  2. java.lang.StackOverflowError: null
  3. at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:57)
  4. at sun.reflect.UnsafeByteFieldAccessorImpl.setByte(UnsafeByteFieldAccessorImpl.java:98)
  5. at java.lang.reflect.Field.setByte(Field.java:838)
  6. at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer$ByteFieldDeserializer.deserialize(JavaDeserializer.java:452)
  7. at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:276)
  8. at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:203)
  9. at com.alibaba.com.xxxxxx.hessian.io.SerializerFactory.readObject(SerializerFactory.java:532)
  10. at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2820)
  11. at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2743)
  12. at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2278)
  13. at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2080)
  14. at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2074)
  15. at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:406)
  16. at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:276)
  17. at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:203)
  18. at com.alibaba.com.xxxxxx.hessian.io.SerializerFactory.readObject(SerializerFactory.java:532)
  19. at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2820)
  20. at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2743)
  21. at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2278)
  22. at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2080)
  23. at com.alibaba.com.xxxxxx.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2074)
  24. at com.alibaba.com.xxxxxx.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:406)
  25. ...

可能的原因

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

解决办法

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