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