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
Migre de un registro HSF+EDAS/ a un registro Dubbo+EDAS/.
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

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:
EDAS Container V3.5.5
edas-dubbo-extension 2.0.6
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
-
Agregue las dependencias relacionadas con Dubbo a pom.xml.
Utilice Spring 4.x o posterior para las dependencias de HSF.
-
Elimine la dependencia del cliente HSF.
<dependency> <groupId>com.alibaba.edas</groupId> <artifactId>edas-sdk</artifactId> <version>1.5.4</version> </dependency> -
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>
-
-
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>NotaLa dirección del registro Dubbo debe establecerse en
edas://127.0.0.1:8080. Debe comenzar con el prefijoedas. 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 serHSFy la versión es1.0.0. De lo contrario, los clientes HSF no podrán invocar el servicio.
-
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> -
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.
-
Verifique el registro del servicio.
-
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 Descargue el centro de registro y configuración ligera, extraiga el paquete, vaya al directorio
biny ejecute el comando./startup.shpara iniciar el centro.-
Ejecute el comando
mvn clean packagepara 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.
-
Despliegue edas-hsf-demo-provider.war en Ali-Tomcat y edas-dubbo-demo-provider.war en Apache Tomcat.
NotaLos 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.
-
Acceda al centro de registro y configuración ligera en
http://127.0.0.1:8080/#/serviceManagementy 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.
-
-
Verifique las llamadas de los consumidores del servicio.
Siga estos pasos para comprobar que los consumidores pueden invocar al proveedor de servicios migrado.
-
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.xmlProporciona 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); } } 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.
-
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.
-
Después de iniciar Ali-Tomcat, acceda a la siguiente URL:
curl http://localhost:8280/edas-hsf-demo-consumer/index.htm -
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.
-
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".
-
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>NotaLa dirección del registro Dubbo debe comenzar con
edas://.Al configurar la etiqueta
<dubbo:service>, debe especificargroupyversion. Los valores degroupyversiondeben coincidir con los del proveedor de servicios. De forma predeterminada,groupes HSF yversiones 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.
En el archivo web.xml, reemplace hsf-consumer-beans.xml por dubbo-consumer-beans.xml.
-
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.
-
Empaquete el proyecto como edas-dubbo-demo-consumer.war y despliéguelo en Apache Tomcat.
ImportanteEvite conflictos de puertos.
-
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-consumersy que su Healthy Instance Count es 1. Esto indica que el consumidor de servicios Dubbo se registró correctamente en Nacos. -
Acceda a http://localhost:8280/edas-dubbo-demo-consumer/index.htm.
curl http://localhost:8280/edas-dubbo-demo-consumer/index.htm -
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.
Despliegue los cuatro paquetes WAR en sus respectivas aplicaciones. Para obtener instrucciones, consulte cómo deploy an application to EDAS o .
-
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 -
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 -
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 -
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®ister.ip=xxx.xx.xx.xxx&release=2.7.3&revision=1.0.1-SNAPSHOT&side=consumer&sticky=false&timeout=2000×tamp=1564242421194&version=1.0.0 to the consumer xxx.xx.xx.xxx use dubbo version 2.7.3Causa 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=falsepara 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.