【返回导航】

  在简单了解了Orleans 之后我们可以通过几个例子去加深印象

一、Orleans入门例子

  这个例子是跟着《Orleans入门例子》(https://www.cnblogs.com/gaopang/articles/7379802.html)

  1.创建

  首先创建一个四个项目的解决方案,如图所示

  

  四个项目分别是:

  1. Client:这个显而易见,里面就是要运行GrainClient的。它要和Host通信,这就要求它引用IGrains项目。这是个控制台项目
  2. Host:这个也是显而易见,里面就是要运行Silo的。它应该引用Grains项目以及IGrains项目,因为它要承载Grain(这就要求引用Grains类),并且需要Grain实例间的通信(这就要求引用IGrains项目),这是个控制台项目
  3. Grains:这个里面实现所有IGrain载明的接口,实现所有的Grain类,包括它们的方法以及字段。(它要求引用IGrain。。。废话)这是个类库项目
  4. IGrains:这里放置所有Grains类要扩展的接口。这是个类库项目。

  然后使用NuGet引用Microsoft.Orleans.Server

  

  接着使用NuGet引用Microsoft.Orleans.Client

  

  2.编码

  IGrains.IBasic

  public interface IBasic : IGrainWithIntegerKey{Task<string> SayHello(string hellostr);}

  Grains.BasicGrain

  public class BasicGrain : Grain, IGrains.IBasic{public Task<string> SayHello(string hellostr){Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.fff"), hellostr);return Task.FromResult<string>("done");}}

  Host.Program

  class Program{static void Main(string[] args){//获得一个配置实例//他需要两个端口,第一个端口2334是用来silo与silo之间的通信的,第二个1234是用于监听client的请求的var config = Orleans.Runtime.Configuration.ClusterConfiguration.LocalhostPrimarySilo(2234, 1234);//初始化一个silohost,这里使用了Orleans提供的silohost而不是silo,其中silo的名字命名为Ba;SiloHost siloHost = new SiloHost("Ba", config);//初始化仓储
            siloHost.InitializeOrleansSilo();//启动
            siloHost.StartOrleansSilo();//检查一下if (siloHost.IsStarted){Console.WriteLine("silohost 启动成功");}else{Console.WriteLine("启动失败");}Console.ReadKey();}}

  

    class Program{static void Main(string[] args){//等待服务端启动完毕
            Console.ReadKey();//然后我聪明的敲击了回车键
            Run();Console.ReadKey();}static async void Run(){//利用内置方法获得一个配置类,这个类指明服务端的端口是1234//可以利用配置文件,不过这里我就先用这个简单的配置类var config = Orleans.Runtime.Configuration.ClientConfiguration.LocalhostSilo(1234);//初始化一个GrainClient
            GrainClient.Initialize(config);//从silo处,获得了一个BasicGrain的接口IGrains.IBasic agrain = GrainClient.GrainFactory.GetGrain<IGrains.IBasic>(314);//调用里面的方法,等待它返回string result = await agrain.SayHello("还好");Console.WriteLine(result);}}

  3.运行

  但是在运行Client的时候导致了一个问题

  

  还不知道怎么解决,就卡在这里了。

  后续解决:

    在博客园获得了博主大大的提示,仔细检查之后,发现原来是我的host项目没有引用引用Grains项目以及IGrains项目。在引用之后,整个项目就能完整的运行下来了。

二、快速入门示例

  这个例子是跟着《Microsoft Orleans 之 入门指南》(https://www.cnblogs.com/endv/p/6147976.html)中的快速入门示例做的

  1.创建

  同样,是先创建一个四个项目的解决方案,这里把它命名为OrleansSamples

  

  项目的结构和上一个例子一样,同样是引用Microsoft.Orleans.Server(服务端包)和Microsoft.Orleans.Client(客户端包)

  不一样的是这个例子使用了和上一个例子不一样的接口

  2.编码

  IUserService

    public interface IUserService : IGrainWithIntegerKey{Task<bool> Exist(string mobileNumber);}

  UserService

    public class UserService : Grain, IUserService{public Task<bool> Exist(string mobileNumber){return Task.FromResult<bool>(mobileNumber == "15665699774");}}

  Server

    class Program{static void Main(string[] args){using (var host = new SiloHost("Default")){host.InitializeOrleansSilo();host.StartOrleansSilo();Console.WriteLine("启动成功!");Console.ReadLine();host.StopOrleansSilo();}}}

  Client

    class Program{static void Main(string[] args){System.Threading.Thread.Sleep(15000);GrainClient.Initialize();while (true){Console.WriteLine("请输入用户手机号:");var mobileNumber = Console.ReadLine();//这里由于我们采用的grain继承的是IGrainWithIntegerKey ,所以我们采用调用数值类型的key=10来创建这个grain,//可能有人会问key是干嘛的,他是唯一标识这个grain的,当你指定一个key的时候,Orleans 会创建一个,它首先到//你的存储介质中找(如果你配置了的话,默认采用内存存储,这种方式适合开发期,生产环境需要保持状态的,所以需要配置到能持久化存储的地方去,比如sqlserver等)//如果找到了就直接返回,如果没找到就根据你指定的这个key然后创建一个,这个就是grain的激活,具体详细的,可以看官方问的关于Grain一章。var userService = GrainClient.GrainFactory.GetGrain<IUserService>(10);//C#的一种新的表达式语法,这样就方便多了,省的我们拼接字符串。Console.WriteLine($"用户{mobileNumber},{(userService.Exist(mobileNumber).Result ? "已经存在" : "不存在")}");}}}

  3.运行

  想要将这个Orleans 运行起来,还需要做件事

  在Server目录下添加OrleansConfiguration.xml

<?xml version="1.0" encoding="utf-8" ?>
<OrleansConfiguration xmlns="urn:orleans"><Globals><StorageProviders><Provider Type="Orleans.Storage.MemoryStorage" Name="MemoryStore" /><Provider Type="Orleans.Storage.MemoryStorage" Name="Default" /><!--<Provider Type="Orleans.Storage.AzureTableStorage" Name="AzureStore"/>--></StorageProviders><SeedNode Address="localhost" Port="22222"/><Messaging ResponseTimeout="30s"/></Globals><Defaults><Networking Address="localhost" Port="22222"/><ProxyingGateway Address="localhost" Port="40000" /><Tracing DefaultTraceLevel="Info" TraceToConsole="true" TraceToFile="{0}-{1}.log" PropagateActivityId="false" BulkMessageLimit="1000"><TraceLevelOverride LogPrefix="Application" TraceLevel="Info" /><!--
<TraceLevelOverride LogPrefix="Runtime.Dispatcher" TraceLevel="Verbose" />
<TraceLevelOverride LogPrefix="AssemblyLoader.Silo" TraceLevel="Warning" />
--></Tracing><Statistics MetricsTableWriteInterval="30s" PerfCounterWriteInterval="30s" LogWriteInterval="300s" WriteLogStatisticsToTable="true" StatisticsCollectionLevel="Info"/></Defaults>
</OrleansConfiguration>

  在Client目录下添加ClientConfiguration.xml

<?xml version="1.0" encoding="utf-8" ?>
<ClientConfiguration xmlns="urn:orleans"><Gateway Address="localhost" Port="40000"/><!-- To turn tracing off, set DefaultTraceLevel="Off" and have no overrides.For the trace log file name, {0} is replaced by "Client" and {1} is the current time. --><Tracing DefaultTraceLevel="Info" TraceToConsole="false" TraceToFile="{0}-{1}.log" BulkMessageLimit="1000"><TraceLevelOverride LogPrefix="Runtime" TraceLevel="Info" /><TraceLevelOverride LogPrefix="Application" TraceLevel="Info" /><TraceLevelOverride LogPrefix="AssemblyLoader" TraceLevel="Warning" /></Tracing><Statistics MetricsTableWriteInterval="300s" PerfCounterWriteInterval="30s" LogWriteInterval="300s" WriteLogStatisticsToTable="true" StatisticsCollectionLevel="Info"/><Messaging ResponseTimeout="30s" ClientSenderBuckets="8192" MaxResendCount="0"/>
</ClientConfiguration>

  并且对这两个xml文件设置属性-高级-复制到输出目录-如果较新则复制

  将Server(服务端)和Client(客户端)分别运行后,即可得到效果

  

  至此一个简单的单服务的Orleans就已经完成了,从这个例子里能简单的理解一下Orleans。但是究竟一个分布式的集群服务器应该怎么搭建,还是毫无头绪,然我们继续学习西区

转载于:https://www.cnblogs.com/amber-L/p/7878534.html

Orleans 初接触(一) 入门例子相关推荐

  1. Orleans入门例子

    Orleans是微软开源的分布式actor模型框架.actor模型的原理网络上有很多文章.有许多理论性的文章,深刻地我都不知道怎么应用.在这里我就不赘述了.既然是博客,就说说自己的理解. 对于编程来说 ...

  2. Restlet入门例子 - RESTful web framwork for java

    RESTful系列文章索引 Restlet入门例子 - RESTful web framwork for java [原创]Jersey入门例子 官方网站介绍: http://www.restlet. ...

  3. 1. Windows Powershell初接触

    1. Windows Powershell初接触 我们之中有些人是因为需要配置Exchange Server2007,才开始对Windows Powershell全新的学习.但是,我认为可以使用WMI ...

  4. Cassandra 单机入门例子——有索引

    入门例子: http://wiki.apache.org/cassandra/GettingStarted 添加环境变量并source生效,使得可以在任意位置执行cassandra/bin安装目录下的 ...

  5. spark streaming 入门例子

    spark streaming 入门例子: spark shell import org.apache.spark._ import org.apache.spark.streaming._sc.ge ...

  6. 图解VC++2012编译安装GDAL1.11.0和入门例子

    相关下载 http://pan.baidu.com/s/1o7OEMc6 gdal1.rar - 入门例子 GDAL书籍代码及数据.rar gdal1110.zip - 下载的源码 GDAL.rar ...

  7. Dapr微服务应用开发系列2:Hello World与SDK初接触

    题记:上篇介绍了Dapr的环境配置,这次我们来动手尝试一下Dapr应用的开发 Hello World Dapr应用的Hello World其实和其他的Hello World一样简单: 首先用你喜欢的语 ...

  8. [深度学习-实践]CycleGAN的入门例子-Tensorflow2.1-keras

    系列文章目录 深度学习GAN(一)之简单介绍 深度学习GAN(二)之DCGAN基于CIFAR10数据集的例子 深度学习GAN(三)之DCGAN基于手写体Mnist数据集的例子 深度学习GAN(四)之c ...

  9. [深度学习-实践]GAN入门例子-利用Tensorflow Keras与数据集CIFAR10生成新图片

    系列文章目录 深度学习GAN(一)之简单介绍 深度学习GAN(二)之基于CIFAR10数据集的例子; 深度学习GAN(三)之基于手写体Mnist数据集的例子; 深度学习GAN(四)之PIX2PIX G ...

最新文章

  1. Java 知识全面总结:并发编程+JVM+设计模式+常用框架+....
  2. 虚拟机安装(Cent OS)
  3. VS2019中配置opencv4.3.0(亲测有效)
  4. python找水仙花数_Python一句代码实现找出所有水仙花数的方法
  5. 用python创建微信机器人_用Python创建微信机器人
  6. 最短路径次短路径算法
  7. 实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例
  8. android动态居中布局,Android动态添加布局的两种方式
  9. 卸载 windows_Windows 10可能很快会自动卸载有问题的Windows更新
  10. java jar合并_多个jar包合并成一个jar包(ant)
  11. Bubble——Typecho 极简风格响应式主题
  12. python中int转换为时间戳_python日期和时间戳互相转化操作详解
  13. OpenCV 1.0在VC6下安装与配置(附测试程序)
  14. 无法获取有关 Windows NT 组/用户 'WIN-*******\********' 的信息,错误代码 0x534。 [SQLSTATE 42000] (错误 15404))....
  15. java实现ZUC算法加密解密
  16. 电路串联和并联图解_串联电路与并联电路的区别
  17. 计算机二级教程48讲视频,天津大学 《线性代数》视频教程48讲 真人手写精品
  18. 【操作系统】第二章--进程的描述与控制--深入与解释(1)
  19. 这套Github上40K+star面试笔记,可以帮你搞定95%以上的Java面试
  20. 【spacedesk】屏幕扩展,将平板pad设置为pc的副屏

热门文章

  1. Hungary(匈牙利算法)——二分图最大匹配
  2. [原]win32 rundll32 应用列表
  3. html对图片轮播脚本怎么调用,【jquery前端开发】可调整的幻灯片(图片轮播)
  4. 奔腾双核linux服务器,Dell推出双核心奔腾服务器
  5. Java旅游动吧项目讲解_springboot动吧项目
  6. linux命令行大全 笔记,《Linux命令行大全》读书笔记
  7. JAVA5000行代码什么概念_GitHub - catstiger/mvc: 一个不超过5000行代码的,快速,简单,易用的MVC框架。...
  8. hanlp 词频统计_10.HanLP实现k均值--文本聚类
  9. 程序包android.support.annotation不存在_efcore技巧贴也许有你不知道的使用技巧
  10. mysql timdir_MYSQL学习笔记——数据类型