Cette rubrique explique comment utiliser Ali-Tomcat pour migrer une application du framework HSF vers le framework Dubbo.
Approches de migration
Il existe deux approches pour migrer d'un registre HSF+EDAS/ vers un registre Dubbo+Nacos :
-
Migration en deux étapes
Migrer d'un registre HSF+EDAS/ vers un registre Dubbo+EDAS/.
Migrer le registre EDAS/ vers Nacos.
Avantage : Cette approche est plus stable et convient aux itérations incrémentielles. Inconvénient : Elle nécessite deux déploiements.
-
Migration directe
Migrer directement d'un registre HSF+EDAS/ vers un registre Dubbo+Nacos.
HSF ne prend pas encore en charge Nacos, ce qui implique un développement supplémentaire pour cette approche.
Si vous souhaitez migrer rapidement votre application vers Dubbo et la déployer en production, la première approche est recommandée pour sa stabilité. Ce guide détaille la migration en deux étapes.
Architecture de migration

Un service Dubbo s'enregistre à la fois aux formats HSF et Dubbo, ce qui permet aux consommateurs HSF de le découvrir. De même, un consommateur Dubbo s'abonne aux deux formats, lui permettant ainsi de découvrir les services HSF.
Prérequis
Le processus de migration requiert les composants suivants :
Démarrer le centre de configuration et d'enregistrement léger
EDAS Container V3.5.5
edas-dubbo-extension 2.0.6
Supposons que les services HSF et Dubbo implémentent la même interface. Cette interface se trouve dans un module séparé, edas-demo-interface, qui contient uniquement une déclaration d'interface et possède la structure de répertoire suivante :
├── pom.xml
├── src
│ └── main
│ └── java
│ └── com
│ └── alibaba
│ └── edas
│ └── DemoService.java
Migrer le fournisseur de service
Supposons que vous migriez l'application HSF edas-hsf-demo-provider-war. Elle contient les fichiers suivants :
pom.xml: Définit les dépendances entre les modules de l'application.DemoServiceImpl.java: L'implémentation de DemoService.hsf-provider-beans.xml: Le fichier de définition des beans Spring pour HSF.web.xml: Le descripteur de déploiement pour le package WAR.
La structure de répertoire de edas-hsf-demo-provider-war est la suivante :
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── alibaba
│ │ │ └── edas
│ │ │ └── hsf
│ │ │ └── provider
│ │ │ └── DemoServiceImpl.java
│ │ ├── resources
│ │ │ └── hsf-provider-beans.xml
│ │ └── webapp
│ │ └── WEB-INF
│ │ └── web.xml
-
Ajoutez les dépendances liées à Dubbo au fichier pom.xml.
Utilisez Spring 4.x ou une version ultérieure pour les dépendances HSF.
-
Supprimez la dépendance du client HSF.
<dependency> <groupId>com.alibaba.edas</groupId> <artifactId>edas-sdk</artifactId> <version>1.5.4</version> </dependency> -
Ajoutez les dépendances liées à Dubbo.
edas-dubbo-extension: Cette dépendance enregistre les services Dubbo auprès du registre EDAS/ et gère l'enregistrement et l'abonnement des services Dubbo au format HSF. Consultez l'exemple de code pour obtenir le fichier pom.xml complet.dubbo: La dépendance Dubbo standard.
<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>
-
-
Renommez le fichier hsf-provider-beans.xml en dubbo-provider-beans.xml et mettez à jour son contenu.
Le fichier original hsf-provider-beans.xml contient la configuration suivante :
<?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>Remplacez le contenu de dubbo-provider-beans.xml par ce qui suit :
<?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>RemarqueL'adresse du registre Dubbo doit être définie sur
edas://127.0.0.1:8080. Elle doit commencer par le préfixeedas. L'adresse IP et le port sont destinés au développement local. Lors du déploiement, EDAS ou les remplace automatiquement par l'adresse de production.Ajoutez la configuration
<dubbo:parameter key="hsf.enable" value="true"/>. Cela enregistre le service Dubbo aux formats HSF et Dubbo, garantissant ainsi que les clients HSF peuvent le découvrir.Lorsque vous configurez la balise
<dubbo:service>, vous devez spécifier explicitement le groupe et la version. Le groupe est généralementHSFet la version est1.0.0. Sinon, les clients HSF ne pourront pas appeler le service.
-
Dans le fichier web.xml, remplacez hsf-provider-beans.xml par dubbo-provider-beans.xml.
Il vous suffit de modifier le nom de fichier dans le paramètre contextConfigLocation pour qu'il devienne 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> -
Vérifiez la migration localement.
La vérification locale comprend deux parties : vérifier l'enregistrement du service et vérifier les appels du consommateur de service.
-
Vérifiez l'enregistrement du service.
-
Pour permettre à l'application HSF de s'enregistrer auprès du registre local, modifiez votre fichier hosts (par exemple, /etc/hosts) et ajoutez l'entrée suivante :
127.0.0.1 jmenv.tbsite.net Téléchargez le centre de configuration et d'enregistrement léger, extrayez le package, accédez au répertoire
binet exécutez la commande./startup.shpour démarrer le centre.-
Exécutez la commande
mvn clean packagepour construire edas-hsf-demo-provider-war en un package WAR.Le package résultant se trouve dans le répertoire target du projet d'application.
-
Déployez edas-hsf-demo-provider.war sur Ali-Tomcat et edas-dubbo-demo-provider.war sur Apache Tomcat.
RemarqueLes ports des deux instances Tomcat peuvent entrer en conflit. Dans le fichier conf/server.xml de chaque instance Tomcat, recherchez les ports 8005 et 8080 et modifiez-les pour éviter les conflits.
-
Accédez au centre de configuration et d'enregistrement léger à l'adresse
http://127.0.0.1:8080/#/serviceManagementet vérifiez le service com.alibaba.edas.DemoService:1.0.0.Si le service est enregistré et que le nombre d'instances est de 2, cela indique que les services Dubbo et HSF sont enregistrés en tant qu'un seul service au format HSF.
-
-
Vérifiez les appels du consommateur de service.
Suivez ces étapes pour vérifier que les consommateurs peuvent appeler le fournisseur de service migré.
-
Préparez un consommateur de service HSF pour les tests, tel que edas-hsf-demo-consumer-war, avec la structure de répertoire suivante :
├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── alibaba │ │ │ └── edas │ │ │ └── hsf │ │ │ └── consumer │ │ │ └── IndexServlet.java │ │ ├── resources │ │ │ └── hsf-consumer-beans.xml │ │ └── webapp │ │ └── WEB-INF │ │ └── web.xmlIl fournit un servlet qui initie un appel HSF lors de la réception d'une requête 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); } } Exécutez la commande mvn clean package pour construire edas-hsf-demo-consumer-war en edas-hsf-demo-consumer.war, puis déployez-le sur une autre instance Ali-Tomcat. Assurez-vous d'éviter les conflits de ports.
-
Connectez-vous à la console du centre de configuration et d'enregistrement léger.
Il est normal que les données du consommateur de service HSF ne s'affichent pas dans la console.
-
Après avoir démarré Ali-Tomcat, accédez à l'URL suivante :
curl http://localhost:8280/edas-hsf-demo-consumer/index.htm -
Observez la sortie standard de l'instance Ali-Tomcat qui exécute edas-hsf-demo-consumer.war.
Si une sortie similaire à celle ci-dessous apparaît, cela confirme que le client HSF a appelé les services Dubbo et 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
-
-
Migrer le consommateur de service
Cette section décrit comment migrer edas-hsf-demo-consumer-war vers edas-dubbo-demo-consumer-war.
-
Ajoutez les dépendances liées à Dubbo au fichier pom.xml.
La procédure de migration d'un consommateur de service est identique à celle d'un fournisseur de service. Ajoutez les dépendances dubbo et edas-dubbo-extension et supprimez la dépendance edas-sdk. Pour plus de détails, consultez l'étape Ajoutez les dépendances liées à Dubbo au fichier pom.xml de la section « Migrer le fournisseur de service ».
-
Renommez le fichier hsf-consumer-beans.xml en dubbo-consumer-beans.xml et mettez à jour son contenu.
Le fichier original hsf-consumer-beans.xml est configuré comme suit :
<?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>Remplacez le contenu de dubbo-consumer-beans.xml par ce qui suit :
<?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>RemarqueL'adresse du registre Dubbo doit commencer par
edas://.Lorsque vous configurez la balise
<dubbo:service>, vous devez spécifier legroupet laversion. Legroupet laversiondoivent être identiques à ceux du fournisseur de service. Par défaut, legroupest HSF et laversionest 1.0.0.Ajoutez la configuration
check="false". Cela empêche l'application consommatrice de service d'échouer au démarrage si un fournisseur n'est pas disponible.Ajoutez la configuration
<dubbo:parameter key="hsf.enable" value="true"/>. Cela garantit que le consommateur de service s'abonne aux données du fournisseur de service.
Dans le fichier web.xml, remplacez hsf-consumer-beans.xml par dubbo-consumer-beans.xml.
-
Vérifiez la migration localement.
La vérification locale comprend deux parties : vérifier que le service est enregistré auprès du centre de configuration et d'enregistrement léger et vérifier que le consommateur peut appeler les services HSF et Dubbo.
-
Empaquetez le projet sous forme de edas-dubbo-demo-consumer.war et déployez-le sur Apache Tomcat.
ImportantÉvitez les conflits de ports.
-
Connectez-vous à la console du centre de configuration et d'enregistrement léger pour vérifier si le consommateur de service Dubbo est enregistré.
Dans la console, accédez à la page Service List. Confirmez que le service
-dubbo-com.alibaba.edas.DemoService-consumersapparaît et que son Healthy Instance Count est de 1. Cela indique que le consommateur de service Dubbo est correctement enregistré auprès de Nacos. -
Accédez à http://localhost:8280/edas-dubbo-demo-consumer/index.htm.
curl http://localhost:8280/edas-dubbo-demo-consumer/index.htm -
Observez la sortie standard de l'Apache Tomcat du client.
Si une sortie similaire à celle ci-dessous apparaît, cela confirme que le consommateur de service Dubbo a appelé les services HSF et 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
-
Déployer et vérifier dans EDAS ou
Cette rubrique utilise un cluster ECS EDAS comme exemple, mais le processus est similaire pour SAE. Pour vérifier la migration, créez et déployez les quatre applications suivantes :
edas-dubbo-demo-consumer : L'application consommatrice de service migrée. Environnement d'exécution : Apache Tomcat 7.0.91.
edas-dubbo-demo-provider : L'application fournisseuse de service migrée. Environnement d'exécution : Apache Tomcat 7.0.91.
edas-hsf-demo-consumer : L'application consommatrice de service avant migration. Environnement d'exécution : EDAS Container v3.5.4.
edas-hsf-demo-provider : L'application fournisseuse de service avant migration. Environnement d'exécution : EDAS Container v3.5.4.
Déployez les quatre packages WAR dans leurs applications respectives. Pour obtenir des instructions, consultez la procédure de déploiement d'une application sur EDAS ou de .
-
Exécutez la commande suivante pour tester si edas-hsf-demo-consumer peut appeler les fournisseurs de services HSF et Dubbo.
curl http://39.106.XX.XXX:8080/index.htm -
Vérifiez les journaux dans la sortie standard de l'instance Ali-Tomcat pour l'application edas-hsf-demo-consumer, par exemple /home/admin/taobao-tomcat-production-7.0.XX.X/logs/catalina.out.
Si une sortie similaire à celle ci-dessous apparaît, cela confirme que le consommateur de service HSF a appelé les services HSF et 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 -
Exécutez la commande suivante pour tester si edas-dubbo-demo-consumer peut appeler les fournisseurs HSF et Dubbo.
curl http://192.168.XX.XX:8080/index.htm -
Vérifiez les journaux dans la sortie standard de l'instance Apache Tomcat pour l'application edas-dubbo-demo-consumer, par exemple /home/admin/apache-tomcat-7.0.91/logs/catalina.out.
Si une sortie similaire à celle ci-dessous apparaît, cela confirme que le consommateur de service Dubbo a appelé les services HSF et 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
FAQ
-
Un consommateur de service Dubbo échoue au démarrage et signale qu'il ne trouve aucun fournisseur de service.
Symptôme
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.3Cause possible
Les adresses des fournisseurs sont poussées de manière asynchrone depuis le registre. Au démarrage, Dubbo vérifie par défaut si les adresses des fournisseurs sont disponibles. Si aucune n'est disponible, Dubbo lève cette exception.
Solution
Ajoutez la configuration
check="false"à la balise<dubbo:reference>dans Dubbo :<dubbo:reference id="demoService" interface="com.alibaba.edas.DemoService" group="HSF" version="1.0.0" check="false"/>Ce paramètre empêche Dubbo de vérifier la disponibilité d'une adresse de fournisseur lors du démarrage. Toutefois, si la logique d'initialisation de votre application nécessite d'appeler un service Dubbo, la logique métier risque d'échouer.
-
Un consommateur de service HSF échoue lors de l'appel d'un service Dubbo.
Symptôme
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)Cause possible
La mise à niveau de Dubbo vers la version 2.7 peut entraîner un problème de compatibilité de protocole avec HSF.
Solution
Mettez à niveau EDAS Container vers la version V3.5.5. Cette version de HSF résout le problème.
-
Un consommateur de service Dubbo échoue lors de l'appel d'un fournisseur de service HSF.
Symptôme
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)Cause possible
HSF active l'authentification des appels, mais Dubbo ne prend pas encore en charge cette fonctionnalité.
Solution
Sur le fournisseur de service HSF, ajoutez le paramètre
-DneedAuth=falsepour désactiver l'authentification des appels. -
Un consommateur de service Dubbo échoue lors de l'appel d'un fournisseur de service HSF en raison d'une erreur de sérialisation.
Symptôme
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)Cause possible
Le fournisseur de service HSF utilise une ancienne version de hessian-lite qui ne prend pas en charge la sérialisation des objets JDK 8 LocalDateTime.
Solution
Mettez à niveau l'EDAS Container du fournisseur de service HSF vers la version v3.5.5.