【JAVA進階架構師指南】之一:如何進行架構設計


前言

  本博客是長篇系列博客,旨在幫助想提升自己,突破技術瓶頸,但又苦於不知道如何進行系統學習從而提升自己的童鞋.筆者假設讀者具有3-5年開發經驗,java基礎扎實,想突破自己的技術瓶頸,成為一位優秀的架構師,所謂java基礎扎實,比如:
  1.java語言三大特性.
  2.java語言八大基本類型及其表示范圍.
  3.為什么float和double存在精度丟失?
  4.publish/private/default/protected表示的范圍?
  5.static/final的用法及含義.
  一位Java基礎扎實的童鞋,以上問題應該都能答上來,並且能知其然知其所以然,從底層原理明白為什么是這樣的,在具備這些基礎后,才能進階突破自己,成為更優秀的工程師.

  當然,本系列文章為筆者原創,許多觀點都是筆者自己的觀點,假如有不正確或者想和筆者討論的,歡迎至極,畢竟每個人都會犯錯,大家一起進步豈不妙哉!

如何成為一名架構師?

  筆者認為,想成為一名架構師,首先第一點必然是你的技術足夠優秀,知識的深度和廣度足夠,遇到問題能很快從腦海中尋找出最合適的解決之道.其次,架構師會從整體上領導項目,與人打交道必不可少,因此與人溝通這些軟技能也必不可少,當然,這個因人而異,有些人天生更會與人打交道,但無論如何,技術足夠優秀是基本條件.當然,想成為一名優秀的架構師,實際開發經驗是必不可少的,沒有多年架構師的經驗也不行,但至少,我們想成為一名架構師,理論知識得先掌握不是嗎?否則談何實踐呢?因此,我總結了一張JAVA架構師進階學習圖譜:
file
  當然還有許多技術和技能也是需要的,比如:架構師要進行文檔輸出,會需要畫相關的圖,常見的比如:流程圖/用例圖/時序圖/泳道圖/狀態圖/協作圖等等(回憶一下這些課程在大學的時候是不是老師都講過?只是我們當時不在意罷了,至少筆者是這樣的,哈哈~).再比如java反射機制及其相關API,高性能NIO---Netty框架等等.如果是大數據相關還需要我們了解flink/blink/spark/hadoop/hbase,不一定全都要會,但是至少腦子里面要有個概念,這個技術是干嘛用的,以至於別人說的時候能聽得懂.至於為什么沒有畫在上面的圖中,是因為筆者后續的文章只准備寫圖中的內容,其余的留給童鞋們自己去學習吧.當然,因為博客篇幅所限,每種技術不可能百分百把所有知識點都講到,但是保證講的全部都是干貨,能讓讀完的童鞋有所收獲!

架構師應該關注什么?

  這個問題,換句話說,是我們在進行架構設計的時候應該關注什么,筆者認為從大的層面來講分兩類,功能性需求以及非功能性需求,細分的話有以下六個方面:

1.功能

  記得我的老師曾說過,功能是0,其余的是1,再牛逼的架構師,如果不滿足功能,再牛逼的設計也是沒用的,只有在滿足功能的前提下,其他的設計才有用.

2.性能

  對現代系統來說,響應時間越短就越可能留住用戶,畢竟誰會忍受打開一個頁面要等待10秒甚至幾分鍾呢?至少筆者在訪問任何網站的時候,一個網頁加載5秒以上就直接關了.常用的性能指標有QPS(每秒查詢速率)/TPS(每秒事務處理率).當然,性能需要在系統開發完成后進行預發環境(和生產環境一樣的環境)測試,常用的性能測試工具有apachebench(簡稱ab)/http_load/jmeter等等.QPS也遵循28原則,一天中80%的訪問量集中在20%的時間內,可以據此估算網站的QPS,從而規划服務器配置,如果性能不達標,則需要優化,常見的優化手段有加機器(簡單粗暴),前端優化(CDN/動靜分離/減少請求次數/),后端代碼優化,緩存(如redis),JVM優化.

3.可用性

  可用性是對現代分布式系統來說,當其子系統有一個或幾個節點宕機的時候,是否還能繼續提供正常的服務.常用的手段是集群以及自動故障轉移,幾乎所有分布式系統中使用的技術都支持高可用,比如緩存redis官方提供redis-cluster集群,MongoDB分片集群,消息中間件(ActiveMQ/RabbitMQ/kafka/RocketMQ)集群,數據庫MySQL集群等等,如果對以上全部都了解的童鞋,總結一下,會發現它們的核心思想都一樣,通過集群提供數據冗余,再通過自動發現並且故障轉移機制保證組件的高可用.

4.伸縮性

  伸縮性是指當系統容量不夠或者多余的時候,是否能方便的進行擴容/縮容處理,很多大公司這方面都做的很好,比較好的策略是容器化,使用docker+k8s進行部署管理,可以方便的進行擴容或者縮容處理,能更好的合理利用資源.

5.擴展性

  擴展性是指當有需求發生變更或者新增的時候,是否能在不改代碼或者改動很少代碼的情況下就能實現功能.擴展性相當考驗一個架構師的功力,筆者看來,想設計一個擴展性很好的系統,除了事先考慮,在合適的情景下使用設計模式也是相當好的方案,因此對架構師而言,設計模式很重要!舉個例子,有一個上傳服務,使用FTP協議進行上傳,我們基於apach ftpClient封裝了一套接口,此時另外有一個需求,是需要使用SFTP協議,我們又使用jsch封裝了另一套接口,那假如后續又有新的協議呢?每新增一個協議就需要我們新增代碼來適配,這個時候使用適配器模式是不是就能很好的解決問題呢?這也符合設計模式的思想,面向接口編程,以后新增一個協議,我們只需要新增一個實現類,而不會改動原有代碼,是不是在代碼改動最少的情況下滿足了需求呢?

6.安全性

  一個網站,如果是用戶訪問量很大的情況下,很容易遭到網絡黑客的攻擊,常見的攻擊手段包括:

6.1 XSS攻擊

  常見的防御手段是消毒(不信任用戶輸入,對輸入進行嚴格校驗和過濾,比如使用"&lt"代替"<"等等).

6.2 SQL注入攻擊

  以前我們使用JDBC的時候,使用Statement會導致SQL注入攻擊,因此后面有了PreparedStatement預編譯的方式來防止SQL注入攻擊,並且大量查詢的情況下PreparedStatement 效率更高.

6.3 CSRF攻擊

  跨站請求偽造,攻擊者盜用受害者cookie,以受害者的名義發送惡意請求,常見的防御方式有:表單提交驗證碼(用戶體驗相對不友好),URL帶token驗證,HTTP referer驗證等.

6.4 DDOS攻擊

  分布式拒絕服務攻擊,DOS攻擊的進階版,防御難度很高,並且方案也相對復雜,業界比較厲害的是阿里,多次雙11大促都抗住了,畢竟阿里有道哥(吳翰清,阿里最年輕的P8,神一樣的存在)及其領導的安全小組的存在.

  當然,還有其他的攻擊方式,這里筆者就不一一列出來了,有興趣的童鞋可以自行了解.下一篇文章,我們正式開始進階內容---JVM篇,敬請期待!

  如果覺得博主寫的不錯,歡迎關注博主微信公眾號,博主會不定期分享技術干貨!
file

本文由博客一文多發平台 OpenWrite 發布!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM