Настройка Azure ServiceFabric для жизненного цикла разработки - как параметризовать имя узла?

Какой хороший способ управлять развертыванием изменений кода в средах разработки, тестирования и производственной среды в Azure? На сайте Azure / Service Fabric есть статья для указания номеров портов с помощью параметров в разделе Практические руководства - Управление жизненным циклом приложения (https://docs.microsoft.com/en-us/azure/service-fabric/Service-Fabric-How-to-Spec-Port-Number-using-Parameters), но я не уверен, как можно управлять именами хостов - есть ли свойство, связанное с именем хоста, которое можно включить в файл Publish Profile .xml (например, Cloud.xml)?

Предыстория: я перехожу с автономного приложения WCF, работающего как служба Windows, и использую WebHttpBinding с конечными точками http и https (использует шаблоны файла конфигурации T4 для определения имени хоста и номера порта в зависимости от среды). Я переношу это на приложение Azure ServiceFabric WcfCommunicationListener (похоже на образец, найденный здесь: https://github.com/loekd/ServiceFabric.WcfCalc) ....

internal sealed class ServiceFabricWcfService : StatelessService
{
    public ServiceFabricWcfService(StatelessServiceContext context) : base(context)

    protected override IEnumerable<ServiceInstanceListener> 
    CreateServiceInstanceListeners()
    {
        yield return new ServiceInstanceListener(CreateRestListener);   
    }

    private ICommunicationListener CreateRestListener(StatelessServiceContext context)
    {
        var host = context.NodeContext.IPAddressOrFQDN;
        var endpointConfig = context.CodePackageActivationContext.GetEndpoint("ServiceEndpoint");
        var port = endpointConfig.Port;
        var scheme = endpointConfig.Protocol.ToString();
        var uri = string.Format(CultureInfo.InvariantCulture, "{0}://{1}:{2}/webhost/", scheme, host, port);
        var listener = new WcfCommunicationListener<IJsonService>(context, new JsonServicePerCall(), new WebHttpBinding(WebHttpSecurityMode.None), new EndpointAddress(uri));
        var ep = listener.ServiceHost.Description.Endpoints.Last();
        ep.Behaviors.Add(new WebHttpBehavior());
        return listener;
    }
}

Как вы можете видеть, имя хоста получается из NodeContext StatelessServiceContext - есть ли хороший способ настроить его для таргетинга на разные имена хостов для каждой среды? Мои клиенты должны иметь возможность выполнять вызовы http / https на основе имени хоста, чтобы определять, к какой среде они подключаются. Спасибо!


person Search4Sound    schedule 11.04.2018    source источник


Ответы (1)


Я не думаю, что вы можете это сделать, поскольку в приведенном примере переменная хоста представляет собой точный узел, на котором запущена служба. Вы можете связаться с ним, используя имя кластера, если вы откроете соответствующий порт, например http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService

person Alex Riabov    schedule 11.04.2018
comment
Что, если бы каждая среда была развернута в другой конечной точке подключения кластера, например, с использованием нескольких профилей публикации для каждой среды (CloudDev.xml, CloudTest.xml и т. Д.)? Тогда каждый запущенный экземпляр будет получать свое собственное имя хоста, и мне не нужно его параметризировать. - person Search4Sound; 11.04.2018
comment
Таким образом, у вас будет свой URL-адрес приложения в каждой среде. Шаблон выглядит ‹protocol›: // ‹clusterName›: ‹appPort› / ‹appEndpoint›, например test-cluster.eastus.cloudapp.azure.com:19081/MyApp/ MyService; dev-cluster.eastus.cloudapp.azure.com:19081/MyApp/ MyService и т. Д. - person Alex Riabov; 11.04.2018