32.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--財務服務--賬本與預算

在我們的孢子記賬應用中,賬本是用于記錄每一筆收支流水的核心模塊。通過賬本,我們可以清晰地追蹤資金的流入與流出,進行數據統計和分析,為后續的報表生成和決策支持提供基礎數據。預算模塊則是用于設置和管理預算的功能,幫助用戶控制支出,避免超支。賬本和預算模塊的實現對于整個記賬應用至關重要,因此在微服務中,我們需要對這兩個模塊進行詳細的設計和實現。

一、小修改

與收支分類模塊的功能類似,賬本模塊和預算模塊就目前來看微服務和單體應用的功能代碼差異不大,賬本模塊一共包含四個功能:創建賬本、刪除賬本、更新賬本以及分頁查詢賬本列表,預算模塊一共包含五個功能:創建預算、刪除預算、更新預算、分頁查詢預算、以及查詢預算詳情。

以賬本模塊為例,我們從單體應用分支中將與賬本模塊相關的代碼復制到當前我們的微服務分支中。然后,我們調整Controller以及Action的路由地址,使其符合標準的restful風格。并且Controller 將不再繼承BaseController,而是直接繼承ASP.NET Core的ControllerBase,這是因為BaseController的功能,在我們當前的微服務中已經通過中間件的形式實現了,而且還更加的通用。以下代碼是修改后的賬本模塊的Controller代碼:

// more code .../// <summary>
/// 賬本接口
/// </summary>
[Route("/api/account-books")]
[ApiController]
public class AccountBookController : ControllerBase
{// more code .../// <summary>/// 創建賬本/// </summary>/// <param name="request">賬本請求</param>/// <returns>返回新增賬本id</returns>[HttpPost]public ActionResult<long> CreateAccountBook([FromBody] AccountBookAddRequest request){// more code ...}/// <summary>/// 刪除賬本/// </summary>/// <param name="id">賬本ID</param>/// <returns>返回刪除結果</returns>[HttpDelete("{id}")]public ActionResult<bool> DeleteAccountBook([FromRoute] long id){// more code ...}/// <summary>/// 更新賬本/// </summary>/// <param name="id">賬本ID</param>/// <param name="request">賬本修改請求</param>/// <returns>返回修改結果</returns>[HttpPut("{id}")]public ActionResult<bool> UpdateAccountBook([FromRoute] long id, [FromBody] AccountBookEditeRequest request){// more code ...}/// <summary>/// 分頁查詢賬本列表/// </summary>/// <param name="page">頁碼</param>/// <param name="size">每頁數量</param>/// <returns>返回賬本列表</returns>[HttpGet]public ActionResult<PageResponse<AccountBookResponse>> GetAccountBooks([FromQuery] int page = 1,[FromQuery] int size = 10){// more code ...}
}

在上面的代碼中,我們屏蔽掉了不變的代碼,只保留了與路由相關的部分。可以看到,我們將Controller的路由地址修改為/api/account-books,并且每個Action的路由地址也進行了相應的調整,使其符合RESTful風格。同樣,其他微服務的功能模塊的Controller以及Action的路由地址同樣也要修改成符合restful風格的。我們還將在Action里Mapper數據轉換的代碼遷移到了Service層中,這樣可以使Controller更加簡潔,并且符合單一職責原則。

對于Server和Server的實現,我們只需要將原本在Action中的Mapper數據轉換的代碼放在Server中即可,其他的代碼暫時不需要進行修改,因為它們的功能和單體應用中的實現基本一致。我們只需要確保在微服務中能夠正確調用這些服務即可。

我們在后續的單體轉微服務的章節中,不會再詳細介紹每個模塊的代碼實現,而是給出需要修改的部分的代碼,這是因為目前我們所做的只是將單體應用改為微服務應用,并且只作一些小的修改,增加一些小的功能,而這些修改的代碼量并不大,且與單體應用中的實現非常相似。因此,我們只需要關注修改的部分即可。

Tip:預算模塊的微服務化改造,我希望大家模仿賬本模塊微服務化改造的思路自己動手實現,遇到問題可以參考賬本模塊的實現,或者在評論區留言,我會盡快回復。

二、總結

這篇文章很短,主要是對賬本和預算模塊的微服務化改造進行了簡單的介紹。我們通過將單體應用中的賬本和預算模塊的代碼遷移到微服務中,并進行一些小的修改,使其符合RESTful風格,從而實現了微服務化。通過這種方式,我們可以更好地組織代碼,提高代碼的可維護性和可擴展性。

在后續的章節中,我們將繼續對剩余模塊進行微服務化改造,并逐步完善我們的孢子記賬應用。微服務化的過程雖然需要一些時間和精力,但它將為我們帶來更好的架構和更高的靈活性,使我們能夠更好地應對未來的需求變化和業務擴展。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94192.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94192.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模型預估打分對運籌跟蹤的影響

在uplift建模中&#xff0c;模型離線指標(QINI、AUUC)提升并不意味著在線A/B實驗的收益&#xff0c;因為在線運籌還需要λ\lambdaλ約束。如果模型打分不滿足單調增且roi邊際遞減&#xff0c;那么λ\lambdaλ運籌求解會非常不穩定&#xff0c;導致線上發券偏高&#xff0c;毛利…

音視頻學習(四十六):聲音的三要素

聲音是人類感知世界的重要途徑之一。在自然界中&#xff0c;聲波本質上是介質中傳播的機械振動&#xff0c;而人類對聲音的主觀感受主要通過三種屬性來認知和描述&#xff0c;即音調&#xff08;音高&#xff09;、響度&#xff08;強弱&#xff09;、音色&#xff08;音質&…

spring batch處理數據模板(Reader-Processor-Writer模式)

步驟監聽器 Component public class StepListener implements StepExecutionListener {private StepExecution stepExecution;public StepExecution getStepExecution() {return this.stepExecution;}Overridepublic void beforeStep(StepExecution stepExecution) {this.stepE…

【華為OD機試】從小桶里取球

題目描述 某部門開展Family Day開放日活動,其中有個從桶里取球的游戲,游戲規則如下: 有N個容量一樣的小桶等距排開,且每個小桶都默認裝了數不等的小球, 每個小桶裝的小球數量記錄在數組bucketBallNums中, 游戲開始時,要求所有桶的小球總數不能超過SUM, 如果小球總…

std::unordered_map 和 std::map的區別【C++】

std::unordered_map 和 std::map 是 C 標準庫中兩種不同的關聯容器&#xff0c;它們都用于存儲鍵值對&#xff0c;但在實現方式、性能特點和使用場景上存在顯著區別。以下是它們的主要區別&#xff1a; 1. 數據結構 std::map&#xff1a; 基于 紅黑樹&#xff08;一種自平衡二叉…

云原生環境里的顯示變革:Docker虛擬瀏覽器與cpolar穿透技術實戰

文章目錄前言【視頻教程】1. 關于neko2. 本地部署neko3. neko簡單使用4. 安裝內網穿透5. 配置neko公網地址6. 配置固定公網地址前言 現代遠程協作本該是無縫銜接的過程&#xff0c;卻被這些障礙不斷打斷&#xff1a;多設備屏幕同步存在延遲、跨平臺訪問需要復雜配置、公網IP申…

LVGL + ESP-Brookesia 在Windows下的編譯和運行

LVGL ESP-Brookesia 在Windows下的編譯和運行 1. 項目介紹 本項目是基于 LVGL&#xff08;輕量級多功能圖形庫&#xff09;和 ESP-Brookesia 的嵌入式模擬桌面應用開發框架&#xff0c;專為嵌入式設備構建豐富的圖形界面而設計。通過在Windows環境下模擬嵌入式設備的圖形界面…

【ip】IP地址能否直接填寫255?

IP地址數值限制? 最近有朋友后臺問我&#xff0c;IP地址里填255行不行&#xff1f;思索著有一陣子沒有分享基礎的知識&#xff0c;就在今天大致說一下&#xff0c;關于IP地址里填255行不行&#xff1f;答案當然是否定的。 IP地址由4個段組成&#xff0c;每個段的數值范圍其實限…

力扣熱題100----------141.環形鏈表

給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表中的環&#xff0c;評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置&#xff08;索…

【Java開發日記】我們來說說 LockSupport 的 park 和 unpark

目錄 一、LockSupport 1.1、LockSupport函數列表 1.2、基本使用 先 park 再 unpark 先 unpark 再 park 1.3、特點 與 Object 的 wait & notify 相比 二、LockSupport park & unpark原理 2.1、情況一&#xff0c;先調用park&#xff0c;再調用unpark park 操作…

AGI|從“實驗室”到“生產線”:企業級AI Agent 如何突圍

在數字化轉型的深水區&#xff0c;企業級 AI Agent 正從技術概念走向產業實踐&#xff0c;成為驅動生產力變革的核心引擎。目錄 一、風口已至&#xff1a;AI Agent 的崛起邏輯與市場剛需 二、企業級AI Agent&#xff1a;核心能力與獨特價值定位 三、AI Agent 的未來目標 一、…

AtCoder Beginner Contest 417

文章目錄A A SubstringB Search and DeleteC Distance IndicatorsD Takahashis ExpectationE A Path in A DictionaryF Random GatheringG Binary CatAtCoder Beginner Contest 417A A Substring You are given an N-character string S consisting of lowercase English lett…

C++23 Concepts:用類型約束重構泛型編程的終極方案

一、開篇:模板元編程的"類型檢查困局" 某金融量化團隊曾遇到詭異bug: template<typename T> void process(T data) {static_assert(std::is_arithmetic<T>::value, "需要數值類型");// 業務邏輯... } 當調用process("hello")時…

【RK3568 看門狗驅動開發詳解】

RK3568 看門狗驅動開發詳解一、Linux 看門狗子系統架構?二、設備樹配置?三、 看門狗驅動實現四、驗證看門狗定時器&#xff08;Watchdog Timer&#xff09;是保障嵌入式系統可靠性的關鍵硬件&#xff0c;它通過定期接收 “喂狗” 信號監控系統運行狀態&#xff0c;當系統故障…

探索 Vue 3.6 新特性:Vapor Mode 與高性能 Web 應用開發

Vue 3.6 簡介 Vue.js 是一個廣受歡迎的漸進式 JavaScript 框架&#xff0c;以其簡潔的 API、靈活的組件系統和高性能著稱。Vue 3.6 是 Vue 3 系列的一個重要版本&#xff0c;引入了多項性能優化和新特性&#xff0c;尤其是備受關注的 Vapor Mode&#xff0c;這是一個無需虛擬 D…

初識prometheus

Prometheus&#xff1a;云原生時代的監控利器 在當今快速發展的云原生和微服務架構時代&#xff0c;傳統的監控系統面臨著巨大的挑戰&#xff1a;如何高效地收集海量、動態變化的指標&#xff1f;如何實時告警并快速定位問題&#xff1f;如何實現靈活的可視化和強大的數據查詢…

從源碼角度分析導致 JVM 內存泄露的 ThreadLocal

文章目錄1. 為什么需要ThreadLocal2. ThreadLocal的實現解析1.1 實現分析1.2 具體實現1.3 ThreadLocalMap中Hash沖突的解決1.3.1 Hash沖突解決的幾種方法1.3.1.1 開放定值法1.3.1.2 鏈地址法1.3.1.3再哈希法&#xff1a;1.3.1.4 建立公共溢出區1.3.2 ThreadLocal解決Hash沖突的…

React組件化的封裝

1. 組件化封裝的結構 1.1. 定義一個類(組件名必須是大寫&#xff0c;小寫會被認為是html元素), 繼續自React.Component1.2. 實現當前組件的render函數 render當中返回的jsx內容&#xff0c;就是之后React會幫助我們渲染的內容 1.3. 結構圖如下&#xff1a; data 方法render()…

嵌入式仿真教學的革新力量:深圳航天科技創新研究院引領高效學習新時代

嵌入式系統作為現代信息技術的核心基石&#xff0c;已深度融入工業控制、物聯網、智能終端等關鍵領域。高校肩負著培養嵌入式技術人才的重任&#xff0c;但傳統教學方式正面臨嚴峻挑戰&#xff1a;硬件實驗設備投入巨大、更新滯后、維護繁瑣、時空限制嚴格&#xff0c;難以滿足…

六、Linux核心服務與包管理

作者&#xff1a;IvanCodes 日期&#xff1a;2025年8月3日 專欄&#xff1a;Linux教程 要保證一個Linux系統穩定、安全、功能完備&#xff0c;有效管理其后臺服務和軟件包是至關重要的。本文將深入介紹現代Linux系統中四個核心的管理工具&#xff1a;systemctl (服務管理)&…