Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Configura un silo programáticamente usando el método de extensión UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) y varias clases de opciones complementarias. Las clases de opción de Orleans siguen el patrón Options en .NET y se pueden cargar desde archivos, variables de entorno o cualquier otro proveedor de configuración válido.
Hay varios aspectos clave de la configuración del silo:
- Proveedor de agrupación en clústeres
- (Opcional) Orleans información de agrupación en clústeres
- (Opcional) Puntos de conexión para comunicaciones de silo a silo y cliente a silo
Sugerencia
Si usa .NET Aspire (Orleans 8.0+), la mayoría de esta configuración se controla automáticamente. Aspire inserta ClusterId, ServiceId y la configuración del punto de conexión a través de variables de entorno, por lo que puede usar el método UseOrleans más sencillo sin parámetros. Consulte
En este ejemplo se muestra una configuración de silo que define la información del clúster y el uso de Azure Table Storage para la agrupación en clústeres:
El uso de un TokenCredential con un URI de servicio es el enfoque recomendado. Este patrón evita almacenar secretos en la configuración y aprovecha microsoft Entra ID para la autenticación segura.
DefaultAzureCredential proporciona una cadena de credenciales que funciona sin problemas en entornos de desarrollo y producción locales. Durante el desarrollo, usa las credenciales de la CLI de Azure o Visual Studio. En producción en Azure, usa automáticamente la identidad administrada asignada al recurso.
Sugerencia
DefaultAzureCredential funciona sin problemas en el desarrollo y la producción locales. En desarrollo, usa las credenciales de la CLI de Azure o Visual Studio. En producción en Azure, usa automáticamente la identidad administrada del recurso. Para mejorar el rendimiento y la capacidad de depuración en producción, considere reemplazarlo por una credencial específica como ManagedIdentityCredential. Para obtener más información, consulte Guía de uso de DefaultAzureCredential.
using Azure.Identity;
using IHost host = Host.CreateDefaultBuilder(args)
.UseOrleans(siloBuilder =>
{
siloBuilder.UseAzureStorageClustering(options =>
{
options.ConfigureTableServiceClient(
new Uri("https://<your-storage-account>.table.core.windows.net"),
new DefaultAzureCredential());
});
})
.UseConsoleLifetime()
.Build();
Sugerencia
Al desarrollar para Orleans, puede llamar UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) para configurar un clúster local. En entornos de producción, debe usar un proveedor de agrupación en clústeres que sea adecuado para la implementación.
Proveedor de agrupación en clústeres
Sugerencia
DefaultAzureCredential funciona sin problemas en el desarrollo y la producción locales. En desarrollo, usa las credenciales de la CLI de Azure o Visual Studio. En producción en Azure, usa automáticamente la identidad administrada del recurso. Para mejorar el rendimiento y la capacidad de depuración en producción, considere reemplazarlo por una credencial específica como ManagedIdentityCredential. Para obtener más información, consulte Guía de uso de DefaultAzureCredential.
siloBuilder.UseAzureStorageClustering(options =>
{
options.ConfigureTableServiceClient(
new Uri("https://<your-storage-account>.table.core.windows.net"),
new DefaultAzureCredential());
});
Normalmente, se implementa un servicio basado en Orleans un clúster de nodos, ya sea en hardware dedicado o en la nube. Para el desarrollo y las pruebas básicas, puede implementar Orleans en una configuración de nodo único. Cuando se implementa en un clúster de nodos, Orleans implementa internamente protocolos para detectar y mantener la pertenencia a Orleans silos en el clúster, incluida la detección de errores de nodo y la reconfiguración automática.
Para administrar la pertenencia a clústeres confiable, Orleans usa Azure Table, SQL Server o Apache ZooKeeper para la sincronización de nodos.
En este ejemplo, usamos Azure Table como proveedor de pertenencia.
Orleans información de agrupación en clústeres
Para configurar opcionalmente la agrupación, use ClusterOptions como parámetro de tipo en el método Configure de la instancia ISiloBuilder.
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "SampleApp";
})
Aquí se especifican dos opciones:
- Establezca el ClusterId a
"my-first-cluster": este es un identificador único para el clúster Orleans. Todos los clientes y silos que usan este identificador pueden comunicarse directamente entre sí. Sin embargo, puede optar por usar otro ClusterId para diferentes implementaciones. - Configura el ServiceId en
"SampleApp": este es un identificador único para tu aplicación que utilizan algunos proveedores, como los proveedores de persistencia. Este identificador debe permanecer estable y no cambiar entre implementaciones.
De forma predeterminada, Orleans usa "default" para tanto ServiceId como ClusterId. Estos valores no necesitan cambiar en la mayoría de los casos.
ServiceId es más significativo y distingue los diferentes servicios lógicos, lo que les permite compartir sistemas de almacenamiento back-end sin interferencias.
ClusterId determina qué hosts se conectan para formar un clúster.
Dentro de cada clúster, todos los hosts deben usar el mismo ServiceId. Sin embargo, varios clústeres pueden compartir un ServiceId. Esto permite escenarios de implementación azul/verde en los que se inicia una nueva implementación (clúster) antes de apagar otra. Esto es típico para los sistemas hospedados en Azure App Service.
El caso más común es que ServiceId y ClusterId permanecen fijos para la duración de la aplicación y se usa una estrategia de implementación gradual. Esto es típico para los sistemas hospedados en Kubernetes y Service Fabric.
Puntos de conexión
De forma predeterminada, Orleans escucha todas las interfaces en el puerto 11111 para la comunicación de silo a silo y el puerto 30000 para la comunicación de cliente a silo. Para invalidar este comportamiento, llame ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean) a y pase los números de puerto que desea usar.
siloBuilder.ConfigureEndpoints(siloPort: 17_256, gatewayPort: 34_512)
En el código anterior:
- El puerto de silo se establece en
17_256. - El puerto de puerta de enlace se establece en
34_512.
Un Orleans silo tiene dos tipos típicos de configuración de punto de conexión:
- Puntos de conexión de silo a silo: se usan para la comunicación entre los silos del mismo clúster.
- Puntos de conexión de cliente a silo (o puerta de enlace): se usa para la comunicación entre clientes y silos en el mismo clúster.
Este método debe ser suficiente en la mayoría de los casos, pero puede personalizarlo aún más si es necesario. Este es un ejemplo del uso de una dirección IP externa con reenvío de puertos:
siloBuilder.Configure<EndpointOptions>(options =>
{
// Port to use for silo-to-silo
options.SiloPort = 11_111;
// Port to use for the gateway
options.GatewayPort = 30_000;
// IP Address to advertise in the cluster
options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
// The socket used for client-to-silo will bind to this endpoint
options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40_000);
// The socket used by the gateway will bind to this endpoint
options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50_000);
})
Internamente, el silo escucha en 0.0.0.0:40000 y 0.0.0.0:50000, pero el valor publicado en el proveedor de membresía es 172.16.0.42:11111 y 172.16.0.42:30000.
Configure un silo mediante programación a través de SiloHostBuilder y varias clases de opciones complementarias. Las clases de opción de Orleans siguen el patrón Options en .NET y se pueden cargar desde archivos, variables de entorno o cualquier otro proveedor de configuración válido.
Hay varios aspectos clave de la configuración del silo:
- Orleans información de agrupación en clústeres
- Proveedor de agrupación en clústeres
- Puntos de conexión para las comunicaciones de silo a silo y de cliente a silo
- Elementos de la aplicación
En este ejemplo se muestra una configuración de silo que define la información del clúster, mediante la agrupación en clústeres de Azure y la configuración de elementos de aplicación:
public static async Task ConfigureSilo(string connectionString)
{
var siloHostBuilder = new SiloHostBuilder()
.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString))
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
})
.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
.ConfigureApplicationParts(
parts => parts.AddApplicationPart(typeof(ValueGrain).Assembly).WithReferences());
var silo = siloHostBuilder.Build();
await silo.StartAsync();
}
Vamos a desglosar los pasos que se usan en este ejemplo:
Proveedor de agrupación en clústeres
public static void ConfigureAzureClustering(ISiloHostBuilder siloBuilder, string connectionString)
{
siloBuilder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString));
}
Normalmente, se implementa un servicio basado en Orleans un clúster de nodos, ya sea en hardware dedicado o en la nube. Para el desarrollo y las pruebas básicas, puede implementar Orleans en una configuración de nodo único. Cuando se implementa en un clúster de nodos, Orleans implementa internamente protocolos para detectar y mantener la pertenencia a Orleans silos en el clúster, incluida la detección de errores de nodo y la reconfiguración automática.
Para administrar la pertenencia a clústeres confiable, Orleans usa Azure Table, SQL Server o Apache ZooKeeper para la sincronización de nodos.
En este ejemplo, usamos Azure Table como proveedor de pertenencia.
Orleans información de agrupación en clústeres
public static void ConfigureClusterOptions(ISiloHostBuilder siloBuilder)
{
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
});
}
Aquí, hacemos dos cosas:
- Establezca el ClusterId a
"my-first-cluster": este es un identificador único para el clúster Orleans. Todos los clientes y silos que usan este identificador pueden comunicarse directamente entre sí. Sin embargo, puede optar por usar otro ClusterId para diferentes implementaciones. - Configura el ServiceId en
"AspNetSampleApp": este es un identificador único para tu aplicación que utilizan algunos proveedores, como los proveedores de persistencia. Este identificador debe permanecer estable y no cambiar entre implementaciones.
De forma predeterminada, Orleans usa "default" para tanto ServiceId como ClusterId. Estos valores no necesitan cambiar en la mayoría de los casos.
ServiceId es más significativo y distingue los diferentes servicios lógicos, lo que les permite compartir sistemas de almacenamiento back-end sin interferencias.
ClusterId determina qué hosts se conectan para formar un clúster.
Dentro de cada clúster, todos los hosts deben usar el mismo ServiceId. Sin embargo, varios clústeres pueden compartir un ServiceId. Esto permite escenarios de implementación azul/verde en los que se inicia una nueva implementación (clúster) antes de apagar otra. Esto es típico para los sistemas hospedados en Azure App Service.
El caso más común es que ServiceId y ClusterId permanecen fijos para la duración de la aplicación y se usa una estrategia de implementación gradual. Esto es típico para los sistemas hospedados en Kubernetes y Service Fabric.
Puntos de conexión
public static void ConfigureSimpleEndpoints(ISiloHostBuilder siloBuilder)
{
siloBuilder.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000);
}
Un Orleans silo tiene dos tipos típicos de configuración de punto de conexión:
- Puntos de conexión de silo a silo: se usan para la comunicación entre los silos del mismo clúster.
- Puntos de conexión de cliente a silo (o puerta de enlace): se usa para la comunicación entre clientes y silos en el mismo clúster.
En el ejemplo, usamos el método de ayuda .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000), que establece el puerto para la comunicación de silo a silo en 11111 y el puerto de puerta de enlace en 30000. Este método detecta en qué interfaz escuchar.
Este método debe ser suficiente en la mayoría de los casos, pero puede personalizarlo aún más si es necesario. Este es un ejemplo del uso de una dirección IP externa con reenvío de puertos:
public static void ConfigureEndpointOptions(ISiloHostBuilder siloBuilder)
{
siloBuilder.Configure<EndpointOptions>(options =>
{
// Port to use for silo-to-silo
options.SiloPort = 11111;
// Port to use for the gateway
options.GatewayPort = 30000;
// IP Address to advertise in the cluster
options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
// The socket used for client-to-silo will bind to this endpoint
options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40000);
// The socket used by the gateway will bind to this endpoint
options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50000);
});
}
Internamente, el silo escucha en 0.0.0.0:40000 y 0.0.0.0:50000, pero el valor publicado en el proveedor de membresía es 172.16.0.42:11111 y 172.16.0.42:30000.
Elementos de la aplicación
public static void ConfigureApplicationParts(ISiloHostBuilder siloBuilder)
{
siloBuilder.ConfigureApplicationParts(
parts => parts.AddApplicationPart(
typeof(ValueGrain).Assembly)
.WithReferences());
}
Aunque este paso no es técnicamente necesario (si no está configurado, Orleans examina todos los ensamblados de la carpeta actual), le recomendamos que lo configure. Este paso ayuda a Orleans cargar ensamblados y tipos de usuario. Estos ensamblados se conocen como elementos de aplicación. Orleans detecta todos los granos, interfaces de grano y serializadores mediante elementos de aplicación.
Configure las partes de la aplicación mediante IApplicationPartManager, accesible a través del método de extensión ConfigureApplicationParts en IClientBuilder y ISiloHostBuilder. El ConfigureApplicationParts método acepta un delegado, Action<IApplicationPartManager>.
Los siguientes métodos de extensión para IApplicationPartManager admiten usos comunes.
- AddApplicationPart: agregue un único ensamblado mediante este método de extensión.
-
AddFromAppDomain: agrega todos los ensamblados cargados actualmente en el
AppDomain. - AddFromApplicationBaseDirectory: carga y agrega todos los ensamblados en la ruta base actual (consulte AppDomain.BaseDirectory).
Complementa los ensamblados agregados por los métodos anteriores mediante los siguientes métodos de extensión en su tipo de valor devuelto, IApplicationPartManagerWithAssemblies:
- WithReferences: agrega todos los ensamblados a los que se hace referencia a partir de los elementos agregados. Esto carga inmediatamente los ensamblados a los que se hace referencia de forma transitiva. Los errores de carga de ensamblados se omiten.
-
WithCodeGeneration: genera código de compatibilidad para los elementos agregados y lo agrega al administrador de elementos. Tenga en cuenta que esto requiere instalar el
Microsoft.Orleans.OrleansCodeGeneratorpaquete y se conoce normalmente como generación de código en tiempo de ejecución.
La detección de tipos requiere que los elementos de aplicación proporcionados incluyan atributos específicos. Agregar el paquete de generación de código en tiempo de compilación (Microsoft.Orleans.CodeGenerator.MSBuild o Microsoft.Orleans.OrleansCodeGenerator.Build) a cada proyecto que contiene granos, interfaces de grano o serializadores es el enfoque recomendado para asegurarse de que estos atributos están presentes. La generación de código en tiempo de compilación solo admite C#. En el caso de F#, Visual Basic y otros lenguajes .NET, puede generar código durante el tiempo de configuración mediante el WithCodeGeneration método descrito anteriormente. Obtenga más información sobre la generación de código en la sección correspondiente.