【DDD/CQRS/微服務架構案例】在Ubuntu 14.04.4 LTS中執行WeText專案的服務端

weixin_34067049發表於2016-04-24

在《WeText專案:一個基於.NET實現的DDD、CQRS與微服務架構的演示案例》文章中,我介紹了自己用Visual Studio 2015(C# 6.0 with .NET Framework 4.6.1)開發的DDD/CQRS/微服務架構的案例專案:WeText。文章發出後反響很好,也很感謝大家的關注。在本文中我將介紹如何在Ubuntu 14.04.4 LTS中執行WeText專案的服務端。

為跨平臺而生

從一開始的設計,我就把WeText的服務端跨平臺納入了實踐目標,因此,所選擇的框架和技術全部都是可以跨平臺執行的。在這個過程中我沒有嘗試最新的.NET Core RC,而是繼續使用最新版本的Mono。Mono目前對微軟官方的.NET Framework相容性已經做得非常好了,一句話概括:除了WPF、WWF不支援,以及部分WCF與ASP.NET 4.5非同步支援不完善以外,其它功能完全支援。.NET Framework已經支援到4.6.1,C#語言規範已經支援到C# 6.0。具體詳情可以參考Mono的官方說明:http://www.mono-project.com/docs/about-mono/compatibility/。在最近工作上遇到一個專案需要能夠執行在Linux下,專案本身不大,也非常簡單,但美國團隊一聽說我打算採用Mono就不太願意接受,最後還是選擇使用Java。當然我承認Java在多平臺的支援方面的確非常出色,但我還是想親身實踐一下Mono,想證明基於Mono的方案的確也能做得很好。這也是我將WeText定位為能夠跨平臺的一個原因吧。話說回來,從客戶的角度,微軟的開源為解決方案的技術選型提供了更為廣闊的選擇餘地,客戶的整套方案不需要像以前那樣,一個部分使用了微軟技術,就整個解決方案都要使用微軟技術(比如,選擇了.NET Framework,就需要執行Windows的伺服器;使用了Windows伺服器,LDAP就是Active Directory最合適;使用Entity Framework,就需要SQL Server做資料庫,客戶一想,我還有一大堆的服務程式都是執行於Linux的,憑什麼我的伺服器一定要選擇Windows?於是,客戶也不會選擇.NET Framework)。當然,這是另外的話題,在這裡我還是繼續介紹WeText服務端的跨平臺特性吧。

我在Ubuntu 14.04.4 LTS版本的Linux系統中成功安裝並執行了WeText的服務端,而且成功從Windows下的WeText.Web專案訪問這臺Linux伺服器並跑通了所有的業務邏輯。聽起來是不是很讓人興奮?現在,就請和我一起了解一下整個安裝和執行過程吧。

環境準備

首先,得要有一臺Ubuntu 14.04.4 LTS的機器(如果是其它系列的Linux,以下安裝過程會有些不同,請大家自行參考各種元件在相應版本的Linux下的安裝步驟進行安裝,但不會影響後續WeText的編譯和執行)。在準備完這臺機器之後,就可以開始一步步地準備環境了。

安裝Mono

在Linux系統中安裝Mono,可以參考http://www.mono-project.com/docs/compiling-mono/linux/。基本上有兩種方式:一種是直接從釋出版本進行編譯安裝,另一種是通過克隆程式碼庫然後編譯安裝。當然,無論哪種方式,在編譯之前,請先通過下面的命令確保所有所需的軟體包都已經正確安裝:

sudo apt-get install git autoconf libtool automake build-essential mono-devel gettext

我自己是通過下載Release Package完成安裝的,Mono所有的Release Package位於:http://download.mono-project.com/sources/mono/。直接選擇最新版本下載解壓即可。

解壓完成後,進入解壓後的目錄,依次執行下面的命令完成編譯安裝:

./configure --prefix=/usr/local
make
make install

第一條命令中的—prefix引數可以根據自己的情況設定。

安裝MongoDB

在WeText中,MongoDB被用作Event Store(事實上Event Sourcing暫時還未實現)。使用MongoDB的原因,是因為事件資料本身是非結構化的,而且MongoDB在replication方面有著很好的解決方案。安裝過程如下:

1. 為包管理系統匯入公鑰

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

2. 為MongoDB建立list檔案

這將為MongoDB在/etc/apt/sources.list.d目錄下建立mongodb-org-3.2.list檔案。

echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

3. 重新整理本地包資料庫

sudo apt-get update

4. 安裝最新版本的MongoDB

sudo apt-get install -y mongodb-org

5. 啟動MongoDB服務

sudo service mongod start

6. 直接執行mongo命令,檢查MongoDB是否已經正確安裝

如果需要更加詳細的安裝步驟,請直接參考官方文件,或者也可以上網搜尋相關的中文資料參考。注意:目前暫時建議整個安裝過程採用預設設定,因為MongoDB的配置目前是寫死在服務端程式碼中的(具體位置是:WeText.DomainRepositories專案下的WeTextMongoSetting.cs檔案中)。如果更改了MongoDB的配置,那麼也需要相應地更改這部分程式碼,然後重新編譯WeText服務端(本文後半部分會介紹編譯過程)。今後會將MongoDB的配置移到配置檔案中。

安裝RabbitMQ

1. 使用以下命令將RabbitMQ的APT Repository加到/etc/apt/sources.list.d目錄下

echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list

2. 將RabbitMQ的公鑰加入受信祕鑰列表中

wget -O- https://www.rabbitmq.com/rabbitmq-signing-key-public.asc | sudo apt-key add -

3. 重新整理本地包資料庫

sudo apt-get update

4. 安裝RabbitMQ

sudo apt-get install rabbitmq-server

如果需要更加詳細的安裝步驟,請直接參考官方文件

安裝MySQL

1. 重新整理本地包資料庫

sudo apt-get update

2. 安裝MySQL

sudo apt-get install mysql-server

3. 使用以下命令嘗試連線MySQL服務

mysql -u root -p

如果需要更加詳細的安裝步驟,請直接參考這篇文章

從原始碼編譯

1. 使用下面的git命令將WeText原始碼克隆到本地

git clone https://github.com/daxnet/we-text.git

2. 進入we-text\scripts目錄,執行mysql –u root –p命令啟動MySQL客戶端。並在MySQL中執行下面的命令,初始化WeText所需使用的查詢資料庫:

\. mysql_query_databases.sql

3. 注意:在Linux下的nuget.exe還是有些問題,在WeText下執行nuget.exe restore命令無法將所有的依賴庫下載下來(我還沒找到解決方案)。因此,只能在Windows中先使用Visual Studio 2015編譯WeText.sln,然後再將下載下來的packages目錄複製到Linux下we-text\src目錄下。可以通過Samba服務,或者使用FTP將packages目錄上傳到Linux系統中

4. 進入we-text\src目錄,使用下面的命令完成WeText服務端的編譯:

xbuild /p:TargetFrameworkVersion=v4.6.1 /p:Configuration=ServerDebug WeText.sln

5. 編譯完成後,會出現一些Assembly Binding的警告,請暫且忽略

執行WeText服務端

進入we-text\bin目錄,執行./WeText.Service.exe命令,啟動WeText服務端,將看到以下畫面:

image

在Windows中通過Visual Studio 2015開啟WeText專案,修改WeText.Web專案的web.config檔案,將下圖中的設定更改為Linux中的WeText服務端地址:

image

啟動WeText.Web專案,新建一個daxnet的使用者:

image

登入後點選選單欄的My Texts選單,建立一個新的Text:

image

現在,檢視Linux下的MongoDB資料庫:

image

檢視MySQL查詢資料庫:

image

檢視RabbitMQ訊息佇列:

image

OK,整個流程執行下來沒什麼問題。最後,只要在WeText.Service.exe的視窗中直接回車,即可退出服務端的執行(退出需要花幾秒鐘時間)。

總結

本文詳細介紹了在Linux環境中編譯執行WeText客戶端的方法,併成功走通了整個流程。正如前文所述,WeText還有很多需要改進的地方,我也會一步步對其進行改進調整,如果有新的心得體會,我也會繼續分享給大家。

相關文章