項目地址 : https://github.com/kelin-xycs/Web-Business-Application-Solutionphp
你們好,這個項目的目的,是 爲 企業應用 + 互聯網商業應用 提供一個 開源 解決方案。html
這個項目 設計 爲 組件 方式。不搞大包大攬。按需引用 須要的模塊 就行,就像組件同樣。^ ^ 這樣避免了 侵入性,鐵板一塊,難理解,難維護。git
企業應用 + 互聯網商業應用,要 解決 的 第一個問題是 Web 大規模 使用。github
我簡單的畫了個 架構圖:docker
我原本畫了一個架構圖的,可是又不知道怎麼把圖片貼進來,因此就文字描述一下了。以下:數據庫
架構小程序
Webc#
緩存後端
數據庫centos
這個架構裏只有 水平伸縮。這樣比較簡單。當 訪問量 增大時,水平擴展 Web層,緩存層 就行。 數據庫的話,如今 分佈式數據庫 用的還不廣泛。對於 單主機 的 數據庫,擴展CPU 核心數,內存;使用SSD硬盤就行。 好比 SqlServer 2017,配置了 足夠的 CPU 核心數,內存,SSD,在 大數據量 高併發 時 的 表現很好。
緩存層 的 使用方法,可謂 各家各派,各類方法方式。^ ^ 個人想法比較簡單,就是 避免頻繁的對數據庫的讀寫。 具體的說,就是,在進行 業務運算和處理 時,把數據從數據庫讀取到 緩存,而後 運算處理。運算處理完成後,再把結果批量更新回數據庫。運算過程當中,對於數據的讀寫都是在緩存進行。 這樣能夠解決數據庫成爲瓶頸的問題。
這個架構,我把它叫作「3.5層架構」。由於 緩存層 算 0.5層 嘛。 ^ ^
上面是 架構。
下面咱們說說 部署。咱們但願作出一套 虛擬機(雲服務器) + 容器編排 + 負載均衡 + Redis 來構建 Web 集羣 的 解決方案。 有個網友提供了一套方案,能夠參考: centos 下docker 一鍵部署php和tomcat環境 https://github.com/kingkoo1985/docker_lnmtp
接下來是 運維。根據 DevOps 的 理論,我再發展一下,就是: 開發 = 運維 。你們都是 開發人員,只不過這段時間我作 開發,你作 運維;下個月 我作 運維,你作 開發。 對不對? ^ ^ 這樣就好玩了。
這套解決方案的 關鍵詞 是 架構 部署 運維。
其實我不太贊同 微服務。但 SOA 卻是可能成爲 趨勢。由於 平臺 與 平臺 之間的 交互 應該會是一個 趨勢。 微服務 的 第一個 課題 就是 實現 數據一致性。SOA 也須要 解決 這個問題。 但實際上,數據不一致 並不可怕,關鍵在於 清晰的 記錄Log,及 提示出來, 讓 用戶 和 各方 可以清楚的看到 這一筆交易 是 失敗 的,問題出在了哪裏,接下來要怎麼處理。 咱們爲此提供了一個 組件 SOALog。 SOALog 的功能就是 記錄 Log 到 數據庫 裏。 見 https://github.com/kelin-xycs/SOALog 。 因此,在 調用服務失敗 的時候,能夠用 SOALog 記錄 Log 到 數據庫 裏。 Log 記錄到 數據庫 的 優勢 是 便於 查詢 分析,還能夠用 報表 呈現出來。 報表 也能夠呈現給 用戶和相關各方 看,做爲問題處理追蹤 的 一個 報表。 總的來講,這是一種 鬆耦合 樂觀 的 數據一致性 解決方案。
在 服務 調用中,會 涉及 「熔斷」 「重試」 等概念。我寫了一個 熔斷 重試 的 例子,見 https://github.com/kelin-xycs/FusingAndReTrySample
這裏想表達的一些理念是:
少搞一點 封裝, 少搞一點 控制反轉(Ioc), 少搞一點 AOP, 少搞一些 「聲明式」。
不要隱藏太多代碼,讓 代碼 迴歸 代碼。
是 找回 80 年代 寫 Basic 的 那種感受 的 時候了。 ^ ^
負載均衡 方面,公有云可使用 雲 提供的 負載均衡 服務,好比 阿里雲 的 彈性計算 負載均衡。 企業內部私有云,可使用 Nginx。Nginx 是一個 反向代理服務器。能夠實現 基於 Http 轉發 的 負載均衡。 是一個 使用普遍,高效,穩定 的 負載均衡 服務器。 聽說 使用 Nginx 能夠 支持 每分鐘 1 萬筆 的 交易量。固然,也可能更多。 ^ ^
參考上文。 我以爲,咱們能夠用手頭的一些技術,來 搭建 可靠的 「高併發 分佈式 業務系統」 架構。 用於 企業應用 + 互聯網應用。 手頭 的 技術, 包括 RPC MQ 緩存(Redis) 網關。 能夠 經過 集羣 (負載均衡) 來 實現 水平伸縮, 以 知足 吞吐量 的 需求。 同步 服務 使用 RPC, 異步 服務 使用 MQ。
這個 架構 到 目前爲止 看起來 很美好, 但 有一個 技術 難點 或者說 重點 是 熱擴展。 實際上, 應用層 很 容易 實現 熱擴展。 好比 , Http 可使用 Nginx, MQ 可使用 RabbitMQ 集羣, 緩存 可使用 Redis 集羣。 而 網絡層 的 熱擴展 則 須要 一些 底層 的 技術 ,,或者說 專業 的 產品。 好比 F5 HAProxy LVS , 或者 阿里雲 彈性計算。 不過 剛剛 看了一下資料, Nginx 也 支持 http tcp udp 的 負載均衡 了。 熱擴展 的 問題 解決 了, 基本上 就 沒什麼 問題 了。 接下來 就是 整個架構 運做 流程 的 監控, 用 上文 《聚合支付系統演講》 裏 文章 最後的話說, 就是 「全鏈路監控」。 這個 部分 說白了 其實 就是 記錄 Log 到 數據庫,用 NLog 能夠 實現。 如今有一款 性能監控 工具 Apache Sky Walking, 聽說 「開箱即用」, 提供了 儀表盤,各類報表, 能夠 來 分析 和 呈現 Log, 也就是 整個 系統 運做流程 監控。 要 使用 Apache Sky Walk 可能 要 實現 它 的 「探針」, 或者 使用 它 現成 的 「探針」,,,這跟 NLog 原理上 也是同樣的。
O 了。
其實 我 還有 一套 架構, 叫作 「 1 Binary 」 架構。 1 Binary 開箱即用。
怎麼實現 擴展 呢 ? n Deploy
合起來 就是 1 Binary + n Deploy 。
頂多 再 加 一個 緩存層,
O 了 。
關於 ORM 和 數據操做, 我 比較 喜歡 一個 超輕量 的 Entity 庫(Active Record) + Sql 查詢 DataTable 。
一個 超輕量 的 Entity 庫, 只須要 實現 將 單筆資料 映射 到 Entity 對象, 並 實現 單筆資料 的 增刪改查 就行。 Sql 查詢 DataTable 的 方式 會 很 靈活 高效, 直觀, 簡單明瞭。 ORM 的 緩存, 在 集羣(負載均衡) 的 狀況 下, 會 有點 雞肋, 由於 服務器 的 緩存 之間 不能 達到 數據一致。 因此,在 集羣(負載均衡) 的 狀況 下, 緩存 一般 會採用 分佈式緩存,如 Redis。 LinQ 的 數據查詢篩選 功能, 能夠說是 好東東, 在 業務邏輯 裏, 有時候 須要對 少許資料 做 distinct group by order by sum 等 時, 會 很方便, 本身 寫 循環 會 比較 麻煩。 但 LinQ 對於 2 個 超過 1000筆 資料 的 集合 join 時, 性能 會 變慢, 由於 LinQ 沒有 索引 的 觀念。 因此,對於 資料量 比較 大的 join, 或者說 廣義 的 數據關係運算 ,, 交給 數據庫 來 完成, 會比較好。 由於 這是 數據庫 的 專業。 如今 硬盤 都是 SSD , 不用 怕 傷 硬盤 嘛 。 ^^
在 索引 和 臨時索引 的 機制 下, 數據庫 能夠 輕鬆 的 完成 數據 查詢 任務。 實際上, 真正 形成 數據庫 負擔 和 瓶頸 的, 是 大數據量 表 頻繁 Insert 索引排序 。
排序 會 形成 很大 的 時間複雜度。 在 SSD 硬盤 普及 的 今天, 查詢 是 健康操做。 說到這裏, 我 產生 了 一個 小想法, 我 打算 寫一個 對 DataTable 使用 Sql 來 進行 數據 查詢 的 小 庫 。 主要 是 支持 distinct goup by order by sum 。 還有 就是 上面說的 一個超輕量 的 Entity 庫。
解決方案組件 和 參考資料 以下:
解決方案組件:
WebApiClient ,一款基於HttpClient封裝,只須要定義c#接口並修飾相關特性,便可異步調用遠程http接口的客戶端庫
https://github.com/dotnetcore/WebApiClient
MultiThreadFileScanner,一個 多線程 檢索 文件內容 的 小程序
https://github.com/kelin-xycs/MultiThreadFileScanner
SOALog,爲 SOA 架構 提供一種 鬆耦合 樂觀 的 數據一致性 解決方案,說白了這個組件的功能就是 記錄 Log 到 數據庫 裏,詳細介紹 見 上文。
https://github.com/kelin-xycs/SOALoghttps://github.com/kelin-xycs/SOALog
FusingAndReTrySample, 熔斷 重試 的 例子。
https://github.com/kelin-xycs/FusingAndReTrySample
阿里雲彈性計算
https://www.aliyun.com/?utm_medium=text&utm_source=bdbrand&utm_campaign=bdbrand&utm_content=se_32492
centos 下docker 一鍵部署php和tomcat環境
https://github.com/kingkoo1985/docker_lnmtp
參考資料:
《後端架構師技術圖譜》
https://github.com/xingshaocheng/architect-awesome
日訪問量百億級的應用如何作緩存架構設計
DevOps老司機如何兼顧運維與開發?(附腦圖)
螞蟻金服CTO程立:金融級分佈式交易的技術路徑
Oracle, Red Hat等大廠近期密集發佈,增強支持Kubernetes
Netty——基本使用介紹
http://www.javashuo.com/article/p-zdquyrbj-ka.html
小白科普:Netty有什麼用?
http://www.javashuo.com/article/p-dadjaojn-hv.html
Cef ,CEF:給客戶端內嵌一個Chrome吧
https://www.itsvse.com/thread-4102-1-1.html
Polly.net 待更新
log4net Nlog
http://www.javashuo.com/article/p-fcrbgana-mk.html https://blog.csdn.net/lx520aa/article/details/77950057http://www.cnblogs.com/Terrylee/archive/2006/12/03/opensource_framework_and_resource_recommendation_Log.html
基於.NET Core 2.0 開發的跨平臺支付SDK集。目前支持:支付寶(Alipay)、微信支付(WeChatPay)、QQ錢包(QPay)、京東支付(JDPay)、連連支付(LianLianPay)、銀聯支付(UnionPay)
https://github.com/Essensoft/Payment
支付寶(Alipay)服務端SDK,採用.NET Standard 2.0,支持.NET Core 2.0,與官方SDK接口徹底相同。徹底能夠按照官方文檔進行開發。除了支持支付之外,官方SDK支持的功能本SDK所有支持,好比生活號、服務窗、行業合做等,且用法幾乎同樣,代碼均可參考官方文檔代碼。
https://github.com/dotnetcore/Alipay.AopSdk.Core
以後會慢慢更新。 ^ ^