全部产品
Search
文档中心

Microservices Engine:Perlindungan Daftar Kosong

更新时间:Jul 06, 2025

Konsumen berlangganan daftar penyedia dari registri. Jika registri mengalami perubahan atau masalah tak terduga, atau jika koneksi antara penyedia dan registri terputus karena faktor-faktor seperti jaringan atau beban CPU, pengecualian langganan dapat terjadi. Akibatnya, konsumen mungkin menerima daftar penyedia yang kosong. Anda dapat mengaktifkan perlindungan daftar kosong pada klien Nacos atau server Microservices Engine (MSE) Nacos untuk meningkatkan ketersediaan sistem secara keseluruhan.

Prasyarat

  • MSE telah diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan MSE.

  • Mesin Nacos telah dibuat. Untuk informasi lebih lanjut, lihat Buat mesin Nacos.

Aktifkan perlindungan daftar kosong pada klien

Batasan

Klien Java Nacos versi 1.4.1 atau lebih baru mendukung perlindungan daftar kosong.

Catatan

Untuk mencegah risiko yang timbul dari versi tertentu, kami menyarankan Anda memilih versi yang sesuai untuk klien, aplikasi Spring Cloud, dan aplikasi Dubbo berdasarkan versi yang direkomendasikan.

Prosedur

  • Jika Anda menggunakan klien Java Nacos, lakukan operasi berikut:

    1. Tambahkan dependensi berikut dari klien Nacos:

      <!-- ${nacos-client.version} harus 1.4.1 atau lebih baru. -->
      <dependency>
          <groupId>com.alibaba.nacos</groupId>
          <artifactId>nacos-client</artifactId>
          <version>${nacos-client.version}</version>
      </dependency>
    2. Konfigurasikan pengaturan berikut dalam kode aplikasi:

      Properties properties = new Properties();
      properties.put(PropertyKeyConst.SERVER_ADDR, "${Endpoint dari instance MSE Nacos}");
      properties.put(PropertyKeyConst.NAMING_PUSH_EMPTY_PROTECTION, "true");
      NamingService naming = NamingFactory.createNamingService(properties);
  • Jika aplikasi Anda adalah aplikasi Spring Cloud Alibaba, tambahkan konfigurasi berikut ke file konfigurasi aplikasi Anda:

    spring.cloud.nacos.discovery.namingPushEmptyProtection=true
  • Jika aplikasi Anda adalah aplikasi Dubbo, tambahkan konfigurasi URL registri berikut ke file konfigurasi aplikasi Dubbo Anda:

    dubbo.registry.address=nacos://${Endpoint dari instance MSE Nacos}:8848?namingPushEmptyProtection=true

Aktifkan perlindungan daftar kosong pada server

Catatan

Sejumlah besar klien non-Java dan klien Java Nacos versi sebelum 1.4.1 masih digunakan. MSE mengoptimalkan kemampuan server Nacos berdasarkan Nacos sumber terbuka untuk menyediakan perlindungan daftar kosong untuk server Nacos.

Batasan

Versi mesin Nacos harus 2.1.0.0 atau lebih baru. Untuk informasi lebih lanjut tentang cara memperbarui versi mesin Nacos, lihat Perbarui versi Nacos.

Prosedur

Metode untuk mengaktifkan perlindungan daftar kosong bervariasi berdasarkan versi mesin MSE Nacos Anda.

  • Jika versi mesin MSE Nacos Anda adalah 2.1.0.0 atau 2.1.0.1, tidak diperlukan tindakan apa pun. Perlindungan daftar kosong secara otomatis diaktifkan dalam versi ini.

  • Jika versi mesin MSE Nacos Anda adalah 2.1.0.2 atau lebih baru, lakukan langkah-langkah berikut untuk mengaktifkan perlindungan daftar kosong:

    1. Masuk ke Konsol MSE, dan pilih wilayah di bilah navigasi atas.

    2. Di panel navigasi kiri, pilih Microservices Registry > Instances.

    3. Di halaman Instances, klik nama instance tersebut.

    4. Di panel navigasi kiri, klik Parameter Settings. Di bagian Real-time Effective Parameters pada halaman Parameter Settings, klik Edit di kolom Actions dari parameter forcePushEmptyProtectionForAllService.

    5. Di kotak dialog Edit Parameters, pilih Yes untuk Value dan klik OK.

      Catatan

      Untuk memastikan ketersediaan layanan tertinggi, kami menyarankan Anda memilih Yes untuk Value dari parameter forcePushEmptyProtectionForAllService dalam semua kasus.

Verifikasi hasil

Saat layanan memicu perlindungan daftar kosong, Trigger push empty protection for Service ditampilkan di file naming.log di direktori ${user.home}/logs/nacos node tempat konsumen berada.

Dalam kondisi normal, informasi semacam itu tidak sering muncul. Jika informasi tersebut sering muncul, Anda dapat menyelesaikan masalah ini berdasarkan penyebab potensial berikut:

  • Penyedia yang dilanggan oleh konsumen tidak ada.

    Jika konsumen berlangganan ke penyedia yang tidak ada, Anda harus memeriksa apakah ketergantungan aplikasi diperlukan. Jika ketergantungan aplikasi tidak diperlukan, hapus ketergantungan yang tidak valid. Jika ketergantungan aplikasi diperlukan, Anda harus menerbitkan kembali penyedia tersebut.

  • Tidak ada penyedia yang ditampilkan dalam daftar instance.

    • Periksa apakah penyedia yang dilanggan oleh konsumen sering terputus.

    • Periksa apakah koneksi jaringan antara setiap penyedia dan instance MSE Nacos normal. Jika koneksi jaringan abnormal, instance MSE Nacos menentukan bahwa penyedia terputus.

Identifikasi layanan yang memicu perlindungan daftar kosong

Pesan kesalahan berisi informasi tentang layanan yang memicu perlindungan daftar kosong. Anda dapat mengidentifikasi layanan kosong yang dilanggan oleh konsumen berdasarkan Service{namespace='XXX', group='xx', name='xxxxxxx', ephemeral=true, revision=0}.

Skenario pemicu yang diketahui

Skenario

Penyebab

Solusi

Dalam skenario multi-langganan di mana versi Dubbo 2 kompatibel, penyedia dengan nama layanan dalam format lama tidak ditampilkan dalam daftar instance.

Format nama layanan penyedia dalam versi sebelum Dubbo 2.7.6 berbeda dari format nama layanan penyedia dalam Dubbo 2.7.6 atau lebih baru. Dalam skenario multi-langganan di mana penyedia dalam Dubbo 2.7.6 atau lebih baru digunakan, konsumen berlangganan baik penyedia dengan nama layanan dalam format lama maupun penyedia dengan nama layanan dalam format baru. Jika versi semua penyedia adalah Dubbo 2.7.6 atau lebih baru, penyedia dengan nama layanan dalam format lama tidak dapat didaftarkan dengan instance Nacos. Akibatnya, perlindungan daftar kosong dipicu ketika konsumen berlangganan ke penyedia dengan nama layanan dalam format lama.

Tingkatkan versi mesin Anda ke 2.1.0.1 atau lebih baru, atau tingkatkan versi Dubbo ke 2.7.17 atau lebih baru. Untuk informasi lebih lanjut, lihat Tingkatkan versi mesin.

Dalam skenario multi-langganan di mana versi Dubbo 3 kompatibel, penyedia dengan nama layanan tingkat antarmuka tidak ditampilkan dalam daftar instance.

Dubbo 3 mendukung penemuan layanan tingkat aplikasi. Nama layanan yang didaftarkan bukan nama layanan tingkat antarmuka tetapi nama layanan tingkat aplikasi. Untuk memastikan peningkatan versi Dubbo yang lancar, konsumen berlangganan baik penyedia dengan nama layanan tingkat aplikasi maupun penyedia dengan nama layanan tingkat antarmuka. Jika versi semua penyedia adalah Dubbo 3, penyedia dengan nama layanan tingkat antarmuka tidak dapat didaftarkan dengan instance Nacos. Akibatnya, perlindungan daftar kosong dipicu ketika konsumen berlangganan ke penyedia dengan nama layanan tingkat antarmuka.

Tambahkan konfigurasi dubbo.application.service-discovery.migration=FORCE_APPLICATION. Untuk informasi lebih lanjut, kunjungi Situs resmi Dubbo.

Jika fitur NacosWatch diaktifkan untuk aplikasi Spring Cloud Alibaba untuk pertama kali dan tidak ada replika instance, daftar instance kosong diterima oleh konsumen.

Fitur NacosWatch disediakan dalam versi baru aplikasi Spring Cloud Alibaba untuk memantau status layanan aplikasi. Fitur NacosWatch memungkinkan aplikasi Spring Cloud Alibaba memantau layanannya saat aplikasi dimulai. Jika fitur NacosWatch diaktifkan untuk aplikasi Spring Cloud Alibaba untuk pertama kali dan tidak ada replika instance, perlindungan daftar kosong dipicu karena instance aplikasi tidak didaftarkan dengan instance Nacos. Setelah instance aplikasi mulai, perlindungan daftar kosong tidak lagi dipicu.

Abaikan masalah jika fitur NacosWatch diaktifkan untuk aplikasi Spring Cloud Alibaba untuk pertama kali dan tidak ada replika instance. Anda juga dapat menambahkan konfigurasi spring.cloud.nacos.discovery.watch.enabled=false untuk menonaktifkan fitur NacosWatch. Untuk informasi lebih lanjut, lihat Spring Cloud Alibaba.

Dalam skenario di mana layanan sepenuhnya dinonaktifkan untuk Spring Cloud Gateway, status layanan tidak disinkronkan.

Saat Spring Cloud Gateway dimulai, Spring Cloud Gateway meminta semua layanan dari instance Nacos dan berlangganan semua layanan. Misalnya, setelah Spring Cloud Gateway dimulai, layanan sepenuhnya dinonaktifkan karena instance Nacos secara otomatis menghapus semua instance aplikasi. Namun, Spring Cloud Gateway tidak mendeteksi status layanan dan terus berlangganan layanan tersebut. Akibatnya, perlindungan daftar kosong dipicu.

Spring Cloud Gateway tidak dapat mendeteksi status layanan secara dinamis dan berhenti berlangganan layanan jika layanan dinonaktifkan. Kami menyarankan Anda memulai ulang Spring Cloud Gateway.

Skenario di mana perlindungan daftar kosong diaktifkan secara paksa

Dalam MSE Nacos 2.1.0.2 atau lebih baru, logika untuk mengaktifkan perlindungan daftar kosong dioptimalkan. Optimasi ini memastikan bahwa perlindungan daftar kosong diaktifkan hanya jika Yes dipilih untuk Value dari parameter forcePushEmptyProtectionForAllService. Namun, sistem masih secara otomatis mengaktifkan perlindungan daftar kosong untuk memastikan ketersediaan dan stabilitas dalam skenario berikut meskipun No dipilih untuk Value dari parameter forcePushEmptyProtectionForAllService.

  • Saat node mesin ditingkatkan, di-restart, atau pulih dari kegagalan, node secara otomatis mengaktifkan perlindungan daftar kosong selama dua menit untuk semua aplikasi guna memastikan ketersediaan layanan selama periode waktu tersebut.

  • Jika semua instance aplikasi dihapus dari daftar instance aplikasi pada instance MSE, instance MSE secara otomatis mengaktifkan perlindungan daftar kosong selama satu menit untuk aplikasi tersebut. Operasi ini mencegah perlindungan daftar kosong dipicu secara tidak terduga ketika masalah seperti performa jaringan yang tidak stabil dan kegagalan sementara penyedia layanan terjadi. Dengan cara ini, ketersediaan layanan disediakan dalam skenario ini.

Catatan

Untuk memastikan ketersediaan layanan tertinggi, kami menyarankan Anda memilih Yes untuk Value dari parameter forcePushEmptyProtectionForAllService untuk mengaktifkan perlindungan daftar kosong dalam semua kasus.