Azure Cloud Services'da rol örnekleri için iletişimi etkinleştirme (klasik)

Önemli

Cloud Services (klasik) artık yeni müşteriler için kullanımdan kaldırılmıştır ve tüm müşteriler için 31 Ağustos 2024'te kullanımdan kaldırılacaktır. Yeni dağıtımlarda yeni Azure Resource Manager tabanlı dağıtım modeli Azure Cloud Services (genişletilmiş destek) kullanılmalıdır.

Bulut hizmeti rolleri iç ve dış bağlantılar aracılığıyla iletişim kurar. Dış bağlantılar giriş uç noktaları , iç bağlantılar ise iç uç noktalar olarak adlandırılır. Bu konu, uç noktalar oluşturmak için hizmet tanımının nasıl değiştirileceğini açıklar.

Giriş uç noktası

Giriş uç noktası, bir bağlantı noktasını dışta kullanıma açmak istediğinizde kullanılır. Daha sonra uç noktanın hem dış hem de iç bağlantı noktaları için geçerli olan protokol türünü ve uç noktanın bağlantı noktasını belirtirsiniz. İsterseniz, localPort özniteliğiyle uç nokta için farklı bir iç bağlantı noktası belirtebilirsiniz.

Giriş uç noktası şu protokolleri kullanabilir: http, https, tcp, udp.

Giriş uç noktası oluşturmak için InputEndpoint alt öğesini bir web veya çalışan rolünün Endpoints öğesine ekleyin.

<Endpoints>
  <InputEndpoint name="StandardWeb" protocol="http" port="80" localPort="80" />
</Endpoints> 

Örnek giriş uç noktası

Örnek giriş uç noktaları giriş uç noktalarına benzer, ancak yük dengeleyicide bağlantı noktası iletmeyi kullanarak her bir rol örneği için belirli genel kullanıma yönelik bağlantı noktalarını eşlemenize olanak tanır. Tek bir genel kullanıma yönelik bağlantı noktası veya bağlantı noktası aralığı belirtebilirsiniz.

Örnek giriş uç noktası protokol olarak yalnızca tcp veya udp kullanabilir.

Örnek giriş uç noktası oluşturmak için InstanceInputEndpoint alt öğesini bir web veya çalışan rolünün Endpoints öğesine ekleyin.

<Endpoints>
  <InstanceInputEndpoint name="Endpoint2" protocol="tcp" localPort="10100">
    <AllocatePublicPortFrom>
      <FixedPortRange max="10109" min="10105" />
    </AllocatePublicPortFrom>
  </InstanceInputEndpoint>
</Endpoints>

İç uç nokta

Örnek-örnek iletişimi için iç uç noktalar kullanılabilir. Bağlantı noktası isteğe bağlıdır ve atlanırsa uç noktaya dinamik bir bağlantı noktası atanır. Bağlantı noktası aralığı kullanılabilir. Rol başına beş iç uç nokta sınırı vardır.

İç uç nokta şu protokolleri kullanabilir: http, tcp, udp, any.

İç giriş uç noktası oluşturmak için InternalEndpoint alt öğesini bir web veya çalışan rolünün Endpoints öğesine ekleyin.

<Endpoints>
  <InternalEndpoint name="Endpoint3" protocol="any" port="8999" />
</Endpoints> 

Bağlantı noktası aralığı da kullanabilirsiniz.

<Endpoints>
  <InternalEndpoint name="Endpoint3" protocol="any">
    <FixedPortRange max="8999" min="8995" />
  </InternalEndpoint>
</Endpoints>

Çalışan rolleri ile Web rolleri karşılaştırması

Hem çalışan hem de web rolleri ile çalışırken uç noktalarda küçük bir fark vardır. Web rolü, HTTP protokollerini kullanarak en az tek bir giriş uç noktasına sahip olmalıdır.

<Endpoints>
  <InputEndpoint name="StandardWeb" protocol="http" port="80" localPort="80" />
  <!-- more endpoints may be declared after the first InputEndPoint -->
</Endpoints>

Uç noktaya erişmek için .NET SDK'sını kullanma

Azure Yönetilen Kitaplığı, rol örneklerinin çalışma zamanında iletişim kurması için yöntemler sağlar. Rol örneğinde çalışan koddan, diğer rol örneklerinin ve uç noktalarının varlığıyla ilgili bilgilerin yanı sıra geçerli rol örneği hakkındaki bilgileri de alabilirsiniz.

Not

Yalnızca bulut hizmetinizde çalışan ve en az bir iç uç nokta tanımlayan rol örnekleri hakkında bilgi alabilirsiniz. Farklı bir hizmette çalışan rol örnekleri hakkında veri alamazsınız.

Bir rolün örneklerini almak için Instances özelliğini kullanabilirsiniz. Önce geçerli rol örneğine başvuru döndürmek için CurrentRoleInstance kullanın ve ardından role başvuru döndürmek için Role özelliğini kullanın.

.NET SDK aracılığıyla program aracılığıyla bir rol örneğine bağlandığınızda, uç nokta bilgilerine erişmek nispeten kolaydır. Örneğin, belirli bir rol ortamına zaten bağlandıktan sonra, belirli bir uç noktanın bağlantı noktasını şu kodla alabilirsiniz:

int port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["StandardWeb"].IPEndpoint.Port;

Instances özelliği, RoleInstance nesnelerinin bir koleksiyonunu döndürür. Bu koleksiyon her zaman geçerli örneği içerir. Rol bir iç uç nokta tanımlamıyorsa, koleksiyon geçerli örneği içerir ancak başka bir örnek içermez. Rol için iç uç nokta tanımlanmadığı durumlarda koleksiyondaki rol örneklerinin sayısı her zaman 1 olur. Rol bir iç uç nokta tanımlarsa, örnekleri çalışma zamanında bulunabilir ve koleksiyondaki örneklerin sayısı hizmet yapılandırma dosyasındaki rol için belirtilen örnek sayısına karşılık gelir.

Not

Azure Yönetilen Kitaplığı, diğer rol örneklerinin durumunu belirlemeye yönelik bir araç sağlamaz, ancak hizmetiniz bu işlevselliğe ihtiyaç duyuyorsa bu tür sistem durumu değerlendirmelerini kendiniz uygulayabilirsiniz. rol örneklerini çalıştırma hakkında bilgi edinmek için Azure Tanılama kullanabilirsiniz.

Rol örneğindeki iç uç noktanın bağlantı noktası numarasını belirlemek için özelliğini kullanarak InstanceEndpoints uç nokta adlarını ve buna karşılık gelen IP adreslerini ve bağlantı noktalarını içeren bir Sözlük nesnesi döndürebilirsiniz. özelliği, IPEndpoint belirtilen uç nokta için IP adresini ve bağlantı noktasını döndürür. özelliği, PublicIPEndpoint yük dengeli uç noktanın bağlantı noktasını döndürür. Özelliğin PublicIPEndpoint IP adresi bölümü kullanılmaz.

Aşağıda rol örneklerini yineleyen bir örnek verilmiştir.

foreach (RoleInstance roleInst in RoleEnvironment.CurrentRoleInstance.Role.Instances)
{
    Trace.WriteLine("Instance ID: " + roleInst.Id);
    foreach (RoleInstanceEndpoint roleInstEndpoint in roleInst.InstanceEndpoints.Values)
    {
        Trace.WriteLine("Instance endpoint IP address and port: " + roleInstEndpoint.IPEndpoint);
    }
}

Hizmet tanımı aracılığıyla kullanıma sunulan uç noktayı alan ve bağlantıları dinlemeye başlayan bir çalışan rolü örneği aşağıda verilmiştir.

Uyarı

Bu kod yalnızca dağıtılan bir hizmet için çalışır. Azure İşlem Öykünücüsü'nde çalışırken, doğrudan bağlantı noktası uç noktaları oluşturan hizmet yapılandırma öğeleri (InstanceInputEndpoint öğeleri) yoksayılır.

using System;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;

namespace WorkerRole1
{
  public class WorkerRole : RoleEntryPoint
  {
    public override void Run()
    {
      try
      {
        // Initialize method-wide variables
        var epName = "Endpoint1";
        var roleInstance = RoleEnvironment.CurrentRoleInstance;

        // Identify direct communication port
        var myPublicEp = roleInstance.InstanceEndpoints[epName].PublicIPEndpoint;
        Trace.TraceInformation("IP:{0}, Port:{1}", myPublicEp.Address, myPublicEp.Port);

        // Identify public endpoint
        var myInternalEp = roleInstance.InstanceEndpoints[epName].IPEndpoint;

        // Create socket listener
        var listener = new Socket(
          myInternalEp.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

        // Bind socket listener to internal endpoint and listen
        listener.Bind(myInternalEp);
        listener.Listen(10);
        Trace.TraceInformation("Listening on IP:{0},Port: {1}",
          myInternalEp.Address, myInternalEp.Port);

        while (true)
        {
          // Block the thread and wait for a client request
          Socket handler = listener.Accept();
          Trace.TraceInformation("Client request received.");

          // Define body of socket handler
          var handlerThread = new Thread(
            new ParameterizedThreadStart(h =>
            {
              var socket = h as Socket;
              Trace.TraceInformation("Local:{0} Remote{1}",
                socket.LocalEndPoint, socket.RemoteEndPoint);

              // Shut down and close socket
              socket.Shutdown(SocketShutdown.Both);
              socket.Close();
            }
          ));

          // Start socket handler on new thread
          handlerThread.Start(handler);
        }
      }
      catch (Exception e)
      {
        Trace.TraceError("Caught exception in run. Details: {0}", e);
      }
    }

    public override bool OnStart()
    {
      // Set the maximum number of concurrent connections 
      ServicePointManager.DefaultConnectionLimit = 12;

      // For information on handling configuration changes
      // see the MSDN topic at https://go.microsoft.com/fwlink/?LinkId=166357.
      return base.OnStart();
    }
  }
}

Rol iletişimlerini denetlemek için ağ trafiği kuralları

İç uç noktaları tanımladıktan sonra, rol örneklerinin birbirleriyle nasıl iletişim kurabileceğini denetlemek için ağ trafiği kuralları (oluşturduğunuz uç noktaları temel alarak) ekleyebilirsiniz. Aşağıdaki diyagramda rol iletişimini denetlemeye yönelik bazı yaygın senaryolar gösterilmektedir:

Ağ Trafiği Kuralları Senaryoları

Aşağıdaki kod örneği, önceki diyagramda gösterilen rollerin rol tanımlarını gösterir. Her rol tanımı tanımlı en az bir iç uç nokta içerir:

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebRole1" vmsize="Medium">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="HttpIn" endpointName="HttpIn" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="80" />
      <InternalEndpoint name="InternalTCP1" protocol="tcp" />
    </Endpoints>
  </WebRole>
  <WorkerRole name="WorkerRole1">
    <Endpoints>
      <InternalEndpoint name="InternalTCP2" protocol="tcp" />
    </Endpoints>
  </WorkerRole>
  <WorkerRole name="WorkerRole2">
    <Endpoints>
      <InternalEndpoint name="InternalTCP3" protocol="tcp" />
      <InternalEndpoint name="InternalTCP4" protocol="tcp" />
    </Endpoints>
  </WorkerRole>
</ServiceDefinition>

Not

Roller arasındaki iletişimin kısıtlanması, hem sabit hem de otomatik olarak atanan bağlantı noktalarının iç uç noktalarıyla gerçekleşebilir.

Varsayılan olarak, bir iç uç nokta tanımlandıktan sonra iletişim herhangi bir kısıtlama olmadan herhangi bir rolden bir rolün iç uç noktasına akabilir. İletişimi kısıtlamak için, hizmet tanımı dosyasındaki ServiceDefinition öğesine bir NetworkTrafficRules öğesi eklemeniz gerekir.

1\. Senaryo

Yalnızca WebRole1'den WorkerRole1'e ağ trafiğine izin verin.

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <NetworkTrafficRules>
    <OnlyAllowTrafficTo>
      <Destinations>
        <RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
      </Destinations>
      <AllowAllTraffic/>
      <WhenSource matches="AnyRule">
        <FromRole roleName="WebRole1"/>
      </WhenSource>
    </OnlyAllowTrafficTo>
  </NetworkTrafficRules>
</ServiceDefinition>

2\. Senaryo

Yalnızca WebRole1'den WorkerRole1 ve WorkerRole2'ye ağ trafiğine izin verir.

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <NetworkTrafficRules>
    <OnlyAllowTrafficTo>
      <Destinations>
        <RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
        <RoleEndpoint endpointName="InternalTCP3" roleName="WorkerRole2"/>
      </Destinations>
      <WhenSource matches="AnyRule">
        <FromRole roleName="WebRole1"/>
      </WhenSource>
    </OnlyAllowTrafficTo>
  </NetworkTrafficRules>
</ServiceDefinition>

3\. Senaryo

Yalnızca WebRole1'den WorkerRole1'e ve WorkerRole1'denWorkerRole2'ye ağ trafiğine izin verir.

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <NetworkTrafficRules>
    <OnlyAllowTrafficTo>
      <Destinations>
        <RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
      </Destinations>
      <AllowAllTraffic/>
      <WhenSource matches="AnyRule">
        <FromRole roleName="WebRole1"/>
      </WhenSource>
    </OnlyAllowTrafficTo>
  </NetworkTrafficRules>
  <NetworkTrafficRules>
    <OnlyAllowTrafficTo>
      <Destinations>
        <RoleEndpoint endpointName="InternalTCP3" roleName="WorkerRole2"/>
      </Destinations>
      <WhenSource matches="AnyRule">
        <FromRole roleName="WorkerRole1"/>
      </WhenSource>
    </OnlyAllowTrafficTo>
  </NetworkTrafficRules>
</ServiceDefinition>

4\. Senaryo

Yalnızca WebRole1'den WorkerRole1'e, WebRole1'denWorkerRole2'ye ve WorkerRole1'denWorkerRole2'ye ağ trafiğine izin verir.

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <NetworkTrafficRules>
    <OnlyAllowTrafficTo>
      <Destinations>
        <RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
      </Destinations>
      <AllowAllTraffic/>
      <WhenSource matches="AnyRule">
        <FromRole roleName="WebRole1"/>
      </WhenSource>
    </OnlyAllowTrafficTo>
  </NetworkTrafficRules>
  <NetworkTrafficRules>
    <OnlyAllowTrafficTo >
      <Destinations>
        <RoleEndpoint endpointName="InternalTCP3" roleName="WorkerRole2"/>
      </Destinations>
      <AllowAllTraffic/>
      <WhenSource matches="AnyRule">
        <FromRole roleName="WorkerRole1"/>
      </WhenSource>
    </OnlyAllowTrafficTo>
  </NetworkTrafficRules>
  <NetworkTrafficRules>
    <OnlyAllowTrafficTo >
      <Destinations>
        <RoleEndpoint endpointName="InternalTCP4" roleName="WorkerRole2"/>
      </Destinations>
      <AllowAllTraffic/>
      <WhenSource matches="AnyRule">
        <FromRole roleName="WebRole1"/>
      </WhenSource>
    </OnlyAllowTrafficTo>
  </NetworkTrafficRules>
</ServiceDefinition>

Yukarıda kullanılan öğeler için bir XML şema başvurusu burada bulunabilir.

Sonraki adımlar

Bulut Hizmeti modeli hakkında daha fazla bilgi edinin.