Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Облачные службы (классическая версия) переведены в разряд устаревших для всех клиентов с 1 сентября 2024 года. Все существующие запущенные развертывания будут остановлены и завершены корпорацией Майкрософт, и данные будут окончательно потеряны начиная с октября 2024 года. Для новых развертываний следует использовать Облачные службы Azure с расширенной поддержкой. Это новая модель развертывания на основе Azure Resource Manager.
Роли облачной службы общаются через внутренние и внешние подключения. Внешние подключения называются входными конечными точками, а внутренние подключения — внутренними конечными точками. В этой статье описывается изменение определения службы для создания конечных точек.
Входная конечная точка
Входная конечная точка используется, когда необходимо предоставить порт вовне. Вы указываете тип протокола и порт конечной точки, который затем применяется как для внешних, так и внутренних портов для конечной точки. Если требуется, для конечной точки можно указать другой внутренний порт с помощью атрибута localPort.
Входная конечная точка может использовать следующие протоколы: http, https, tcp, udp.
Чтобы создать входную конечную точку, добавьте дочерний элемент InputEndpoint в элемент Endpoints либо веб-роли, либо рабочей роли.
<Endpoints>
<InputEndpoint name="StandardWeb" protocol="http" port="80" localPort="80" />
</Endpoints>
Входная конечная точка экземпляра
Конечные точки ввода экземпляра похожи на входные конечные точки, но позволяют сопоставлять определенные общедоступные порты для каждого отдельного экземпляра роли с помощью перенаправления портов в подсистеме балансировки нагрузки. Можно указать один общедоступный порт или диапазон портов.
Входная конечная точка экземпляра может использовать только протокол TCP или UDP.
Чтобы создать входную конечную точку экземпляра, добавьте дочерний элемент InstanceInputEndpoint в элемент Endpoints веб-роли или рабочей роли.
<Endpoints>
<InstanceInputEndpoint name="Endpoint2" protocol="tcp" localPort="10100">
<AllocatePublicPortFrom>
<FixedPortRange max="10109" min="10105" />
</AllocatePublicPortFrom>
</InstanceInputEndpoint>
</Endpoints>
Внутренняя конечная точка
Внутренние конечные точки доступны для взаимодействия между экземплярами. Порт является необязательным, и если он не указан, конечной точке назначается динамический порт. Можно использовать диапазон портов. Существует ограничение в пять внутренних конечных точек для каждой роли.
Внутренняя конечная точка может использовать следующие протоколы: http, tcp, udp, any.
Чтобы создать внутреннюю входную конечную точку, добавьте дочерний элемент InternalEndpoint в элемент Endpoints для веб- или рабочей роли.
<Endpoints>
<InternalEndpoint name="Endpoint3" protocol="any" port="8999" />
</Endpoints>
Можно также использовать диапазон портов.
<Endpoints>
<InternalEndpoint name="Endpoint3" protocol="any">
<FixedPortRange max="8999" min="8995" />
</InternalEndpoint>
</Endpoints>
Рабочие роли против Веб-ролей
При работе с рабочими и веб-ролями существует одна небольшая разница с конечными точками. У веб-роли должна быть как минимум одна выходная конечная точка, использующая протокол HTTP .
<Endpoints>
<InputEndpoint name="StandardWeb" protocol="http" port="80" localPort="80" />
<!-- more endpoints may be declared after the first InputEndPoint -->
</Endpoints>
Использование пакета SDK для .NET для доступа к конечной точке
Управляемая библиотека Azure предоставляет методы для обмена данными между экземплярами роли во время выполнения. Из кода, выполняемого в экземпляре роли, можно получить сведения о существовании других экземпляров ролей и их конечных точек. Вы также можете получить сведения о текущем экземпляре роли.
Примечание.
Можно получать сведения только о тех экземплярах ролей, которые выполняются в облачной службе и для которых определен по крайней мере один внутренний конечный пункт. Вы не можете получить данные об экземплярах роли, которые выполняются в другой службе.
Для получения экземпляров роли можно использовать свойство Instances . Сначала используйте CurrentRoleInstance, чтобы вернуть ссылку на текущий экземпляр роли, а затем используйте свойство Role, чтобы вернуть ссылку на саму роль.
При программном подключении к экземпляру роли с помощью пакета SDK для .NET сравнительно легко получить доступ к информации о конечной точке. Например, после подключения к определенной среде ролей можно получить порт определенной конечной точки с помощью этого кода:
int port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["StandardWeb"].IPEndpoint.Port;
Свойство Instances возвращает коллекцию объектов RoleInstance. Эта коллекция всегда содержит текущий экземпляр. Если роль не определяет внутреннюю конечную точку, коллекция включает текущий экземпляр, но не включает другие экземпляры. Количество экземпляров ролей в коллекции всегда одно в том случае, если для роли не определена внутренняя конечная точка. Если роль определяет внутреннюю конечную точку, его экземпляры можно обнаружить во время выполнения, а количество экземпляров в коллекции соответствует количеству экземпляров, указанных для роли в файле конфигурации службы.
Примечание.
Управляемая библиотека Azure не предоставляет средства определения работоспособности других экземпляров роли, но вы можете реализовать такие оценки работоспособности самостоятельно, если службе нужна подобная функциональность. Можно использовать систему диагностики Azure для получения информации о выполняемых экземплярах роли.
Чтобы определить номер порта для внутренней конечной точки в экземпляре роли, можно получить из свойства InstanceEndpoints
объект Dictionary с именами, IP-адресами и портами конечных точек. Свойство IPEndpoint
возвращает IP-адрес и порт для указанной конечной точки. Свойство PublicIPEndpoint
возвращает порт для конечной точки, использующей балансировку нагрузки. Часть свойства PublicIPEndpoint
, относящаяся к IP-адресу, не используется.
Вот пример итерации экземпляров ролей.
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);
}
}
Ниже приведен пример рабочей роли, которая получает конечную точку, предоставленную с помощью определения службы, и начинает прослушивать подключения.
Предупреждение
Этот код будет работать только для развернутой службы. При выполнении в эмуляторе вычислений Azure элементы конфигурации службы, создающие конечные точки прямых портов (элементыInstanceInputEndpoint ), игнорируются.
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();
}
}
}
Правила сетевого трафика для управления обменом данными между ролями
После определения внутренних конечных точек можно добавить правила сетевого трафика (на основании созданных конечных точек), чтобы управлять обменом данными между экземплярами роли. На следующей схеме показаны некоторые общие сценарии управления обменом данными между ролями:
В следующем примере кода показаны определения ролей, показанных на предыдущей схеме. В каждом определении роли определена по крайней мере одна внутренняя конечная точка:
<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>
Примечание.
Обмен данными между ролями с внутренним конечными точками с фиксированными и автоматически назначенными портами может быть ограничен.
По умолчанию после определения внутренней конечной точки данные могут передаваться из одной роли во внутреннюю конечную точку другой роли без каких-либо ограничений. Чтобы ограничить обмен данными, необходимо добавить элемент NetworkTrafficRules в элемент ServiceDefinition в файле определения службы.
Сценарий 1
Разрешен только сетевой трафик из WebRole1 в WorkerRole1.
<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
Разрешен только сетевой трафик из WebRole1 в WorkerRole1 и WorkerRole2.
<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
Разрешен только сетевой трафик из WebRole1 в WorkerRole1 и из WorkerRole1 в WorkerRole2.
<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
Разрешен только сетевой трафик из WebRole1 в WorkerRole1, из WebRole1 в WorkerRole2 и из WorkerRole1 в WorkerRole2.
<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>
Здесь можно найти ссылку на схему XML для используемых элементов.
Дальнейшие действия
Дополнительная информация о моделиоблачной службы