當前位置: 妍妍網 > 碼農

.NET 資料精選:架構篇

2024-03-19碼農

前言

.NET 6.0 已釋出,高效能雲原生開發框架。希望有更多的小夥伴加入大.NET陣營。這是本系列的第三篇文章:架構篇,喜歡的速度學起來。

本系列文章,主要分享一些.NET Core比較優秀的社群資料和微軟官方資料。我進行了知識點歸類,讓大家可以更清晰的學習.NET Core。

首先感謝資料原作者的貢獻。

第一篇:

介紹.NET歷史、開源之路、基礎、路由、依賴註入、HttpContext、cookie|session、HttpClient、gRPC、單元測試、釋出部署等等。

第二篇:

介紹.NET工程化、AOP、例外處理、緩存、日誌、響應最佳化、上傳下載、健康檢查、後台任務、認證和授權、安全性(Https、CORS、CSRF)、EF Core 等等

第三篇:.NET Core資料精選:架構篇

介紹.NET跨平台的包袱與演變、.NET執行機制、效能分析方案;架構相關知識(設計原則、設計模式、DDD、微服務、中台等);.NET相關的微服務開發框架、微服務技術、雲原生(docker、k8s)等

推薦資料: .NET開源github資源匯總

https://github.com/jasonhua95/awesome-dotnet-core

這是第三篇,知識點如圖:

深入.NET

1、.NET Core跨平台解讀

[.NET Core跨平台的奧秘上篇]:歷史的枷鎖

[.NET Core跨平台的奧秘中篇]:復用之殤

[.NET Core跨平台的奧秘下篇]:全新的布局(.NET Standard)

2、.NET Standard 與 .NET 5+

【譯】介紹 .NET Standard

.NET Standard Versions(版本對應圖)

[github]dotnet/standard

微軟停止更新.NET Standard,.NET 5 取而代之

選擇建議:

  1. 用於在.NET Framework 和所有其他平台之間共享程式碼,使用netstandard2.0

  2. 用於在Mono,Xamarin 和.NET Core 3.x 之間共享程式碼,使用netstandard2.1

  3. 向後共享程式碼,使用net5.0

.NET API 一覽表

3、執行機制

.NET 的執行模型(CoreCLR 執行模型和Native AOT執行模型)

200行程式碼,7個物件——讓你了解ASP.NET Core框架的本質(帶源碼)

(HttpContext,RequestDelegate,Middleware,ApplicationBuilder,Server,HttpListenerServer,WebHost)

ASP.NET Core 服務是如何啟動、配置並執行的(IWebHost、Create­DefaultBuilder)

深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll檔

補充:在vs中編譯core計畫時,在bin下面會生成deps.json記錄nuget包依賴關系,並不會把依賴的nuget包拷貝到bin資料夾下。但執行dotnet publish命令釋出core計畫時,會將依賴的nuget包拷貝到釋出目錄

.NET Core 執行時配置設定(小節包含幾篇文章,配置:依賴的包,載入路徑,網路設定、執行緒設定等)

使用Directory.Build.props 檔管理多個csproj計畫的配置

4、.NET Web 伺服器

ASP.NET Core web伺服器實作( kestrel&HTTP.sys )

為什麽Linux 上的Asp.NET 5 需要 Kestrel ?

ASP.NET Core 的Kestrel Web 伺服器

ASP.NET Core 的HTTP.sys Web 伺服器

5、效能分析方案

效能分析

使用MiniProfiler 分析ASP.NET Core 、EF Core 效能

使用 BenchmarkDotnet 測試程式碼效能

分析快照堆疊、執行緒資訊、異常資訊、記憶體資訊等

分析.net core在linux下記憶體占用過高問題(dotnet-counters,dotnet-dump)

如何排查.NET 記憶體泄漏(dotnet-counters,dotnet-dump)

Windbg程式偵錯系列(記憶體泄露、執行緒阻塞、高CPU等)

【一線碼農】Windbg分析案例

架構相關理論

1、設計理論

一句話總結軟體設計七大原則

一句話歸納23種設計模式

網站系統架構層次

The Clean Architecture(幹凈體系架構)

伺服端高並行分布式架構15次演進之路

API設計

四連問:API 介面應該如何設計?如何保證安全?如何簽名?如何防重?

API介面設計最佳實踐

系統架構設計:行程緩存和緩存服務,如何抉擇?

分布式之資料庫和緩存雙寫一致性方案解析

MySQL資料庫之互聯網常用架構方案

一文搞懂藍綠釋出、灰度釋出和捲動釋出

2、領域驅動設計(DDD)

領域驅動涉及的主要概念:領域、界限上下文、領域模型、統一建模語言(UML)、模組、實體、值物件、套用服務&領域服務、領域事件、聚合、聚合根、倉儲、工作單元(Uow)等等

一文理解DDD 領域驅動設計!

[聖傑]DDD理論學習系列——案例及目錄

DDD 領域驅動設計:貧血模型、充血模型的深入解讀

【微服務架構設計模式】讀書筆記:微服務架構中的業務邏輯設計

DDD中重要且難理解部份的摘抄:

  1. 領域:一個領域本質上可以理解為就是一個問題域,只要是同一個領域,那問題域就相同。所以,只要我們確定了系統所屬的領域,那這個系統的核心業務,即要解決的關鍵問題、問題的範圍邊界就基本確定了。

  2. 領域模型:就是將業務中涉及到的概念以物件導向的思想進行抽象,抽象出實體物件,確定實體所對應的方法和內容,以及實體之間的關系。然後將這些實體和實體之間的關系以某種形式(比如UML、圖形、程式碼、文字描述等)展現出來。

  3. 模組:

l 模組透過分解領域模型為不同的模組,以降低領域模型的復雜性,提高領域模型的可讀性。

l 模組的設計要符合高內聚低耦合的設計思想。

  1. 領域事件= 事件釋出+ 事件儲存+ 事件分發+ 事件處理

  2. 領域服務

l 領域服務是無狀態的,它存在的意義就是協調多個領域物件完成某個操作,所有的狀態還是都保存在相應的領域物件中。

l 領域服務還有一個很重要的功能就是可以避免領域邏輯泄露到套用層。因為如果沒有領域服務,那麽套用層會直接呼叫領域物件完成本該是屬於領域服務該做的操作,這樣一來,領域層可能會把一部份領域知識泄露到套用層。因為套用層需要了解每個領域物件的業務功能,具有哪些資訊,以及它可能會與哪些其他領域物件互動,怎麽互動等一系列領域知識。因此,引入領域服務可以有效的防治領域層的邏輯泄露到套用層。

  1. 聚合和聚合根

l 聚合的一些特點:

  1. 每個聚合有一個根和一個邊界,邊界定義了一個聚合內部有哪些實體或值物件,根是聚合內的某個實體;

  2. 聚合內實作事務一致性,聚合外實作最終一致性(使用領域事件進行事務拆分,實作最終一致性)。在一個事務中,只能建立或更新一個聚合。

  3. 聚合內部的物件之間可以相互參照,但是聚合外部如果要存取聚合內部的物件時,必須透過聚合根開始導航,絕對不能繞過聚合根直接存取聚合內的物件,也就是說聚合根是外部存取聚合的閘道器;

  4. 聚合內除根以外的其他實體的唯一標識都是本地標識,也就是只要在聚合內部保持唯一即可,因為它們總是從屬於這個聚合的;

  5. 基於聚合的以上概念,我們可以推論出從資料庫查詢時的單元也是以聚合為一個單元,也就是說我們不能直接查詢聚合內部的某個非根的物件;

  6. 使用小聚合(大聚合會影響效能;大聚合容易導致並行沖突;大聚合擴充套件性差)

  7. 聚合內部的物件可以保持對其他聚合根的參照;

  8. 刪除一個聚合根時必須同時刪除該聚合內的所有相關物件,因為他們都同屬於一個聚合,是一個完整的概念;

  9. 停下來重構模型。尋找模型中覺得有些疑問或者是蹩腳的地方,比如思考一些物件應該透過關聯導航獲得到還是應該從倉儲獲取?聚合設計的是否正確?考慮模型的效能怎樣,等等;

l 如何辨識聚合:

先從業務的角度深入思考,然後慢慢分析出有哪些物件是:

  1. 有獨立存在的意義,即它是不依賴於其他物件的存在它才有意義的;

  2. 可以被獨立存取的,還是必須透過某個其他物件導航得到的;

有分析報告顯示,通常在大部份領域模型中,有70%的聚合通常只有一個實體,即聚合根,該實體內部沒有包含其他實體,只包含一些值物件;另外30%的聚合中,基本上也只包含兩到三個實體。

l 如何辨識聚合根:

如果一個聚合只有一個實體,那麽這個實體就是聚合根;如果有多個實體,那麽我們可以思考聚合內哪個物件有獨立存在的意義並且可以和外部直接進行互動。

  1. 倉儲

l 倉儲裏面存放的物件一定是聚合,原因是領域模型中是以聚合的概念去劃分邊界的;聚合是我們更新物件的一個邊界,事實上我們把整個聚合看成是一個整體概念,要麽一起被取出來,要麽一起被刪除。我們永遠不會單獨對某個聚合內的子物件進行單獨查詢或做更新操作。因此,我們只對聚合設計倉儲

l 倉儲還有一個重要的特征就是分為倉儲定義部份和倉儲實作部份,在領域模型中我們定義倉儲的介面,而在基礎設施層實作具體的倉儲。這樣做的原因是:由於倉儲背後的實作都是在和資料庫打交道,但是我們又不希望客戶(如套用層)把重點放在如何從資料庫獲取數據的問題上,因為這樣做會導致客戶(套用層)程式碼很混亂,很可能會因此而忽略了領域模型的存在。

l 倉儲定義的介面要有具體領域意義,不能是一個模糊的通用的介面。通用介面會導致取數據邏輯泄露到套用層或領域層。

8、微服務

微服務介紹

微服務劃分的姿勢

分布式系統架構的冰與火

從亞馬遜的實踐,談分布式系統的難點

.NET 微服務:適用於容器化.NET 應用程式的體系結構- 電子書

9、中台

阿裏大中台小前台解讀

企業級中台建設

頭部電商的中台實踐血淚總結

.NET 微服務架構

1、ABP基礎開發框架

官網:https://cn.abp.io/

github:https://github.com/abpframework/abp

官方教程:https://docs.abp.io/zh-Hans/abp/latest

商業版demo:https://commercial.abp.io/demo

使用

get-started:https://www.abp.io/get-started

(使用Volo.Abp.Cli下載計畫有時會失敗,可以在get-started網站上直接建立計畫樣版)

基於abp vnext制作計畫腳手架

AbpHelper.CLI

使用ABPHelper自動生成程式碼 (CRUD演示)

CRUD演示

範例

Abp官方所有範例

Abp官方微服務解決方案範例

最佳實踐

跟著「土牛」學架構知識

[Abp官方]模組開發最佳實踐& 約定

基於ABP落地領域驅動設計-01.全景圖

基於ABP落地領域驅動設計-02.聚合和聚合根的最佳實踐和原則

基於ABP落地領域驅動設計-03.倉儲和規約最佳實踐和原則

基於ABP落地領域驅動設計-04.領域服務和套用服務的最佳實踐和原則

基於ABP落地領域驅動設計-05.實體建立和更新最佳實踐

基於ABP落地領域驅動設計-06.正確區分領域邏輯和套用邏輯

其他:

Abp官方(https://www.abp.io/get-started)有提供社群版前端客戶端:Razor Pages、Blazor、Angular、ReactNative。暫時沒有提供Vue前端客戶端。這邊給出幾個vue-admin的社群資源:

abp+vue-element-admin

abp+vue-vben-admin(vue3+typescript+ant design)

abp-vnext-pro + vben

樣版計畫圖:

計畫依賴圖:

因本人使用過ABP,所以文中以ABP基礎開發框架為例

在DotNet Core中還有很多其他的優秀基礎開發框架,如:WTM、Osharp、Furioin 等等

2、.NET 微服務相關的技術

API閘道器:Kong、Ocelot、Nginx

服務註冊與發現:Consul(Consul Tamplate+nginx)、etcd、ZooKeeper

身份認證中心:IdentityServer4

服務呼叫:WebAPI、gRPC

訊息事件匯流排:本地訊息匯流排(行程記憶體緩存)、分布式訊息匯流排(RabbitMQ、Kafka)

瞬態故障處理:Polly

分布式追蹤:SkyWalking、Cat、Zipkin、Elastc.APM

分布式系統監控:Prometheus、(App.Metrics+InfluxDB+Grafana)

分布式事務:CAP、MassTransit

分布式日誌:ExceptionLess、ELK

分布式緩存:StackExchange.Redis

分布式鎖:RedLock.NET

訊息佇列:RabbitMQ、Kafka

配置中心:Apollo

DevOps:Jenkins、Docker、K8S、GitLab-ci、Azure Pipelines

相關資料推薦

API閘道器

高效能微服務閘道器.NETCore客戶端Kong.Net開源釋出

Ocelot簡易教程(簡介、配置、負載、認證、限流、聚合等)

IdentityServer4 認證授權

[阮一峰]理解OAuth 2.0

OAuth2.0授權登入四種模式時序圖

IdentityServer4實作了OAuth和OpenId Connect

OAuth只負責Authorization(授權). 那麽誰來負責Authentication(認證)呢?那就是OpenId Connect, OpenId Connect是對OAuth的一種補充, 因為它能進行Authentication.

OAuth通常有以下幾種endpoint:authorize,token,revocation等

OpenId Connect 通常有以下幾種endpoints:userinfo,checksession,endsession,.well-known/openid-configuration,.well-known/jwks等

[曉晨Master]IdentityServer4 中文文件與實戰

Asp.Net Core 中IdentityServer4 授權原理及重新整理Token的套用

[免費視訊]IdentityServer4 教程視訊

分布式事務

聊聊分布式事務(ACID、CAP、BASE、2PC、TCC、本地訊息表(異步確保)、MQ 事務訊息)

Asp.Net Core&CAP實作分布式事務

Apollo

Apollo guthub:https://github.com/ctripcorp/apollo

Apollo官方Demo:http://106.54.227.205/(帳戶密碼是:apollo/admin)

監控

使用Elastic APM監控你的.NET Core套用

ASP.NET Core之跨平台的即時效能監控(App.Metrics+InfluxDB+Grafana)

其他

RabbitMQ 七種佇列模式套用場景案例分析(通俗易懂)

基於Redis的分布式鎖設計(RedLock.net)

套用範例:

eShopOnContainers計畫

[github]eShopOnContainers

[聖傑]eShopOnContainers 分析文章系列

[github]abp-samples/MicroserviceDemo計畫

雲原

雲原生是雲這種環境下的一種開發的理念、一種模式,無伺服器、微服務、容器、DevOps都是雲原生理念裏面的子集。

什麽是雲原生

雲是和本地相對的,傳統的套用必須跑在本地伺服器上,現在流行的套用都跑在雲端,雲包含了IaaS,、PaaS和SaaS。

原生就是土生土長的意思,我們在開始設計套用的時候就考慮到套用將來是執行雲環境裏面的,要充分利用雲資源的優點,比如️雲服務的彈性和分布式優勢。

可以簡單地把雲原生理解為:雲原生= 微服務+ DevOps + 容器化+ 持續交付

雲原生全景圖譜

雲原生全景圖詳解

進擊的.NET 在雲原生時代的蛻變

雲原生套用的12要素

給各種雲服務一個靈活度排序:IaaS(各種雲主機)> CaaS(Docker 等容器服務)> PaaS(BAE、SAE、GAE 等APP Engine)> FaaS > BaaS > SaaS(各種Web APP,如Google Doc)。(檢視更多=>)

1、Docker 與Kubernetes(K8S)

極簡Docker和Kubernetes發展史

Docker與k8s的恩怨情仇

Docker員工自述:我們為什麽「輸」給了Kubernetes?

Docker

Docker 常用命令(.NET Core範例)

K8S

kubernetes中文社群、中文文件

8 分鐘了解 Kubernetes

[Edison Zhou]ASP.NET Core on K8s 入門學習系列文章目錄

例項

如何使用vs將asp.net core計畫添加容器支持並釋出docker映像到私有dockerhub和添加k8s/helm管理

從零開始在Windows 上部署.NET Core 到 Kubernetes

2、自動化整合與部署

流程:編碼-> 構建-> 整合-> 測試-> 交付-> 部署

一文看懂持續部署按需釋出!DevOps部署和釋出方法大全

[CI&CD]jenkins自動化工具使用教程

持續整合(Continuous Integration)簡稱CI

持續交付(Continuous Delivery)簡稱CD

GitHub Actions

GitHub Actions 快速入門

兩種github action 打包.Net Core 計畫docker映像推播到阿裏雲映像倉庫

Azure Pipeline

使用Azure DevOps Pipeline實作.Net Core程式的CI

範例:WTM-pipelines

轉自:滴答的雨

連結:cnblogs.com/heyuquan/p/dotnet-architecture-learning-resource.html

- EOF -