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

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:
EDAS Container V3.5.5
edas-dubbo-extension 2.0.6
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
-
Adicione as dependências relacionadas ao Dubbo no arquivo pom.xml.
Use o Spring 4.x ou superior para as dependências do HSF.
-
Remova a dependência do cliente HSF.
<dependency> <groupId>com.alibaba.edas</groupId> <artifactId>edas-sdk</artifactId> <version>1.5.4</version> </dependency> -
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>
-
-
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>NotaDefina o endereço do registro Dubbo como
edas://127.0.0.1:8080. Ele deve começar com o prefixoedas. 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 éHSFe a versão é1.0.0. Caso contrário, os clientes HSF não conseguirão chamar o serviço.
-
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> -
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.
-
Valide o registro do serviço.
-
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 Baixe o centro leve de configuração e registro, extraia o pacote, acesse o diretório
bine execute o comando./startup.shpara iniciar o centro.-
Execute o comando
mvn clean packagepara compilar o edas-hsf-demo-provider-war em um pacote WAR.O pacote resultante estará no diretório target do projeto da aplicação.
-
Implante edas-hsf-demo-provider.war no Ali-Tomcat e edas-dubbo-demo-provider.war no Apache Tomcat.
NotaAs 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.
-
Acesse o centro leve de configuração e registro em
http://127.0.0.1:8080/#/serviceManagemente 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.
-
-
Valide as chamadas do consumidor de serviço.
Siga estas etapas para confirmar que os consumidores conseguem chamar o provedor de serviços migrado.
-
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.xmlEle 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); } } 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.
-
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.
-
Após iniciar o Ali-Tomcat, acesse a seguinte URL:
curl http://localhost:8280/edas-hsf-demo-consumer/index.htm -
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.
-
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".
-
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>NotaO endereço do registro Dubbo deve começar com
edas://.Ao configurar a tag
<dubbo:service>, especifiquegroupeversion. Os valores degroupeversiondevem ser iguais aos do provedor de serviços. Por padrão,groupé HSF eversioné 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.
No arquivo web.xml, substitua hsf-consumer-beans.xml por dubbo-consumer-beans.xml.
-
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.
-
Empacote o projeto como edas-dubbo-demo-consumer.war e implante-o no Apache Tomcat.
ImportanteEvite conflitos de porta.
-
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-consumersaparece e se sua Healthy Instance Count é 1. Isso indica que o consumidor de serviço Dubbo foi registrado com sucesso no Nacos. -
Acesse http://localhost:8280/edas-dubbo-demo-consumer/index.htm.
curl http://localhost:8280/edas-dubbo-demo-consumer/index.htm -
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.
Implante os quatro pacotes WAR em suas respectivas aplicações. Para obter instruções, consulte como implantar uma aplicação no EDAS ou .
-
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 -
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 -
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 -
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®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 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=falsepara 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.