Orleans的集群構建
Orleans的集群構建
這是Orleans系列文章中的一篇.首篇文章在此
聽聞一周前,微軟公布了.net core2.0,以及各種各樣的其他core2.0.大家都很興奮.微媽的誠意真是滿滿的.這次開源勢頭讓我感覺到了微媽的技術實力之雄厚.我在這裏祝福C#越來越好.細心的人似乎發現Orleans在github中是和net core分在一起的.Orleans的2.0何時發布呀…
現在我們面對的Orleans1.5(github上是1.6)已經是一個成熟的框架了.涉及到分布式的方方面面,我突然覺得我原來暫定的8篇文章都介紹不完全.我盡量介紹完整,至少讓大家能入門,後邊的修行就看大家自己的努力了.如果讀者中有人能夠和我分享,與我共同討論我也是非常歡迎的.我的聯系方式在第一篇文章中這裏就不再復述了.
我現在利用<Orleans簡單配置>文章中介紹的內容,配置一個可以分布式的silo,觀察它們的行為.這裏只介紹2種,其余的配置方式往讀者自己研究.
我先說利用sql server數據庫作為"服務自我發現"的服務
還是跟以前一樣,我一步一步來.
基於SQL server的集群步驟
-
回顧之前的文章中在集群中客戶端配置應該是這個模樣:
<ClientConfiguration xmlns="urn:orleans"> <SystemStore SystemStoreType="SqlServer" DeploymentId="target deployment ID" DataConnectionString="SQL connection string"/> </ClientConfiguration>
這裏解釋一下,還記得持久化中配置文件的主體是什麽嗎?對了是<StorageProviders>節.這個節的內容定義了Orleans在持久化時,要利用的存儲中間件的各種參數.
而我們這裏要利用的是<SystemStore>,它定義了與"系統"相關的變量應該存儲在哪裏.我只要定義好<SystemStore>後Orleans就會自動使用服務發現.
由於Orleans使用MembershipTable 來控制silo與silo的關系變化(誰加入了集群,誰離開了集群等等)如果配置好了<SystemStore>,這個MembershipTable就會存儲在數據庫中.所有的silo都要以數據庫中的成員關系表為標準.這個表長成這個樣子
其中有一個字段就是silo的地址.因此silo可以發現其他的silo,它們可以構成一個集群,而client可以發現集群內所有的silo.從而與集群互動.
- 按照以上討論,我修改了一下配置文件.如下.
此處client也需要配置,因為client也需要讀取成員關系表,以便知道所有silo的地址和狀態.為了使client可以利用<SystemStore>必須在client裏引用OrleansSQLUtils以及System.Data.SqlClient的包,
- 運行一下,就會有如下截圖
-
再運行一個.找到host.exe,我們雙擊後再運行一個,會看到錯誤,這是因為silo配置文件中指明了一些端口,這些端口已經被第一個silo占用了,所以我修改一些host的配置文件,再次運行,會得到如下截圖
我們看到先啟動的silo發現了新加入的silo.讀者可以再次實驗silo離開後的情況.
-
此時我讓client運行,就會得到如下截圖
可以看到client發送的消息均衡負載地再兩個silo內執行.
至此一個基於sql server的簡單silo集群就搭建完畢…這個集群雖然簡單,但是滿足所有高級的特性,擴展性和穩定性雙優.是居家旅行的良好解決方案.只要有一個silo存活,這個集群就不會倒..
基於consul的集群
下文將介紹一下,另一個輕量級的集群實現.這個實現的步驟來自於官方教程.我再剛開始學習Orleans的時候,曾經使用這個步驟構建過集群.因為這個步驟是官方教程裏一個最為詳細的步驟,所以我就照做了.
1. 創建一個文件夾用來放置consul 比如 c:\consul.
2. 創建一個子文件夾放置數據 比如 c:\consul\data(consul不會自己創建.)
3. 下載並解壓consul到c:\consul
4. 打開cmd,轉至 c:\consul
5. 運行 Consul.exe agent -server -bootstrap -data-dir "C:\Consul\Data" -client=0.0.0.0
agent 指示consul新運行承載服務的代理進程,如果缺少這個參數 consul進程就嘗試使用RPC來配置一個正在運行的代理進程
-server 指明這個代理進程是服務而不是client(一個consul client承載著所有的服務和數據,但是它沒有權利投票,也沒有可能成為consul集群領導)
-bootstrap consul集群中的第一個節點必須是有這個參數,它同時也是consul集群的領導.(單實例consule,,無所謂了)
-data-dir [path] 指明數據存儲地址
-client=0.0.0.0 指明consule的服務地址
還有很多其他的consule參數.它們可以用json文件來配置,閱讀consul文章來詳細了解
確保consul已經運行了,請在瀏覽器裏輸入以下網址http://localhost:8500/v1/catalog/services 看看
6. 配置服務器
<OrleansConfiguration xmlns="urn:orleans"> <Globals> <SystemStore SystemStoreType="None" DataConnectionString="http://localhost:8500" DeploymentId="MyOrleansDeployment" /> </Globals> <Defaults> <Networking Address="localhost" Port="22222" /> <ProxyingGateway Address="localhost" Port="30000" /> </Defaults> </OrleansConfiguration>
並在host項目中的program.cs中,手動增加以下內容
silohost.Config.Globals.LivenessType = GlobalConfiguration.LivenessProviderType.Custom; silohost.Config.Globals.MembershipTableAssembly = "OrleansConsulUtils"; silohost.Config.Globals.ReminderServiceType = GlobalConfiguration.ReminderServiceProviderType.Disabled; silohost.InitializeOrleansSilo();
官方解釋說: Consul的xml配置文件,Orleans在解析的時候有點小bug所以要在代碼中控制一下.我在搭配的時候就采用了這個,但是我並沒有驗證此bug是否依然存在(官方教程是1.2的,我寫的時候已經是1.5了).
好了這樣一個基於consul的集群就構建好了.
經過以上的文章介紹,Orleans主要方面都或多或少的涉及到了,我寫這系列文章的目的也快要達到了.除去一個方面,那就是eventSourcing.由於EventSourcinig是個復雜的事情,我需要組織語言,而且最近家裏私事很多.也許下一篇文章放出的時候會很晚.因為接下來我沒有太多時間.
Orleans的集群構建