Tous les produits
Search
Centre de documentation

Enterprise Distributed Application Service:Migrer des applications d'une architecture HSF vers Dubbo (Ali-Tomcat)

Dernière mise à jour :Aug 11, 2026

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

    1. Migrer d'un registre HSF+EDAS/ vers un registre Dubbo+EDAS/.

    2. 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

HSF迁移Dubbo结构图

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 :

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
  1. 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.

    1. Supprimez la dépendance du client HSF.

      <dependency>
                  <groupId>com.alibaba.edas</groupId>
                  <artifactId>edas-sdk</artifactId>
                  <version>1.5.4</version>
      </dependency>
    2. 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>
  2. 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>
    Remarque
    • L'adresse du registre Dubbo doit être définie sur edas://127.0.0.1:8080. Elle doit commencer par le préfixe edas. 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éralement HSF et la version est 1.0.0. Sinon, les clients HSF ne pourront pas appeler le service.

  3. 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>
  4. 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.

    1. Vérifiez l'enregistrement du service.

      1. 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
      2. Téléchargez le centre de configuration et d'enregistrement léger, extrayez le package, accédez au répertoire bin et exécutez la commande ./startup.sh pour démarrer le centre.

      3. Exécutez la commande mvn clean package pour 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.

      4. Déployez edas-hsf-demo-provider.war sur Ali-Tomcat et edas-dubbo-demo-provider.war sur Apache Tomcat.

        Remarque

        Les 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.

      5. Accédez au centre de configuration et d'enregistrement léger à l'adresse http://127.0.0.1:8080/#/serviceManagement et 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.

    2. Vérifiez les appels du consommateur de service.

      Suivez ces étapes pour vérifier que les consommateurs peuvent appeler le fournisseur de service migré.

      1. 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.xml

        Il 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);
            }
        }
      2. 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.

      3. 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.

      4. Après avoir démarré Ali-Tomcat, accédez à l'URL suivante :

        curl http://localhost:8280/edas-hsf-demo-consumer/index.htm
      5. 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.

  1. 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 ».

  2. 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>
    Remarque
    • L'adresse du registre Dubbo doit commencer par edas://.

    • Lorsque vous configurez la balise <dubbo:service>, vous devez spécifier le group et la version. Le group et la version doivent être identiques à ceux du fournisseur de service. Par défaut, le group est HSF et la version est 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.

  3. Dans le fichier web.xml, remplacez hsf-consumer-beans.xml par dubbo-consumer-beans.xml.

  4. 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.

    1. Empaquetez le projet sous forme de edas-dubbo-demo-consumer.war et déployez-le sur Apache Tomcat.

      Important

      Évitez les conflits de ports.

    2. 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-consumers apparaî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.

    3. Accédez à http://localhost:8280/edas-dubbo-demo-consumer/index.htm.

      curl http://localhost:8280/edas-dubbo-demo-consumer/index.htm
    4. 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.

  1. 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 .

  2. 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
  3. 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
  4. 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
  5. 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&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

    Cause 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=false pour 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.