Azure Service Fabric'de ters ara sunucu

Azure Service Fabric yerleşik ters ara sunucu, Service Fabric kümede çalışan mikro hizmetlerin http uç noktalarına sahip diğer hizmetleri keşfetmesine ve iletişim kurmasına yardımcı olur.

Mikro hizmetler iletişim modeli

Kümedeki mikro Service Fabric kümedeki düğümlerin bir alt kümesinde çalıştırıldı ve çeşitli nedenlerle düğümler arasında geçiş yapılabiliyor. Sonuç olarak, mikro hizmetlerin uç noktaları dinamik olarak değişebilir. Kümede diğer hizmetleri bulmak ve bu hizmetlerle iletişim kurmak için mikro hizmetin aşağıdaki adımların üzerinden geçebilirsiniz:

  1. Adlandırma hizmeti aracılığıyla hizmet konumunu çözümle.
  2. Bağlan için.
  3. Bağlantı hatalarında uygulanacak hizmet çözümleme ve yeniden deneme ilkelerini uygulayan bir döngüde önceki adımları sarmala

Daha fazla bilgi için bkz. Bağlan ile iletişim kurma.

Ters ara sunucu kullanarak iletişim kurma

Ters ara sunucu, her düğümde çalışan ve istemci hizmetleri adına uç nokta çözümlemesini, otomatik yeniden denemeyi ve diğer bağlantı hatalarını ele alan bir hizmettir. Ters ara sunucu, istemci hizmetlerinden gelen istekleri işleyene çeşitli ilkeleri uygulayacak şekilde yalıtabilirsiniz. Ters ara sunucu kullanmak, istemci hizmetinin herhangi bir istemci tarafı HTTP iletişim kitaplığını kullanmalarına olanak sağlar ve hizmette özel çözümleme ve yeniden deneme mantığı gerektirmez.

Ters ara sunucu, istemci hizmetlerinin diğer hizmetlere istek göndermek için kullanmaları için yerel düğümde bir veya daha fazla uç noktayı gösterir.

İç iletişim

Not

Desteklenen Platformlar

Service Fabric'da ters ara sunucu şu anda aşağıdaki platformları destekler

  • Windows Kümesi: Windows 8 ve sonrası veya Windows Server 2012 ve sonrası
  • Linux Kümesi: Ters Proxy şu anda Linux kümeleri için kullanılamıyor

Kümenin dışından mikro hizmetlere ulaşma

Mikro hizmetler için varsayılan dış iletişim modeli, her hizmete doğrudan dış istemcilerden erişilemediklerinden bir kabul modelidir. Azure Load Balancerve dış istemciler arasında bir ağ sınırı olan bir ağ sınırı olan Azure Load Balancer, ağ adresi çevirisini gerçekleştirir ve dış istekleri iç IP:bağlantı noktası uç noktalarına iletir. Bir mikro hizmetin uç noktasını dış istemciler için doğrudan erişilebilir hale Load Balancer, trafiği hizmetin kümede kullandığı her bağlantı noktasına iletecektir. Ancak, özellikle durum bilgili mikro hizmetler olmak üzere çoğu mikro hizmet kümenin tüm düğümlerinde yaşamıyor. Mikro hizmetler yük devretmedeki düğümler arasında hareket eder. Böyle durumlarda, Load Balancer trafiği iletecek çoğaltmaların hedef düğümünün konumunu etkili bir şekilde belirleye değildir.

Kümenin dışından ters ara sunucu aracılığıyla mikro hizmetlere ulaşma

Tek bir hizmetin bağlantı noktasını Load Balancer yerine yalnızca ters ara sunucu bağlantı noktasını Load Balancer. Bu yapılandırma, küme dışındaki istemcilerin ek yapılandırma olmadan ters ara sunucu kullanarak küme içindeki hizmetlere ulaşmalarına olanak sağlar.

Dış iletişim

Uyarı

Ters proxy'nin bağlantı noktasını Load Balancer, kümede http uç noktasını ortaya çıkaran tüm mikro hizmetler küme dışından adreslenebilir. Bu, dahili olması gereken mikro hizmetlerin, belirlenen kötü amaçlı bir kullanıcı tarafından keşfedilebilir olduğu anlamına gelir. Bu potansiyel olarak açıklardan yararlanabilecek ciddi güvenlik açıkları sunar; örneğin:

  • Kötü amaçlı bir kullanıcı, yeterince sağlamlaştırılmış bir saldırı yüzeyine sahip bir iç hizmeti tekrar tekrar çağırarak bir hizmet reddi saldırısı başlatabilirsiniz.
  • Kötü amaçlı bir kullanıcı, bir iç hizmete yanlış biçimlendirilmiş paketler teslim ediyor ve bu da yanlış davranışa neden olabilir.
  • dahili olması amaçlanan bir hizmet, küme dışındaki hizmetlere açık olması amaçlanan özel veya hassas bilgileri geri getirerek bu hassas bilgileri kötü amaçlı bir kullanıcıya ifşa ediyor olabilir.

Ters ara sunucu bağlantı noktasını genel hale gelmeden önce kümeniz ve üzerinde çalışan uygulamalar için olası güvenlik açıklarını tam olarak anlamadan ve hafifletmeden emin olun.

Ters ara sunucu kullanarak hizmetleri adresleyeme için URI biçimi

Ters ara sunucu, gelen isteğin ilet alınmak istediğiniz hizmet bölümünü tanımlamak için belirli bir tekdüz kaynak tanımlayıcısı (URI) biçimini kullanır:

http(s)://<Cluster FQDN | internal IP>:Port/<ServiceInstanceName>/<Suffix path>?PartitionKey=<key>&PartitionKind=<partitionkind>&ListenerName=<listenerName>&TargetReplicaSelector=<targetReplicaSelector>&Timeout=<timeout_in_seconds>
  • http(s): Ters ara sunucu HTTP veya HTTPS trafiğini kabul etmek için yalıtabilirsiniz. HTTPS iletme için, HTTPS'Bağlan ara sunucu kurulumuna sahip olduktan sonra ters ara sunucu ile güvenli bir hizmete nasıl bağlanabilirsiniz? bağlantısına bakın.

  • Küme tam etki alanı adı (FQDN) | IP adresi: Dış istemciler için, ters proxy'yi küme etki alanı üzerinden erişilebilir olacak şekilde mycluster.eastus.cloudapp.azure.com. Varsayılan olarak, ters ara sunucu her düğümde çalışır. İç trafik için ters ara sunucuya localhost'ta veya 10.0.0.1 gibi herhangi bir iç düğüm IP'sine ulaşabilirsiniz.

  • Bağlantı noktası: Bu, ters ara sunucu için belirtilen 19081 gibi bir bağlantı noktasıdır.

  • ServiceInstanceName: Bu, "fabric:/" olmadan ulaşmaya çalışan dağıtılan hizmet örneğinin tam adıdır Düzeni. Örneğin, fabric:/myapp/myservice/ hizmetine ulaşmak için myapp/myservice kullanabilirsiniz.

    Hizmet örneği adı büyük/büyük/büyük harfe duyarlıdır. URL'de hizmet örneği adı için farklı bir büyük/küçük ad kullanmak, isteklerin 404 (Bulunamadı) ile başarısız olmasına neden olur.

  • Sonek yolu: Bu, bağlanmak istediğiniz hizmetin myapi/values/add/3 gibi gerçek URL yoludur.

  • PartitionKey: Bölümlenmiş bir hizmet için bu, ulaşmak istediğiniz bölümün hesaplanan bölüm anahtarıdır. Bunun bölüm kimliği GUID'si olmadığını unutmayın. Bu parametre, tek bölüm düzenini kullanan hizmetler için gerekli değildir.

  • PartitionKind: Bu, hizmet bölüm düzenidir. Bu 'Int64Range' veya 'Named' olabilir. Bu parametre, tek bölüm düzenini kullanan hizmetler için gerekli değildir.

  • ListenerName Hizmetten uç noktalar {"Endpoints":{"Listener1":"Endpoint1","Listener2":"Endpoint2" ...}} şeklindedir. Hizmet birden çok uç noktayı açığa çıkararak istemci isteğinin ilet olması gereken uç noktayı tanımlar. Hizmetin yalnızca bir dinleyicisi varsa bu atlanabilir.

  • TargetReplicaSelector Bu, hedef çoğaltmanın veya örneğin nasıl seçileceklerini belirtir.

    • Hedef hizmet durum bilgili olduğunda TargetReplicaSelector şu hizmetlerden biri olabilir: 'PrimaryReplica', 'RandomSecondaryReplica' veya 'RandomReplica'. Bu parametre belirtilmezse varsayılan değer 'PrimaryReplica' olur.
    • Hedef hizmet durum bilgisiz olduğunda ters ara sunucu, isteği ilet olmak için hizmet bölümünün rastgele bir örneğini seçer.
  • Zaman aşımı: Bu, istemci isteği adına hizmete ters ara sunucu tarafından oluşturulan HTTP isteğinin zaman aşımını belirtir. Varsayılan değer 120 saniyedir. Bu isteğe bağlı bir parametredir.

Örnek kullanım

Örneğin, aşağıdaki URL'de bir HTTP dinleyicisi açan fabric:/MyApp/MyService hizmetini alalım:

http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/

Hizmetin kaynakları aşağıda ve ardından ve daha sonra ve daha fazla bilgi ve daha fazla hizmet için kullanılabilir:

  • /index.html
  • /api/users/<userId>

Hizmet tek bölümleme düzenini kullanıyorsa PartitionKey ve PartitionKind sorgu dizesi parametreleri gerekli değildir ve hizmete ağ geçidi kullanılarak şu şekilde ulaşabilirsiniz:

  • Harici: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService
  • Dahili: http://localhost:19081/MyApp/MyService

Hizmet Uniform Int64 bölümleme düzenini kullanıyorsa, hizmetin bir bölümüne ulaşmak için PartitionKey ve PartitionKind sorgu dizesi parametreleri kullanılmalıdır:

  • Harici: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range
  • Dahili: http://localhost:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range

Hizmetin kullanımına açık kaynaklara ulaşmak için URL'de hizmet adının ardından kaynak yolunu ekleyin:

  • Harici: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService/index.html?PartitionKey=3&PartitionKind=Int64Range
  • Dahili: http://localhost:19081/MyApp/MyService/api/users/6?PartitionKey=3&PartitionKind=Int64Range

Ağ geçidi daha sonra bu istekleri hizmetin URL'sini iletir:

  • http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/index.html
  • http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/api/users/6

Bağlantı noktası paylaşım hizmetleri için özel işleme

Bu Service Fabric ara sunucu bir hizmet adresini yeniden çözümlemeyi ve bir hizmete ulaşılamay olduğunda isteği yeniden denemeyi denemektedir. Genellikle, bir hizmete ulaşılamaysa, hizmet örneği veya çoğaltma normal yaşam döngüsünün bir parçası olarak farklı bir düğüme taşınmıştır. Bu durumda ters ara sunucu, ilk çözümlenen adreste bir uç noktanın artık açık olmadığını belirten bir ağ bağlantısı hatası alır.

Ancak, çoğaltmalar veya hizmet örnekleri bir konak işlemini paylaşabilir ve ayrıca, http.sys tabanlı bir web sunucusu tarafından barındırıldıklarına yönelik bağlantı noktasını paylaşabilir, örneğin:

Bu durumda, web sunucusu büyük olasılıkla konak işlemde kullanılabilir ve isteklere yanıt verir, ancak çözümlenen hizmet örneği veya çoğaltma artık konakta kullanılamaz. Bu durumda, ağ geçidi web sunucusundan bir HTTP 404 yanıtı alır. Bu nedenle HTTP 404 yanıtının iki farklı anlamı olabilir:

  • Olay #1: Hizmet adresi doğru, ancak kullanıcının isteği olan kaynak mevcut değil.
  • Olay #2: Hizmet adresi yanlış ve kullanıcının isteğinde olduğu kaynak farklı bir düğümde mevcut olabilir.

İlk örnek, kullanıcı hatası olarak kabul edilen normal bir HTTP 404'tir. Ancak ikinci durumda kullanıcı var olan bir kaynağı talep etti. Hizmetin kendisi taşındığı için ters ara sunucu bu proxy'nin yerini belirleyemiyor. Ters proxy'nin adresi yeniden çözümlemesi ve isteği yeniden denemesi gerekir.

Bu nedenle ters ara sunucu, bu iki durum arasında ayrım yapmak için bir yol gerekir. Bu ayrımı yapmak için sunucudan bir ipucu gerekir.

  • Varsayılan olarak, ters ara sunucu büyük/#2 olduğunu varsayarak isteği çözümlemeye ve yeniden sorun gidermeye çalışır.

  • Ters ara sunucuya #1 olduğunu belirtmek için, hizmet aşağıdaki HTTP yanıt üst bilgisini geri getirmektedir:

    X-ServiceFabric : ResourceNotFound

Bu HTTP yanıt üst bilgisi, istenen kaynağın mevcut olmayan normal bir HTTP 404 durumunu gösterir ve ters ara sunucu hizmet adresini yeniden çözümlemeye çalışmaz.

Kapsayıcılarda çalışan hizmetler için özel işleme

Kapsayıcıların içinde çalışan hizmetler için, aşağıdaki kodda olduğu gibi ters Fabric_NodeIPOrFQDN proxy URL'sini oluşturmak üzere ortam değişkenini kullanabilirsiniz:

    var fqdn = Environment.GetEnvironmentVariable("Fabric_NodeIPOrFQDN");
    var serviceUrl = $"http://{fqdn}:19081/DockerSFApp/UserApiContainer";

Yerel küme için varsayılan Fabric_NodeIPOrFQDN olarak "localhost" olarak ayarlanır. Kapsayıcıların düğümde çalışan ters -UseMachineName ara sunucuya ulaşa olduğundan emin olmak için yerel kümeyi parametresiyle başlatın. Daha fazla bilgi için bkz. Kapsayıcılarda hata ayıklamak için geliştirici ortamınızı yapılandırma.

Service Fabric kapsayıcılar içinde çalıştır Docker Compose hizmetleri için özel bir docker-compose.yml Bağlantı Noktaları bölümü http: veya https: yapılandırma gerekir. Daha fazla bilgi için bkz. Docker Compose Azure'da dağıtım Service Fabric.

Sonraki adımlar