19詳細設(shè)計說明書_第1頁
19詳細設(shè)計說明書_第2頁
19詳細設(shè)計說明書_第3頁
19詳細設(shè)計說明書_第4頁
19詳細設(shè)計說明書_第5頁
已閱讀5頁,還剩260頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

文檔版本:DOCPROPERTY文檔版本2018-09-25DOCPROPERTY商標XXXXXX局社會共治服務(wù)平臺建設(shè)項目詳細設(shè)計說明書XXXXXX有限公司XXXXXXXXXXXX局社會共治服務(wù)平臺建設(shè)項目-詳細設(shè)計說明書文檔基本信息文件狀態(tài):[]草稿[√]正式發(fā)布[]正在修改文件標識:XXXXXXXXXXXX局社會共治服務(wù)平臺建設(shè)項目-詳細設(shè)計說明書當前版本:V1.0作者:張三完成日期:2022年11月修訂記錄版本號作者參與者日期修改說明V0.5張三/2022年11月創(chuàng)建文檔V0.6張三/2022年11月補充接口設(shè)計V0.7張三/2022年11月調(diào)整文檔目錄結(jié)構(gòu),統(tǒng)一圖片備注。V0.8張三/2022年11月補充輸入輸出、用戶界面設(shè)計V1.0張三/2022年11月統(tǒng)一調(diào)整文檔格式目錄TOC\o"1-4"\f\u1.引言 社會共治服務(wù)平臺建設(shè)項目詳細設(shè)計說明書名稱縮寫:詳細設(shè)計說明書文檔概述本文檔是以項目建設(shè)目標和內(nèi)容以及需求規(guī)格說明書、概要設(shè)計說明書為依據(jù),以文檔的方式闡述本項目各系統(tǒng)模塊的詳細設(shè)計內(nèi)容,擬達到如下2個主要目的:確保本文檔的設(shè)計內(nèi)容符合項目建設(shè)目標與內(nèi)容,以及滿足用戶的真實需求。確保本文檔能作為開發(fā)人員進行系統(tǒng)編碼的依據(jù)。本文檔的讀者主要分為兩個主要類別:一類是項目相關(guān)參與人,作為系統(tǒng)的使用者、需求的提出者,通過本文檔能夠明確產(chǎn)品開發(fā)的目標以及能夠達到的程度;另一類是項目技術(shù)實施的相關(guān)人員,通過本文檔能夠指導(dǎo)編碼人員進行系統(tǒng)編碼,指導(dǎo)測試人員進行單元測試。修改約束該文檔在正式發(fā)布后,其更新需要甲乙雙方共同確認。參考資料《XXXXXXXXXXXX局社會共治服務(wù)平臺建設(shè)項目需求規(guī)格說明書》《XXXXXXXXXXXX局社會共治服務(wù)平臺建設(shè)項目概要設(shè)計說明書》設(shè)計概述背景介紹黨的十九大報告指出,打造共建共治共享的社會治理格局,是中國特色社會主義進入新時代的客觀要求。市場監(jiān)管是社會治理的重要組成部分。商事制度改革后,市場主體保持高增長態(tài)勢,新技術(shù)、新業(yè)態(tài)、新模式持續(xù)涌現(xiàn),市場監(jiān)管的難度和復(fù)雜性不斷提升,傳統(tǒng)政府大包大攬模式已無法適應(yīng)監(jiān)管的現(xiàn)實需求。以科技賦能市場監(jiān)管現(xiàn)代化成為為發(fā)展主線,營造良好科技創(chuàng)新生態(tài),加快構(gòu)建市場監(jiān)管科技創(chuàng)新體系,推動社會共治是共治理念的新發(fā)展。項目背景進入新時代,應(yīng)對機構(gòu)改革后“一支隊伍管市場”的新挑戰(zhàn),從單一的部門監(jiān)管走向多元參與的社會共治,回應(yīng)人民群眾對美好生活的新期待,是新形勢下市場監(jiān)管的大方向。為應(yīng)對這一變化,XXXXXX市場監(jiān)管局提出建設(shè)社會共治服務(wù)平臺,推進XXXXXX市場監(jiān)管共治體系建設(shè)。項目目標轉(zhuǎn)變市場秩序及市場安全監(jiān)管治理理念,從政府“單打獨斗”向“社會共治”轉(zhuǎn)變,從“事后救火”向“事前預(yù)警”轉(zhuǎn)變,通過市場監(jiān)管社會共治平臺建設(shè),為通用市場監(jiān)管領(lǐng)域共治場景提供統(tǒng)一共治監(jiān)管應(yīng)用,為個性共治場景提供統(tǒng)一規(guī)范能力支撐,壓實市場主體責任,引導(dǎo)行業(yè)自律,提升主體自治水平,充分發(fā)揮公眾監(jiān)督作用,優(yōu)先實現(xiàn)食品生產(chǎn)、流通、餐飲、電梯場景社會共治模式。推動構(gòu)建“政府主導(dǎo)、市場主體自治、行業(yè)自律、社會監(jiān)督”的社會共治格局。1、鼓勵企業(yè)自證合規(guī),推動構(gòu)建自治自律的社會共治格局壓實市場主體責任,引導(dǎo)行業(yè)自律,提升主體自治水平,推動構(gòu)建“政府主導(dǎo)、市場主體自治、行業(yè)自律、社會監(jiān)督”的社會共治格局。2、提升社會監(jiān)督能力,促進企業(yè)良性發(fā)展創(chuàng)建消費者、社會公眾的監(jiān)督渠道,通過“他證合規(guī),投訴評價”促進社會監(jiān)督,樹立好企業(yè)的口碑。3、建立自治、共治體系,推動市場監(jiān)管理念轉(zhuǎn)變轉(zhuǎn)變市場秩序及市場安全監(jiān)管治理理念,從政府“單打獨斗”向“社會共治”轉(zhuǎn)變,從“事后救火”向“事前預(yù)警”轉(zhuǎn)變,通過市場監(jiān)管社會共治平臺建設(shè),為通用共治場景提供統(tǒng)一共治監(jiān)管應(yīng)用,為個性共治場景提供統(tǒng)一能力支撐。通過構(gòu)建監(jiān)管線索反哺日常監(jiān)管和各類專項監(jiān)管。4、形成一套符合云南市場監(jiān)管工作實際的共治模式機制保障。建立一套標準規(guī)范,形成共治監(jiān)管機制。系統(tǒng)架構(gòu)使用圖系統(tǒng)架構(gòu)圖技術(shù)架構(gòu)使用圖技術(shù)架構(gòu)圖部署架構(gòu)使用圖部署架構(gòu)圖系統(tǒng)環(huán)境序號系統(tǒng)名稱用途數(shù)量硬件環(huán)境軟件環(huán)境網(wǎng)絡(luò)環(huán)境1自證合規(guī)應(yīng)用前端應(yīng)用服務(wù)器1云主機:CPU:8核;內(nèi)存:16G;系統(tǒng)盤:100G;數(shù)據(jù)盤:200G;系統(tǒng)版本:CentOS7.564位Nginx1.24.0互聯(lián)網(wǎng)區(qū)2后臺應(yīng)用服務(wù)器1云主機:CPU:8核;內(nèi)存:16G;系統(tǒng)盤:100G;數(shù)據(jù)盤:200G;系統(tǒng)版本:CentOS7.564位;Jdk1.8政務(wù)外網(wǎng)區(qū)3數(shù)據(jù)庫服務(wù)器1云主機:CPU:8核;內(nèi)存:16G;存儲空間:500G系統(tǒng)版本:CentOS7.564位MySQL5.7互聯(lián)網(wǎng)區(qū)出錯處理設(shè)計出錯輸出信息錯誤碼錯誤類型錯誤字符描述Err_cfg_info事先沒有配置系統(tǒng)系統(tǒng)提示用戶讓管理員創(chuàng)建配置文檔Err_debug_info調(diào)用外部模型系統(tǒng)出錯系統(tǒng)提示用戶檢查調(diào)用地址和參數(shù)Err_doc_info引用的配置文檔改變或者刪除系統(tǒng)提示用戶配置文檔已改變或刪除Err_performent_info系統(tǒng)運行出錯系統(tǒng)提示出錯,并給出錯誤編號和說明Err_submit_info沒有填寫要求的必要信息而提交對于保存操作,使用域校驗公式,或者檢查是否填寫完整;400業(yè)務(wù)異常業(yè)務(wù)異常,消息不能讀取,缺少必要的請求參數(shù),請求參數(shù)類型錯誤,請求參數(shù)綁定錯誤,參數(shù)校驗失敗401請求未授權(quán)客戶端請求未授權(quán)404請求地址錯誤404沒找到請求405請求方法錯誤不支持當前請求方法415媒體類型錯誤不支持當前媒體類型500服務(wù)器異常服務(wù)器異常出錯處理策略故障出現(xiàn)后可能采取的變通措施,包括:1)后備技術(shù)說明準備采用的后備技術(shù),當原始系統(tǒng)數(shù)據(jù)萬一丟失時啟用的副本的建立和啟動的技術(shù),例如周期性地把磁盤信息記錄到磁帶上去就是對于磁盤媒體的一種后備技術(shù)。2)降效技術(shù)說明準備采用的后備技術(shù),使用另一個效率稍低的系統(tǒng)或方法來求得所需結(jié)果的某些部分,例如一個自動系統(tǒng)的降效技術(shù)可以是手工操作和數(shù)據(jù)的人工記錄。3)恢復(fù)及再啟動技術(shù)說明將使用的恢復(fù)再啟動技術(shù),使軟件從故障點恢復(fù)執(zhí)行或使軟件從頭開始重新運行的方法。出錯處理過程系統(tǒng)關(guān)鍵事務(wù)將由系統(tǒng)進行事務(wù)管理,關(guān)鍵事務(wù)如果出錯將返回到系統(tǒng)最近完好狀態(tài),保證數(shù)據(jù)安全,不被污染。系統(tǒng)某個實例出現(xiàn)故障,此實例將被鎖定,以利于排查問題;但系統(tǒng)其他應(yīng)用實例將不受影響可以繼續(xù)工作。質(zhì)量屬性設(shè)計高可用性要求系統(tǒng)提供7×24小時的連續(xù)運行能力,數(shù)據(jù)存取服務(wù)準確,不能丟失數(shù)據(jù)。系統(tǒng)具備冗余和容錯能力,避免出現(xiàn)系統(tǒng)死鎖、資源耗盡、程序崩潰等故障,具備自動糾錯和異常報警功能。可擴展性要求系統(tǒng)設(shè)計采用分布式數(shù)據(jù)庫技術(shù),支持自動化水平拆分、平滑擴容、彈性擴展、透明讀寫分離、分布式事務(wù)、具備分布式數(shù)據(jù)庫全生命周期的運維管控能力,確保數(shù)據(jù)層的可擴展性。系統(tǒng)設(shè)計采用分布式服務(wù)框架和松耦合設(shè)計,支持微應(yīng)用、服務(wù)治理和容量線性擴展,在業(yè)務(wù)持續(xù)增長的情況下保障業(yè)務(wù)平穩(wěn)運行。系統(tǒng)設(shè)計采用組件化、迭代化的開發(fā)模式,基于微應(yīng)用構(gòu)建通用服務(wù)中心,支持快速搭建應(yīng)用。性能要求社會共治門戶提供良好的頁面設(shè)計與功能交互,在網(wǎng)絡(luò)穩(wěn)定的環(huán)境下,業(yè)務(wù)專網(wǎng)業(yè)務(wù)應(yīng)用操作界面簡單操作的響應(yīng)時間小于5秒,互聯(lián)網(wǎng)業(yè)務(wù)應(yīng)用操作界面簡單操作的響應(yīng)時間小于5秒;可恢復(fù)性要求具備事務(wù)回滾功能,可將錯誤數(shù)據(jù)恢復(fù)到正確節(jié)點,而不影響其他數(shù)據(jù)。接口支持斷點續(xù)傳,與周邊系統(tǒng)數(shù)據(jù)交互出現(xiàn)異常時自動補傳和數(shù)據(jù)校驗,確保數(shù)據(jù)完整性和一致性。具備成熟的災(zāi)難恢復(fù)功能,提供多種級別的數(shù)據(jù)及應(yīng)用備份能力。兼容性要求系統(tǒng)兼容各種版本的主流瀏覽器,包括IE10+、FireFox、Chrome等常見瀏覽器,客戶端支持常用終端設(shè)備PC(Windows)、手機和平板(Android)等。整體需求功能列表編號建設(shè)版塊一級功能二級功能功能說明1社會共治服務(wù)門戶企業(yè)端門戶注冊登錄提供企業(yè)主體用戶注冊及登錄功能,支持用戶注冊、登錄、綁定操作。提供統(tǒng)一的用戶登陸界面,支持電子營業(yè)執(zhí)照認證、法人實名認證,事業(yè)單位,外資企業(yè)認證、連鎖企業(yè)認證。2主體查詢提供企業(yè)相關(guān)信息檢索查詢功能,具體包含企業(yè)主體信息、行政信息、陽光公示信息。支持查看企業(yè)畫像信息。3通知公告提供通知公告、風險預(yù)警、政策法規(guī)等公告信息的查閱。4共治專區(qū)對市場監(jiān)管社會共治應(yīng)用專區(qū)介紹,如食品安全、特種設(shè)備、藥品安全、重要工業(yè)產(chǎn)品、質(zhì)量安全、知識產(chǎn)權(quán),提供相關(guān)的功能介紹。5信息填報意見征集、問卷調(diào)查、企業(yè)表單等不同類型表單的填報。6企業(yè)中心提供共治消息查看、信息反饋、企業(yè)基本信息自主維護管理,作為企業(yè)自證合規(guī)應(yīng)用入口,可以進入到人員管理、主體責任落實、服務(wù)能力管理、客體管理等功能。關(guān)鍵技術(shù)基于分布式計算技術(shù)(1)分布式文件系統(tǒng)提供一個海量的、可靠的、可擴展的數(shù)據(jù)存儲服務(wù),將集群中各個節(jié)點的存儲能力聚集起來,并能夠自動屏蔽軟硬件故障,為用戶提供不間斷的數(shù)據(jù)訪問服務(wù)。支持增量擴容和數(shù)據(jù)的自動平衡,支持隨機讀寫和追加寫的操作。(2)任務(wù)調(diào)度為集群系統(tǒng)中的任務(wù)提供調(diào)度服務(wù),同時支持強調(diào)響應(yīng)速度的在線服務(wù)和強調(diào)處理數(shù)據(jù)吞吐量的離線任務(wù)。自動檢測系統(tǒng)中故障和熱點,通過錯誤重試、針對長尾作業(yè)并發(fā)備份作業(yè)等方式,保證作業(yè)穩(wěn)定可靠地完成。(3)集群監(jiān)控和部署對集群的狀態(tài)和上層應(yīng)用服務(wù)的運行狀態(tài)和性能指標進行監(jiān)控,對異常事件產(chǎn)生警報和記錄;為運維人員提供整個基礎(chǔ)計算平臺以及上層應(yīng)用的部署和配置管理,支持在線集群擴容、縮容和應(yīng)用服務(wù)的在線升級。(4)分布式系統(tǒng)底層服務(wù)提供分布式環(huán)境下所需要的協(xié)調(diào)服務(wù)、遠程過程調(diào)用、安全管理和資源管理的服務(wù)。這些底層服務(wù)為上層的分布式文件系統(tǒng)、任務(wù)調(diào)度等模塊提供支持?;谠萍夹g(shù)的計算和存儲狹義云計算是指IT基礎(chǔ)設(shè)施的交付和使用模式,指通過網(wǎng)絡(luò)以按需、易擴展的方式獲得所需的資源;廣義云計算是指服務(wù)的交付和使用模式,指通過網(wǎng)絡(luò)以按需、易擴展的方式獲得所需的服務(wù)。這種服務(wù)可以是IT和軟件、互聯(lián)網(wǎng)相關(guān)的,也可以是任意其他的服務(wù),它具有超大規(guī)模、虛擬化、可靠安全等獨特功效。云技術(shù)具有以下特點:(1)數(shù)據(jù)安全可靠云計算提供了最可靠、最安全的數(shù)據(jù)存儲中心,用戶不用再擔心數(shù)據(jù)丟失、病毒入侵等麻煩。嚴格的權(quán)限管理策略可以幫助你放心地與你指定的人共享數(shù)據(jù)。(2)客戶端需求低其次,云計算對用戶端的設(shè)備要求最低,使用起來也最方便。(3)輕松共享數(shù)據(jù)云計算可以輕松實現(xiàn)不同設(shè)備間的數(shù)據(jù)與應(yīng)用共享。(4)可能無限多云計算為使用網(wǎng)絡(luò)提供了幾乎無限多的可能。為存儲和管理數(shù)據(jù)提供了幾乎無限多的空間,也為完成各類應(yīng)用提供了幾乎無限強大的計算能力。微服務(wù)架構(gòu)服務(wù)架構(gòu)采用一組服務(wù)的方式來構(gòu)建一個應(yīng)用,服務(wù)獨立部署在不同的進程中,不同服務(wù)通過一些輕量級交互機制來通信,例如RPC、HTTP等,服務(wù)可獨立擴展伸縮,每個服務(wù)定義了明確的邊界,不同的服務(wù)甚至可以采用不同的編程語言來實現(xiàn),由獨立的團隊來維護,具備如下幾個特征:(1)通過服務(wù)實現(xiàn)組件化傳統(tǒng)實現(xiàn)組件的方式是通過庫(library),傳統(tǒng)組件是和應(yīng)用一起運行在進程中,組件的局部變化意味著整個應(yīng)用的重新部署。通過服務(wù)來實現(xiàn)組件,意味著將應(yīng)用拆散為一系列的服務(wù)運行在不同的進程中,那么單一服務(wù)的局部變化只需重新部署對應(yīng)的服務(wù)進程。另外將服務(wù)作為組件可以更明確的定義出組件的邊界,因為服務(wù)之間的調(diào)用是跨進程的,清晰的邊界和職責定義是設(shè)計時必須考慮的。(2)按業(yè)務(wù)能力來劃分服務(wù)與組織團隊傳統(tǒng)開發(fā)方式中,我們將工程師按技能專長分層為前端層、中間層、數(shù)據(jù)層,前端對應(yīng)的角色為UI、頁面構(gòu)建師等,中間層對應(yīng)的角色為服務(wù)端業(yè)務(wù)開發(fā)工程師,數(shù)據(jù)層對應(yīng)著DBA等角色。事實上傳統(tǒng)應(yīng)用設(shè)計架構(gòu)的分層結(jié)構(gòu)正反應(yīng)了不同角色的溝通結(jié)構(gòu)。而微服務(wù)架構(gòu)的開發(fā)模式不同于傳統(tǒng)方式,它將應(yīng)用按業(yè)務(wù)能力來劃分為不同的服務(wù),每個服務(wù)都要求在對應(yīng)業(yè)務(wù)領(lǐng)域的全棧(從前端到后端)軟件實現(xiàn),從界面到數(shù)據(jù)存儲到外部溝通協(xié)作等等。因此團隊的組織是跨功能的,包含實現(xiàn)業(yè)務(wù)所需的全面的技能。近年興起的全棧工程師正是因為架構(gòu)和開發(fā)模式的轉(zhuǎn)變而出現(xiàn),當然具備全棧的工程師其實很少,但將不同領(lǐng)域的工程師組織為一個全棧的團隊就容易的多。(3)服務(wù)即產(chǎn)品傳統(tǒng)的應(yīng)用開發(fā)都是基于項目模式的,開發(fā)團隊根據(jù)一堆功能列表開發(fā)出一個軟件應(yīng)用并交付給客戶后,該軟件應(yīng)用就進入維護模式,由另一個維護團隊負責,開發(fā)團隊的職責結(jié)束。而微服務(wù)架構(gòu)的倡導(dǎo)者提議避免采用這種項目模式,更傾向于讓開發(fā)團隊負責整個產(chǎn)品的全部生命周期。(4)智能終端與啞管道微服務(wù)架構(gòu)拋棄了ESB過度復(fù)雜的業(yè)務(wù)規(guī)則編排、消息路由等。服務(wù)作為智能終端,所有的業(yè)務(wù)智能邏輯在服務(wù)內(nèi)部處理,而服務(wù)間的通信盡可能的輕量化,不添加任何額外的業(yè)務(wù)規(guī)則。(5)去中心統(tǒng)一化傳統(tǒng)應(yīng)用中傾向采用統(tǒng)一的技術(shù)平臺或產(chǎn)品來解決所有問題。不是每個問題都是釘子,也不是每個解決方案都是一個錘子。問題有其具體性,解決方案也應(yīng)有其針對性。用最適合的技術(shù)方案去解決具體的問題,在大一統(tǒng)的傳統(tǒng)應(yīng)用中其實很難做到,而微服務(wù)的架構(gòu)意味著,你可以針對不同的業(yè)務(wù)服務(wù)特征選擇不同的技術(shù)平臺或產(chǎn)品,有針對性的解決具體的業(yè)務(wù)問題。(6)基礎(chǔ)設(shè)施自動化單一進程的傳統(tǒng)應(yīng)用被拆分為一系列的多進程服務(wù)后,意味著開發(fā)、調(diào)試、測試、集成、監(jiān)控和發(fā)布的復(fù)雜度都會相應(yīng)增大。必須要有合適的自動化基礎(chǔ)設(shè)施來支持微服務(wù)架構(gòu)模式,否則開發(fā)、運維成本將大大增加。(7)Designforfailure正因為將服務(wù)獨立在不同的進程中后,引入了額外的失敗因素。任何時刻對服務(wù)的調(diào)用都可能因為服務(wù)方不可用導(dǎo)致失敗,這就要求服務(wù)的消費方需要優(yōu)雅的處理此類錯誤。這其實是相對傳統(tǒng)應(yīng)用開發(fā)方式的一個缺點,不過隨著一些開源服務(wù)化框架的出現(xiàn),對業(yè)務(wù)開發(fā)人員而言適當?shù)钠帘瘟祟愃频腻e誤處理,不過開發(fā)人員依然需要知道對服務(wù)的調(diào)用是完全不同于進程內(nèi)的方法或函數(shù)調(diào)用的。(8)進化設(shè)計一旦采用了微服務(wù)架構(gòu)模式,那么在服務(wù)需要變更時我們要特別小心,服務(wù)提供者的變更可能引發(fā)服務(wù)消費者的兼容性破壞,時刻謹記保持服務(wù)契約(接口)的兼容性。業(yè)界流行的阿里的框架dubbo以及淘寶內(nèi)部的HSF,Navi-rpc都可以看做微服務(wù)化框架的雛形,加上服務(wù)治理中心的管理、基礎(chǔ)交付設(shè)施的保障就可以構(gòu)成完整的一套微服務(wù)框架。整體架構(gòu)如下圖,他由服務(wù)發(fā)布者、調(diào)用者和治理中心三者組成,屬于標準的協(xié)調(diào)者模式。微服務(wù)整體框架生產(chǎn)者中服務(wù)邏輯在Spring或者Guice等IoC框架的bean中,由IoC容器托管,為了符合模塊即服務(wù)的思想,在框架層級實現(xiàn)了一套可插拔組件的引擎,去實現(xiàn)組件的掃描,需要暴露服務(wù)的發(fā)布出來,依賴別的服務(wù)的,通過字節(jié)碼技術(shù)生成Rpc調(diào)用代理Stub,形成了一個基于組件的容器,通過JSR315這個規(guī)范的SPI實現(xiàn)對接到J2EE容器,下面的消費者結(jié)構(gòu)相同。在服務(wù)啟動后,首先會第一步注冊自己到服務(wù)治理中心,上傳自己的契約、版本上去,治理中心如果通過檢查就發(fā)布出去,之后和治理中心通過長連接協(xié)議(我們采用websocket,因為現(xiàn)成、簡單)做一個訂閱發(fā)布的通道,可以供收集狀態(tài),推送服務(wù)Endpint的變更;服務(wù)消費者可以去治理中心或者Maven倉庫獲取契約、SDK,治理中心推送Endpoint下來,供路由進行Rpc調(diào)用,通過消費者也通過長連接協(xié)議來進行狀態(tài)和統(tǒng)計信息的上報,供治理中心進行分析決策和反饋。服務(wù)治理中心為了保證高可用性,通常使用Zookeeper這個流行的開源的基于Paxos的方案,當然最近漸漸流行起來的kebernetes的etcd是基于Raft的集群共享數(shù)據(jù)、也可以做服務(wù)的發(fā)現(xiàn)的解決方案。隨著這種分布式調(diào)用越來越頻繁,就需要服務(wù)治理能力越來越強,否則就是一張混亂的、無序的Rpc調(diào)用的網(wǎng),無法管理復(fù)雜度。這里建立了服務(wù)治理的模型,在下圖中的服務(wù)治理中心來實現(xiàn),模型從這樣幾個角度來考慮如何治理服務(wù),包括通信、契約、版本、監(jiān)控、安全、交付等角度,依托服務(wù)治理中心,有了這套基礎(chǔ)設(shè)施保駕護航,服務(wù)化就可以真正做到提高研發(fā)效率、提供優(yōu)雅的開發(fā)體驗。服務(wù)治理模型DOA面向數(shù)據(jù)的體系結(jié)構(gòu)面向數(shù)據(jù)的體系結(jié)構(gòu)(DOA,DataOrientedArchitecture),建立在云計算的硬件架構(gòu)之上,采用“面向數(shù)據(jù)和以數(shù)據(jù)為核心”的思想,通過數(shù)據(jù)注冊中心(DRC,DataRegisterCenter),數(shù)據(jù)權(quán)限中心(DAC,DataAuthorityCenter),數(shù)據(jù)異??刂浦行模―EC,DataExceptionControlCenter)來統(tǒng)一定義數(shù)據(jù)、管理數(shù)據(jù)和提供數(shù)據(jù)服務(wù),通過數(shù)據(jù)應(yīng)用單元(DAUs,DataApplicationUnits)對各種應(yīng)用進行管理和服務(wù),建立一種數(shù)據(jù)大平臺與碎片化應(yīng)用的數(shù)據(jù)生態(tài)系統(tǒng),構(gòu)建起從數(shù)據(jù)保護到授權(quán)應(yīng)用的整套機制,為有效解決大數(shù)據(jù)時代所面臨軟件體系結(jié)構(gòu)的問題提供基礎(chǔ)理論和方法技術(shù)支撐。大數(shù)據(jù)時代下的廣義數(shù)據(jù),是真實世界映射成虛擬世界的各種類型的數(shù)據(jù),應(yīng)用則是由政府、企業(yè)和個人在互聯(lián)網(wǎng)和移動互聯(lián)網(wǎng)中隨時隨地、隨心隨意的各種需求產(chǎn)生出的碎片化和個性化的應(yīng)用。數(shù)據(jù)生態(tài)系統(tǒng)可以簡單形象地比喻為“肥沃的數(shù)據(jù)土壤上生長著茂盛的應(yīng)用森林”。理解為:將不斷積累和豐富的各種數(shù)據(jù)定義為數(shù)據(jù)土壤,那么建立在數(shù)據(jù)之上的各種碎片化、個性化和不斷增長的應(yīng)用則是應(yīng)用森林。應(yīng)用森林中的某一棵應(yīng)用之樹是具有生命周期的,可能會被淘汰或死亡,但整個森林是生態(tài)的、枝繁葉茂的和可持續(xù)發(fā)展的。一個生態(tài)系統(tǒng)的好壞取決于這個生態(tài)系統(tǒng)的構(gòu)成和運行機制,而面向數(shù)據(jù)的軟件體系結(jié)構(gòu)(DOA)就是探索一種解決數(shù)據(jù)與應(yīng)用之間自生長、自適應(yīng)、自管理和可持續(xù)發(fā)展的機制,也包括數(shù)據(jù)的安全機制和應(yīng)用中數(shù)據(jù)的授權(quán)使用機制。數(shù)據(jù)注冊中心(DRC),是DOA的核心部件,通過它來構(gòu)建邏輯的數(shù)據(jù)資源池,并管理數(shù)據(jù)和提供數(shù)據(jù)服務(wù)。DRC按照統(tǒng)一標準進行設(shè)計,可以將各個行業(yè)或不同規(guī)模的DRC進行互聯(lián)和關(guān)聯(lián),從而可以構(gòu)成更大規(guī)模的DOA系統(tǒng)。數(shù)據(jù)權(quán)限中心(DAC),是DOA的關(guān)鍵部件,對數(shù)據(jù)的安全存儲、傳輸及應(yīng)用授權(quán)進行管理。對數(shù)據(jù)實行“天生加密、授權(quán)使用”的機制,將數(shù)據(jù)分成存儲和傳輸時保持加密的“數(shù)據(jù)態(tài)”和在應(yīng)用中授權(quán)使用時解密的“應(yīng)用態(tài)”,充分保證數(shù)據(jù)的安全及使用的授權(quán)。數(shù)據(jù)異??刂浦行模―EC),是DOA的重要部件,對數(shù)據(jù)資源池進行自適應(yīng)管理,也是數(shù)據(jù)生態(tài)系統(tǒng)的主要構(gòu)成。數(shù)據(jù)應(yīng)用單元(DAUs),是DOA的關(guān)鍵部件,關(guān)聯(lián)應(yīng)用對數(shù)據(jù)的訪問,對各種應(yīng)用提供支持。類似于構(gòu)件系統(tǒng),在數(shù)據(jù)資源池之上,以模塊和積木方式提供應(yīng)用程序接口(API,ApplicationProgrammingInterface),供應(yīng)用系統(tǒng)直接調(diào)用,可以由易到難,由簡到繁地構(gòu)建生態(tài)的應(yīng)用系統(tǒng)。大數(shù)據(jù)分析技術(shù)大數(shù)據(jù)分析技術(shù)是改進已有數(shù)據(jù)挖掘和機器學習技術(shù),開發(fā)數(shù)據(jù)網(wǎng)絡(luò)挖掘、特異群組挖掘、圖挖掘等新型數(shù)據(jù)挖掘技術(shù);突破基于對象的數(shù)據(jù)連接、相似性連接等大數(shù)據(jù)融合技術(shù),突破用戶興趣分析、網(wǎng)絡(luò)行為分析、情感語義分析等面向領(lǐng)域的大數(shù)據(jù)挖掘技術(shù)。大數(shù)據(jù)挖掘就是從大量的、不完全的、有噪聲的、模糊的、隨機的實際應(yīng)用數(shù)據(jù)中,提取隱含在其中的、人們事先不知道的、但又是潛在有用的信息和知識的過程。與傳統(tǒng)數(shù)據(jù)分析相比,用于大數(shù)據(jù)分析的數(shù)據(jù)集合主要有三點區(qū)別:首先,傳統(tǒng)模式多通過采樣方式獲得部分數(shù)據(jù)用于分析,大數(shù)據(jù)可以對收集到的所有海量數(shù)據(jù)進行分析,分析用的數(shù)據(jù)源由采樣數(shù)據(jù)擴展至全部數(shù)據(jù);其次,分析用的數(shù)據(jù)源從傳統(tǒng)單一領(lǐng)域的數(shù)據(jù)擴展到跨領(lǐng)域數(shù)據(jù),大數(shù)據(jù)可以將不同領(lǐng)域的數(shù)據(jù)組合后進行分析;再次,傳統(tǒng)數(shù)據(jù)分析更關(guān)注數(shù)據(jù)源與分析結(jié)果間的因果關(guān)系,大數(shù)據(jù)分析時數(shù)據(jù)源與分析結(jié)果間不再只是因果關(guān)系,基于有相關(guān)關(guān)系的數(shù)據(jù)源同樣可以分析預(yù)測出正確的結(jié)果。大數(shù)據(jù)分析給傳統(tǒng)數(shù)據(jù)分析和處理技術(shù)帶來了很多挑戰(zhàn)。云計算和開源技術(shù)的發(fā)展推動大數(shù)據(jù)落地,分布式存儲、非關(guān)系數(shù)據(jù)庫和并行處理技術(shù)逐漸成為大數(shù)據(jù)應(yīng)用實施過程中的關(guān)鍵技術(shù)。數(shù)據(jù)可視化技術(shù)(1)支持多種場景的復(fù)雜設(shè)計模板數(shù)據(jù)可視化的設(shè)計難點不在于圖表類型的多,而在于如何能在簡單的一頁之內(nèi)讓人讀懂數(shù)據(jù)之間的層次與關(guān)聯(lián),這就關(guān)系到色彩、布局、圖表的綜合運用。通過提供指揮中心、地理分析、實時監(jiān)控、匯報展示等多種場景模版,即便沒有設(shè)計師的可視化作品也有高設(shè)計水準。(2)多種圖表組件,支撐多種數(shù)據(jù)類型的分析展示除針對業(yè)務(wù)展示優(yōu)化過的常規(guī)圖表外,還能夠繪制包括海量數(shù)據(jù)的地理軌跡、地理飛線、熱力分布、地域區(qū)塊、3D地圖、3D地球,地理數(shù)據(jù)的多層疊加。此外還有拓撲關(guān)系、樹圖等異形圖表供自由搭配。(3)多種數(shù)據(jù)源接入,充分發(fā)揮云大數(shù)據(jù)計算的能力能夠接入包括云分析型數(shù)據(jù)庫,關(guān)系型數(shù)據(jù)庫,本地上傳和在線API的接入,且支持動態(tài)請求。滿足各類大數(shù)據(jù)實時計算、監(jiān)控的需求,充分發(fā)揮大數(shù)據(jù)計算的能力。(4)圖形化的搭建工具,無需專業(yè)編程人員也可快速實現(xiàn)提供多種的業(yè)務(wù)模塊級而非圖表組件的Wiget,所見即所得式的配置方式,只需要通過拖拖拽拽,無需編程能力,即可創(chuàng)造出專業(yè)的可視化應(yīng)用。(5)多分辨率適配與發(fā)布方式,滿足不同場合下的使用特別針對拼接大屏端的展示做了分辨率優(yōu)化,能夠適配非常規(guī)拼接分辨率做適配優(yōu)化。創(chuàng)建的可視化應(yīng)用能夠發(fā)布分享,用戶也可以訪問到應(yīng)用,作為對外數(shù)據(jù)業(yè)務(wù)展示的窗口。編碼規(guī)范命名風格(1)【強制】代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結(jié)束。反例:_name/__name/$Object/name_/name$/Object$(2)【強制】代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。說明:正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。注意,即使純拼音命名方式也要避免采用。正例:alibaba/taobao/youku/hangzhou等國際通用的名稱,可視同英文。反例:DaZhePromotion[打折]/getPingfenByName()[評分]/int某變量=3(3)【強制】類名使用UpperCamelCase風格,必須遵從駝峰形式,但以下情形例外:DO/BO/DTO/VO/AO正例:MarcoPolo/UserDO/XmlService/TcpUdpDeal/TaPromotion反例:macroPolo/UserDo/XMLService/TCPUDPDeal/TAPromotion(4)【強制】方法名、參數(shù)名、成員變量、局部變量都統(tǒng)一使用lowerCamelCase風格,必須遵從駝峰形式。正例:localValue/getHttpMessage()/inputUserId(5)【強制】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。正例:MAX_STOCK_COUNT反例:MAX_COUNT(6)【強制】抽象類命名使用Abstract或Base開頭;異常類命名使用Exception結(jié)尾;測試類命名以它要測試的類的名稱開始,以Test結(jié)尾。(7)【強制】中括號是數(shù)組類型的一部分,數(shù)組定義如下:String[]args;反例:使用Stringargs[]的方式來定義。(8)【強制】POJO類中布爾類型的變量,都不要加is,否則部分框架解析會引起序列化錯誤。反例:定義為基本數(shù)據(jù)類型BooleanisDeleted;的屬性,它的方法也是isDeleted(),RPC框架在反向解析的時候,“以為”對應(yīng)的屬性名稱是deleted,導(dǎo)致屬性獲取不到,進而拋出異常。(9)【強制】包名統(tǒng)一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統(tǒng)一使用單數(shù)形式,但是類名如果有復(fù)數(shù)含義,類名可以使用復(fù)數(shù)形式。正例:應(yīng)用工具類包名為com.alibaba.open.util、類名為MessageUtils(此規(guī)則參考spring的框架結(jié)構(gòu))。(10)【強制】杜絕完全不規(guī)范的縮寫,避免望文不知義。反例:AbstractClass“縮寫”命名成AbsClass;condition“縮寫”命名成condi,此類隨意縮寫嚴重降低了代碼的可閱讀性。(11)【推薦】為了達到代碼自解釋的目標,任何自定義編程元素在命名時,使用盡量完整的單詞組合來表達其意。正例:從遠程倉庫拉取代碼的類命名為PullCodeFromRemoteRepository反例:變量inta;的隨意命名方式。(12)【推薦】如果模塊、接口、類、方法使用了設(shè)計模式,在命名時體現(xiàn)出具體模式。說明:將設(shè)計模式體現(xiàn)在名字中,有利于閱讀者快速理解架構(gòu)設(shè)計理念。正例:publicclassOrderFactory;publicclassLoginProxy;publicclassResourceObserver;(13)【推薦】接口類中的方法和屬性不要加任何修飾符號(public也不要加),保持代碼的簡潔性,并加上有效的Javadoc注釋。盡量不要在接口里定義變量,如果一定要定義變量,肯定是與接口方法相關(guān),并且是整個應(yīng)用的基礎(chǔ)常量。正例:接口方法簽名:voidf();接口基礎(chǔ)常量表示:StringCOMPANY="alibaba";反例:接口方法定義:publicabstractvoidf();說明:JDK8中接口允許有默認實現(xiàn),那么這個default方法,是對所有實現(xiàn)類都有價值的默認實現(xiàn)。(14)接口和實現(xiàn)類的命名有兩套規(guī)則:1)【強制】對于Service和DAO類,基于SOA的理念,暴露出來的服務(wù)一定是接口,內(nèi)部的實現(xiàn)類用Impl的后綴與接口區(qū)別。正例:CacheServiceImpl實現(xiàn)CacheService接口。2)【推薦】如果是形容能力的接口名稱,取對應(yīng)的形容詞做接口名(通常是–able的形式)。正例:AbstractTranslator實現(xiàn)Translatable。(15)【參考】枚舉類名建議帶上Enum后綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。說明:枚舉其實就是特殊的常量類,且構(gòu)造方法被默認強制是私有。正例:枚舉名字為ProcessStatusEnum的成員名稱:SUCCESS/UNKOWN_REASON(16)【參考】各層命名規(guī)約:1)Service/DAO層方法命名規(guī)約a)獲取單個對象的方法用get做前綴。b)獲取多個對象的方法用list做前綴。c)獲取統(tǒng)計值的方法用count做前綴。d)插入的方法用save/insert做前綴。e)刪除的方法用remove/delete做前綴。f)修改的方法用update做前綴。2)領(lǐng)域模型命名規(guī)約a)數(shù)據(jù)對象:xxxDO,xxx即為數(shù)據(jù)表名。b)數(shù)據(jù)傳輸對象:xxxDTO,xxx為業(yè)務(wù)領(lǐng)域相關(guān)的名稱。c)展示對象:xxxVO,xxx一般為網(wǎng)頁名稱。d)POJO是DO/DTO/BO/VO的統(tǒng)稱,禁止命名成xxxPOJO。常量定義(1)【強制】不允許任何魔法值(即未經(jīng)定義的常量)直接出現(xiàn)在代碼中。反例:Stringkey="Id#taobao_"+tradeId;cache.put(key,value);(2)【強制】long或者Long初始賦值時,使用大寫的L,不能是小寫的l,小寫容易跟數(shù)字1混淆,造成誤解。說明:Longa=2l;寫的是數(shù)字的21,還是Long型的2?(3)【推薦】不要使用一個常量類維護所有常量,按常量功能進行歸類,分開維護。說明:大而全的常量類,非得使用查找功能才能定位到修改的常量,不利于理解和維護。正例:緩存相關(guān)常量放在類CacheConsts下;系統(tǒng)配置相關(guān)常量放在類ConfigConsts下。(4)【推薦】常量的復(fù)用層次有五層:跨應(yīng)用共享常量、應(yīng)用內(nèi)共享常量、子工程內(nèi)共享常量、包內(nèi)共享常量、類內(nèi)共享常量。1)跨應(yīng)用共享常量:放置在二方庫中,通常是client.jar中的constant目錄下。2)應(yīng)用內(nèi)共享常量:放置在一方庫中,通常是modules中的constant目錄下。反例:易懂變量也要統(tǒng)一定義成應(yīng)用內(nèi)共享常量,兩位攻城師在兩個類中分別定義了表示“是”的變量:類A中:publicstaticfinalStringYES="yes";類B中:publicstaticfinalStringYES="y";A.YES.equals(B.YES),預(yù)期是true,但實際返回為false,導(dǎo)致線上問題。3)子工程內(nèi)部共享常量:即在當前子工程的constant目錄下。4)包內(nèi)共享常量:即在當前包下單獨的constant目錄下。5)類內(nèi)共享常量:直接在類內(nèi)部privatestaticfinal定義。(5)【推薦】如果變量值僅在一個范圍內(nèi)變化,且?guī)в忻Q之外的延伸屬性,定義為枚舉類。下面正例中的數(shù)字就是延伸信息,表示星期幾。正例:publicEnum{MONDAY(1),TUESDAY(2),WEDNESDAY(3),THURSDAY(4),FRIDAY(5),SATURDAY(6),SUNDAY(7);}代碼格式(1)【強制】大括號的使用約定。如果是大括號內(nèi)為空,則簡潔地寫成{}即可,不需要換行;如果是非空代碼塊則:1)左大括號前不換行。2)左大括號后換行。3)右大括號前換行。4)右大括號后還有else等代碼則不換行;表示終止的右大括號后必須換行。(2)【強制】左小括號和字符之間不出現(xiàn)空格;同樣,右小括號和字符之間也不出現(xiàn)空格。詳見第5條下方正例提示。反例:if(空格a==b空格)(3)【強制】if/for/while/switch/do等保留字與括號之間都必須加空格。(4)【強制】任何二目、三目運算符的左右兩邊都需要加一個空格。說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號等。(5)【強制】采用4個空格縮進,禁止使用tab字符。說明:如果使用tab縮進,必須設(shè)置1個tab為4個空格。IDEA設(shè)置tab為4個空格時,請勿勾選Usetabcharacter;而在eclipse中,必須勾選insertspacesfortabs。正例:(涉及1-5點)publicstaticvoidmain(String[]args){//縮進4個空格Stringsay="hello";//運算符的左右必須有一個空格intflag=0;//關(guān)鍵詞if與括號之間必須有一個空格,括號內(nèi)的f與左括號,0與右括號不需要空格if(flag==0){System.out.println(say);}//左大括號前加空格且不換行;左大括號后換行if(flag==1){System.out.println("world");//右大括號前換行,右大括號后有else,不用換行}else{System.out.println("ok");//在右大括號后直接結(jié)束,則必須換行}}(6)【強制】注釋的雙斜線與注釋內(nèi)容之間有且僅有一個空格。正例://注釋內(nèi)容,注意在//和注釋內(nèi)容之間有一個空格。(7)【強制】單行字符數(shù)限制不超過120個,超出需要換行,換行時遵循如下原則:1)第二行相對第一行縮進4個空格,從第三行開始,不再繼續(xù)縮進,參考示例。2)運算符與下文一起換行。3)方法調(diào)用的點符號與下文一起換行。4)方法調(diào)用時,多個參數(shù),需要換行時,在逗號后進行。5)在括號前不要換行,見反例。正例:StringBuffersb=newStringBuffer();//超過120個字符的情況下,換行縮進4個空格,點號和方法名稱一起換行sb.append("zi").append("xin")....append("huang")....append("huang")....append("huang");反例:StringBuffersb=newStringBuffer();//超過120個字符的情況下,不要在括號前換行sb.append("zi").append("xin")...append("huang");//參數(shù)很多的方法調(diào)用可能超過120個字符,不要在逗號前換行method(args1,args2,args3,...,argsX);(8)【強制】方法參數(shù)在定義和傳入時,多個參數(shù)逗號后邊必須加空格。正例:下例中實參的"a",后邊必須要有一個空格。method("a","b","c");(9)【強制】IDE的textfileencoding設(shè)置為UTF-8;IDE中文件的換行符使用Unix格式,不要使用Windows格式。(10)【推薦】沒有必要增加若干空格來使某一行的字符與上一行對應(yīng)位置的字符對齊。正例:inta=3;longb=4L;floatc=5F;StringBuffersb=newStringBuffer();說明:增加sb這個變量,如果需要對齊,則給a、b、c都要增加幾個空格,在變量比較多的情況下,是一種累贅的事情。(11)【推薦】方法體內(nèi)的執(zhí)行語句組、變量的定義語句組、不同的業(yè)務(wù)邏輯之間或者不同的語義之間插入一個空行。相同業(yè)務(wù)邏輯和語義之間不需要插入空行。說明:沒有必要插入多個空行進行隔開。OOP規(guī)約(1)【強制】避免通過一個類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法,無謂增加編譯器解析成本,直接用類名來訪問即可。(2)【強制】所有的覆寫方法,必須加@Override注解。說明:getObject()與get0bject()的問題。一個是字母的O,一個是數(shù)字的0,加@Override可以準確判斷是否覆蓋成功。另外,如果在抽象類中對方法簽名進行修改,其實現(xiàn)類會馬上編譯報錯。(3)【強制】相同參數(shù)類型,相同業(yè)務(wù)含義,才可以使用Java的可變參數(shù),避免使用Object。說明:可變參數(shù)必須放置在參數(shù)列表的最后。(提倡同學們盡量不用可變參數(shù)編程)正例:publicUsergetUsers(Stringtype,Integer...ids){...}(4)【強制】外部正在調(diào)用或者二方庫依賴的接口,不允許修改方法簽名,避免對接口調(diào)用方產(chǎn)生影響。接口過時必須加@Deprecated注解,并清晰地說明采用的新接口或者新服務(wù)是什么。(5)【強制】不能使用過時的類或方法。說明:.URLDecoder中的方法decode(StringencodeStr)這個方法已經(jīng)過時,應(yīng)該使用雙參數(shù)decode(Stringsource,Stringencode)。接口提供方既然明確是過時接口,那么有義務(wù)同時提供新的接口;作為調(diào)用方來說,有義務(wù)去考證過時方法的新實現(xiàn)是什么。(6)【強制】Object的equals方法容易拋空指針異常,應(yīng)使用常量或確定有值的對象來調(diào)用equals。正例:"test".equals(object);反例:object.equals("test");說明:推薦使用java.util.Objects#equals(JDK7引入的工具類)(7)【強制】所有的相同類型的包裝類對象之間值的比較,全部使用equals方法比較。說明:對于Integervar=?在-128至127范圍內(nèi)的賦值,Integer對象是在IntegerCache.cache產(chǎn)生,會復(fù)用已有對象,這個區(qū)間內(nèi)的Integer值可以直接使用==進行判斷,但是這個區(qū)間之外的所有數(shù)據(jù),都會在堆上產(chǎn)生,并不會復(fù)用已有對象,這是一個大坑,推薦使用equals方法進行判斷。(8)關(guān)于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標準如下:1)【強制】所有的POJO類屬性必須使用包裝數(shù)據(jù)類型。2)【強制】RPC方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型。3)【推薦】所有的局部變量使用基本數(shù)據(jù)類型。說明:POJO類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值,任何NPE問題,或者入庫檢查,都由使用者來保證。正例:數(shù)據(jù)庫的查詢結(jié)果可能是null,因為自動拆箱,用基本數(shù)據(jù)類型接收有NPE風險。反例:比如顯示成交總額漲跌情況,即正負x%,x為基本數(shù)據(jù)類型,調(diào)用的RPC服務(wù),調(diào)用不成功時,返回的是默認值,頁面顯示為0%,這是不合理的,應(yīng)該顯示成中劃線。所以包裝數(shù)據(jù)類型的null值,能夠表示額外的信息,如:遠程調(diào)用失敗,異常退出。(9)【強制】定義DO/DTO/VO等POJO類時,不要設(shè)定任何屬性默認值。反例:POJO類的gmtCreate默認值為newDate();但是這個屬性在數(shù)據(jù)提取時并沒有置入具體值,在更新其它字段時又附帶更新了此字段,導(dǎo)致創(chuàng)建時間被修改成當前時間。(10)【強制】序列化類新增屬性時,請不要修改serialVersionUID字段,避免反序列失?。蝗绻耆患嫒萆?,避免反序列化混亂,那么請修改serialVersionUID值。說明:注意serialVersionUID不一致會拋出序列化運行時異常。(11)【強制】構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯,如果有初始化邏輯,請放在init方法中。(12)【強制】POJO類必須寫toString方法。使用IDE的中工具:source>generatetoString時,如果繼承了另一個POJO類,注意在前面加一下super.toString。說明:在方法執(zhí)行拋出異常時,可以直接調(diào)用POJO的toString()方法打印其屬性值,便于排查問題。(13)【推薦】使用索引訪問用String的split方法得到的數(shù)組時,需做最后一個分隔符后有無內(nèi)容的檢查,否則會有拋IndexOutOfBoundsException的風險。說明:Stringstr="a,b,c,,";String[]ary=str.split(",");//預(yù)期大于3,結(jié)果是3System.out.println(ary.length);(14)【推薦】當一個類有多個構(gòu)造方法,或者多個同名方法,這些方法應(yīng)該按順序放置在一起,便于閱讀,此條規(guī)則優(yōu)先于第15條規(guī)則。(15)【推薦】類內(nèi)方法定義順序依次是:公有方法或保護方法>私有方法>getter/setter方法。說明:公有方法是類的調(diào)用者和維護者最關(guān)心的方法,首屏展示最好;保護方法雖然只是子類關(guān)心,也可能是“模板設(shè)計模式”下的核心方法;而私有方法外部一般不需要特別關(guān)心,是一個黑盒實現(xiàn);因為承載的信息價值較低,所有Service和DAO的getter/setter方法放在類體最后。(16)【推薦】setter方法中,參數(shù)名稱與類成員變量名稱一致,this.成員名=參數(shù)名。在getter/setter方法中,不要增加業(yè)務(wù)邏輯,增加排查問題的難度。反例:publicIntegergetData(){if(true){returnthis.data+100;}else{returnthis.data-100;}}(17)【推薦】循環(huán)體內(nèi),字符串的連接方式,使用StringBuilder的append方法進行擴展。說明:反編譯出的字節(jié)碼文件顯示每次循環(huán)都會new出一個StringBuilder對象,然后進行append操作,最后通過toString方法返回String對象,造成內(nèi)存資源浪費。反例:Stringstr="start";for(inti=0;i<100;i++){str=str+"hello";}(18)【推薦】final可以聲明類、成員變量、方法、以及本地變量,下列情況使用final關(guān)鍵字:1)不允許被繼承的類,如:String類。2)不允許修改引用的域?qū)ο螅纾篜OJO類的域變量。3)不允許被重寫的方法,如:POJO類的setter方法。4)不允許運行過程中重新賦值的局部變量。5)避免上下文重復(fù)使用一個變量,使用final描述可以強制重新定義一個變量,方便更好地進行重構(gòu)。(19)【推薦】慎用Object的clone方法來拷貝對象。說明:對象的clone方法默認是淺拷貝,若想實現(xiàn)深拷貝需要重寫clone方法實現(xiàn)屬性對象的拷貝。(20)【推薦】類成員與方法訪問控制從嚴:1)如果不允許外部直接通過new來創(chuàng)建對象,那么構(gòu)造方法必須是private。2)工具類不允許有public或default構(gòu)造方法。3)類非static成員變量并且與子類共享,必須是protected。4)類非static成員變量并且僅在本類使用,必須是private。5)類static成員變量如果僅在本類使用,必須是private。6)若是static成員變量,必須考慮是否為final。7)類成員方法只供類內(nèi)部調(diào)用,必須是private。8)類成員方法只對繼承類公開,那么限制為protected。說明:任何類、方法、參數(shù)、變量,嚴控訪問范圍。過于寬泛的訪問范圍,不利于模塊解耦。思考:如果是一個private的方法,想刪除就刪除,可是一個public的service方法,或者一個public的成員變量,刪除一下,不得手心冒點汗嗎?變量像自己的小孩,盡量在自己的視線內(nèi),變量作用域太大,無限制的到處跑,那么你會擔心的。集合處理(1)【強制】關(guān)于hashCode和equals的處理,遵循如下規(guī)則:1)只要重寫equals,就必須重寫hashCode。2)因為Set存儲的是不重復(fù)的對象,依據(jù)hashCode和equals進行判斷,所以Set存儲的對象必須重寫這兩個方法。3)如果自定義對象做為Map的鍵,那么必須重寫hashCode和equals。說明:String重寫了hashCode和equals方法,所以我們可以非常愉快地使用String對象作為key來使用。(2)【強制】ArrayList的subList結(jié)果不可強轉(zhuǎn)成ArrayList,否則會拋出ClassCastException異常,即java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList說明:subList返回的是ArrayList的內(nèi)部類SubList,并不是ArrayList,而是ArrayList的一個視圖,對于SubList子列表的所有操作最終會反映到原列表上。(3)【強制】在subList場景中,高度注意對原集合元素個數(shù)的修改,會導(dǎo)致子列表的遍歷、增加、刪除均會產(chǎn)生ConcurrentModificationException異常。(4)【強制】使用集合轉(zhuǎn)數(shù)組的方法,必須使用集合的toArray(T[]array),傳入的是類型完全一樣的數(shù)組,大小就是list.size()。說明:使用toArray帶參方法,入?yún)⒎峙涞臄?shù)組空間不夠大時,toArray方法內(nèi)部將重新分配內(nèi)存空間,并返回新數(shù)組地址;如果數(shù)組元素大于實際所需,下標為[list.size()]的數(shù)組元素將被置為null,其它數(shù)組元素保持原值,因此最好將方法入?yún)?shù)組大小定義與集合元素個數(shù)一致。正例:List<String>list=newArrayList<String>(2);list.add("guan");list.add("bao");String[]array=newString[list.size()];array=list.toArray(array);反例:直接使用toArray無參方法存在問題,此方法返回值只能是Object[]類,若強轉(zhuǎn)其它類型數(shù)組將出現(xiàn)ClassCastException錯誤。(5)【強制】使用工具類Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時,不能使用其修改集合相關(guān)的方法,它的add/remove/clear方法會拋出UnsupportedOperationException異常。說明:asList的返回對象是一個Arrays內(nèi)部類,并沒有實現(xiàn)集合的修改方法。Arrays.asList體現(xiàn)的是適配器模式,只是轉(zhuǎn)換接口,后臺的數(shù)據(jù)仍是數(shù)組。String[]str=newString[]{"you","wu"};Listlist=Arrays.asList(str);第一種情況:list.add("yangguanbao");運行時異常。第二種情況:str[0]="gujin";那么list.get(0)也會隨之修改。(6)【強制】泛型通配符<?extendsT>來接收返回的數(shù)據(jù),此寫法的泛型集合不能使用add方法,而<?superT>不能使用get方法,做為接口調(diào)用賦值時易出錯。說明:擴展說一下PECS(ProducerExtendsConsumerSuper)原則:第一、頻繁往外讀取內(nèi)容的,適合用<?extendsT>。第二、經(jīng)常往里插入的,適合用<?superT>。(7)【強制】不要在foreach循環(huán)里進行元素的remove/add操作。remove元素請使用Iterator方式,如果并發(fā)操作,需要對Iterator對象加鎖。正例:Iterator<String>iterator=list.iterator();while(iterator.hasNext()){Stringitem=iterator.next();if(刪除元素的條件){iterator.remove();}}反例:List<String>list=newArrayList<String>();list.add("1");list.add("2");for(Stringitem:list){if("1".equals(item)){list.remove(item);}}說明:以上代碼的執(zhí)行結(jié)果肯定會出乎大家的意料,那么試一下把“1”換成“2”,會是同樣的結(jié)果嗎?(8)【強制】在JDK7版本及以上,Comparator要滿足如下三個條件,不然Arrays.sort,Collections.sort會報IllegalArgumentException異常。說明:三個條件如下1)x,y的比較結(jié)果和y,x的比較結(jié)果相反。2)x>y,y>z,則x>z。3)x=y,則x,z比較結(jié)果和y,z比較結(jié)果相同。反例:下例中沒有處理相等的情況,實際使用中可能會出現(xiàn)異常:newComparator<Student>(){@Overridepublicintcompare(Studento1,Studento2){returno1.getId()>o2.getId()?1:-1;}};(9)【推薦】集合初始化時,指定集合初始值大小。說明:HashMap使用HashMap(intinitialCapacity)初始化。正例:initialCapacity=(需要存儲的元素個數(shù)/負載因子)+1。注意負載因子(即loaderfactor)默認為0.75,如果暫時無法確定初始值大小,請設(shè)置為16(即默認值)。反例:HashMap需要放置1024個元素,由于沒有設(shè)置容量初始大小,隨著元素不斷增加,容量7次被迫擴大,resize需要重建hash表,嚴重影響性能。(10)【推薦】使用entrySet遍歷Map類集合KV,而不是keySet方式進行遍歷。說明:keySet其實是遍歷了2次,一次是轉(zhuǎn)為Iterator對象,另一次是從hashMap中取出key所對應(yīng)的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。正例:values()返回的是V值集合,是一個list集合對象;keySet()返回的是K值集合,是一個Set集合對象;entrySet()返回的是K-V值組合集合。(11)【推薦】高度注意Map類集合K/V能不能存儲null值的情況,如下表格:集合類KeyValueSuper說明Hashtable不允許為null不允許為nullDictionary線程安全ConcurrentHashMap不允許為null不允許為nullAbstractMap鎖分段技術(shù)(JDK8:CAS)TreeMap不允許為null允許為nullAbstractMap線程不安全HashMap允許為null允許為nullAbstractMap線程不安全反例:由于HashMap的干擾,很多人認為ConcurrentHashMap是可以置入null值,而事實上,存儲null值時會拋出NPE異常。(12)【參考】合理利用好集合的有序性(sort)和穩(wěn)定性(order),避免集合的無序性(unsort)和不穩(wěn)定性(unorder)帶來的負面影響。說明:有序性是指遍歷的結(jié)果是按某種比較規(guī)則依次排列的。穩(wěn)定性指集合每次遍歷的元素次序是一定的。如:ArrayList是order/unsort;HashMap是unorder/unsort;TreeSet是order/sort。(13)【參考】利用Set元素唯一的特性,可以快速對一個集合進行去重操作,避免使用List的contains方法進行遍歷、對比、去重操作。并發(fā)處理(1)【強制】獲取單例對象需要保證線程安全,其中的方法也要保證線程安全。說明:資源驅(qū)動類、工具類、單例工廠類都需要注意。(2)【強制】創(chuàng)建線程或線程池時請指定有意義的線程名稱,方便出錯時回溯。正例:publicclassTimerTaskThreadextendsThread{publicTimerTaskThread(){super.setName("TimerTaskThread");...}(3)【強制】線程資源必須通過線程池提供,不允許在應(yīng)用中自行顯式創(chuàng)建線程。說明:使用線程池的好處是減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷,解決資源不足的問題。如果不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導(dǎo)致消耗完內(nèi)存或者“過度切換”的問題。(4)【強制】線程池不允許使用Executors去創(chuàng)建,而是通過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規(guī)則,規(guī)避資源耗盡的風險。說明:Executors返回的線程池對象的弊端如下:1)FixedThreadPool和SingleThreadPool:允許的請求隊列長度為Integer.MAX_VALUE,可能會堆積大量的請求,從而導(dǎo)致OOM。2)CachedThreadPool和ScheduledThreadPool:允許的創(chuàng)建線程數(shù)量為Integer.MAX_VALUE,可能會創(chuàng)建大量的線程,從而導(dǎo)致OOM。(5)【強制】SimpleDateFormat是線程不安全的類,一般不要定義為static變量,如果定義為static,必須加鎖,或者使用DateUtils工具類。正例:注意線程安全,使用DateUtils。亦推薦如下處理:privatestaticfinalThreadLocal<DateFormat>df=newThreadLocal<DateFormat>(){@OverrideprotectedDateFormatinitialValue(){returnnewSimpleDateFormat("yyyy-MM-dd");}};說明:如果是JDK8的應(yīng)用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat,官方給出的解釋:simplebeautifulstrongimmutablethread-safe。(6)【強制】高并發(fā)時,同步調(diào)用應(yīng)該去考量鎖的性能損耗。能用無鎖數(shù)據(jù)結(jié)構(gòu),就不要用鎖;能鎖區(qū)塊,就不要鎖整個方法體;能用對象鎖,就不要用類鎖。說明:盡可能使加鎖的代碼塊工作量盡可能的小,避免在鎖代碼塊中調(diào)用RPC方法。(7)【強制】對多個資源、數(shù)據(jù)庫表、對象同時加鎖時,需要保持一致的加鎖順序,否則可能會造成死鎖。說明:線程一需要對表A、B、C依次全部加鎖后才可以進行更新操作,那么線程二的加鎖順序也必須是A、B、C,否則可能出現(xiàn)死鎖。(8)【強制】并發(fā)修改同一記錄時,避免更新丟失,需要加鎖。要么在應(yīng)用層加鎖,要么在緩存加鎖,要么在數(shù)據(jù)庫層使用樂觀鎖,使用version作為更新依據(jù)。說明:如果每次訪問沖突概率小于20%,推薦使用樂觀鎖,否則使用悲觀鎖。樂觀鎖的重試次數(shù)不得小于3次。(9)【強制】多線程并行處理定時任務(wù)時,Timer運行多個TimeTask時,只要其中之一沒有捕獲拋出的異常,其它任務(wù)便會自動終止運行,使用ScheduledExecutorService則沒有這個問題。(10)【推薦】使用CountDownLatch進行異步轉(zhuǎn)同步操作,每個線程退出前必須調(diào)用countDown方法,線程執(zhí)行代碼注意catch異常,確保countDown方法被執(zhí)行到,避免主線程無法執(zhí)行至await方法,直到超時才返回結(jié)果。說明:注意,子線程拋出異常堆棧,不能在主線程try-catch到。(11)【推薦】避免Random實例被多線程使用,雖然共享該實例是線程安全的,但會因競爭同一seed導(dǎo)致的性能下降。說明:Random實例包括java.util.Random的實例或者Math.random()的方式。正例:在JDK7之后,可以直接使用APIThreadLocalRandom,而在JDK7之前,需要編碼保證每個線程持有一個實例。(12)【推薦】在并發(fā)場景下,通過雙重檢查鎖(double-checkedlocking)實現(xiàn)延遲初始化的優(yōu)化問題隱患(可參考The"Double-CheckedLockingisBroken"Declaration),推薦解決方案中較為簡單一種(適用于JDK5及以上版本),將目標屬性聲明為volatile型。反例:classSingleton{privateHelperhelper=null;publicHelpergetHelper(){if(helper==null)synchronized(this){if(helper==null)helper=newHelper();}returnhelper;}//othermethodsandfields...}(13)【參考】volatile解決多線程內(nèi)存不可見問題。對于一寫多讀,是可以解決變量同步問題,但是如果多寫,同樣無法解決線程安全問題。如果是count++操作,使用如下類實現(xiàn):AtomicIntegercount=newAtomicInteger();count.addAndGet(1);如果是JDK8,推薦使用LongAdder對象,比AtomicLong性能更好(減少樂觀鎖的重試次數(shù))。(14)【參考】HashMap在容量不夠進行resize時由于高并發(fā)可能出現(xiàn)死鏈,導(dǎo)致CPU飆升,在開發(fā)過程中可以使用其它數(shù)據(jù)結(jié)構(gòu)或加鎖來規(guī)避此風險。(15)【參考】ThreadLocal無法解決共享對象的更新問題,ThreadLocal對象建議使用static修飾。這個變量是針對一個線程內(nèi)所有操作共享的,所以設(shè)置為靜態(tài)變量,所有此類實例共享此靜態(tài)變量,也就是說在類第一次被使用時裝載,只分配一塊存儲空間,所有此類的對象(只要是這個線程內(nèi)定義的)都可以操控這個變量。控制語句(1)【強制】在一個switch塊內(nèi),每個case要么通過break/return等來終止,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個case為止;在一個switch塊內(nèi),都必須包含一個default語句并且放在最后,即使它什么代碼也沒有。(2)【強制】在if/else/for/while/do語句中必須使用大括號。即使只有一行代碼,避免采用單行的編碼方式:if(condition)statements;(3)【推薦】表達異常的分支時,少用if-else方式,這種方式可以改寫成:if(condition){...returnobj;}//接著寫else的業(yè)務(wù)邏輯代碼;說明:如果非得使用if()...elseif()...else...方式表達邏輯,【強制】避免后續(xù)代碼維護困難,請勿超過3層。正例:超過3層的if-else的邏輯判斷代碼可以使用衛(wèi)語句、策略模式、狀態(tài)模式等來實現(xiàn),其中衛(wèi)語句示例如下:publicvoidtoday(){if(isBusy()){System.out.println(“changetime.”);return;}if(isFree()){System.out.println(“gototravel.”);return;}System.out.println(“stayathometolearnAlibabaJavaCodingGuidelines.”);return;}(4)【推薦】除常用方法(如getXxx/isXxx)等外,不要在條件判斷中執(zhí)行其它復(fù)雜的語句,將復(fù)雜邏輯判斷的結(jié)果賦值給一個有意義的布爾變量名,以提高可讀性。說明:很多if語句內(nèi)的邏輯相當復(fù)雜,閱讀者需要分析條件表達式的最終結(jié)果,才能明確什么樣的條件執(zhí)行什么樣的語句,那么,如果閱讀者分析邏輯表達式錯誤呢?正例://偽代碼如下finalbooleanexisted=(file.open(fileName,"w")!=null)&&(...)||(...);if(existed){...}反例:if((file.open(fileName,"w")!=null)&&(...)||(...)){...}(5)【推薦】循環(huán)體中的語句要考量性能,以下操作盡量移至循環(huán)體外處理,如定義對象、變量、獲取數(shù)據(jù)庫連接,進行不必要的try-catch操作(這個try-catch是否可以移至循環(huán)體外)。(6)【推薦】接口入?yún)⒈Wo,這種場景常見的是用于做批量操作的接口。(7)【參考】下列情形,需要進行參數(shù)校驗:1)調(diào)用頻次低的方法。2)執(zhí)行時間開銷很大的方法。此情形中,參數(shù)校驗時間幾乎可以忽略不計,但如果因為參數(shù)錯誤導(dǎo)致中間執(zhí)行回退,或者錯誤,那得不償失。3)需要極高穩(wěn)定性和可用性的方法。4)對外提供的開放接口,不管是RPC/API/HTTP接口。5)敏感權(quán)限入口。(8)【參考】下列情形,不需要進行參數(shù)校驗:1)極有可能被循環(huán)調(diào)用的方法。但在方法說明里必須注明外部參數(shù)檢查要求。2)底層調(diào)用頻度比較高的方法。畢竟是像純凈水過濾的最后一道,參數(shù)錯誤不太可能到底層才會暴露問題。一般DAO層與Service層都在同一個應(yīng)用中,部署在同一臺服務(wù)器中,所以DAO的參數(shù)校驗,可以省略。3)被聲明成private只會被自己代碼所調(diào)用的方法,如果能夠確定調(diào)用方法的代碼傳入?yún)?shù)已經(jīng)做過檢查或者肯定不會有問題,此時可以不校驗參數(shù)。注釋規(guī)約(1)【強制】類、類屬性、類方法的注釋必須使用Javadoc規(guī)范,使用/**內(nèi)容*/格式,不得使用//xxx方式。說明:在IDE編輯窗口中,Javadoc方式會提示相關(guān)注釋,生成Javadoc可以正確輸出相應(yīng)注釋;在IDE中,工程調(diào)用方法時,不進入方法即可懸浮提示方法、參數(shù)、返回值的意義,提高閱讀效率。(2)【強制】所有的抽象方法(包括接口中的方法)必須要用Javadoc注釋、除了返回值、參數(shù)、異常說明外,還必須指出該方法做什么事情,實現(xiàn)什么功能。說明:對子類的實現(xiàn)要求,或者調(diào)用注意事項,請一并說明。(3)【強制】所有的類都必須添加創(chuàng)建者和創(chuàng)建日期。(4)【強制】方法內(nèi)部單行注釋,在被注釋語句上方另起一行,使用//注釋。方法內(nèi)部多行注釋使用/**/注釋,注意與代碼對齊。(5)【強制】所有的枚舉類型字段必須要有注釋,說明每個數(shù)據(jù)項的用途。(6)【推薦】與其“半吊子”英文來注釋,不如用中文注釋把問題說清楚。專有名詞與關(guān)鍵字保持英文原文即可。反例:“TCP連接超時”解釋成“傳輸控制協(xié)議連接超時”,理解反而費腦筋。(7)【推薦】代碼修改的同時,注釋也要進行相應(yīng)的修改,尤其是參數(shù)、返回值、異常、核心邏輯等的修改。說明:代碼與注釋更新不同步,就像路網(wǎng)與導(dǎo)航軟件更新不同步一樣,如果導(dǎo)航軟件嚴重滯后,就失去了導(dǎo)航的意義。(8)【參考】謹慎注釋掉代碼。在上方詳細說明,而不是簡單地注釋掉。如果無用,則刪除。說明:代碼被注釋掉有兩種可能性:1)后續(xù)會恢復(fù)此段代碼邏輯。2)永久不用。前者如果沒有備注信息,難以知曉注釋動機。后者建議直接刪掉(代碼倉庫保存了歷史代碼)。(9)【參考】對于注釋的要求:第一、能夠準確反應(yīng)設(shè)計思想和代碼邏輯;第二、能夠描述業(yè)務(wù)含義,使別的程序員能夠迅速了解到代碼背后的信息。完全沒有注釋的大段代碼對于閱讀者形同天書,注釋是給自己看的,即使隔很長時間,也能清晰理解當時的思路;注釋也是給繼任者看的,使其能夠快速接替自己的工作。(10)【參考】好的命名、代碼結(jié)構(gòu)是自解釋的,注釋力求精簡準確、表達到位。避免出現(xiàn)注釋的一個極端:過多過濫的注釋,代碼的邏輯一旦修改,修改注釋是相當大的負擔。反例://putelephantintofridgeput(elephant,fridge);方法名put,加上兩個有意義的變量名elephant和fridge,已經(jīng)說明了這是在干什么,語義清晰的代碼不需要額外的注釋。(11)【參考】特殊注釋標記,請注明標記人與標記時間。注意及時處理這些標記,通過標記掃描,經(jīng)常清理此類標記。線上故障有時候就是來源于這些標記處的代碼。1)待辦事宜(TODO):(標記人,標記時間,[預(yù)計處理時間])表示需要實現(xiàn),但目前還未實現(xiàn)的功能。這實際上是一個Javadoc的標簽,目前的Javad

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論