微服務知識講解
微服務知識講解
微服務
一、劃分
- 根據耦合度低的功能服務進行劃分。
治理
- 單體轉微服務
一開始是做ERP的項目使用的是單體應用,后來積累了一定的行業經驗轉做SAAS產品,因為要考慮到高可用和靈活性所以轉做微服務架構。
- 主要內容
Consul服務注冊與發現,Kong網關反向代理,Apollo分布式配置中心,SkyWalking鏈路追蹤(主要是檢測服務間相互調用時的異常和性能問題)。
- 讀寫分離的好處
防止高并發、高可用寫服務報錯不會影響讀服務、提高性能讀數據庫加索引不會 影響寫數據庫
- 防止高并發:讀寫分離可以更好地應對高并發的情況。寫操作通常比讀操作更消耗資源,將它們分開可以防止讀操作被寫操作阻塞。
- 高可用:如果寫服務出現問題,不會影響讀服務,這樣可以確保讀操作的高可用性。
- 提高性能:讀數據庫可以進行特定的優化(如添加索引)來提高查詢性能,而不會影響寫數據庫的性能。
通信
- HttpClint進行服務間的接口相互調用。
- RabbitMQ:是一種消息機制,最大的優點就是有順序,我們在把數據庫的數據更新到redis的過程中,redis有可能會引發異常,如果異常的話,這時候我們消息隊列就會把兩者之間的操作先記錄在消息隊列中,等到redis恢復正常的時候,再繼續執行這些操作。
部署
自動化部署Azure DevOps通過Docker進行部署到linux云服務器上。
Docker基礎命令:
docker run: 用于運行一個容器。
docker ps: 列出所有正在運行的容器。-a: 列出所有容器,包括停止的容器。
docker stop: 停止一個或多個正在運行的容器。
docker rm: 刪除一個或多個容器。
docker images: 列出本地的所有 Docker 鏡像。
docker rmi: 刪除一個或多個 Docker 鏡像。
docker pull: 從 Docker Hub 或其他注冊中心拉取一個鏡像或倉庫。
docker build: 使用 Dockerfile 構建一個鏡像。
docker exec: 在運行的容器中執行命令。
.Net服務通過Docker發布的過程:
先在服務中創建Dockerfile的文件。
然后構建Docker鏡像
運行Docker容器
設計模式
創建型模式:
單例模式、工廠方法模式、抽象工廠模式、建造者模式和原型模式
結構型模式:
適配器模式、橋接模式、組合模式、裝飾模式、外觀模式、享元模式和代理模式
行為型模式:
責任鏈模式、命令模式、解釋器模式、迭代器模式、中介者模式、備忘錄模式、觀察 者模式、狀態模式、策略模式、模板方法模式和訪問者模式
常用的設計模式以及用法:
單例模式:優點:確保一個類只有一個實例,并提供一個全局訪問點。 缺點:可能導 致全局變量的濫用,增加了代碼的耦合度。 適用場景:需要確保只有一個實例的 場景,如線程池、數據庫連接池等(數據連接對象)。通常使用靜態來實現。
懶漢模式:在第一次獲取實例時進行初始化。
餓漢模式:在類加載時就完成了初始化。
工廠方法模式:優點:將對象的創建與使用分離開,隱藏了對象的創建細節。 缺點: 增加了系統的復雜度。 適用場景:需要根據條件創建不同具體對象的場景。 簡 單工廠:對象轉移.
中介者模式:優點:將對象之間的交互封裝到中介者對象中,減少對象之間的直接通 信,降低了耦合度。 缺點:增加了中介者對象的復雜性。 適用場景:當多個對 象之間存在復雜的交互關系時,可以引入中介者模式來簡化交互。使用MediatR 實現中介者
授權中心
單體應用
- 服務端session生成唯一標識符。
- 客戶端獲取存到cookie。
- 客戶端訪問服務端通過生成的唯一標識符進行訪問。
微服務架構
- 通過JWT進行服務之間的授權。
- 頒發Token傳給前端。
- 前端獲取到Token存入攔截器中。
- 前端訪問后端通過攔截器攜帶Token訪問進行權限訪問。
- JWT分為頭部載荷標簽,頭部存放加密算法,載荷存放用戶唯一標識符,標簽存放算法標識符和私鑰主要是防止篡改。
- 如果驗證不通過就會報錯401。
- 把生成的Token存到Redis中如果檢測到用戶還在使用并且Token快過期那就通過方法把這個Token進行延時。
- 延時策略,把token存到Redis中通過方法判斷用戶是否正在操作如果正在操作就把該token進行對應的延時。
- 前端通過(咯扣死道瑞)存入攔截器的Hand中,雙token機制,登錄時生成兩個token當正在使用的token時間還剩5分鐘的時候檢測到服務正在使用,備用token就會變成主token同時會再次生成一個備用token。
鑒權
表結構
用戶、角色、菜單、功能、用戶角色、角色菜單、菜單功能。
基于內存數據庫Redis。
策略授權:后臺根據角色進行策略授權。
具體業務
主要就是通過角色進行菜單功能劃分。
保證一致性
rabbitMQ消息隊列有序的把操作暫存等數據庫恢復再執行對應的操作執行完后移除消息隊列中的操作也就是消息補償機制。
日志
ES存儲
LoginSight分析
kibana查日志
我們日志是記錄在一張單獨的表中的,通過Kibana來進行日志的查詢。
數據庫性能分析
數據量大
加索引:
- 索引適用于什么場景?
高頻訪問的字段。
條件多的字段。
數據重復率低的字段。
- 如果有多個字段需要加索引怎么辦?
加聯合索引。
聯合索引遵循最左匹配原則篩選匹配的字段數據。
- 如何檢查索引是否命中?
使用EXPLAIN。
- 那些字段可能會影響索引命中?
or、not in、in
- 怎么查找需要優化的表?
通過SqlProfiler找到具體是那張表影響了查詢的效率
計算量大
寬表:
優點:減少了計算的過程優化性能。
缺點:犧牲時效性因為它是在前一天晚上用定時任務進行的統一計算并存入表中。
讀寫分離數據庫集群(AlwaysOn)
我們使用的是一主多從的模式,主數據庫是寫操作,從數據庫是讀,我們的數據一致性是它自帶的強一致性因為數據的一致性是最主要的所以用的是同步復制。
分布式
分布式鎖
分布式事務
CAP.Net+rabbitMQ
分布式緩存
Redis集群。
依賴注入
解耦
依賴注入是一種設計模式,控制反轉是具體的實現。
通過在program中配置服務容器,在要使用的類的構造函數中直接引用,然后就可以使用了。
單例:它只創建一個對象然后每次復用。
瞬態:每一次創建都是一個新的對象。
作用域:在一個請求的范圍內它就是一個新的對象。
.Net Core中一次請求的過程
當請求發起的時候先進入管道就是builder,通過use把中間件掛載到管道中app.use,app.run執行掛載的中間件,執行順序就是use的順序根據use順序進行依次執行,然后是授權過濾器,然后就是根據路由找到控制器和控制器中的方法,然后是結果過濾器,最后動作結束。
應用場景
Redis:緩存租戶的組織信息、權限信息,羊場首頁的生產提示信息。
RabbitMQ:Redis和Db之間數據同步做消息補償,分布式事務CAP.Net+rabbit。

浙公網安備 33010602011771號