Todos los productos
Search
Centro de documentos

Enterprise Distributed Application Service:Migración de aplicaciones de una arquitectura HSF a Dubbo (Ali-Tomcat)

Última actualización: Sep 05, 2026

Este tema explica cómo utilizar Ali-Tomcat para migrar una aplicación del framework HSF al framework Dubbo.

Enfoques de migración

Existen dos enfoques para migrar de un registro HSF+EDAS/ a un registro Dubbo+Nacos:

  • Migración en dos pasos

    1. Migre de un registro HSF+EDAS/ a un registro Dubbo+EDAS/.

    2. Migre el registro de EDAS/ a Nacos.

    Ventaja: Este enfoque es más estable y adecuado para iteraciones incrementales. Desventaja: Requiere dos despliegues.

  • Migración directa

    Migre directamente de un registro HSF+EDAS/ a un registro Dubbo+Nacos.

    Actualmente, HSF no admite Nacos, por lo que este enfoque requiere desarrollo adicional.

Si desea migrar rápidamente su aplicación a Dubbo y desplegarla en producción, se recomienda el primer enfoque por su estabilidad. Esta guía detalla la migración en dos pasos.

Arquitectura de migración

HSF迁移Dubbo结构图

Un servicio Dubbo se registra tanto en formato HSF como en formato Dubbo, lo que permite que los consumidores HSF lo descubran. De igual manera, un consumidor Dubbo se suscribe a ambos formatos, lo que le permite descubrir servicios HSF.

Antes de empezar

El proceso de migración requiere los siguientes componentes:

Suponga que tanto los servicios HSF como Dubbo implementan la misma interfaz. Esta interfaz se encuentra en un módulo separado, edas-demo-interface, que solo contiene una declaración de interfaz y tiene la siguiente estructura de directorio:

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

Migración del proveedor de servicios

Suponga que está migrando la aplicación HSF edas-hsf-demo-provider-war. Contiene los siguientes archivos:

  • pom.xml: Define las dependencias entre los módulos de la aplicación.

  • DemoServiceImpl.java: La implementación de DemoService.

  • hsf-provider-beans.xml: El archivo de definición de beans de Spring para HSF.

  • web.xml: El descriptor de despliegue para el paquete WAR.

La estructura de directorios de edas-hsf-demo-provider-war es la siguiente:

├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │     └── alibaba
│ │ │         └── edas
│ │ │             └── hsf
│ │ │                 └── provider
│ │ │                     └── DemoServiceImpl.java
│ │ ├── resources
│ │ │ └── hsf-provider-beans.xml
│ │ └── webapp
│ │     └── WEB-INF
│ │         └── web.xml
  1. Agregue las dependencias relacionadas con Dubbo a pom.xml.

    Utilice Spring 4.x o posterior para las dependencias de HSF.

    1. Elimine la dependencia del cliente HSF.

      <dependency>
                  <groupId>com.alibaba.edas</groupId>
                  <artifactId>edas-sdk</artifactId>
                  <version>1.5.4</version>
      </dependency>
    2. Agregue las dependencias relacionadas con Dubbo.

      • edas-dubbo-extension: Esta dependencia registra los servicios Dubbo en el registro de EDAS/ y gestiona el registro y la suscripción de servicios Dubbo en formato HSF. Consulte el código de ejemplo para ver el archivo pom.xml completo.

      • dubbo: La dependencia estándar de Dubbo.

      <dependency>
                  <groupId>com.alibaba.edas</groupId>
                  <artifactId>edas-dubbo-extension</artifactId>
                  <version>2.0.6</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. Cambie el nombre del archivo hsf-provider-beans.xml a dubbo-provider-beans.xml y actualice su contenido.

    El archivo original hsf-provider-beans.xml contiene la siguiente configuración:

    <?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" />
        <!-- Provide a service example -->
        <hsf:provider id="demoService" interface="com.alibaba.edas.DemoService"
            ref="itemService" version="1.0.0">
        </hsf:provider>
    </beans>

    Reemplace el contenido de dubbo-provider-beans.xml con lo siguiente:

    <?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>
    Nota
    • La dirección del registro Dubbo debe establecerse en edas://127.0.0.1:8080. Debe comenzar con el prefijo edas. La dirección IP y el puerto son para desarrollo local. Durante el despliegue, EDAS o los reemplaza automáticamente con la dirección de producción.

    • Agregue la configuración <dubbo:parameter key="hsf.enable" value="true"/>. Esto registra el servicio Dubbo tanto en formato HSF como en formato Dubbo, lo que garantiza que los clientes HSF puedan descubrirlo.

    • Al configurar la etiqueta <dubbo:service>, debe especificar explícitamente el grupo y la versión. El grupo suele ser HSF y la versión es 1.0.0. De lo contrario, los clientes HSF no podrán invocar el servicio.

  3. En el archivo web.xml, reemplace hsf-provider-beans.xml por dubbo-provider-beans.xml.

    Solo necesita cambiar el nombre del archivo en el parámetro contextConfigLocation a 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. Compruebe la migración localmente.

    La verificación local consta de dos partes: comprobar el registro del servicio y verificar las llamadas de los consumidores del servicio.

    1. Verifique el registro del servicio.

      1. Para permitir que la aplicación HSF se registre en el registro local, edite su archivo hosts (por ejemplo, /etc/hosts) y agregue la siguiente entrada:

        127.0.0.1     jmenv.tbsite.net
      2. Descargue el centro de registro y configuración ligera, extraiga el paquete, vaya al directorio bin y ejecute el comando ./startup.sh para iniciar el centro.

      3. Ejecute el comando mvn clean package para compilar edas-hsf-demo-provider-war en un paquete WAR.

        El paquete resultante se encuentra en el directorio target del proyecto de la aplicación.

      4. Despliegue edas-hsf-demo-provider.war en Ali-Tomcat y edas-dubbo-demo-provider.war en Apache Tomcat.

        Nota

        Los puertos de las dos instancias de Tomcat podrían entrar en conflicto. En el archivo conf/server.xml de cada instancia de Tomcat, busque los puertos 8005 y 8080 y cámbielos por valores que no generen conflictos.

      5. Acceda al centro de registro y configuración ligera en http://127.0.0.1:8080/#/serviceManagement y compruebe el servicio com.alibaba.edas.DemoService:1.0.0.

        Si el servicio está registrado y el recuento de instancias es 2, esto indica que tanto los servicios Dubbo como HSF están registrados como un único servicio en formato HSF.

    2. Verifique las llamadas de los consumidores del servicio.

      Siga estos pasos para comprobar que los consumidores pueden invocar al proveedor de servicios migrado.

      1. Prepare un consumidor de servicios HSF para realizar pruebas, como edas-hsf-demo-consumer-war, con la siguiente estructura de directorio:

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

        Proporciona un servlet que inicia una llamada HSF al recibir una solicitud HTTP.

        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. Ejecute el comando mvn clean package para compilar edas-hsf-demo-consumer-war en edas-hsf-demo-consumer.war y despliéguelo en otra instancia de Ali-Tomcat. Asegúrese de evitar conflictos de puertos.

      3. Inicie sesión en la consola del centro de registro y configuración ligera.

        Es normal si no se muestran datos del consumidor de servicios HSF en la consola.

      4. Después de iniciar Ali-Tomcat, acceda a la siguiente URL:

        curl http://localhost:8280/edas-hsf-demo-consumer/index.htm
      5. Observe la salida estándar de la instancia de Ali-Tomcat que ejecuta edas-hsf-demo-consumer.war.

        Si aparece una salida similar a la siguiente, se confirma que el cliente HSF ha invocado tanto los servicios Dubbo como 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

Migración del consumidor de servicios

Esta sección describe cómo migrar edas-hsf-demo-consumer-war a edas-dubbo-demo-consumer-war.

  1. Agregue las dependencias relacionadas con Dubbo a pom.xml.

    El procedimiento para migrar un consumidor de servicios es el mismo que para migrar un proveedor de servicios. Agregue las dependencias dubbo y edas-dubbo-extension, y elimine la dependencia edas-sdk. Para obtener más detalles, consulte el paso Add Dubbo-related dependencies to pom.xml en la sección "Migración del proveedor de servicios".

  2. Cambie el nombre del archivo hsf-consumer-beans.xml a dubbo-consumer-beans.xml y actualice su contenido.

    El archivo original hsf-consumer-beans.xml tiene la siguiente configuración:

    <?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>

    Reemplace el contenido de dubbo-consumer-beans.xml con lo siguiente:

    <?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>
    Nota
    • La dirección del registro Dubbo debe comenzar con edas://.

    • Al configurar la etiqueta <dubbo:service>, debe especificar group y version. Los valores de group y version deben coincidir con los del proveedor de servicios. De forma predeterminada, group es HSF y version es 1.0.0.

    • Agregue la configuración check="false". Esto evita que la aplicación consumidora del servicio falle durante el inicio si un proveedor no está disponible.

    • Agregue la configuración <dubbo:parameter key="hsf.enable" value="true"/>. Esto garantiza que el consumidor del servicio se suscriba a los datos del proveedor de servicios.

  3. En el archivo web.xml, reemplace hsf-consumer-beans.xml por dubbo-consumer-beans.xml.

  4. Compruebe la migración localmente.

    La verificación local consta de dos partes: comprobar que el servicio está registrado en el centro de registro y configuración ligera, y verificar que el consumidor puede invocar tanto servicios HSF como Dubbo.

    1. Empaquete el proyecto como edas-dubbo-demo-consumer.war y despliéguelo en Apache Tomcat.

      Importante

      Evite conflictos de puertos.

    2. Inicie sesión en la consola del centro de registro y configuración ligera para comprobar si el consumidor de servicios Dubbo está registrado.

      En la consola, vaya a la página Service List. Confirme que aparece el servicio -dubbo-com.alibaba.edas.DemoService-consumers y que su Healthy Instance Count es 1. Esto indica que el consumidor de servicios Dubbo se registró correctamente en Nacos.

    3. Acceda a http://localhost:8280/edas-dubbo-demo-consumer/index.htm.

      curl http://localhost:8280/edas-dubbo-demo-consumer/index.htm
    4. Observe la salida estándar del Apache Tomcat del cliente.

      Si aparece una salida similar a la siguiente, se confirma que el consumidor de servicios Dubbo ha invocado tanto los servicios HSF como 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

Despliegue y verificación en EDAS o

Este tema utiliza un clúster ECS de EDAS como ejemplo, pero el proceso es similar para SAE. Para verificar la migración, cree y despliegue las siguientes cuatro aplicaciones:

  • edas-dubbo-demo-consumer: La aplicación consumidora de servicios migrada. Entorno de ejecución: Apache Tomcat 7.0.91.

  • edas-dubbo-demo-provider: La aplicación proveedora de servicios migrada. Entorno de ejecución: Apache Tomcat 7.0.91.

  • edas-hsf-demo-consumer: La aplicación consumidora de servicios previa a la migración. Entorno de ejecución: EDAS Container v3.5.4.

  • edas-hsf-demo-provider: La aplicación proveedora de servicios previa a la migración. Entorno de ejecución: EDAS Container v3.5.4.

  1. Despliegue los cuatro paquetes WAR en sus respectivas aplicaciones. Para obtener instrucciones, consulte cómo deploy an application to EDAS o .

  2. Ejecute el siguiente comando para probar si edas-hsf-demo-consumer puede invocar tanto a los proveedores de servicios HSF como Dubbo.

    curl http://39.106.XX.XXX:8080/index.htm
  3. Revise los registros en la salida estándar de la instancia de Ali-Tomcat para la aplicación edas-hsf-demo-consumer, por ejemplo, /home/admin/taobao-tomcat-production-7.0.XX.X/logs/catalina.out.

    Si aparece una salida similar a la siguiente, se confirma que el consumidor de servicios HSF ha invocado tanto los servicios HSF como Dubbo.

    2019-07-18 09:58:03.137 org.springframework.web.context.ContextLoader initWebApplicationContext
    INFO: Root WebApplicationContext: initialization completed in 5187 ms
    2019-07-18 09:58:03.214 org.apache.catalina.startup.HostConfig deployDescriptor
    INFO: Deployment of configuration descriptor /home/admin/taobao-tomcat-production-7.0.59.3/conf/Catalina/localhost/ROOT.xml has finished in 14,445 ms
    2019-07-18 09:58:03.226 org.apache.coyote.AbstractProtocol start
    INFO: Starting ProtocolHandler ["http-bio-8080"]
    2019-07-18 09:58:03.275 org.apache.catalina.startup.Catalina start
    INFO: Server startup in 14574 ms
    Received: Hello hsf, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello hsf, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello hsf, response from hsf provider: /192.168.xxx.xxx:35676
    Received: Hello hsf, response from hsf provider: /192.168.xxx.xxx:35676
    Received: Hello hsf, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello hsf, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello hsf, response from hsf provider: /192.168.xxx.xxx:35676
    Received: Hello hsf, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello hsf, response from hsf provider: /192.168.xxx.xxx:35676
    Received: Hello hsf, response from hsf provider: /192.168.xxx.xxx:35676
    Received: Hello hsf, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello hsf, response from hsf provider: /192.168.xxx.xxx:35676
    Received: Hello hsf, response from hsf provider: /192.168.xxx.xxx:35676
    Received: Hello hsf, response from dubbo provider: 192.168.xxx.xxx:20880
  4. Ejecute el siguiente comando para probar si edas-dubbo-demo-consumer puede invocar tanto a los proveedores HSF como Dubbo.

    curl http://192.168.XX.XX:8080/index.htm
  5. Revise los registros en la salida estándar de la instancia de Apache Tomcat para la aplicación edas-dubbo-demo-consumer, por ejemplo, /home/admin/apache-tomcat-7.0.91/logs/catalina.out.

    Si aparece una salida similar a la siguiente, se confirma que el consumidor de servicios Dubbo ha invocado tanto los servicios HSF como Dubbo.

    Received: Hello dubbo, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello dubbo, response from hsf provider: /192.168.xxx.xxx:12200
    Received: Hello dubbo, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello dubbo, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello dubbo, response from hsf provider: /192.168.xxx.xxx:12200
    Received: Hello dubbo, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello dubbo, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello dubbo, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello dubbo, response from hsf provider: /192.168.xxx.xxx:12200
    Received: Hello dubbo, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello dubbo, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello dubbo, response from dubbo provider: 192.168.xxx.xxx:20880
    Received: Hello dubbo, response from hsf provider: /192.168.xxx.xxx:12200
    Received: Hello dubbo, response from hsf provider: /192.168.xxx.xxx:12200
    Received: Hello dubbo, response from hsf provider: /192.168.xxx.xxx:12200

Preguntas frecuentes

  • Un consumidor de servicios Dubbo no se inicia y reporta que no puede encontrar un proveedor de servicios.

    Síntoma

    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

    Causa posible

    Las direcciones de los proveedores se envían de forma asíncrona desde el registro. Durante el inicio, Dubbo comprueba de forma predeterminada si hay direcciones de proveedores disponibles. Si no hay ninguna disponible, Dubbo genera esta excepción.

    Solución

    Agregue la configuración check="false" a la etiqueta <dubbo:reference> en Dubbo:

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

    Este parámetro evita que Dubbo busque una dirección de proveedor disponible durante el inicio. Sin embargo, si la lógica de inicialización de su aplicación requiere invocar un servicio Dubbo, la lógica de negocio podría fallar.

  • Un consumidor de servicios HSF falla al invocar un servicio Dubbo.

    Síntoma

    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)

    Causa posible

    Actualizar Dubbo a la versión 2.7 puede causar un problema de compatibilidad de protocolo con HSF.

    Solución

    Actualice EDAS Container a la V3.5.5. Esta versión de HSF resuelve el problema.

  • Un consumidor de servicios Dubbo falla al invocar un proveedor de servicios HSF.

    Síntoma

    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)

    Causa posible

    HSF tiene habilitada la autenticación de llamadas, pero actualmente Dubbo no admite esta función.

    Solución

    En el proveedor de servicios HSF, agregue el parámetro -DneedAuth=false para deshabilitar la autenticación de llamadas.

  • Un consumidor de servicios Dubbo falla al invocar un proveedor de servicios HSF debido a un error de serialización.

    Síntoma

    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)
        ...(The recursive call above is repeated multiple times and is omitted)

    Causa posible

    El proveedor de servicios HSF utiliza una versión anterior de hessian-lite que no admite la serialización de objetos LocalDateTime de JDK 8.

    Solución

    Actualice el EDAS Container del proveedor de servicios HSF a la v3.5.5.