背景 我們的springboot項(xiàng)目是通過k8s部署的,我們使用了G1垃圾回收器作為jvm的垃圾回收器,同時(shí)也配置了如下的各種應(yīng)對jvm oom崩潰時(shí)的參數(shù)喘帚;在服務(wù)上線的一周...
背景 我們的springboot項(xiàng)目是通過k8s部署的,我們使用了G1垃圾回收器作為jvm的垃圾回收器,同時(shí)也配置了如下的各種應(yīng)對jvm oom崩潰時(shí)的參數(shù)喘帚;在服務(wù)上線的一周...
為什么ConnectionFinalizerPhantomReference 對象不會隨著時(shí)間變少,一天4800個(gè)顷级,那什么時(shí)候會減少呢麦萤?
數(shù)據(jù)庫連接池配置不當(dāng)導(dǎo)致的full gc問題記錄背景 線上有個(gè)流量比較大的服務(wù)缕陕,qps日常在2000-3000之間味滞,請求方對耗時(shí)要求比較高樱蛤,響應(yīng)時(shí)間要求在300ms以內(nèi),服務(wù)上線以后剑鞍,運(yùn)行也比較平穩(wěn)昨凡。某天夜里,突然有幾千個(gè)...
前言 之前關(guān)于實(shí)體和值對象的文章中有提過迪米特發(fā)則以及告訴而非詢問原則蚁署。偏向于值對象的設(shè)計(jì)方法便脊,今天參考馬丁福勒的文章https://martinfowler.com/bli...
前言 參考官方文檔:https://pinpoint-apm.gitbook.io/pinpoint/getting-started/installation#3-pinpo...
前言 redis自帶的StringSerializer性能相對較差,redis官方推薦kryo來提高序列化和反序列化速度光戈,推薦snappy來節(jié)約redis內(nèi)存和網(wǎng)絡(luò)帶寬哪痰,在s...
https://www.info.ucl.ac.be/~pvr/PrincipleOfLeastExpressiveness.pdf[https://www.info.ucl...
確實(shí),整潔架構(gòu)和ddd雖然是兩碼事田度,但是這個(gè)架構(gòu)比較符合ddd設(shè)計(jì)思想妒御。ddd的戰(zhàn)術(shù)設(shè)計(jì)就是指導(dǎo)代碼實(shí)現(xiàn)的解愤。您說的優(yōu)勢1是戰(zhàn)略設(shè)計(jì)過程中拆分問題域镇饺,得出上下文。2類似于事件風(fēng)暴規(guī)劃出聚合送讲。至于兩個(gè)關(guān)聯(lián)一個(gè)循環(huán)不了解是什么奸笤。每個(gè)人落地的ddd都會有區(qū)別,對ddd的領(lǐng)悟也不盡相同哼鬓。但歸根到底是要服務(wù)于業(yè)務(wù)的
為什么要DDD一监右、傳統(tǒng)架構(gòu)的劣勢 0、面向數(shù)據(jù)庫建模异希,更加關(guān)注數(shù)據(jù)健盒、關(guān)注有哪些表哪些列,只要數(shù)據(jù)最終落庫,中間邏輯可以采取任何形式扣癣。忽略了業(yè)務(wù)中非常重要的“行為\動作\業(yè)務(wù)邏輯” 的建模惰帽,...
已經(jīng)在項(xiàng)目里實(shí)施過了。由于項(xiàng)目不是特別復(fù)雜父虑,迭代版本還不多该酗,ddd優(yōu)勢還沒有完全發(fā)揮出來。相反代碼量要比傳統(tǒng)方式多了一些士嚎,數(shù)據(jù)庫設(shè)計(jì)由于項(xiàng)目限定要求mysql呜魄,也多做了一些工作。目前來看收益有幾部分莱衩。第一爵嗅,組內(nèi)所有人對業(yè)務(wù)理解都很透徹,因?yàn)橐黄鹱鲞^事件風(fēng)暴笨蚁,可以反向的判斷pm的需求提的是否合理操骡,同時(shí)可以判斷新需求代碼寫在哪里合適,是不是屬于本上下文赚窃。第二册招,項(xiàng)目實(shí)施過程中為了適配前端改了很多版本代碼,但都沒有影響到業(yè)務(wù)邏輯勒极,對一些數(shù)據(jù)庫的表字段變更也沒有影響到核心業(yè)務(wù)邏輯是掰。第三,服務(wù)拆分時(shí)戰(zhàn)略設(shè)計(jì)和上下文映射提供了很大幫助辱匿,不是拍腦袋決定拆键痛,而是有法可依。第四匾七,是分層帶來的收益了絮短,從編譯器級別對類的隨意注入做了限制,長期來看應(yīng)該可以避免一些網(wǎng)狀引用昨忆。第五丁频,整潔架構(gòu)帶來的收益,tob項(xiàng)目插件式架構(gòu)可以適配多個(gè)公司的多種數(shù)據(jù)庫緩存消息隊(duì)列等邑贴,而不會影響核心邏輯席里。
為什么要DDD一、傳統(tǒng)架構(gòu)的劣勢 0拢驾、面向數(shù)據(jù)庫建模奖磁,更加關(guān)注數(shù)據(jù)、關(guān)注有哪些表哪些列繁疤,只要數(shù)據(jù)最終落庫咖为,中間邏輯可以采取任何形式秕狰。忽略了業(yè)務(wù)中非常重要的“行為\動作\業(yè)務(wù)邏輯” 的建模,...
前言 領(lǐng)域事件是領(lǐng)域驅(qū)動設(shè)計(jì)中的重中之重躁染,事件風(fēng)暴的時(shí)候確認(rèn)的領(lǐng)域事件可以直接應(yīng)用在我們的代碼設(shè)計(jì)中封恰,但是領(lǐng)域事件在哪里發(fā)布、領(lǐng)域事件的應(yīng)該是自己寫還是直接利用spring的...
前言 首先看下領(lǐng)域驅(qū)動設(shè)計(jì)中對應(yīng)用層和領(lǐng)域?qū)拥慕忉專?從解釋中我們可以看出褐啡,應(yīng)用層的任務(wù)是與其他系統(tǒng)應(yīng)用層合作诺舔、為領(lǐng)域?qū)舆M(jìn)行協(xié)調(diào),實(shí)際上還包括了翻譯等工作备畦,具體工作可以參考一...
前言 應(yīng)用服務(wù)層是Domain層的直接消費(fèi)者低飒,同時(shí)也是外部想要調(diào)用領(lǐng)域?qū)拥拈T面。應(yīng)用服務(wù)內(nèi)部包含了翻譯外部數(shù)據(jù)到領(lǐng)域?qū)ο蟮倪壿嫸巍轭I(lǐng)域服務(wù)準(zhǔn)備領(lǐng)域?qū)ο蟮倪壿嬋焐蕖⒄{(diào)用領(lǐng)域服務(wù)或者...
一、整潔架構(gòu)分層 整潔架構(gòu)分層如圖所示莉恼,從內(nèi)到外分別為實(shí)體->用例->接口適配器->框架與驅(qū)動程序拌喉。其中實(shí)體層和用例層包含業(yè)務(wù)邏輯、接口適配器層是翻譯層俐银,負(fù)責(zé)把外部數(shù)據(jù)翻譯成...
前言 聚合是由實(shí)體和值對象組成的一個(gè)整體概念尿背,聚合根就是組成這個(gè)聚合的一個(gè)實(shí)體。 聚合設(shè)計(jì)原則 參照沃恩弗農(nóng): 1捶惜、在聚合邊界內(nèi)保護(hù)業(yè)務(wù)規(guī)則不變性 比如業(yè)務(wù)規(guī)則是 a=b+c...
前言 值對象是狀態(tài)不可變的田藐、可整體替換的、用于度量和描述領(lǐng)域中某件東西的對象吱七。在落地DDD過程中我們常常遇到一個(gè)概念到底是建模成實(shí)體好還是建模成值對象好這種問題汽久,其實(shí)各DDD...
前言 實(shí)體和值對象的區(qū)分是領(lǐng)域驅(qū)動設(shè)計(jì)中的老大難問題,建模過程中是必然會遇到的問題踊餐,我們在落地領(lǐng)域驅(qū)動設(shè)計(jì)過程中就遭遇了這類問題景醇,下面介紹下我們落地過程中的經(jīng)驗(yàn)。 實(shí)體 實(shí)體...
前言 DDD架構(gòu)分層由內(nèi)到外主要分為domain層->application層->infrastructure層->interface層其中領(lǐng)域服務(wù)屬于domain層吝岭、應(yīng)用服...
前言 DDD分為戰(zhàn)略設(shè)計(jì)和戰(zhàn)術(shù)設(shè)計(jì)三痰,戰(zhàn)略設(shè)計(jì)就是劃分子域和限界上下文的過程。領(lǐng)域劃分為子域的通用劃分形式是把領(lǐng)域劃分為 核心子域苍碟、支撐子域酒觅、通用子域。我們在落地過程中常常會很...
前言 CQRS在領(lǐng)域驅(qū)動設(shè)計(jì)中非常常見微峰,也非常好用,簡單來說就是對領(lǐng)域模型的修改和對領(lǐng)域生成數(shù)據(jù)的讀取職責(zé)是相互分離的抒钱。 CQRS分類 CQRS在落地過程中分為幾種 第一種是...