返回导航

  在简单了解了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(, );
//初始化一个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(); //初始化一个GrainClient
GrainClient.Initialize(config); //从silo处,获得了一个BasicGrain的接口
IGrains.IBasic agrain = GrainClient.GrainFactory.GetGrain<IGrains.IBasic>(); //调用里面的方法,等待它返回
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 == "");
}
}

  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();
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>();
//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。但是究竟一个分布式的集群服务器应该怎么搭建,还是毫无头绪,然我们继续学习西区

Orleans 初接触(一) 入门例子的更多相关文章

  1. Orleans 初接触

    简介 这篇随笔主要记录了自己学习Orleans的经过和理解,在学习过程中会一直更新,思路和理解可能有些偏颇,如果有幸有大佬看到这篇文章,希望能给予批评指正. 导航 (一) 入门例子 (二) 测试用例 ...

  2. Orleans 初接触(二) 测试用例

    [返回导航] 在简单了解了Orleans 之后我们可以通过几个例子去加深印象 一.快速入门示例 这个例子也是跟着<Microsoft Orleans 之 入门指南>(https://www ...

  3. Orleans入门例子

    Orleans入门例子 这是Orleans系列文章中的一篇.首篇文章在此  一.铺垫. 虽然是个入门例子,还是需要一些铺垫. Orleans的最小完全体,应该分为2个部分.一个是Orleans客户端, ...

  4. ExtJS初接触 —— 了解 Ext Core

    ExtJS初接触 —— 了解 Ext Core Ext Core是一款和jQuery媲美的轻型JS库,基于MIT许可.对于Dom的操作,我个人还是比较喜欢用jQuery.当然如果项目中用的是ExtJS ...

  5. Quartz入门例子简介 从入门到菜鸟(一)

    转: Quartz入门例子简介 从入门到菜鸟(一) 2016年11月19日 22:58:24 爱种鱼的猫 阅读数:4039   刚接触quartz这个词并不是在学习过程中...而是WOW里面的界面插件 ...

  6. 【Bootstrap Demo】入门例子创建

    本文简单介绍下如何来使用 Bootstrap,通过引入 Bootstrap,来实现一个最基本的入门例子. 在前一篇博文[Bootstrap]1.初识Bootstrap 基础之上,我们完全可以更加方便快 ...

  7. 初接触BurpLoader工具

    初接触burp工具 菜鸟一枚,现在在接触一段时间测试,我在测试功能性的时候,想着网站被黑案例那么多,我是不是也应该弄弄安全性测试了,所以就有了下边的第一次接触BurpLoader工具来测试手机的app ...

  8. 【Bootstrap】入门例子创建

    本文简单介绍下如何来使用 Bootstrap,通过引入 Bootstrap,来实现一个最基本的入门例子. 在前一篇博文[Bootstrap]1.初识Bootstrap 基础之上,我们完全可以更加方便快 ...

  9. spring boot入门例子

    最近学习spring boot,总结一下入门的的基础知识 1新建maven项目,修改pom.xml <project xmlns="http://maven.apache.org/PO ...

随机推荐

  1. nyoj 811-变态最大值 (max)

    811-变态最大值 内存限制:64MB 时间限制:1000ms 特判: No 通过数:6 提交数:15 难度:1 题目描述: Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这 ...

  2. 控制层传递参数到jsp页面,jsp页面进行接收

    在java代码中,控制层方法如下(采用model,还有其他方式) public String mysave(MyTreeMould myTreeMould, Model model) {...... ...

  3. PHP的global和$GLOBALS的区别

    global是关键字,通常添加在变量前,可以使变量的作用域为全局. $GLOBALS预定义的超全局变量,把变量扔到里面一样可以变成全局变量. $GLOBALS 是一个关联数组,每一个变量为一个元素,键 ...

  4. java的Io流机制的学习

    IO流机制 File类的使用 File类的构造方法 File(URI uri) File(String pathname) File(File parent, String child) File(S ...

  5. python基础-面向对象编程之继承

    面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...

  6. 🔥《手把手教你》系列基础篇之4-python+ selenium自动化测试-xpath使用(详细教程)

    1. 简介 俗话说:磨刀不误砍柴工,因此在我们要开始写自动化脚本之前,我们先来学习和了解几个基本概念,在完全掌握了这几个概念之后,有助于我们快速上手,如何去编写自动化测试脚本. 元素,在这个教程系列, ...

  7. 【Luogu P1168】【Luogu P1801&UVA 501】中位数&黑匣子(Black Box)——对顶堆相关

    Luogu P1168 Luogu P1801 UVA 501(洛谷Remote Judge) 前置知识:堆.优先队列STL的使用 对顶堆 是一种在线维护第\(k\)小的算法. 其实就是开两个堆,一个 ...

  8. Netty Pipeline与ChannelHandler那些事

    Pipeline和ChannelHandler是Netty处理流程的重要组成部分,ChannelHandler对应一个个业务处理器,Pipeline则是负责将各个ChannelHandler串起来的& ...

  9. Mysql查询语句之排序查询

    语法: /* select 查询列表 from 表 [where 筛选条件] order by 排序列表 [asc/desc] */ ①asc为升序,desc为降序,且默认为升序 ②order by子 ...

  10. Java核心技术第八章-泛型

    摘要 本文根据<Java核心技术 卷一>一书的第八章总结而成,部分文章摘抄书内,作为个人笔记. 文章不会过于深入,望读者参考便好. 为什么要使用泛型程序设计 泛型程序设计(Generic ...