序:一年多沒更新博客園的內(nèi)容了,core已經(jīng)發(fā)生了翻天覆地的變化,想起2014年這時(shí)候,我就開始了從當(dāng)時(shí)還叫k的那套preview都不如的vnext搭建這套系統(tǒng),陸陸續(xù)續(xù)它每一次升級(jí),我也相應(yīng)地折騰,大約4個(gè)月前,我開始把生產(chǎn)環(huán)境的一部分從 windows server 遷移到 centos 7 上,觀察了幾個(gè)月,覺得可以全面遷移了,于是總結(jié)了折騰的路上幾點(diǎn)經(jīng)驗(yàn),與大家共勉。雖說我今天早已不是全職程序員,但是這套系統(tǒng)在我有空的時(shí)候總會(huì)維護(hù)與更新,它的運(yùn)作與我目前的工作相輔相成,并且會(huì)一直更新下去。
這系統(tǒng)干什么的及地址就不說了,免得人家說我這不是碼農(nóng)的碼農(nóng)還賴在博客園發(fā)軟文。
為什么要遷移,江湖上傳說windows server的穩(wěn)定性不如某某某,這類議題與八卦新聞沒兩樣,不談,如果windows的價(jià)錢能夠和linux相同或者差異不至于那么大,我才懶得換,因?yàn)楦F,這才是重點(diǎn)。
涉及IO路徑拼接,一定要Path.Combine, 反正我自己眼力比較差,手工拼接的話,有時(shí)候多一個(gè)或少一個(gè)斜杠,或者斜杠方向反了,Linux系統(tǒng)都會(huì)出錯(cuò),搞半天不知道錯(cuò)在哪,如果大小寫都搞錯(cuò)卻沒注意或者一時(shí)不知的話,神仙都救不了。
注意用System.Environment.NewLine代替硬編碼的換行符,String.Empty代替"",這兩個(gè)看不見的東西,發(fā)作的時(shí)候喝腦白金都沒用。
而core在初始化的時(shí)候,會(huì)遍歷wwwroot文件夾包含的所有內(nèi)容,在windows中無所謂你文件夾怎么命名,在中文centos也無所謂你文件夾怎么命名。但是,如果你的生產(chǎn)服務(wù)器是英文系統(tǒng),恰好在wwwroot中有中文文件夾的話,你都不知道為什么會(huì)全局報(bào)錯(cuò)。關(guān)于中文文件夾(在某些時(shí)刻會(huì)演變?yōu)閬y碼文件夾),我也不知哪里來的,有些客戶端編輯器組件,就是包含了非英文的文件夾。所以搭建虛擬機(jī)測(cè)試環(huán)境的時(shí)候,guest系統(tǒng)需要安裝英文版本來驗(yàn)證。
newtonsoft的json在反序列化枚舉類型的時(shí)候,得到的是名,微軟自家的json在反序列化枚舉的時(shí)候,得到的是值,雖然可以通過特性來定義,但是本人對(duì)特性相當(dāng)反感,全套代碼不會(huì)用也不可能會(huì)用,所以有時(shí)候需要用class來代替enum。
Microsoft.AspNetCore.NodeServices 是個(gè)好東西,就簡(jiǎn)單來說,正則表達(dá)式驗(yàn)證庫(kù),只寫一次,客戶端和服務(wù)端都可以共用。
Program.Main方法里,可以建立后臺(tái)線程,里面放一個(gè)全局靜態(tài)的ConcurrentQueue<Action>,while(true)定時(shí)監(jiān)視它,今天我們編寫的是進(jìn)程級(jí)的asp.net,你可以讓它做很多IIS做不到的真正異步,比如說記錄某些日志,扔action進(jìn)去就是了,不必等待。
事情還可以做得更絕一些:開辟新進(jìn)程,把代價(jià)高昂的、不確定是否會(huì)出錯(cuò)的、卻需要立即清理內(nèi)存的操作丟給它,操作完了自動(dòng)關(guān)閉,在這一層面上,你可以藐視.net的垃圾回收。
如果你實(shí)在玩不來gulp也沒關(guān)系,裝個(gè)BundlerMinifier就行了,右鍵選幾個(gè)js后自動(dòng)壓縮
能用PocoController的時(shí)候,盡量用,比如說某些頻繁的API,它的資源占用最小。
為HttpClient建立池,static ConcurrentQueue<HttpClient>,兩三個(gè)就夠了,一般不會(huì)出錯(cuò),但是誰也不能保證網(wǎng)絡(luò)請(qǐng)求,錯(cuò)了一個(gè)就讓下一個(gè)來代替,然后把出錯(cuò)的扔到上面的ConcurrentQueue<Action>中讓它愛什么時(shí)候銷毀什么時(shí)候銷毀。
文件級(jí)數(shù)據(jù)庫(kù),比如說SQLite,也需要ConcurrentQueue<Action>來封裝寫入邏輯,絕對(duì)的保證同一時(shí)刻只有一個(gè)線程寫