c# - tutorial - service fabric sdk vs2017
¿Cómo versionar y separar aplicaciones de Service Fabric? (2)
Todos los examples tejido de servicio representan examples tela de servicio de solución única. Esto parece ir en contra de la filosofía de los microservicios, donde desea un aislamiento de dependencia completo entre sus servicios. Si bien puede seguir este patrón manualmente, la práctica más común es aplicarlo haciendo que cada servicio sea su propio repositorio y solución / proyecto.
¿Cómo se administran e implementan los servicios de Fabric Service y se hacen cumplir los contratos de servicio (ServiceInferfaces) utilizando múltiples soluciones (en múltiples repositorios Git)?
P.ej
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) Como desarrollador, quiero verificar y crear todas las versiones actuales de aplicaciones / servicios. Quiero activar mi proyecto Service Fabric que gestiona todos los manifiestos y desplegarlo en mi clúster de desarrollo local. Quiero aplicar las mismas interfaces de servicio entre soluciones. No entiendo cómo lo harías, porque la aplicación es externa a los servicios.
2) Como equipo de DevOps, quiero automatizar el retiro de las aplicaciones, su construcción y despliegue en Azure.
¿Cómo podemos "forzar" el aislamiento a través de soluciones separadas, pero hacer que sea más fácil juntarlas y desplegarlas en el clúster, al tiempo que facilitamos la creación de tuberías para implementar cada clúster configurado únicamente para entornos DEV, QA y PROD.
¿Cuál es la estructura del flujo de trabajo / proceso / proyecto para habilitar esto? ¿Es posible?
Sí, es posible. He hecho algo en esta línea antes. Estos son los pensamientos que vienen a la mente inmediatamente ...
En cada solución de Service Fabric, tenga un proyecto "público" que contenga solo las interfaces que desea exponer de los servicios en esa aplicación. El resultado de este proyecto podría ser empaquetado como un paquete nuget y enviado a un repositorio privado. Podrías llamarlo el proyecto de "interfaces", supongo, pero no tendrías que exponer todas las interfaces si quisieras considerar algunas de ellas internas a tu aplicación; estos podrían definirse en un proyecto separado, no expuesto.
Otras soluciones que quieren hacer referencia a los servicios expuestos por otra aplicación simplemente tuvieron que desplegar el paquete nuget correspondiente para obtener una referencia a las interfaces de servicio.
Ahora esto no está sin problemas:
- La aplicación consumidora aún necesita saber las direcciones de los servicios para poder construir proxies para ellos. Podrías exponerlos como constantes definidas en algún lugar en el paquete nuget, o si vas por la ruta DI completa y no te importa conectarte a un contenedor DI en todas partes (o te apetece abstraerlo), podrías exponer un módulo del paquete nuget que puede registrar las interfaces de servicios como un lambda que hace la creación del proxy de servicio en nombre de las aplicaciones dependientes.
- Eres mucho más vulnerable a romper contratos. Debe tener mucho cuidado con la actualización de las firmas de métodos, ya que ahora es responsable de la granularidad y la coordinación de las implementaciones de aplicaciones / servicios.
- Puede ir demasiado granular, como lo menciona, las herramientas de Service Fabric lo guían para tener múltiples servicios en una sola solución. Incluso con el enfoque anterior, trataría de agrupar de forma lógica mis servicios hasta cierto punto, es decir, no busque un mapeo uno a uno entre una aplicación y un servicio; eso definitivamente será más doloroso de lo que vale.
Espero que ayude.
EDITAR:
Un ejemplo de registro de una interfaz de servicio en un módulo DI, (estilo Autofac) ...
Este sería el módulo DI que expone del paquete nuget público:
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...
}
}
Y en los Program.cs de su aplicación de consumo, incluiría algo como esto:
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();
}
Por supuesto, este enfoque solo funcionará si no está dividiendo sus servicios ...
También puede usar protocolos menos acoplados, por ejemplo, http basado en xml / wsdl o json / swagger y proxies httpclient autogenerados o creados manualmente.
El costo de administrar un nugget lib, nuspec, etc. es alto.