Orleans 初接触(一) 入门例子
?【返回導(dǎo)航】
在簡單了解了Orleans?之后我們可以通過幾個例子去加深印象
一、Orleans入門例子
這個例子是跟著《Orleans入門例子》(https://www.cnblogs.com/gaopang/articles/7379802.html)
1.創(chuàng)建
首先創(chuàng)建一個四個項目的解決方案,如圖所示
四個項目分別是:
然后使用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){//獲得一個配置實(shí)例//他需要兩個端口,第一個端口2334是用來silo與silo之間的通信的,第二個1234是用于監(jiān)聽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){//等待服務(wù)端啟動完畢 Console.ReadKey();//然后我聰明的敲擊了回車鍵 Run();Console.ReadKey();}static async void Run(){//利用內(nèi)置方法獲得一個配置類,這個類指明服務(wù)端的端口是1234//可以利用配置文件,不過這里我就先用這個簡單的配置類var config = Orleans.Runtime.Configuration.ClientConfiguration.LocalhostSilo(1234);//初始化一個GrainClient GrainClient.Initialize(config);//從silo處,獲得了一個BasicGrain的接口IGrains.IBasic agrain = GrainClient.GrainFactory.GetGrain<IGrains.IBasic>(314);//調(diào)用里面的方法,等待它返回string result = await agrain.SayHello("還好");Console.WriteLine(result);}}
3.運(yùn)行
但是在運(yùn)行Client的時候?qū)е铝艘粋€問題
還不知道怎么解決,就卡在這里了。
后續(xù)解決:
在博客園獲得了博主大大的提示,仔細(xì)檢查之后,發(fā)現(xiàn)原來是我的host項目沒有引用引用Grains項目以及IGrains項目。在引用之后,整個項目就能完整的運(yùn)行下來了。
?
二、快速入門示例
? 這個例子是跟著《Microsoft Orleans 之 入門指南》(https://www.cnblogs.com/endv/p/6147976.html)中的快速入門示例做的
1.創(chuàng)建
同樣,是先創(chuàng)建一個四個項目的解決方案,這里把它命名為OrleansSamples
項目的結(jié)構(gòu)和上一個例子一樣,同樣是引用Microsoft.Orleans.Server(服務(wù)端包)和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("請輸入用戶手機(jī)號:");var mobileNumber = Console.ReadLine();//這里由于我們采用的grain繼承的是IGrainWithIntegerKey ,所以我們采用調(diào)用數(shù)值類型的key=10來創(chuàng)建這個grain,//可能有人會問key是干嘛的,他是唯一標(biāo)識這個grain的,當(dāng)你指定一個key的時候,Orleans 會創(chuàng)建一個,它首先到//你的存儲介質(zhì)中找(如果你配置了的話,默認(rèn)采用內(nèi)存存儲,這種方式適合開發(fā)期,生產(chǎn)環(huán)境需要保持狀態(tài)的,所以需要配置到能持久化存儲的地方去,比如sqlserver等)//如果找到了就直接返回,如果沒找到就根據(jù)你指定的這個key然后創(chuàng)建一個,這個就是grain的激活,具體詳細(xì)的,可以看官方問的關(guān)于Grain一章。var userService = GrainClient.GrainFactory.GetGrain<IUserService>(10);//C#的一種新的表達(dá)式語法,這樣就方便多了,省的我們拼接字符串。Console.WriteLine($"用戶{mobileNumber},{(userService.Exist(mobileNumber).Result ? "已經(jīng)存在" : "不存在")}");}}}3.運(yùn)行
想要將這個Orleans?運(yùn)行起來,還需要做件事
在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文件設(shè)置屬性-高級-復(fù)制到輸出目錄-如果較新則復(fù)制
將Server(服務(wù)端)和Client(客戶端)分別運(yùn)行后,即可得到效果
至此一個簡單的單服務(wù)的Orleans就已經(jīng)完成了,從這個例子里能簡單的理解一下Orleans。但是究竟一個分布式的集群服務(wù)器應(yīng)該怎么搭建,還是毫無頭緒,然我們繼續(xù)學(xué)習(xí)西區(qū)
?
轉(zhuǎn)載于:https://www.cnblogs.com/amber-L/p/7878534.html
總結(jié)
以上是生活随笔為你收集整理的Orleans 初接触(一) 入门例子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决HP ProLiant DL380
- 下一篇: CentOS7如何安装vsftpd