一个简单的Orleans例子

一个简单的Orleans例子

  • Orleans例子的大致结构
  • Grain接口
  • Grain接口的实现
  • Orleans的服务端
  • Orleans的客户端
  • 运行结果

Orleans例子的大致结构

一个简单的Orleans例子_第1张图片

  1. Grain接口
  2. Grain接口的实现
  3. Orleans的Server
  4. 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时,用来判断标识的类型。
一个简单的Orleans例子_第2张图片
例子的实现:

 public interface ITest : IGrainWithGuidKey 
 {
      Task GetName(int id); 
 }

Grain接口的实现

定义一个类,继承自Grain和ITest接口,代码如下:

public class TestGrain : Grain,ITest
    {
         public Task GetName(int id)
        {
            List name = new List()//具体业务
            {
                "张三","李四","王五"
            };
            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(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(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:
一个简单的Orleans例子_第3张图片
然后运行Client,可以看到已经成功调用了Server的方法:
一个简单的Orleans例子_第4张图片
调用的同时,server也会输出如下日志:
一个简单的Orleans例子_第5张图片
Orleans的简单例子就到这里结束了。

你可能感兴趣的:(框架,Orleans例子)