Topik ini menjelaskan cara memigrasikan aplikasi dari High-Speed Service Framework (HSF) ke Apache Dubbo (Dubbo) menggunakan Ali-Tomcat.
Solusi migrasi
Tujuan akhir migrasi adalah untuk memigrasikan aplikasi dari HSF dan registry Enterprise Distributed Application Service (EDAS) ke Dubbo dan registry Nacos. Dua solusi tersedia:
Migrasi Dua Langkah
Migrasi dari HSF dan registry EDAS ke Dubbo dan registry EDAS.
Migrasi dari registry EDAS ke registry Nacos.
Solusi ini memiliki stabilitas tinggi dan cocok untuk iterasi bertahap kecil. Namun, aplikasi harus diterbitkan dua kali.
Migrasi Langsung
Migrasi dari HSF dan registry EDAS ke Dubbo dan registry Nacos.
HSF tidak mendukung Nacos. Pengembangan tambahan diperlukan.
Jika Anda ingin dengan cepat memigrasikan aplikasi Anda ke Dubbo dan merilisnya, kami sarankan menggunakan solusi pertama demi stabilitas. Bagian berikut menjelaskan cara melakukan migrasi dua langkah.
Arsitektur migrasi
Layanan Dubbo terdaftar dalam format HSF dan Dubbo untuk memastikan konsumen layanan HSF menemukan layanan Dubbo. Konsumen layanan Dubbo berlangganan data dalam format HSF dan Dubbo untuk memastikan konsumen layanan Dubbo menemukan layanan HSF.
Prasyarat
Komponen-komponen berikut yang diperlukan untuk migrasi telah diterapkan:
EDAS-container V3.5.5
edas-dubbo-extension 2.0.6
Asumsikan bahwa baik layanan HSF maupun Dubbo mewarisi antarmuka yang sama bernama edas-demo-interface. Antarmuka tersebut hanya berisi satu deklarasi antarmuka, dengan struktur direktori sebagai berikut:
├── pom.xml
├── src
│ └── main
│ └── java
│ └── com
│ └── alibaba
│ └── edas
│ └── DemoService.javaMigrasi penyedia layanan
Asumsikan bahwa Anda ingin memigrasikan aplikasi HSF edas-hsf-demo-provider-war, yang berisi file-file berikut:
pom.xmladalah file konfigurasi untuk dependensi antar modul aplikasi.DemoServiceImpl.javaadalah implementasi dari DemoService.hsf-provider-beans.xmladalah file deklarasi bean Spring untuk HSF.web.xmladalah deskriptor yang digunakan untuk penyebaran paket WAR.
Informasi berikut menunjukkan struktur direktori edas-hsf-demo-provider-war:
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── alibaba
│ │ │ └── edas
│ │ │ └── hsf
│ │ │ └── provider
│ │ │ └── DemoServiceImpl.java
│ │ ├── resources
│ │ │ └── hsf-provider-beans.xml
│ │ └── webapp
│ │ └── WEB-INF
│ │ └── web.xmlTambahkan dependensi Dubbo ke pom.xml.
Kami merekomendasikan menggunakan Spring 4.x atau lebih baru untuk layanan HSF.
Hapus dependensi klien HSF.
<dependency> <groupId>com.alibaba.edas</groupId> <artifactId>edas-sdk</artifactId> <version>1.5.4</version> </dependency>Tambahkan dependensi Dubbo.
edas-dubbo-extensiondigunakan untuk mendaftarkan layanan Dubbo dengan registry EDAS dan mendaftarkan serta berlangganan layanan Dubbo dalam format HSF. Untuk informasi lebih lanjut tentang file pom.xml lengkap, lihat kode contoh.dubboadalah dependensi standar Dubbo.
<dependency> <groupId>com.alibaba.edas</groupId> <artifactId>edas-dubbo-extension</artifactId> <version>2.0.5</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>
Ubah hsf-provider-beans.xml menjadi dubbo-provider-beans.xml.
Informasi berikut menunjukkan konfigurasi file hsf-provider-beans.xml:
<? 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" /> <! -- Contoh menyediakan layanan --> <hsf:provider id="demoService" interface="com.alibaba.edas.DemoService" ref="itemService" version="1.0.0"> </hsf:provider> </beans>Anda harus mengubahnya menjadi
dubbo-provider-beans.xml:<? 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"> <! -- Ini berarti layanan Dubbo akan didaftarkan dalam format HSF, sehingga konsumen hsf dapat menemukannya. --> <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>CatatanAlamat registry Dubbo harus diatur ke
edas://127.0.0.1:8080. Harus dimulai dengan edas. Alamat IP dan nomor port dapat tetap tidak berubah, yang akan diganti secara otomatis dengan yang dari layanan online oleh EDAS selama penyebaran.Anda harus menambahkan
<dubbo:parameter key="hsf.enable" value="true"/>, yang berarti layanan Dubbo didaftarkan dalam format HSF dan Dubbo untuk memastikan klien HSF menemukan layanan tersebut.Anda harus menentukan grup dan versi untuk label
<dubbo:service>. Grup default adalahHSFdan versi default adalah1.0.0. Jika tidak, klien HSF tidak dapat dipanggil.
Di file web.xml, ganti hsf-provider-beans.xml dengan dubbo-provider-beans.xml.
Anda hanya perlu mengganti
hsf-provider-beans.xmldengandubbo-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>Verifikasi hasil di lingkungan lokal.
Verifikasi di lingkungan lokal mencakup verifikasi apakah layanan dapat didaftarkan dan verifikasi apakah konsumen layanan dapat memanggil layanan tersebut.
Verifikasi apakah layanan dapat didaftarkan.
Untuk mendaftarkan aplikasi HSF Anda dengan registry lokal, tambahkan entri berikut ke file hosts, seperti /etc/hosts:
127.0.0.1 jmenv.tbsite.netUnduh konfigurasi registry ringan, ekstrak paket tersebut, masuk ke direktori bin, dan jalankan perintah
./startup.shuntuk memulai konfigurasi registry ringan.Jalankan perintah
mvn clean packageuntuk mengompilasi edas-hsf-demo-provider-war menjadi paket WAR.Setelah kompilasi, file disimpan di direktori target.
Sebarkan edas-hsf-demo-provider.war ke Ali-Tomcat dan edas-dubbo-demo-provider.war ke Apache Tomcat.
CatatanPort yang digunakan untuk memulai dua program Tomcat mungkin saling bertabrakan. Dalam hal ini, cari port 8005 dan 8080 di file conf/server.xml Tomcat dan ubah ke port yang tidak bertabrakan.
Akses konfigurasi registry ringan di http://127.0.0.1:8080/#/serviceManagement dan lihat layanan com.alibaba.edas.DemoService:1.0.0.
Jika layanan terdaftar dan memiliki dua instance, layanan Dubbo dan HSF terdaftar sebagai satu layanan yang sama dalam format HSF.
Verifikasi apakah konsumen layanan dapat memanggil layanan tersebut.
Lakukan langkah-langkah berikut untuk memeriksa apakah penyedia layanan yang dimigrasikan dapat dipanggil oleh konsumen:
Siapkan konsumen layanan HSF untuk pengujian, seperti edas-hsf-demo-consumer-war, dengan struktur direktori berikut:
├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── alibaba │ │ │ └── edas │ │ │ └── hsf │ │ │ └── consumer │ │ │ └── IndexServlet.java │ │ ├── resources │ │ │ └── hsf-consumer-beans.xml │ │ └── webapp │ │ └── WEB-INF │ │ └── web.xmlKonsumen menyediakan servlet yang digunakan untuk memulai pemanggilan layanan HSF setelah konsumen menerima permintaan 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); } }Jalankan perintah
mvn clean packageuntuk mengompilasi edas-hsf-demo-consumer-war menjadi edas-hsf-demo-consumer.war dan sebarkan edas-hsf-demo-consumer.war ke kontainer Ali-Tomcat lainnya. Pastikan port tidak bertabrakan.Masuk ke konsol konfigurasi registry ringan.
Normal jika tidak ada data konsumen layanan HSF yang muncul di konsol.
Setelah Ali-Tomcat dimulai, buka URL berikut:
curl http://localhost:8280/edas-hsf-demo-consumer/index.htmPeriksa keluaran standar dari kontainer Ali-Tomcat edas-hsf-demo-consumer.war.
Jika keluarannya mirip dengan informasi berikut, klien HSF telah memanggil layanan Dubbo dan 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
Migrasi konsumen layanan
Berdasarkan edas-hsf-demo-consumer-war, migrasikan konsumen layanan ke edas-dubbo-demo-consumer-war.
Tambahkan dependensi Dubbo ke pom.xml.
Konsumen layanan dapat dimigrasikan dengan cara yang sama seperti penyedia layanan. Operasi utama termasuk menambahkan dependensi dubbo dan dubbo-edas-extension serta menghapus dependensi edas-sdk. Untuk informasi lebih lanjut, lihat Tambahkan dependensi Dubbo ke pom.xml di bagian "Migrasi Penyedia Layanan".
Ubah hsf-comsumer-beans.xml menjadi dubbo-consumer-beans.xml.
Informasi berikut menampilkan konfigurasi file hsf-consumer-beans.xml:
<? 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"> <! -- Contoh mengonsumsi layanan --> <hsf:consumer id="demoService" interface="com.alibaba.edas.DemoService" version="1.0.0"> </hsf:consumer> </beans>Ubah file menjadi dubbo-consumer-beans.xml.
<? 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"> <! -- Ini berarti konsumen Dubbo akan berlangganan layanan HSF --> <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>CatatanAlamat registry Dubbo harus dimulai dengan
edas://.Tentukan
groupdanversionuntuk label<dubbo:service>. Pastikangroupdanversionsama dengan milik penyedia layanan. Defaultgroupadalah HSF dan defaultversionadalah 1.0.0.Tambahkan konfigurasi
check="false", yang berarti aplikasi konsumen layanan tidak akan langsung gagal tanpa alamat penyedia layanan saat aplikasi mencoba memulai.Tambahkan konfigurasi
<dubbo:parameter key="hsf.enable" value="true"/>, yang berarti konsumen layanan berlangganan data dari penyedia layanan.
Di file web.xml, ganti hsf-consumer-beans.xml dengan dubbo-comsumer-beans.xml.
Verifikasi hasil di lingkungan lokal.
Verifikasi di lingkungan lokal mencakup pengecekan apakah layanan terdaftar dengan konfigurasi registry ringan serta verifikasi kemampuan pemanggilan layanan HSF dan Dubbo.
Kemas proyek sebelumnya menjadi edas-dubbo-demo-consumer.war dan sebarkan ke Apache Tomcat.
PentingPastikan port tidak bertabrakan.
Masuk ke konsol konfigurasi registry ringan untuk memeriksa apakah konsumen layanan Dubbo terdaftar.
Jika layanan konsumen terdaftar muncul di konsol, layanan tersebut telah terdaftar.
Buka http://localhost:8280/edas-dubbo-demo-consumer/index.htm:
curl http://localhost:8280/edas-dubbo-demo-consumer/index.htmPeriksa keluaran standar Apache Tomcat pada klien HSF.
Jika keluarannya mirip dengan informasi berikut, konsumen layanan Dubbo telah mengonsumsi layanan HSF dan Dubbo.
Diterima: Hello dubbo, respons dari penyedia dubbo: 192.168.XX.XX:20880 Diterima: Hello dubbo, respons dari penyedia dubbo: 192.168.XX.XX:20880 Diterima: Hello dubbo, respons dari penyedia hsf: /192.168.XX.XX:12202 Diterima: Hello dubbo, respons dari penyedia hsf: /192.168.XX.XX:12202 Diterima: Hello dubbo, respons dari penyedia dubbo: 192.168.XX.XX:20880 Diterima: Hello dubbo, respons dari penyedia hsf: /192.168.XX.XX:12202 Diterima: Hello dubbo, respons dari penyedia hsf: /192.168.XX.XX:12202 Diterima: Hello dubbo, respons dari penyedia dubbo: 192.168.XX.XX:20880 Diterima: Hello dubbo, respons dari penyedia dubbo: 192.168.XX.XX:20880 Diterima: Hello dubbo, respons dari penyedia hsf: /192.168.XX.XX:12202 Diterima: Hello dubbo, respons dari penyedia hsf: /192.168.XX.XX:12202 Diterima: Hello dubbo, respons dari penyedia dubbo: 192.168.XX.XX:20880 Diterima: Hello dubbo, respons dari penyedia dubbo: 192.168.XX.XX:20880
Menyebarkan aplikasi ke EDAS dan memverifikasi hasilnya
Dalam topik ini, penyebaran di kluster Elastic Compute Service (ECS) digunakan sebagai contoh. Di EDAS, buat empat aplikasi berikut:
edas-dubbo-demo-consumer adalah aplikasi konsumen layanan setelah migrasi. Lingkungan runtime-nya adalah Apache Tomcat 7.0.91.
edas-dubbo-demo-provider adalah aplikasi penyedia layanan setelah migrasi. Lingkungan runtime-nya adalah Apache Tomcat 7.0.91.
edas-hsf-demo-consumer adalah aplikasi konsumen layanan sebelum migrasi. Lingkungan runtime-nya adalah EDAS-Container V3.5.4.
edas-hsf-demo-provider adalah aplikasi penyedia layanan sebelum migrasi. Lingkungan runtime-nya adalah EDAS-Container V3.5.4.
Sebarkan empat paket WAR ke empat aplikasi secara terpisah. Untuk informasi lebih lanjut, lihat Menyebarkan aplikasi ke EDAS.
Jalankan perintah berikut untuk memeriksa apakah konsumen layanan edas-hsf-demo-consumer dapat memanggil penyedia layanan HSF dan Dubbo:
curl http://39.106.XX.XXX:8080/index.htmLihat log di keluaran standar Ali-Tomcat dari aplikasi edas-hsf-demo-consumer, seperti /home/admin/taobao-tomcat-production-7.0.XX.X/logs/catalina.out.
Jika keluarannya mirip dengan informasi berikut, konsumen layanan HSF telah mengonsumsi layanan HSF dan Dubbo.
Jalankan perintah berikut untuk memeriksa apakah edas-dubbo-demo-consumer dapat memanggil penyedia layanan HSF dan Dubbo.
curl http://192.168.XX.XX:8080/index.htmLihat log di keluaran standar Apache Tomcat dari aplikasi edas-dubbo-demo-consumer, seperti /home/admin/apache-tomcat-7.0.91/logs/catalina.out.
Jika keluarannya mirip dengan informasi berikut, konsumen layanan Dubbo telah mengonsumsi layanan HSF dan Dubbo.
Pertanyaan yang Sering Diajukan (FAQ)
Mengapa saya tidak dapat menemukan alamat penyedia layanan setelah konsumen layanan Dubbo dimulai?
Deskripsi Masalah
java.lang.IllegalStateException: Gagal memeriksa status layanan com.xxxx.xxxxx.service.xxxxxConfigService. Tidak ada penyedia yang tersedia untuk layanan HSF/com.xxxxx.xxxxx.service.xxxxxxxxxxService:1.0.0 dari 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 untuk konsumen xxx.xx.xx.xxx menggunakan versi dubbo 2.7.3Penyebab Potensial
Registry secara asinkron mendorong alamat penyedia layanan. Secara default, Dubbo memeriksa apakah alamat penyedia layanan tersedia saat startup. Jika tidak ada alamat yang tersedia, kesalahan ini terjadi.
Solusi
Di label
<dubbo:reference>Dubbo, tambahkan konfigurasicheck="false"berikut:<dubbo:reference id="demoService" interface="com.alibaba.edas.DemoService" group="HSF" version="1.0.0" check="false"/>Setelah konfigurasi ditambahkan, Dubbo tidak akan memeriksa apakah alamat penyedia layanan tersedia saat startup. Namun, jika layanan Dubbo perlu dipanggil dalam kode inisialisasi bisnis, bisnis tersebut mungkin gagal.
Mengapa terjadi kesalahan ketika konsumen layanan HSF memanggil layanan Dubbo?
Deskripsi Masalah
2019-07-28 23:07:38.005 [WARN ] [cf67433d1e7a44412a518bd190100d176-node401] [NettyServerWorker-6-1] [o.a.d.r.exchange.codec.ExchangeCodec:91] | [DUBBO] Gagal menyandikan respons: 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]], kirim info bad_response sebagai gantinya, penyebab: Untuk input string: "", versi dubbo: 2.7.3, host saat ini: xxx.xx.xx.xxx java.lang.NumberFormatException: Untuk 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) ...Penyebab Potensial
Setelah Dubbo diperbarui ke V2.7, HSF tidak kompatibel dengan Dubbo.
Solusi
Perbarui EDAS-Container ke V3.5.5. Masalah ini telah diperbaiki di EDAS-Container versi ini di HSF.
Mengapa konsumen layanan Dubbo gagal memanggil penyedia layanan HSF?
Deskripsi Masalah
java.lang.Exception: [HSF-Provider-192.168.0.46] Log kesalahan: [HSF-Provider] Aplikasi [xxxxxxx-3b6f-42d3-xxxx-0ad2434xxxxx] gagal memverifikasi tanda tangan pemanggil [null] untuk [com.alibaba.edas.DemoService:1.0.0] [sayHello] dari klien [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)Penyebab Potensial
Otentikasi panggilan diaktifkan untuk HSF, tetapi Dubbo tidak mendukung otentikasi ini.
Solusi
Tambahkan
-DneedAuth=falseke penyedia layanan HSF untuk menonaktifkan otentikasi panggilan.Mengapa konsumen layanan Dubbo gagal memanggil penyedia layanan HSF?
Deskripsi Masalah
2019-08-02 17:17:15.187 [WARN ] [cf67433d1e7a44412a518bd190100d176-node401] [NettyClientWorker-4-1] [o.a.d.r.p.dubbo.DecodeableRpcResult:91] | [DUBBO] Dekode hasil rpc gagal: null, versi dubbo: 2.7.3, host saat ini: 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) ...Penyebab Potensial
Layanan HSF menyediakan dan bergantung pada versi Hessian Lite yang lebih lama, yang tidak mendukung serialisasi JDK 8 LocalDateTime.
Solusi
Perbarui EDAS-Container penyedia layanan HSF ke V3.5.5.