Todos os produtos
Search
Central de documentação

Enterprise Distributed Application Service:Migrar aplicações de uma arquitetura HSF para Dubbo (Ali-Tomcat)

Última atualização: Jul 04, 2026

Este tópico explica como usar o Ali-Tomcat para migrar uma aplicação do framework HSF para o framework Dubbo.

Abordagens de migração

Existem duas abordagens para migrar de um registro HSF+EDAS/ para um registro Dubbo+Nacos:

  • Migração em duas etapas

    1. Migre de um registro HSF+EDAS/ para um registro Dubbo+EDAS/.

    2. Migre o registro EDAS/ para o Nacos.

    Vantagem: Esta abordagem é mais estável e adequada para iterações incrementais. Desvantagem: Requer duas implantações.

  • Migração direta

    Migre diretamente de um registro HSF+EDAS/ para um registro Dubbo+Nacos.

    O HSF não oferece suporte ao Nacos atualmente; portanto, esta abordagem exige desenvolvimento adicional.

Para migrar rapidamente sua aplicação para o Dubbo e implantá-la em produção, recomenda-se a primeira abordagem devido à sua estabilidade. Este guia detalha a migração em duas etapas.

Arquitetura de migração

HSF迁移Dubbo结构图

Um serviço Dubbo se registra nos formatos HSF e Dubbo, permitindo que consumidores HSF o descubram. Da mesma forma, um consumidor Dubbo assina ambos os formatos, o que possibilita a descoberta de serviços HSF.

Antes de começar

O processo de migração requer os seguintes componentes:

Considere que tanto os serviços HSF quanto Dubbo implementam a mesma interface. Essa interface reside em um módulo separado, edas-demo-interface, que contém apenas uma declaração de interface e possui a seguinte estrutura de diretórios:

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

Migrar o provedor de serviços

Suponha que você esteja migrando a aplicação HSF edas-hsf-demo-provider-war. Ela contém os seguintes arquivos:

  • pom.xml: Define as dependências entre os módulos da aplicação.

  • DemoServiceImpl.java: A implementação do DemoService.

  • hsf-provider-beans.xml: O arquivo de definição de beans do Spring para HSF.

  • web.xml: O descritor de implantação do pacote WAR.

A estrutura de diretórios de edas-hsf-demo-provider-war é a seguinte:

├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │     └── alibaba
│ │ │         └── edas
│ │ │             └── hsf
│ │ │                 └── provider
│ │ │                     └── DemoServiceImpl.java
│ │ ├── resources
│ │ │ └── hsf-provider-beans.xml
│ │ └── webapp
│ │     └── WEB-INF
│ │         └── web.xml
  1. Adicione as dependências relacionadas ao Dubbo no arquivo pom.xml.

    Use o Spring 4.x ou superior para as dependências do HSF.

    1. Remova a dependência do cliente HSF.

      <dependency>
                  <groupId>com.alibaba.edas</groupId>
                  <artifactId>edas-sdk</artifactId>
                  <version>1.5.4</version>
      </dependency>
    2. Adicione as dependências relacionadas ao Dubbo.

      • edas-dubbo-extension: Esta dependência registra serviços Dubbo no registro EDAS/ e gerencia o registro e a assinatura de serviços Dubbo no formato HSF. Consulte o código de exemplo para ver o arquivo pom.xml completo.

      • dubbo: A dependência padrão do 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. Renomeie o arquivo hsf-provider-beans.xml para dubbo-provider-beans.xml e atualize seu conteúdo.

    O arquivo original hsf-provider-beans.xml contém a seguinte configuração:

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

    Substitua o conteúdo de dubbo-provider-beans.xml pelo seguinte:

    <?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
    • Defina o endereço do registro Dubbo como edas://127.0.0.1:8080. Ele deve começar com o prefixo edas. O endereço IP e a porta destinam-se ao desenvolvimento local. Durante a implantação, o EDAS ou o os substitui automaticamente pelo endereço de produção.

    • Inclua a configuração <dubbo:parameter key="hsf.enable" value="true"/>. Isso registra o serviço Dubbo nos formatos HSF e Dubbo, garantindo que os clientes HSF possam descobri-lo.

    • Ao configurar a tag <dubbo:service>, especifique explicitamente o grupo e a versão. Normalmente, o grupo é HSF e a versão é 1.0.0. Caso contrário, os clientes HSF não conseguirão chamar o serviço.

  3. No arquivo web.xml, substitua hsf-provider-beans.xml por dubbo-provider-beans.xml.

    Basta alterar o nome do arquivo no parâmetro contextConfigLocation para 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. Verifique a migração localmente.

    A verificação local envolve duas partes: validar o registro do serviço e validar as chamadas do consumidor de serviço.

    1. Valide o registro do serviço.

      1. Para permitir que a aplicação HSF se registre no registro local, edite seu arquivo hosts (por exemplo, /etc/hosts) e adicione a seguinte entrada:

        127.0.0.1     jmenv.tbsite.net
      2. Baixe o centro leve de configuração e registro, extraia o pacote, acesse o diretório bin e execute o comando ./startup.sh para iniciar o centro.

      3. Execute o comando mvn clean package para compilar o edas-hsf-demo-provider-war em um pacote WAR.

        O pacote resultante estará no diretório target do projeto da aplicação.

      4. Implante edas-hsf-demo-provider.war no Ali-Tomcat e edas-dubbo-demo-provider.war no Apache Tomcat.

        Nota

        As portas das duas instâncias do Tomcat podem entrar em conflito. No arquivo conf/server.xml de cada instância do Tomcat, localize as portas 8005 e 8080 e altere-as para valores que não gerem conflito.

      5. Acesse o centro leve de configuração e registro em http://127.0.0.1:8080/#/serviceManagement e verifique o serviço com.alibaba.edas.DemoService:1.0.0.

        Se o serviço estiver registrado e a contagem de instâncias for 2, isso indica que tanto os serviços Dubbo quanto HSF estão registrados como um único serviço no formato HSF.

    2. Valide as chamadas do consumidor de serviço.

      Siga estas etapas para confirmar que os consumidores conseguem chamar o provedor de serviços migrado.

      1. Prepare um consumidor de serviço HSF para testes, como o edas-hsf-demo-consumer-war, com a seguinte estrutura de diretórios:

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

        Ele fornece um servlet que inicia uma chamada HSF ao receber uma solicitação 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. Execute o comando mvn clean package para compilar edas-hsf-demo-consumer-war em edas-hsf-demo-consumer.war e implante-o em outra instância do Ali-Tomcat. Certifique-se de evitar conflitos de porta.

      3. Faça login no console do centro leve de configuração e registro.

        É normal que os dados do consumidor de serviço HSF não apareçam no console.

      4. Após iniciar o Ali-Tomcat, acesse a seguinte URL:

        curl http://localhost:8280/edas-hsf-demo-consumer/index.htm
      5. Observe a saída padrão da instância do Ali-Tomcat que executa edas-hsf-demo-consumer.war.

        Se aparecer uma saída semelhante à abaixo, isso confirma que o cliente HSF chamou tanto os serviços Dubbo quanto 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

Migrar o consumidor de serviços

Esta seção descreve como migrar edas-hsf-demo-consumer-war para edas-dubbo-demo-consumer-war.

  1. Adicione as dependências relacionadas ao Dubbo no arquivo pom.xml.

    O procedimento para migrar um consumidor de serviços é igual ao de migrar um provedor de serviços. Adicione as dependências dubbo e edas-dubbo-extension e remova a dependência edas-sdk. Para obter detalhes, consulte a etapa Adicionar dependências relacionadas ao Dubbo no pom.xml na seção "Migrar o provedor de serviços".

  2. Renomeie o arquivo hsf-consumer-beans.xml para dubbo-consumer-beans.xml e atualize seu conteúdo.

    O arquivo original hsf-consumer-beans.xml tem a seguinte configuração:

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

    Substitua o conteúdo de dubbo-consumer-beans.xml pelo seguinte:

    <?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
    • O endereço do registro Dubbo deve começar com edas://.

    • Ao configurar a tag <dubbo:service>, especifique group e version. Os valores de group e version devem ser iguais aos do provedor de serviços. Por padrão, group é HSF e version é 1.0.0.

    • Adicione a configuração check="false". Isso impede que a aplicação consumidora de serviços falhe na inicialização caso um provedor esteja indisponível.

    • Inclua a configuração <dubbo:parameter key="hsf.enable" value="true"/>. Isso garante que o consumidor de serviços assine os dados do provedor de serviços.

  3. No arquivo web.xml, substitua hsf-consumer-beans.xml por dubbo-consumer-beans.xml.

  4. Verifique a migração localmente.

    A verificação local consiste em duas partes: confirmar que o serviço está registrado no centro leve de configuração e registro e validar que o consumidor consegue chamar serviços HSF e Dubbo.

    1. Empacote o projeto como edas-dubbo-demo-consumer.war e implante-o no Apache Tomcat.

      Importante

      Evite conflitos de porta.

    2. Faça login no console do centro leve de configuração e registro para verificar se o consumidor de serviço Dubbo está registrado.

      No console, acesse a página Service List. Confirme se o serviço -dubbo-com.alibaba.edas.DemoService-consumers aparece e se sua Healthy Instance Count é 1. Isso indica que o consumidor de serviço Dubbo foi registrado com sucesso no Nacos.

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

      curl http://localhost:8280/edas-dubbo-demo-consumer/index.htm
    4. Observe a saída padrão do Apache Tomcat do cliente.

      Se aparecer uma saída semelhante à abaixo, isso confirma que o consumidor de serviço Dubbo chamou tanto os serviços HSF quanto 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

Implantar e verificar no EDAS ou

Este tópico utiliza um cluster ECS do EDAS como exemplo, mas o processo é semelhante para o SAE. Para validar a migração, crie e implante as quatro aplicações a seguir:

  • edas-dubbo-demo-consumer: A aplicação consumidora de serviços migrada. Ambiente de execução: Apache Tomcat 7.0.91.

  • edas-dubbo-demo-provider: A aplicação provedora de serviços migrada. Ambiente de execução: Apache Tomcat 7.0.91.

  • edas-hsf-demo-consumer: A aplicação consumidora de serviços anterior à migração. Ambiente de execução: EDAS Container v3.5.4.

  • edas-hsf-demo-provider: A aplicação provedora de serviços anterior à migração. Ambiente de execução: EDAS Container v3.5.4.

  1. Implante os quatro pacotes WAR em suas respectivas aplicações. Para obter instruções, consulte como implantar uma aplicação no EDAS ou .

  2. Execute o comando a seguir para testar se o edas-hsf-demo-consumer consegue chamar os provedores de serviço HSF e Dubbo.

    curl http://39.106.XX.XXX:8080/index.htm
  3. Verifique os logs na saída padrão da instância do Ali-Tomcat da aplicação edas-hsf-demo-consumer, por exemplo, /home/admin/taobao-tomcat-production-7.0.XX.X/logs/catalina.out.

    Se aparecer uma saída semelhante à abaixo, isso confirma que o consumidor de serviço HSF chamou tanto os serviços HSF quanto 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. Execute o comando a seguir para testar se o edas-dubbo-demo-consumer consegue chamar os provedores HSF e Dubbo.

    curl http://192.168.XX.XX:8080/index.htm
  5. Verifique os logs na saída padrão da instância do Apache Tomcat da aplicação edas-dubbo-demo-consumer, por exemplo, /home/admin/apache-tomcat-7.0.91/logs/catalina.out.

    Se aparecer uma saída semelhante à abaixo, isso confirma que o consumidor de serviço Dubbo chamou tanto os serviços HSF quanto 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

Perguntas frequentes

  • Um consumidor de serviço Dubbo falha ao iniciar e relata que não consegue encontrar um provedor de serviços.

    Sintoma

    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 possível

    Os endereços dos provedores são enviados de forma assíncrona pelo registro. Durante a inicialização, o Dubbo verifica por padrão se há endereços de provedor disponíveis. Se nenhum estiver disponível, o Dubbo lança essa exceção.

    Solução

    Adicione a configuração check="false" à tag <dubbo:reference> no Dubbo:

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

    Esse parâmetro impede que o Dubbo verifique a disponibilidade de um endereço de provedor durante a inicialização. No entanto, se a lógica de inicialização da sua aplicação exigir a chamada de um serviço Dubbo, a lógica de negócio poderá falhar.

  • Um consumidor de serviço HSF falha ao chamar um serviço Dubbo.

    Sintoma

    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 possível

    A atualização do Dubbo para a versão 2.7 pode causar um problema de compatibilidade de protocolo com o HSF.

    Solução

    Atualize o EDAS Container para a V3.5.5. Essa versão do HSF resolve o problema.

  • Um consumidor de serviço Dubbo falha ao chamar um provedor de serviço HSF.

    Sintoma

    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 possível

    O HSF está com a autenticação de chamadas ativada, mas o Dubbo atualmente não oferece suporte a esse recurso.

    Solução

    No provedor de serviço HSF, adicione o parâmetro -DneedAuth=false para desativar a autenticação de chamadas.

  • Um consumidor de serviço Dubbo falha ao chamar um provedor de serviço HSF devido a um erro de serialização.

    Sintoma

    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 possível

    O provedor de serviço HSF utiliza uma versão antiga do hessian-lite que não oferece suporte à serialização de objetos LocalDateTime do JDK 8.

    Solução

    Atualize o EDAS Container do provedor de serviço HSF para a v3.5.5.