Orleans例子的大致结构

- Grain接口
- Grain接口的实现
- Orleans的Server
- Orleans的Client
各个项目间的关系:
【Grain接口的实现】引用【Grain接口】,并实现Grain接口
【Client】引用【Grain接口】,
【Server】引用【Grain接口的实现】
需要注意的是:
【Grain的接口】和【Grain接口的实现】需要引用【Microsoft.Orleans.OrleansCodeGenerator.Build】包。引入这个包,会在【Grain的接口】和【Grain接口的实现】中生成通讯用的cs文件的。如果不引用这个包,编译的时候是不会报错的,但是运行的时候会提示
“System.ArgumentException:“Cannot find an implementation class for grain interface: OrleansInterface.ITest. Make sure the grain assembly was correctly deployed and loaded in the silo.”
生成通讯文件时在编译的时候。
【Client】和【Server】分别需要引用Orleans对应的包,这个包不引用代码直接编译不了就不说了。
Grain接口
定义一个接口文件,继承IGrainWithXXXX即可,XXXX可以是GuidKey,也可以是StringKey,如下图。这些类型在GetGrain时,用来判断标识的类型。
例子的实现:
public interface ITest : IGrainWithGuidKey
{
Task<string> GetName(int id);
}
Grain接口的实现
定义一个类,继承自Grain和ITest接口,代码如下:
public class TestGrain : Grain,ITest
{
public Task<string> GetName(int id)
{
List<string> name = new List<string>()//具体业务
{
"张三","李四","王五"
};
if (id >= 0 && id < name.Count)
{
return Task.FromResult(name[id]);
}
return Task.FromResult("NO");
}
}
Orleans的服务端
服务端需要创建一个ISiloHost的实例,然后调用该类的StartAsync开始监听即可。
static void Run()
{
ISiloHost host = new SiloHostBuilder()
.UseLocalhostClustering(40001,40000)
.Build();
host.StartAsync();
}
Orleans的客户端
客户端创建的是IClusterClient的实例,然后将client连接到silo,然后通过该client获取Grain,接着调用Grain的方法即可。代码如下:
static async void Run()
{
IClusterClient client = new ClientBuilder()
.UseLocalhostClustering()
.UseStaticClustering(new IPEndPoint(IPAddress.Parse("127.0.0.1"),40000))
.Configure<ClusterOptions>(opt =>
{
opt.ClusterId = "TestCluster";
opt.ServiceId = "TestServer";
})
.Build();
await client.Connect(ex =>
{
if (ex != null)
{
Console.WriteLine(ex.Message);
}
return Task.FromResult(true);
});
ITest test = client.GetGrain<ITest>(Guid.NewGuid());
string name = await test.GetName(0);
Console.WriteLine("name:" + name);
string name1 = await test.GetName(1);
Console.WriteLine("name1:" + name1);
string name2 = await test.GetName(2);
Console.WriteLine("name2:" + name2);
}
运行结果
先运行server:
然后运行Client,可以看到已经成功调用了Server的方法:
调用的同时,server也会输出如下日志:
Orleans的简单例子就到这里结束了。