Aracılığıyla paylaş


Azure Service Fabric'te ters proxy

Azure Service Fabric'te yerleşik ters ara sunucu, Service Fabric kümesinde çalışan mikro hizmetlerin http uç noktaları olan diğer hizmetleri bulmasına ve bunlarla iletişim kurmasına yardımcı olur.

Mikro hizmetler iletişim modeli

Service Fabric'teki mikro hizmetler, kümedeki düğümlerin bir alt kümesinde çalışır ve çeşitli nedenlerle düğümler arasında geçiş yapabilir. Sonuç olarak, mikro hizmetlerin uç noktaları dinamik olarak değişebilir. Mikro hizmetin kümedeki diğer hizmetleri bulması ve bunlarla iletişim kurması için aşağıdaki adımları gerçekleştirmesi gerekir:

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

Daha fazla bilgi için bkz . Hizmetlere bağlanma ve hizmetlerle iletişim kurma.

Ters ara sunucuyu 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ı işleyen bir hizmettir. Ters ara sunucu, istemci hizmetlerinden gelen istekleri işlerken çeşitli ilkeler uygulayacak şekilde yapılandırılabilir. Ters ara sunucu kullanmak, istemci hizmetinin herhangi bir istemci tarafı HTTP iletişim kitaplığı kullanmasını sağlar ve hizmette özel çözüm ve yeniden deneme mantığı gerektirmez.

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

İç iletişim

Not

Desteklenen Platformlar

Service Fabric'te ters ara sunucu şu anda aşağıdaki platformları desteklemektedir

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

Mikro hizmetlere küme dışından ulaşma

Mikro hizmetler için varsayılan dış iletişim modeli, her hizmete doğrudan dış istemcilerden erişilemeyen bir kabul modelidir. Mikro hizmetler ve dış istemciler arasındaki bir ağ sınırı olan Azure Load Balancer, ağ adresi çevirisi gerçekleştirir ve dış istekleri iç IP:bağlantı noktası uç noktalarına iletir. Mikro hizmetin uç noktasının dış istemciler tarafından doğrudan erişilebilir olmasını sağlamak için, önce Load Balancer kümede hizmetin kullandığı her bağlantı noktasına trafiği iletecek şekilde yapılandırmanız gerekir. Ancak mikro hizmetlerin çoğu, özellikle de durum bilgisi olan mikro hizmetler kümenin tüm düğümlerinde çalışmaz. Mikro hizmetler yük devretme sırasında düğümler arasında geçiş yapabilir. Bu gibi durumlarda, Load Balancer trafiği iletmesi gereken çoğaltmaların hedef düğümünün konumunu etkili bir şekilde belirleyemez.

Küme dışından ters proxy aracılığıyla mikro hizmetlere ulaşma

Load Balancer'da tek bir hizmetin bağlantı noktasını yapılandırmak yerine, Load Balancer ters proxy'nin yalnızca bağlantı noktasını yapılandırabilirsiniz. Bu yapılandırma, küme dışındaki istemcilerin ek yapılandırma olmadan ters ara sunucuyu kullanarak küme içindeki hizmetlere ulaşmasını sağlar.

Dış iletişim

Uyarı

ters proxy'nin bağlantı noktasını Load Balancer yapılandırdığınızda, kümedeki http uç noktasını kullanıma sunan tüm mikro hizmetler küme dışından adreslenebilir. Bu, dahili olması amaçlan mikro hizmetlerin belirli bir kötü amaçlı kullanıcı tarafından bulunabileceği anlamına gelir. Bu potansiyel olarak kötüye kullanılabilecek 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üzeyi olmayan bir iç hizmeti tekrar tekrar çağırarak bir hizmet reddi saldırısı başlatabilir.
  • Kötü amaçlı bir kullanıcı iç hizmete hatalı biçimlendirilmiş paketler teslim edebilir ve bu da istenmeyen davranışa neden olabilir.
  • İç hizmet olması amaçlanan bir hizmet, küme dışındaki hizmetlere açık olması amaçlanmamış özel veya hassas bilgileri döndürerek bu hassas bilgileri kötü amaçlı bir kullanıcıya gösterebilir.

Ters proxy bağlantı noktasını genel hale getirmeden önce kümeniz ve üzerinde çalışan uygulamalar için olası güvenlik etkilerini tam olarak anladığınızdan ve hafifletdiğinizden emin olun.

Ters ara sunucuyu kullanarak hizmetleri adresleme için URI biçimi

Ters proxy, gelen isteğin iletilmesi gereken hizmet bölümünü tanımlamak için belirli bir tekdüzen 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(ler): Ters ara sunucu HTTP veya HTTPS trafiğini kabul etmek için yapılandırılabilir. HTTPS iletme için HTTPS'yi dinlemek için ters ara sunucu kurulumu yaptıktan sonra ters proxy ile güvenli bir hizmete bağlanma bölümüne bakın.

  • Küme tam etki alanı adı (FQDN) | iç IP: Dış istemciler için ters proxy'yi, mycluster.eastus.cloudapp.azure.com gibi küme etki alanı üzerinden erişilebilir olacak şekilde yapılandırabilirsiniz. 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'sinde ulaşılabilir.

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

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

    Hizmet örneği adı büyük/küçük harfe duyarlıdır. URL'de hizmet örneği adı için farklı bir büyük/küçük harf kullanılması, 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.

  • DinleyiciAdı Hizmetten gelen uç noktalar {"Endpoints":{"Listener1":"Endpoint1","Listener2":"Endpoint2" ...}} biçimindedir. Hizmet birden çok uç noktayı kullanıma sunarsa, istemci isteğinin iletilmesi gereken uç noktayı tanımlar. Hizmette yalnızca bir dinleyici varsa bu atlanabilir.

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

    • Hedef hizmet durum bilgisi olduğunda TargetReplicaSelector aşağıdakilerden biri olabilir: 'PrimaryReplica', 'RandomSecondaryReplica' veya 'RandomReplica'. Bu parametre belirtilmediğinde varsayılan değer 'PrimaryReplica'dır.
    • Hedef hizmet durum bilgisi olmadığında ters ara sunucu, isteğin iletilmek üzere 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

Örnek olarak, şu 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ı şunlardır:

  • /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şılabilir:

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

Hizmet Tekdüzen 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ıma açık olduğu kaynaklara ulaşmak için kaynak yolunu URL'deki hizmet adından sonra yerleştirmeniz yeterlidir:

  • 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'sine 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 kullanım

Service Fabric ters ara sunucusu bir hizmet adresini yeniden çözümlemeyi dener ve hizmete ulaşılamadığında isteği yeniden dener. Genellikle, bir hizmete ulaşılamadığında, hizmet örneği veya çoğaltma normal yaşam döngüsünün bir parçası olarak farklı bir düğüme taşını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ı alabilir.

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ığında aşağıdakiler de dahil olmak üzere bir bağlantı noktasını paylaşabilir:

Bu durumda, web sunucusunun konak işleminde kullanılabilir ve isteklere yanıt verme olasılığı yüksektir, 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 istediği kaynak yok.
  • 2. Olay: Hizmet adresi yanlış ve kullanıcının istediği kaynak farklı bir düğümde bulunabilir.

İlk durum, kullanıcı hatası olarak kabul edilen normal bir HTTP 404'dür. Ancak ikinci durumda kullanıcı var olan bir kaynak istedi. Hizmetin kendisi taşındığından ters ara sunucu onu bulamadı. 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 yönteme ihtiyaç duyar. Bu ayrımı yapmak için sunucudan bir ipucu gerekir.

  • Varsayılan olarak, ters ara sunucu 2. durumu varsayar ve isteği çözmeyi ve yeniden düzenlemeyi dener.

  • Ters ara sunucuya 1. büyük/küçük harf belirtmek için hizmetin aşağıdaki HTTP yanıt üst bilgisini döndürmesi gerekir:

    X-ServiceFabric : ResourceNotFound

Bu HTTP yanıt üst bilgisi, istenen kaynağın mevcut olmadığı 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 içinde çalışan hizmetler için ortam değişkenini Fabric_NodeIPOrFQDN kullanarak aşağıdaki kodda olduğu gibi ters proxy URL'sini oluşturabilirsiniz:

    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 ara sunucuya erişebildiğinden emin olmak için yerel kümeyi parametresiyle -UseMachineName 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.

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

Sonraki adımlar