言
系統的技術架構(相對于業務架構),主要會考慮下面5個點:
高性能、高可用、可伸縮、可擴展、安全。
一、高性能
1、架構層面
1.1、緩存
瀏覽器緩存
CDN緩存
反向代理緩存
本地緩存
分布式緩存
緩存注意的點:
1)避免緩存穿透:把空對象保存在內存緩存里
2)緩存與數據庫的數據一致性:Cache Aside模式:先更新DB,再清除緩存,DB主從同步完成后,再清理緩存。
1.2、異步
本地隊列
分布式隊列
1.3、資源復用
線程池、連接池、對象池
單例
2、代碼層面
2.1、多線程
線程池,線程數與CPU核數相關:看IO密集型還是計算密集型
線程數=(任務執行時間 / (任務執行時間 - IO等待時間))* CPU核數
2.2、內存:空間換時間
2.3、鎖
盡量不用鎖
非要用鎖,盡量降低鎖粒度、控制鎖總數、盡量使用無鎖框架CAS,putIfAbsent等
2.4、數據結構的時間復雜度
Skiplist 替代 TreeMap
2.5、訪問量大時可批量請求,降低請求次數
Kafka producer批量請求
3、DB層面
3.1、索引
InnoDB引擎 默認BTree+ 索引
3.2、SQL優化
3.3、NoSQL
4、附錄:衡量性能指標
4.1、TPS & QPS
4.2、系統性能參數:CPU Load Average, CPU User Usage, 內存,網絡IO,磁盤IOPS
CPU Load Average:平均每核CPU,理想值在100%
CPU User Usage:理想值在70%以內
4.3、響應時間
4.4、并發數:并發訪問數、在線用戶數
二、高可用
1、冗余:數據冗余 & 依賴服務冗余
2、限流、降級、熔斷
3、故障自愈
4、自動擴縮容
5、自動化運維
6、自動化測試
7、預發布測試
8、灰度發布
9、服務自動失效轉移
10、多維度監控,告警逐步升級
維度1:客戶端APM打點 & Server端監控
維度2:業務級監控 & 系統指標參數監控
自動化巡檢,發現問題
三、可伸縮
1、應用層可伸縮:無狀態服務
微服務的拆分方式:
1)橫向拆分:拆分成職責不同的應用:如chatroom和CMP
2)縱向拆分:如chatroom和chatroommessage服務
每個微服務都要可水平擴展
2、緩存層可伸縮:Redis容器云方案
Redis Cluster集群模式的負載均衡策略:槽位遷移
3、關系型數據庫:在DB上游通過Proxy保證可伸縮
4、NoSQL:天然可伸縮
四、易擴展
易擴展主要指微服務的拆分時保證每個微服務“高內聚、低耦合”
1、應用間通過隊列異步解耦
2、分布式微服務
五、安全
1、密碼和手機校驗碼做身份認證
用戶對于開放http API接口訪問時,要攜帶秘鑰做簽名認證
2、登錄、交易、敏感數據等,對網絡通信做加密
加解密方式:
1)單向散列加密:如MD5,SHA等,通常加密后加點salt。
單向加密不可逆,僅能比較加密后數據是否一致,如用于做密碼校驗,但不能還原密碼。
2)對稱加密:即加密和解密用同一個秘鑰,如DES,RC等
優點:算法簡單、性能快
缺點:加解密用同一個秘鑰,不夠安全。
3)非對稱加密:加密和解密用不同的秘鑰,如RSA等
一個對外公開,叫公鑰;一個只有網站系統知道,叫私鑰
用公鑰加密的信息,必須用私鑰才能解密;反之,用私鑰加密的信息,用公鑰才能解開。
3、請求編碼轉換,避免XSS攻擊、SQL注入等
1)XSS(Cross Site Script):指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載并執行攻擊者惡意制造的網頁程序。
這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。
攻擊成功后,攻擊者可能得到包括但不限于更高的權限(如執行一些操作)、私密網頁內容、會話和cookie、密碼等各種內容。
防攻擊手段:
1)消毒:對某些HTML危險字符轉義,如">"轉義為“>”等
2)HttpOnly:禁止瀏覽器JS訪問帶有HttpOnly屬性的cookie。即對于存敏感信息的cookie,如用戶密碼等,未該cookie添加HttpOnly屬性,防止被JavaScript竊取
2)SQL注入
通過預編譯參數綁定,如ibatis, hibernate等框架都實現了參與預綁定。
4、敏感詞過濾
原文鏈接:https://blog.csdn.net/shijinghan1126/article/details/117906768
vb啊,這回你明白了
一直想寫VB相關的內容,把實踐過的感悟總結成文,分享給更多在途的朋友。本篇在《明比閱歷淺,暗拼體力衰,指下講武德,碼上笑春風 》的鋪排下,終于等來了這個時機。前篇為廣大非IT人士開啟IT之路提供了務實的指引,此篇則更深入介紹其中的途徑。這讓人有點興奮,又有點緊張。興奮的是,這么多經驗可讓人少些浮躁,多干實事,少走彎路。緊張的是,怕不夠客觀,誤人入了歧途。
那就擬揚先挫吧,兼聽則明,偏信則暗嘛。正視自己的短處,才能揚長避短。若是無法接受,提早打住,另謀出處,也未嘗不是件好事。
1、無論是VB的使用者還是其他語言的編碼人員,VB處于鄙視鏈末端,這是不爭的事實。
2、VB的職業開發需求少,招聘VB的鳳毛麟角。學習混不到職業前途,這是不爭的事實。
3、VB在Windows中扎根太深,猶如彼時的IE。在眾多OS不斷崛起的今天,跨平臺的戰斗,注定要落下VB這位老臣。VB6在上個世紀末就未再更新,Win8以后官方未再宣稱系統級支持,VB6進無可進,這是不爭的事實。
4、VB6到VB.Net之間的大跨越,終結了VB的后向兼容,導致曾經的項目難以進行無縫的現代化升級。老項目無法使用更現代化的工具,維護效率低下。VB.Net這個新物種不但沒攬到早前VB的生態,連官方支持也不如C#。VB.Net將VB6封印,在商業競爭上,自己卻進不如C#,退不如VB6。VB項目生態的不可持續性,被編碼人員篤定,這是不爭的事實。
5、VB虛擬機的過渡代勞,讓剛入行的初學者安全自在,卻也困住了想起飛的入門者,讓其舉步維艱。編碼者就像VB的崽,時常處于VB媽媽的監控之中。沒有指針、無繼承、太爛的多線程、不支持內嵌匯編…,不易擴展,更不能跨平臺,不時尚土鱉像古董,這讓專業開發人員非常鄙視,這也是不爭的事實。
6、VB沒落了嗎?沒落了,這是一邊倒的聲音。
這么一數落,似乎VB無藥可救,一無是處了。沒有調查就沒有發言權,要想客觀評價,不得不回看VB的歷史。
1、1988年,QuickBASIC就已風靡DOS系統,實時語法糾錯,可移植,在IDE中啟動。
2、1991年,隨著Windows3.0一起,VB1.0正式誕生。脫胎于QuickBASIC語法,事件驅動,可視化IDE。Win3.0圖形界面的巨大成功,讓VB迅速獲得開發者的青睞。事件驅動更是對以往過程式驅動的一聲驚雷,革命性BASIC成為佳話。
3、1992年,隨著Win3.1的持續加碼,VB2.0繼續深挖系統特性,幾個月后就出了VB3.0。對象變量擁有最早的繼承特性,對控件(VBX、OLE)的支持,對數據庫(ODBC、JET)的支持,讓此時的VB可開發出相當有水平的Windows程序。此時,針對VB虛擬機的P代碼效率問題,競爭者Delphi才應運而生(其設計者也正是后來C#的設計者)。
4、1995年,在硬件更新換代的背景下,VB4.0誕生了。Windows開始走向32位系統時,VB則開始擁抱COM,定位也轉向Visual Basic For Application。自此,VB與Office的宏語言統一起來,緊抱Office這顆大樹,也是VB日后的免死金牌。全新的控件(OCX)、類模塊奠定了VB面向對象的特性,其封裝性(DLL)也使得VB成為COM的語言。
5、1997年,COM(ActiveX)技術已相當成熟,此時的VB5.0對其提供了最強支持。該版不僅對Visual Basic For Application進行了完善和豐富,更是提供了代碼的本地編譯器。自此,VB在性能上終于有了質的提升。此時的VB不但可開發自己的ActiveX組件、還可開發進程內外COM組件(ActiveXDLL、ActiveXEXE),更是可以開發在瀏覽器中運行的ActiveX文檔。其IDE的智能感知,也極大地提高了開發效率。
6、1998年,以Visual Studio 6.0家族成員的方式發布了VB6.0,微軟將其定位為企業級快速開發工具。VB6集成的各項特性,足夠企業快速建立多層分布式系統及Web應用程序。此后近4年均未更新,顯示出了VB6的成熟和穩定。
7、2002年,在Java的逼迫下,Visual Studio.NET1.0問世。.NET框架下的VB,除了語法風格與經典VB類似外,其實就是全新設計的開發語言。在激烈的市場競爭中,VB6沒能等來繼任者,成為最后的經典。
此后的VB.Net波瀾起伏,將經典VB積累的生態揮霍殆盡,大量的專業開發人員轉投了C#。VB.Net出生如同VB4.0,有戰略上的急迫,更有自身的失誤。在不能后向兼容經典VB的情況下,又在革新時錯失了市場,才導致今天雞肋的地位。
VB.Net幾經周折,盡管已足夠強大,足夠安全,足夠易用,在使用習慣上也已高度還原VB6,甚至很多官方文檔也可被VB6采用,但畢竟已是新的開發工具。VB.Net在.NET框架下不如C#,在企業級快速開發上也不能替代掉VB6,在這樣的夾縫中,VB.Net的未來注定任重而道遠。
不得不承認VB(以下VB若無特別說明,僅指VB6)曾是最流行的開發工具之一,據說其生產的代碼量是C++的數十倍之多,數不清的應用活躍在各大企業生產的田邊地角。然而成也蕭何,敗也蕭何,VB最大的問題竟在于其過于成功。
它極為有效地降低了初級程序員的學習難度,幾乎所有人都可以用VB進行編程。職員、學生紛紛加入,輕易解決其他平臺實現起來更困難的問題。因為VB太好用了,也從來不苛責不良的開發習慣,所以到處都是新手,到處都是質量低劣的機械式代碼,成了殺雞焉用牛刀的最佳詮釋。
對于VB,素有”沉默的大多數”的說法。據說只有3%的用戶能發出VB不好,希望官方改進的聲音,其余97%的用戶覺得VB挺好,沒有什么需要改的。當VB.Net1.0的Beta1出來的時候,與VB6天翻地覆的差異,直接把提要求的那3%給搞蒙,搞害怕了,進而轉投C#去了。其余的97%仍然覺得VB6挺好,沒什么需要改的。所以,在業界VB從企業級快速開發工具淪落為小學生的玩具,也就不足為奇。
這也正是我在《明比閱歷淺,暗拼體力衰,指下講武德,碼上笑春風 》中,極力推薦VB的主要原因。太好用,太容易用,輕易就可達成初級程序員的目標,的確具有吸引力。時至今日,由這97%周轉的,機械的,功能有限的代碼,解決著很大一部分實際生產中遇到的問題。實用性是VB得以茍延殘喘的法寶,也正符合非IT人士對IT的需求。
1、幾乎很難找得到像VB這樣拖拖拉拉就能完全繪制用戶界面并快速編碼的工具,這是VB與Windows與生俱來的血脈關系造就的。
2、幾乎很難找得到像VB這樣允許程序員在IDE中運行、發現并修改錯誤、并在修改結果上繼續的編程環境,即便停更十余年也不公開源碼,可見的確獨到。
多如繁星的VB項目,使得官方不得不一而再再而三延長系統支持,據稱官方至少覆蓋了整個Win8生命周期。而實際情況卻是,在號稱最后1個Windows版本的Win10上也活得怪好。相信職員、學生一類非專業開發人員還會繼續紛至沓來,在沒有足夠投入的情況下,繼續生產功能夠用的代碼,就像打不死的”小強”,在自己的領域里堅強地做著自己的事情?;蛟S,VB看上去就要落幕了,但即便是真的,只要WIN32開發不被淘汰,Office還能繼續為生產賣力,VB就不會消失。相反,VB會成為1個遺留產品,一個被忽視的沒有激情,也沒有未來的工具。
爭論了半天VB的好壞和前途,跟你我有半毛錢關系?這是一個關于名為VB軟件后續升級的討價還價。不升級就死掉了么?就像用鋤頭和拖拉機種地,別人說鋤頭變不了拖拉機,因此鋤頭要死了,用鋤頭的也要死了。
鋤頭郁悶了,你用或不用,我都靜靜的在那里,不悲不喜。種地的也郁悶了,是我家地不能用鋤頭了,還是鋤頭種的糧食不能吃了?縱使一馬平川的主場,也有顧不到的田邊地角,更何況還有崎嶇的山地??v使師資再好,北大清華也是少數,允許你3%,就不允許我97%?所以,你一開拖拉機的,爬上我這山頭,對著我的鋤頭,瞎得瑟什么呀?賣拖拉機的錢裝你兜里?你種的是糧食,我鋤頭種的就不是了?你能上我山頭,我就不能下到你山腳?
VB是生產的鋤頭,只要Windows這塊地沒變天,以前種的糧也沒壞,那就可以繼續吃,鋤頭也可繼續用。允許3%的人去開拖拉機,種更多的口糧。也允許97%的人在自留地里揮舞鋤頭種點瓜果副食。
VB在4.0就轉向Visual Basic For Application,與Office的聯姻,才是VB容顏不老的秘訣。VB6雖然沒等到7.0,但VBA卻進化到了7.0,跟著Office到了64位Win10的地界。VB、VBA和VBS之間,以及與Office32/64之間的關系,隨后會專題深入介紹,請繼續關注 BtOfficer獲取相應內容。
VB6是32位Windows上COM的語言,只要Windows擺脫不了COM、擺脫不了WIN32子系統,VB6就會無比堅定的存活下去。VB6與VC6之間的關系,VB6與C/C++的互通,32位VB與64位系統的兼容,隨后會有專題深入介紹,請繼續關注BtOfficer獲取相應內容。
VB5.0就加入了本地代碼編譯器,從某種程度上說,之后的系統無論是否原生支持,對VB而言都不再是束縛。VB6的編譯器原理,編譯器的深度使用,隨后會有專題深入介紹,請繼續關注BtOfficer獲取相應內容。
縱觀VB的歷史,從其誕生那天起,VB的使命就是要打出Windows系統特性這幅王炸牌。說VB是Windows的大家閨秀也毫不為過,VB其實就是系統附帶的生產力。VB更多的角色不是編譯器的腳本,而是充當系統的命令,直接調配資源組織生產。所以,VB的虛擬機才那么短小精悍,VB的應用才那么容易既快又準的落地。VB6的虛擬機,VB6與WIN32編程,VB6與VB.Net資源共享等,以后會有專題深入介紹,請繼續關注BtOfficer獲取相應內容。
遺憾的同時,也慶幸VB6沒有繼續走遠,成了系統身邊那個永遠不嫁的姑娘。雖然系統爸爸的勢力范圍越來越大,但最核心的,始終近在眼前。撥開安全的層層迷霧,指針、線程、繼承、內嵌匯編等一眾C的手腳,托起了那97%的任性。尤其是內嵌匯編,為VB6插上了想象的翅膀,成為VB6名副其實的免死金牌。VB6的指針、安全多線程、內嵌匯編等內容,以后會有專題深入介紹,請繼續關注BtOfficer獲取相應內容。
3%的那部分從VB這個小學畢業后,升了初中,以后還會上高中念大學。也會有更多97%的這部分不斷等著VB開學。在普通人通往程序之路上,VB就像擺渡人,接來一批又送走一批。VB存世的意義,或許就在于既普世又度人。心清腦秀者,許你3%得道升華。資歷平平者,也許你97%的凡人吃喝。
VB的世界里有自由的周全,也有刻薄的束縛。她試圖讓所有人都能踏進編程的世界,并在這個晦澀的世界里護其周全。她也總拿自由不是沒有代價來告誡使用者,知其然還要知其所以然,到遠方去才是旅游的意義。