Tüm Ürünler
Search
Belge Merkezi

Microservices Engine:Boş liste koruması

Son Güncelleme:Oct 06, 2026

Bir tüketici, sağlayıcı listesini bir kayıt defterinden abonelik yoluyla alır. Kayıt defterinde değişiklik olması, beklenmedik bir sorunla karşılaşılması veya ağ ve CPU yükleri gibi faktörler nedeniyle sağlayıcı ile kayıt defteri arasındaki bağlantının kesilmesi durumunda abonelik istisnaları oluşabilir. Bu durumda tüketici boş bir sağlayıcı listesi alabilir. Sistemin genel kullanılabilirliğini artırmak için Nacos istemcisinde veya Microservices Engine (MSE) Nacos sunucusunda boş liste korumasını etkinleştirebilirsiniz.

Ön koşullar

  • MSE etkinleştirilmiş olmalıdır. Daha fazla bilgi için bkz. Activate MSE.

  • Bir Nacos motoru oluşturulmuş olmalıdır. Daha fazla bilgi için bkz. Nacos motoru oluşturma.

İstemcide boş liste korumasını etkinleştirme

Sınırlamalar

1.4.1 veya sonraki sürümlerdeki Nacos Java istemcisi boş liste korumasını destekler.

Not

Belirli sürümlerden kaynaklanan riskleri önlemek için istemci, Spring Cloud uygulamaları ve Dubbo uygulamaları için önerilen sürümler temelinde uygun sürümleri seçmenizi öneririz.

Yordam

  • Nacos Java istemcisini kullanıyorsanız aşağıdaki adımları uygulayın:

    1. Aşağıdaki Nacos istemcisi bağımlılığını ekleyin:

      <!-- ${nacos-client.version} must be 1.4.1 or later. -->
      <dependency>
          <groupId>com.alibaba.nacos</groupId>
          <artifactId>nacos-client</artifactId>
          <version>${nacos-client.version}</version>
      </dependency>
    2. Uygulama kodunda aşağıdaki ayarları yapılandırın:

      Properties properties = new Properties();
      properties.put(PropertyKeyConst.SERVER_ADDR, "${Endpoint of the MSE Nacos instance}");
      properties.put(PropertyKeyConst.NAMING_PUSH_EMPTY_PROTECTION, "true");
      NamingService naming = NamingFactory.createNamingService(properties);
  • Uygulamanız bir Spring Cloud Alibaba uygulamasıysa uygulamanızın yapılandırma dosyasına aşağıdaki yapılandırmayı ekleyin:

    spring.cloud.nacos.discovery.namingPushEmptyProtection=true
  • Uygulamanız bir Dubbo uygulamasıysa Dubbo uygulamanızın yapılandırma dosyasına aşağıdaki kayıt defteri URL yapılandırmasını ekleyin:

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

Sunucuda boş liste korumasını etkinleştirme

Not

Hala çok sayıda Java dışı istemci ve 1.4.1 öncesi sürümlerdeki Nacos Java istemcisi kullanılmaktadır. MSE, açık kaynaklı Nacos'a dayalı olarak Nacos sunucularının yeteneklerini optimize eder ve Nacos sunucuları için boş liste koruması sağlar.

Sınırlamalar

Nacos motoru sürümü 2.1.0.0 veya sonraki bir sürüm olmalıdır. Nacos motoru sürümünü yükseltme hakkında daha fazla bilgi için bkz. Nacos sürümünü güncelleme.

Yordam

Boş liste korumasını etkinleştirme yöntemi, MSE Nacos motorunuzun sürümüne göre değişir.

  • MSE Nacos motorunuzun sürümü 2.1.0.0 veya 2.1.0.1 ise herhangi bir işlem gerekmez. Bu sürümlerde boş liste koruması otomatik olarak etkindir.

  • MSE Nacos motorunuzun sürümü 2.1.0.2 veya sonraki bir sürümse boş liste korumasını etkinleştirmek için aşağıdaki adımları izleyin:

    1. MSE konsolunda oturum açın ve üst gezinme çubuğundan bir bölge seçin.

    2. Sol gezinme bölmesinde Microservices Registry > Instances öğelerini seçin.

    3. Instances sayfasında örneğin adına tıklayın.

    4. Sol gezinme bölmesinde Parameter Settings seçeneğine tıklayın. Parameter Settings sayfasının Real-time Effective Parameters bölümünde forcePushEmptyProtectionForAllService parametresinin Actions sütununda Edit seçeneğine tıklayın.

    5. Edit Parameters iletişim kutusunda Value için Yes seçeneğini belirleyin ve OK seçeneğine tıklayın.

      Not

      En yüksek hizmet kullanılabilirliğini sağlamak için tüm durumlarda forcePushEmptyProtectionForAllService parametresinin Value değeri olarak Yes seçeneğini belirlemenizi öneririz.

Sonucu doğrulama

Bir hizmet boş liste korumasını tetiklediğinde tüketicinin bulunduğu düğümün ${user.home}/logs/nacos dizinindeki naming.log dosyasında Trigger push empty protection for Service mesajı görüntülenir.

Normal koşullarda bu tür bilgiler sık sık görünmez. Bu tür bilgiler sık sık görünürse sorunu aşağıdaki olası nedenlere göre giderebilirsiniz:

  • Tüketicinin abone olduğu sağlayıcılar mevcut değil.

    Tüketici mevcut olmayan bir sağlayıcıya abone olduysa uygulama bağımlılığının gerekli olup olmadığını kontrol etmeniz gerekir. Uygulama bağımlılığı gerekli değilse geçersiz bağımlılığı silin. Uygulama bağımlılığı gerekliyse sağlayıcıyı yeniden yayınlamanız gerekir.

  • Örnek listesinde hiçbir sağlayıcı görüntülenmiyor.

    • Tüketicinin abone olduğu sağlayıcıların bağlantısının sık sık kesilip kesilmediğini kontrol edin.

    • Her sağlayıcı ile MSE Nacos örneği arasındaki ağ bağlantısının normal olup olmadığını kontrol edin. Ağ bağlantısı anormal ise MSE Nacos örneği sağlayıcının bağlantısının kesildiğini belirler.

Boş liste korumasını tetikleyen hizmeti tanımlama

Hata mesajı, boş liste korumasını tetikleyen hizmetle ilgili bilgileri içerir. Tüketicinin abone olduğu boş hizmeti Service{namespace='XXX', group='xx', name='xxxxxxx', ephemeral=true, revision=0} bilgisine göre tanımlayabilirsiniz.

Bilinen tetikleme senaryoları


Senaryo


Neden


Çözüm


Dubbo 2 sürümlerinin uyumlu olduğu çoklu abonelik senaryolarında eski biçimdeki hizmet adlarına sahip sağlayıcılar örnek listesinde görüntülenmez.


Dubbo 2.7.6 öncesi bir sürümdeki sağlayıcının hizmet adı biçimi, Dubbo 2.7.6 veya sonraki sürümlerdeki sağlayıcının hizmet adı biçiminden farklıdır. Dubbo 2.7.6 veya sonraki sürümlerdeki sağlayıcıların kullanıldığı çoklu abonelik senaryolarında tüketici hem eski biçimli hem de yeni biçimli hizmet adlarına sahip sağlayıcılara abone olur. Tüm sağlayıcıların sürümleri Dubbo 2.7.6 veya sonraki sürümler ise eski biçimli hizmet adlarına sahip sağlayıcılar Nacos örneğine kaydedilemez. Sonuç olarak, tüketici eski biçimli hizmet adına sahip bir sağlayıcıya abone olduğunda boş liste koruması tetiklenir.


Motor sürümünüzü 2.1.0.1 veya sonraki bir sürüme ya da Dubbo sürümünüzü 2.7.17 veya sonraki bir sürüme yükseltin. Daha fazla bilgi için bkz. Motor sürümünü yükseltme.


Dubbo 3 sürümlerinin uyumlu olduğu çoklu abonelik senaryolarında arabirim düzeyindeki hizmet adlarına sahip sağlayıcılar örnek listesinde görüntülenmez.


Dubbo 3, uygulama düzeyinde hizmet keşfini destekler. Kaydedilen hizmet adları arabirim düzeyindeki hizmet adları değil, uygulama düzeyindeki hizmet adlarıdır. Dubbo sürümlerinin sorunsuz yükseltilmesini sağlamak için tüketici hem uygulama düzeyindeki hem de arabirim düzeyindeki hizmet adlarına sahip sağlayıcılara abone olur. Tüm sağlayıcıların sürümleri Dubbo 3 ise arabirim düzeyindeki hizmet adlarına sahip sağlayıcılar Nacos örneğine kaydedilemez. Sonuç olarak, tüketici arabirim düzeyindeki hizmet adına sahip bir sağlayıcıya abone olduğunda boş liste koruması tetiklenir.


dubbo.application.service-discovery.migration=FORCE_APPLICATION yapılandırmasını ekleyin. Daha fazla bilgi için Dubbo resmi web sitesini ziyaret edin.


Bir Spring Cloud Alibaba uygulaması için NacosWatch özelliği ilk kez etkinleştirildiğinde ve hiçbir örnek çoğaltması mevcut olmadığında tüketici boş bir örnek listesi alır.


NacosWatch özelliği, uygulamaların hizmet durumunu izlemek için Spring Cloud Alibaba uygulamalarının yeni sürümünde sağlanır. NacosWatch özelliği, bir Spring Cloud Alibaba uygulamasının başladığında kendi hizmetini izlemesine olanak tanır. Bir Spring Cloud Alibaba uygulaması için NacosWatch özelliği ilk kez etkinleştirildiğinde ve hiçbir örnek çoğaltması mevcut değilse uygulama örneği Nacos örneğine kaydedilmediğinden boş liste koruması tetiklenir. Uygulama örneği başladıktan sonra boş liste koruması artık tetiklenmez.


Bir Spring Cloud Alibaba uygulaması için NacosWatch özelliği ilk kez etkinleştirildiğinde ve hiçbir örnek çoğaltması mevcut değilse sorunu yok sayın. Alternatif olarak NacosWatch özelliğini devre dışı bırakmak için spring.cloud.nacos.discovery.watch.enabled=false yapılandırmasını ekleyebilirsiniz. Daha fazla bilgi için bkz. Spring Cloud Alibaba.


Bir Spring Cloud Gateway için bir hizmet tamamen devre dışı bırakıldığında hizmet durumu senkronize edilmez.


Spring Cloud Gateway başlatıldığında Spring Cloud Gateway, Nacos örneğinden tüm hizmetleri sorgular ve tüm hizmetlere abone olur. Örneğin, bir Spring Cloud Gateway başlatıldıktan sonra Nacos örneği tüm uygulama örneklerini otomatik olarak kaldırdığından bir hizmet tamamen devre dışı kalır. Ancak Spring Cloud Gateway hizmet durumunu algılamaz ve hizmete abone olmaya devam eder. Sonuç olarak boş liste koruması tetiklenir.


Spring Cloud Gateway, bir hizmetin durumunu dinamik olarak algılayamaz ve hizmet devre dışı bırakılırsa aboneliği iptal edemez. Spring Cloud Gateway'i yeniden başlatmanızı öneririz.

Boş liste korumasının zorla etkinleştirildiği senaryolar

MSE Nacos 2.1.0.2 veya sonraki sürümlerde boş liste korumasını etkinleştirme mantığı optimize edilmiştir. Bu optimizasyon, forcePushEmptyProtectionForAllService parametresinin Value değeri için Yes seçildiğinde yalnızca boş liste korumasının etkinleştirilmesini sağlar. Ancak sistem, forcePushEmptyProtectionForAllService parametresinin Value değeri için No seçilse bile kullanılabilirliği ve kararlılığı sağlamak için aşağıdaki senaryolarda boş liste korumasını otomatik olarak etkinleştirir.

  • Bir motor düğümü yükseltildiğinde, yeniden başlatıldığında veya arızadan kurtarıldığında düğüm, bu süre zarfında hizmet kullanılabilirliğini sağlamak için tüm uygulamalar için iki dakikalık boş liste korumasını otomatik olarak etkinleştirir.

  • Bir uygulamanın tüm örnekleri MSE örneğindeki uygulama örnek listesinden kaldırılırsa MSE örneği, uygulama için bir dakikalık boş liste korumasını otomatik olarak etkinleştirir. Bu işlem, kararsız ağ performansı ve hizmet sağlayıcılarının geçici arızaları gibi sorunlar ortaya çıktığında boş liste korumasının beklenmedik şekilde tetiklenmesini önler. Bu şekilde, bu senaryoda hizmet kullanılabilirliği sağlanır.

Not

En yüksek hizmet kullanılabilirliğini sağlamak için tüm durumlarda boş liste korumasını etkinleştirmek üzere forcePushEmptyProtectionForAllService parametresinin Value değeri olarak Yes seçeneğini belirlemenizi öneririz.