標籤:

微軟.NET年芳15:我在Azure上搭建Photon伺服器(C#.NET)

網上火熱的「微軟.NET年芳15」文章,我也得寫點什麼嘛,畢竟我還是現任的微軟MVP。

摘錄網上的「.NET 15周年」信息如下:

微軟的 .NET 框架本周迎來了 15 歲生日。.NET 的第一個版本在 2002 年 2 月 13 日作為的 Visual Studio.NET 的一部分首次公開亮相。過去 15 年,.NET 框架從一個流行的閉源軟體開發平台,變成了一個開源的跨平台開發工具,微軟是在 2014 年 11 月 12 日宣布開源 .NET,支持競爭對手 Linux 和 OS X 的平台。微軟稱,Visual Studio 2017 將於 2017 年 3 月 7 日發布,而 Visual Studio 也迎來了 20 歲生日,開源的 .NET Core 也將發布 2.0版本。

我梳理了一下目前的.NET技術棧: 業務是基於Unity3D(跨平台遊戲開發引擎),開發AR、VR 應用; 絕大部分項目採用單機版,使用的編程語言是C#(Mono.NET),不過最近交流的AR幾個業務,明顯用戶已經不太滿足單機版,有更多的需求需要用到聯網的伺服器功能,故技術選型就勢在必行了:也算是未雨綢繆吧。

技術棧選型

我的技術選型有2點原則

  1. 成熟,有助於提高開發效率
  2. 人多,有坑大家一起填

這2點原則是基於第一次創業失敗的經驗總結。約在3年前吧,剛開始創業的時候,特別排斥C#.NET技術(互聯網創業,還用C#,說出去都不好意思啊),雖然用的是Unity3D遊戲引擎(C#),但是伺服器選擇卻是非.NET傾向的。 那個時候對比了多種技術棧:

  • PHP遊戲伺服器
  • Node.js遊戲伺服器
  • C++遊戲伺服器
  • JAVA遊戲伺服器

權衡再三選擇是Java,採用的是SmartFoxServer商用伺服器框架,JAVA和C#非常類似、學習成本低一些。

種種原因,後來呢,第一次創業失敗了,我的反思是「創業成功大部分原因是CEO的引導有方,創業失敗大部分原因是CTO的選擇失誤導致」。

當時我沒有考慮到成本意識、對一個5人研發團隊,C#、Java並行的溝通風險有多大:

如果當時客戶端是C#技術棧、伺服器端也是C#技術棧,則可以從5人技術團隊裁掉1人,節約20%人力成本,而且減少溝通後可以提高30%的開發效率,進而有效的推動產品快速撲向市場的速度,可惜這個是「事後諸葛亮」。

這個「事後諸葛亮」,我一直如噎在喉.

不過去年在一次微軟技術峰會,看到網易案例的演講,我的眼睛亮了起來:「微軟技術大神徐玉濤Tory做的分享—網易《絕代雙驕》將遊戲後端從Java轉為新一代.NET Core,研發效率提升20%,伺服器成本節省50%」–在線視頻為證。

故對選擇一款C#的伺服器,以打通AR、VR客戶端、伺服器端,提高開發效率,生產力加速,我個人非常期待

Photon商用成熟C# (Mono.NET)ASP.NET Core開源 2.0還未發布.NET CoreUnity NetworkUnity自帶區域網C# (Mono.NET)

有SmartFoxServer的實踐經驗,故雷同的商用伺服器Photon我本次做了專門的實踐.

Photon支持3種類型伺服器

  • LoadBalancing: 負載均衡伺服器
  • MMO: 大型MMO網遊伺服器
  • Lite: 大廳、房間類型伺服器 (相對簡單一些)

Photon授權策略:免費版100個CCU (對於絕大部分AR、VR項目足以了); 商用版3500美金不限制CCU (約2.5萬人民幣)。

雲伺服器選型

我的選型原則也就2點:

  1. 速度:國內訪問速度快、快、快!
  2. 便宜:方便我們這種初創型公司節約不必要的成本

雖然同樣是世紀互聯在運營,但是早期的AZure在我心目中,網速那是非常非常的慢、價格也是高高在上(和國內的阿里、百度等雲比起來,毫無優勢可言),故原來使用過阿里雲、七牛雲,國際版高大上的AZure和AWS都未曾考慮過。

但是呢,微軟MVP內部微信群、郵件組,AZure的討論還是很多的,尤其是「自2017年2月1日起,Azure虛擬機價格大幅下調,最高降價幅度高達60%!」這則消息討論了好幾天,我也漸漸回頭持續關注AZure。

通過信息搜集,我了解的AZure信息碎片如下:

Windows Azure在北京、上海部署有伺服器

中國的AZure是個」國內版本」–和國際版AZure採用物理隔離方案

MySQL也是比較符合目前國內接地氣的方案;

AZure新的特效,國際版和國內版部署時間約差不多是3個月至半年。

azure.cn/ 是國內版本的網站

在Azure上搭建Photon伺服器(C#.NET)

未來AR產品軟體框架是這樣的,伺服器端需要搭建遊戲邏輯Photon、以及資源更新AssetBundle–更新資源。MySQL目前是國內很多公司的標配–社區版免費。

Photon運行方式很簡單,選擇伺服器實例,啟動應用即可,符合GUI操作習慣。

AZure虛擬機,提供了C盤,直接把需要的軟體和數據,通過遠程桌面拷貝過去即可,windows Server 2012英文系統,還是挺方便的。

幾個有用的小技巧:

  • TT模板:database first–自動生成模型代碼

原創文章來源: 使用T4模板生成MySql資料庫實體類

注意在VS2015下,需要把.ttinclude後綴修改為.tt才可以。 同時,需要修改 資料庫連接為你自己的 9 var connectionString = @"server=127.0.0.1;uid=root;pwd=12345678;charset=utf8;";

AZure開5505 UDP埠

  • 前端、後端C#鏈接類快捷方式:節約成本的王道

即,直接可以實現前段和後端復用模型實體代碼、傳遞的Code枚舉代碼,以減少文檔重複工作量。

以關鍵的OperationCode為例,如果前端是C#、後端是Java,則無法做到代碼級別復用,即需要寫文檔來約束。而相同的C#代碼後,注釋好.cs文件,前端和後端是同樣的代碼,則溝通起來暢快了很多。

public enum MyOperationCodes : byte

{

/// <summary>

/// LoginOperation

/// </summary>

LoginOperation = 100,

/// <summary>

/// EchoOperation

/// </summary>

EchoOperation = 101,

/// <summary>

/// GameOperation

/// </summary>

GameOperation = 102,

/// <summary>

/// ChatOperation

/// </summary>

ChatOperation = 103,

/// <summary>

/// ChatOperation

/// </summary>

CCUOperation = 104,

}

  • MySQL ORM (Dapper框架):

我選擇了輕量級、火熱的Dapper(stackoverflow網站就用它來做ORM),而且開源。

參考:dapper操作連接mysql開發最完整實例總結使用SQL部分代碼如下:

Db aa = DbInit();

var a3 = aa.Query<device>("select * from device where uuid=@uuid", new { uuid = "aabb636238694579824398" });

device dv = new device

{

UUID = "aabb" + DateTime.Now.Ticks.ToString(),

DeviceModel = "IOS",

DeviceName = "Iphone 5s",

RegisterDate = DateTime.Now.AddDays(-1),

UpdateDate = DateTime.Now,

TokenID = DateTime.Now.Ticks.ToString()

};

long ret = aa.Devices.InsertOrUpdate(dv);

var a1 = aa.Devices.All();

  • Json序列化工具:newtonsoft

本來Unity5.3已結自帶了Json序列化API,但是有bug,Json序列化可能為空,就選擇了」老朋友」newtonSoft.dll了。

  • AZure開通埠

應用跑起來後,埠一直不通,需要AZure開通埠–首先在Windows Server裡面開通埠(TCPUDP),然後再AZure裡面開通:網路介面–網路安全組–入站安全規則、出站安全規則。

APK Demo下載: https://www.pgyer.com/ 搭建Photon伺服器(C#.NET)

PhotonLab 源碼:git.oschina.net/xifarm/

參考

  1. 時間飛快–連微軟官方都開源了208個源碼庫
  2. 《歲月在挑燈夜戰中走過:親歷的軟體框架 》
  3. 《我的微軟.net演進路線圖》
  4. 《榮獲2015微軟.NET MVP稱號!》
  5. 《寫在.NET 15周年之際——致那些仍然愛著.NET的中國程序員們 來自微軟MVP Tony Qu微信
  6. 《.NET 十五歲,談談我眼中的.NET 來自微軟MVP 張善友的博客》

推薦閱讀:

TAG:微軟Microsoft |