Подтвердить что ты не робот

Как использовать версии и отдельные приложения для сервисов?

Все примеры демонстрируют примеры шаблонов услуг одного решения. Это, похоже, противоречит философии микросервисов, где вам нужна полная зависимость между вашими службами. Хотя вы можете вручную следовать этому шаблону, более распространенная практика заключается в том, чтобы обеспечить его соблюдение, сделав каждую службу собственником репозитория и решения/проекта.

Как вы управляете и развертываете сервисные сервисы и применяете контракты на обслуживание (ServiceInferfaces) с использованием нескольких решений (в нескольких хранилищах Git)?

например.

Service Fabric Solution
      App1 - Customers
         - Service1 [Carts] From Other Solution
         - Service2 [LocationInfo]From Other Solution
         - Service3 [REST WebAPI for Admin] From Other Solution
      App2 - Products
         - Service4 [Status]From Other Solution
         - Service5 [Firmware]From Other Solution
         - Service6 [Event Stream] From Other Solution

External Solution
   - Service1
External Solution
   - Service2
External Solution
   - Service3

External Solution
   - Service4
External Solution
   - Service5
External Solution
   - Service6

1) Как разработчик, я хочу проверить и собрать все текущие версии приложений/сервисов. Я хочу запустить проект Service Fabric, который управляет всеми манифестами, и развертывать его в моем локальном кластере dev. Я хочу использовать одни и те же сервисные интерфейсы между решениями. Я не понимаю, как вы это сделаете, потому что приложение является внешним по отношению к сервисам.

2) Как команда DevOps, я хочу автоматизировать работу с приложениями, их создание и развертывание в Azure.

Как мы "применяем" изоляцию с помощью отдельных решений, но упрощаем их совместное использование и развертывание в кластере, а также упрощаем создание конвейеров для развертывания каждого кластера, настроенного для условий DEV, QA и PROD,

Какова структура рабочего процесса/процесса/проекта, чтобы это сделать? Возможно ли это?

4b9b3361

Ответ 1

Да, возможно - раньше я делал что-то в этом направлении. Это мысли о том, что spring сразу ум...

В каждом решении Service Fabric есть "общедоступный" проект, содержащий только интерфейсы, которые вы хотите открыть из служб в этом приложении. Выход из этого проекта может быть упакован как пакет nuget и помещен в частный репозиторий. Вы могли бы назвать это проектом "интерфейсов", я предполагаю, но вам не нужно было бы раскрывать все интерфейсы, если бы вы хотели рассмотреть некоторые из них внутри вашего приложения; они могут быть определены в отдельном, неэкспонированном проекте.

Другие решения, которые хотят ссылаться на службы, открытые другим приложением, просто должны были вытащить соответствующий пакет nuget, чтобы получить ссылку на интерфейсы службы.

Теперь это не без проблем:

  • Потребляющему приложению по-прежнему необходимо знать адреса для служб, чтобы создавать для них прокси. Вы можете либо выставить их как константы, определенные где-то в пакете nuget, либо если вы идете вниз по полному маршруту DI и не возражаете связывать себя с контейнером DI во всем мире (или фантазировать, пытаясь отвлечь его), вы можете разоблачить модуль из пакета nuget, который может регистрировать интерфейсы служб как лямбда, который создает прокси-сервер службы от имени зависимых приложений.
  • Вы гораздо более уязвимы для разрыва контрактов. Вы должны быть очень осторожны в обновлении сигнатур методов, поскольку теперь вы отвечаете за гранулярность и координацию развертываний приложений/служб.
  • Вы можете пойти слишком подробно - как вы заметили, инструментарий Service Fabric помогает вам иметь несколько сервисов в одном решении. Даже при таком подходе я все равно попытаюсь логически сгруппировать свои службы в какой-то степени, т.е. Не переходите на одно-однозначное сопоставление между приложением и сервисом - это определенно будет больнее, чем это стоит.

Надеюсь, что это поможет.

EDIT:

Пример регистрации сервисного интерфейса в модуле DI (стиль Autofac)...

Это будет модуль DI, который вы выставляете из открытого пакета nuget:

using System;
using Autofac;
using Microsoft.ServiceFabric.Services.Remoting.Client;

public class MyAppModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.Register(component => ServiceProxy.Create<IMyService>(new Uri("fabric:/App/MyService"))).As<IMyService>();
        // Other services...
    }
}

И в Program.cs вашего приложения-потребителя вы должны включить что-то вроде этого:

public static void Main()
{
    try
    {
        var container = ConfigureServiceContainer();

        ServiceRuntime.RegisterServiceAsync(
            "MyConsumingServiceType",
            context => container.Resolve<MyConsumingService>(new TypedParameter(typeof(StatefulServiceContext), context))).GetAwaiter().GetResult();
        ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(MyConsumingService).Name);

        Thread.Sleep(Timeout.Infinite);
    }
    catch (Exception e)
    {
        ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
        throw;
    }
}

private static IContainer ConfigureServiceContainer()
{
    var containerBuilder = new ContainerBuilder();

    // Other registrations...

    containerBuilder.RegisterModule<MyAppModule>();

    return containerBuilder.Build();
}

Конечно, этот подход будет работать, только если вы не разбиваете свои сервисы...

Ответ 2

Вы также можете использовать менее слабосвязанные протоколы, например, на основе http, используя xml\wsdl или json\swagger и автогенерированные прокси.

Стоимость управления nugget lib, nuspec и т.д. не равна нулю.