此概述与此处提供的Hello World示例应用程序相关联。
Orleans的主要概念涉及silo、client、一个或多个grain。创建Orleans应用程序涉及配置silo、配置client和编写grain。
通过SiloHostBuilder
和一些补充选项类,以编程方式配置Silo。可以在此处找到所有选项的列表。
[...]
private static async Task StartSilo()
{
// define the cluster configuration
var builder = new SiloHostBuilder()
.UseLocalhostClustering()
.Configure(options =>
{
options.ClusterId = "dev";
options.ServiceId = "HelloWorldApp";
})
.Configure(options => options.AdvertisedIPAddress = IPAddress.Loopback)
.ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(HelloGrain).Assembly).WithReferences())
.ConfigureLogging(logging => logging.AddConsole());
var host = builder.Build();
await host.StartAsync();
return host;
}
选项 | 用于 |
---|---|
.UseLocalhostClustering() |
将client配置为连接到localhost上的silo。 |
ClusterOptions |
ClusterId是Orleans集群的名称,对于silo和client必须相同,因此它们可以相互通信。ServiceId是用于应用程序的ID,不得在部署之间进行更改 |
EndpointOptions |
这告诉silo在哪里监听。对于这个例子,我们使用的是loopback 。 |
ConfigureApplicationParts |
将grain类和接口程序集作为应用程序部件添加到您的orleans应用程序中。 |
加载配置后,构建SiloHost,然后异步启动。
与Silo类似,客户端通过ClientBuilder
类似的选项类集合进行配置。
private static async Task StartClientWithRetries()
{
attempt = 0;
IClusterClient client;
client = new ClientBuilder()
.UseLocalhostClustering()
.Configure(options =>
{
options.ClusterId = "dev";
options.ServiceId = "HelloWorldApp";
})
.ConfigureLogging(logging => logging.AddConsole())
.Build();
await client.Connect(RetryFilter);
Console.WriteLine("Client successfully connect to silo host");
return client;
}
选项 | 用于 |
---|---|
.UseLocalhostClustering() |
与SiloHost相同 |
ClusterOptions |
与SiloHost相同 |
可以在“配置指南”的“客户端配置”部分中,找到有关配置客户端的更深入的指南。
grain是Orleans编程模型的关键原语。grain是Orleans应用程序的构建块,它们是隔离的、分布式的、持久性的原子单元。grain是表示应用程序实体的对象。就像在经典的面向对象编程中一样,grain封装了实体的状态,并在代码逻辑中对其行为进行编码。Grains可以通过调用彼此通过接口公开的方法,来保持彼此的引用并进行交互。
您可以在Orleans文档的Core Concepts部分中阅读有关它们的更多信息。
这是Hello World grain的主要代码:
[...]
namespace HelloWorld.Grains
{
public class HelloGrain : Orleans.Grain, IHello
{
Task<string> IHello.SayHello(string greeting)
{
logger.LogInformation($"SayHello message received: greeting = '{greeting}'");
return Task.FromResult($"You said: '{greeting}', I say: Hello!");
}
}
}
grain类实现了一个或多个grain接口,您可以这里的阅读Grains章节。
[...]
namespace HelloWorld.Interfaces
{
public interface IHello : Orleans.IGrainWithIntegerKey
{
Task<string> SayHello(string greeting);
}
}
该编程模型是我们分布式面向对象编程的核心概念的一部分。SiloHost首先启动。然后,OrleansClient程序启动。OrleansClient的Main方法调用启动客户端的方法StartClientWithRetries(),
客户端被传递给DoClientWork()
方法。
private static async Task DoClientWork(IClusterClient client)
{
// example of calling grains from the initialized client
var friend = client.GetGrain(0);
var response = await friend.SayHello("Good morning, my friend!");
Console.WriteLine("\n\n{0}\n\n", response);
}
此时,OrleansClient创建对IHello grain的引用,并通过其接口IHello,调用其SayHello()方法。此调用激活silo中的grain。OrleansClient向激活的grain发送问候语。grain返回问候语作为对OrleansClient的响应,OrleansClient显示在控制台上。
要运行示例应用程序,请参阅自述文件。