小白到架構師需要掌握的技能(轉)
*感謝技術部所有兄弟這一年來對我工作的認可和支援,因為你們使我看到團隊的希望和不可戰勝的勇氣。*
*本文談的是以java的所有專案,其他語言的兄弟請諒解!*
*由於時間匆忙,對於自己的處女拙作,請大家撥冗斧正,不勝感謝!*
**一、先說說當前常用框架以及開發流程**
*常用框架*
談起java web開發框架,先是SSH(Struts、Spring、Hibernate),後來升級為Struts2
到後來Struts2被spring mvc替換掉,變成了Spring + SpringMVC + Hibernate/ibatis架構,然後Hibernate配置維護需要的人力成本大而慢慢被ibatis代替,後來MyBatis出現了,從
目前應該Spring+SpringMVC+Mybatis這樣的框架佔主流,Springboot+Mybatis架構開始興起。所以對於初學者或有豐富經驗的開發人員或架構師,在技術學習或選型上應該考慮Springboot+Mybatis。
Mas最近幾年比較火,基於SOA的服務會慢慢退出歷史舞臺,微服務的框架有很多,其實瞭解主流的springboot、dubbo就可以了,springboot+dubbo目前很多公司也在用。Spring Boot讓你可以通過嵌入式伺服器將它提供的Java應用程式與你自己的應用程式一起使用,Spring Boot擁有你的應用程式所需的所有基礎架構,springboot的優點大家可以去官網學習下,這裡不在敘述。
開發流程
我們在開發測試部署上線過程,我叫他工程化概念,大多數企業目前已經使用jenkins進行持續化整合,加上自動化測試及程式碼掃描功能,很有部分企業處於純手工階段,所以第一步要實現開發部門狹隘的工程化,如下圖所示,開發只關心開發,開發和測試之間有交集,測試完成後,轉交給運維,那麼開發的生命週期就結束了。這樣的好處是通過軟體工程化,使每個人各司其職,把自己分內的事情做好,達到最大的產能輸出。
![enter image description here](http://images.gitbook.cn/3c601ad0-6c68-11e8-a3f1-8d9f51994466)
所以從開發到測試,測試到運維部署上線,包括採用docker技術實現虛擬機器、容器自動化的建立和部署。
目前搭建基於Kubernetes+Docker的PaaS平臺,實現DevOps也是相當火的,大家有時間可以研究下。
**二、Java必備知識**
千里之行始於足下,java的基礎務必夯實
java的基本資料型別
作用域public,private,protected,以及不寫時的區別
Static Nested Class 和 Inner Class的不同
介面與抽象類的區別?
Java中的異常有哪幾類?分別怎麼使用?
常用的集合類有哪些?比如List如何排序?
ArrayList和LinkedList內部的實現大致是怎樣的?他們之間的區別和優缺點?
記憶體溢位是怎麼回事?請舉一個例子?
==和equals的區別?
hashCode方法的作用?
NIO是什麼?適用於何種場景?
HashMap實現原理,如何保證HashMap的執行緒安全?
JVM記憶體結構,為什麼需要GC?
NIO模型,select/epoll的區別,多路複用的原理
Java中一個字元佔多少個位元組,擴充套件再問int, long, double佔多少位元組
建立一個類的例項都有哪些辦法?
final/finally/finalize的區別?
Session/Cookie的區別?
String/StringBuffer/StringBuilder的區別,擴充套件再問他們的實現?
Servlet的生命週期?
如何用Java分配一段連續的1G的記憶體空間?需要注意些什麼?
Java有自己的記憶體回收機制,但為什麼還存在記憶體洩露的問題呢?
什麼是java序列化,如何實現java序列化?(寫一個例項)?
String s = new String("abc");建立了幾個 String Object?
java的幾種資料結構執行緒安全、效能差異要搞清楚,在不同的場景應該選擇那種資料結構
Vector、ArrayList和LinkedList區別。
hashmap和hashtable的區別
ConurrentHashMap和Hashtable的區別
演算法分析,用java來實現常見的排序演算法並且能夠分析出他的複雜度
排序方法平均情況最好情況最壞情況輔助空間穩定性
氣泡排序O(n^2)O(n)O(n^2)O(1)穩定
簡單選擇排序O(n^2)O(n^2)O(n^2)O(1)穩定
直接插入排序O(n^2)O(n)O(n^2)O(1)穩定
希爾排序O(nlogn)~O(n^2)O(n^1.3)O(n^2)O(1)不穩定
堆排序O(nlogn)O(nlogn)O(nlogn)O(1)不穩定
歸併排序O(nlogn)O(nlogn)O(nlogn)O(n)穩定
快速排序O(nlogn)O(nlogn)O(n^2)O(logn)~O(n)不穩定
JVM記憶體分配機制
JVM堆的基本結構。
JVM的垃圾演算法有哪幾種
CMS垃圾回收的基本流程
JVM有哪些常用啟動引數
如何檢視JVM的記憶體使用情況
Java程式是否會記憶體溢位,記憶體洩露情況發生
你常用的JVM配置和調優引數都有哪些
常用的GC策略,什麼時候會觸發YGC,什麼時候觸發FGC
java的常用指令
記憶體快照及分析
執行緒快照及分析
多執行緒併發問題
如何建立執行緒?如何保證執行緒安全
如何實現一個執行緒安全的資料結構
Volatile關鍵字的作用
Copy-On-Write的原理
HashMap在多執行緒環境下使用需要注意什麼
Java程式中啟動一個執行緒是用run還是start
什麼是守護執行緒?有什麼用
什麼是死鎖?如何避免
執行緒和程序的差別是什麼
Java裡面的Threadlocal是怎樣實現的
ConcurrentHashMap的實現原理是
sleep和wait區別
notify和notifyAll區別
volatile關鍵字的作
ThreadLocal的作用與實現
兩個執行緒如何序列執行
上下文切換是什麼含義
可以執行時kill掉一個執行緒嗎
什麼是條件鎖、讀寫鎖、自旋鎖、可重入鎖
執行緒池ThreadPoolExecutor的實現原理
Lock和synchronized的區別
其他泛型、註解之類的
Java中的泛型是什麼 ? 使用泛型的好處是什麼
Java的泛型是如何工作的 ? 什麼是型別擦除
什麼是泛型中的限定萬用字元和非限定萬用字元
List<? extends T>和List <? super T>之間有什麼區別
List<String>和原始型別List之間的區別
註解的功能
註解的屬性
自定義註解怎麼實現
**三、Spring必備知識**
Spring的原理及常用功能的掌握(如果之前沒有使用過可以在springboot基礎上學習一網打盡,忘記之前繁重的xml配置),
Spring中Bean的生命週期。
Spring註解自定義
SpringMVC的原理
Spring AOP原理及常用功能
Spring事務的傳播屬性是怎麼回事?它會影響什麼?
Spring中BeanFactory和FactoryBean有什麼區別?
Spring框架中IOC的原理是什麼?
spring的依賴注入有哪幾種方式
Spring如何實現一個切面?
Spring 如何實現資料庫事務?
Spring常用介面
Spring和mybatis結合原理
spring上下文的範圍
框架比較
spring
Spring最重要的特徵是依賴注入。所有SpringModules不是依賴注入就是 IOC 控制反轉。
當我們恰當的使用 DI 或者是 IOC 的時候,我們可以開發鬆耦合應用。鬆耦合應用的單元測試可以很容易的進行。
SpringMVC`
提供了一種分離式的方法來開發 Web 應用。通過運用像DispatcherServelet,MoudlAndView和ViewResolver等一些簡單的概念,開發 Web 應用將會變的非常簡單。
SpringBoot
讓你可以通過嵌入式伺服器將它提供的Java應用程式與你自己的應用程式一起使用。它使用了Tomcat,因此你不必使用其他的Java EE容器。
Spring Boot的工程包括:
[SpringBoot快速入門,講解了Springboot和dubbo的原理,有興趣可以去看看](https://edu.csdn.net/course/detail/8358)
- Spring IO Platform:用於版本化應用程式的企業級分發。
- Spring Framework:用於事務管理、依賴注入、資料訪問、訊息傳遞和Web應用程式。
- Spring Cloud:用於分散式系統,用於構建或部署你的微服務。
- Spring Data:用於與資料訪問相關的微服務,不管是對映還是歸約,關係型還是非關係型。
- Spring Batch:用於高級別的批量操作。
- Spring Security:用於授權和認證支援。
- Spring REST文件:用於RESTful服務文件化。
- Spring Social:用於連線社交媒體API。
- Spring Mobile:適用於行動網路應用。
SpringBoot第三方結合
Mybatis、activemq、rabbitmq、redis、memcached、quartz等
**四、分散式快取**
快取常用框架java自身、ehcache、memcached、redis還有很多資料庫、作業系統自己的快取,Spring快取、mybatis快取等等
快取的優點
提高系統的效能,儘量減少IO的操作(網路io、硬碟io等),特別是磁碟IO的操作,提高大資料量的讀取速度。
快取的缺點
是不支援事務,儲存物件必須進行序列化操作,不支援關係型資料庫那樣的sql查詢。
快取選型務必要懂得各快取的優缺點,根據不同的業務場景選擇不同的框架
這裡簡單說下redis和memcached原理及使用
redis
Redis是一個開源的key—value型資料庫,支援string、list、set、zset和hash型別資料。對這些資料的操作都是原子性的,redus為了保證效率會定期持久化資料。
掌握知識點
redis的常用指令
redis的埠
redis的資料庫
redis的叢集有哪些中,優缺點是什麼
redis節點追加對資料的影響
redis的訂閱機制
redis的效能測試工具
redis的持久化方式,有那兩種優缺點
memcached
Memcached 是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個儲存鍵/值對的hashmap。其守護程序(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護程序通訊。
掌握知識點
memcached的分散式演算法原理
memcahced的效能分析
memcached的分配策略
memcached的常用命令
memcached的分散式叢集
基於快取的擴充套件
Spring整合分散式快取
**五、訊息中介軟體**
訊息中介軟體的好處是非同步處理提高主流程的響應速度,把耗時處理資料放入佇列,多個消費者同時處理,而主流程無需等待處理結果。系統間解耦,提高系統的穩定性,從而消除系統的峰值,還有跨系統間資料訪問處理。
使用訊息中介軟體首先jms的概念要清楚
Jms規範
JMS是java的訊息服務,JMS的客戶端之間可以通過JMS服務進行非同步的訊息傳輸。
訊息型別
點對點、釋出訂閱
角色
消費者、生產者
開發常用的屬性
ConnectionFactory
建立Connection物件的工廠,針對兩種不同的jms訊息模型,分別有QueueConnectionFactory和TopicConnectionFactory兩種。可以通過JNDI來查詢ConnectionFactory物件。
Destination
Destination的意思是訊息生產者的訊息傳送目標或者說訊息消費者的訊息來源。對於訊息生產者來說,它的Destination是某個佇列(Queue)或某個主題(Topic);對於訊息消費者來說,它的Destination也是某個佇列或主題(即訊息來源)。
所以,Destination實際上就是兩種型別的物件:Queue、Topic可以通過JNDI來查詢Destination。
Connection
Connection表示在客戶端和JMS系統之間建立的連結(對TCP/IP socket的包裝)。Connection可以產生一個或多個Session。跟ConnectionFactory一樣,Connection也有兩種型別:QueueConnection和TopicConnection。
Session
Session是我們操作訊息的介面。可以通過session建立生產者、消費者、訊息等。Session提供了事務的功能。當我們需要使用session傳送/接收多個訊息時,可以將這些傳送/接收動作放到一個事務中。同樣,也分QueueSession和TopicSession。
訊息的生產者
訊息生產者由Session建立,並用於將訊息傳送到Destination。同樣,訊息生產者分兩種型別:QueueSender和TopicPublisher。可以呼叫訊息生產者的方法(send或publish方法)傳送訊息。
訊息消費者
訊息消費者由Session建立,用於接收被髮送到Destination的訊息。兩種型別:QueueReceiver和TopicSubscriber。可分別通過session的createReceiver(Queue)或createSubscriber(Topic)來建立。當然,也可以session的creatDurableSubscriber方法來建立持久化的訂閱者。
MessageListener
訊息監聽器。如果註冊了訊息監聽器,一旦訊息到達,將自動呼叫監聽器的onMessage方法。
訊息中介軟體知識,需要掌握
高可用叢集方案怎麼實現
訊息持久化策略是什麼
訊息的重發機制
訊息事務原理
死信佇列處理
訊息消費的屬性有哪些
訊息延遲消費機制
訊息中介軟體之間差異
Activemq、rabbitmq、tibco、javaq等
**六、定時任務**
各種定時任務的原理及實戰比較,從單節點的分散式叢集分片執行,下面羅列下知識點,在這裡不再詳細講解
基於crontable的定時任務
基於java的timer的定時任務
基於quartz的定時任務
基於Saturn的分散式定時任務
基於spring的定時任務
基於Elastic-Job分散式定時任務
基於zookeeper的分散式定時任務
基於訊息佇列的分散式定時任務
基於springquartz的分散式定時任務
Cron表示式要掌握
執行緒池引數及其用途
Spring整合
Spring quartz整合
**七、資料庫**
關係型
掌握ACID特性
掌握CRUD操作,SQL基礎打牢
慢查詢的sql要會分析優化
根據執行計劃sql調優,一定要使用索引查詢
資料建模技能,根據情況可以存在冗餘
分庫分表(垂直拆分、水平拆分)
讀寫分離
主從方案
叢集方案
常用資料庫:mysql、oracle、sqlserver
Nosql資料庫
常用的有HBase、Redis、MongoDB、Couchbase、LevelDB,掌握他們的特點以及使用場景
理解ACID與BASE的區別(ACID是關係型資料庫強一致性的四個要求,而BASE是NoSQL資料庫通常對可用性及一致性的弱要求原則)
理解持久化與非持久化的區別。這麼說是因為有的NoSQL系統是純記憶體儲存的。
關係型資料庫與NoSQL系統在資料結構上的本質區別。傳統關係型資料庫通常是基於行的表格型儲存,而NoSQL系統包括了列式儲存(Cassandra)、key/value儲存(Memcached)、文件型儲存(CouchDB)以及圖結構儲存(Neo4j)
與傳統關係資料庫有統一的SQL語言操作介面不同,NoSQL系統通常有自己特有的API介面。
在架構上,你必須搞清楚,NoSQL系統是被設計用於成百上千臺機器的叢集中的,而非共享型資料庫系統的架構。
在NoSQL系統中,可能你得習慣一下不知道你的資料具體存在何處的情況。
在NoSQL系統中,你最好習慣它的弱一致性。”eventually consistent”(最終一致性)正是BASE原則中的重要一項。比如在Twitter,你在Followers列表中經常會感受到資料的延遲。
在NoSQL系統中,你要理解,很多時候資料並不總是可用的。
你得理解,有的方案是擁有分割槽容忍性的,有的方案不一定有。
高可用叢集方案
**八、系統監控**
監控的目的是事中、事後發現問題,根據歷史資料事前進行預防,避免重大的事故發生。主要分三部分資料採集、資料清洗、資料監控。
資料採集
資料採集應該從三個方面,一個是系統級別的,採集cpu、記憶體、硬碟io、網路io、容器io等,可以利用第三方外掛來實現。一是日誌級別的,可以採用離線抓取日誌檔案,採用logstash抓取日誌搭建ELK日誌分析平臺,也可以購買splunk日誌抓取並資料分析,也可以自己編寫agent來根據日誌規則抓取日誌,達到妙計監控的效果。一是基於業務資料的分析,屬於事後的資料分析,主要是一些環比、同比的分析,提供運營的決策。
當然還有第三方全套的服務,如聽雲、神策、growingio,基於使用者行為分析。
資料清洗
把髒資料清洗掉,提高資料質量並能準確的反映到圖表上,一般步驟是資料分析、定義清洗規則、執行資料清洗規則、清洗結果驗證。如果利用第三方產品一般都帶有清洗功能,開源的框架 spark,hadoop,hive等資料清洗。
如果資料本身都是按照標準規則抓去的,那麼清洗的處理會少些,甚至不需要清洗直接可以輸出使用。
資料監控
資料清洗以後那就是展示,可以利用開源框架進行開發自己的監控平臺,監控可以分為前端展示和後臺任務的形式,如前端echarts,第三方帆軟報表finereport也可以提供資料的輸出,後端的主要是報警的一些任務,如某個數值達到一定閾值進行簡訊、郵件以及電話的通知,也可以自己設計app來進行訊息推送。
**九、效能測試**
效能測試工具有很多,我覺得比較流行的有兩款,
一是LoadRunner(收費),一是JMeter(免費)
LoadRunner,是hp的一種預測系統行為和效能的負載測試工具
JMeter是Apache JMeter是Apache組織開發的基於Java的壓力測試工具
效能指標
1、響應時間
響應時間指的是“系統響應時間”,定義為應用系統從發出請求開始到客戶端接收到響應所消耗的時間。把它作為使用者視角的軟體效能的主要體現。它包括網路上的傳輸時間,web伺服器上處理時間,APP伺服器上處理時間,DB伺服器上處理時間,但不包括瀏覽器上的內容顯示時間,即“呈現時間”,這是因為呈現時間在很大程度上取決於客戶端的表現。
2、最大併發使用者數
有兩種理解方式,一種是從業務的角度來模擬真實的使用者訪問,體現的是業務併發使用者數,指在同一時間段內訪問系統的使用者數量。另一種是從伺服器端承受的壓力來考慮,這裡的“併發使用者數”指的是同時向伺服器端發出請求的客戶數,該概念一般結合併發測試(Concurrency Testing)使用,體現的是服務端承受的最大併發訪問數。
3、吞吐量
吞吐量是指“單位時間內系統處理的客戶請求的數量”,直接體現軟體系統的效能承載能力。一般來說,吞吐量用請求數/秒或是頁面數/秒來衡量,從業務的角度,吞吐量也可以用訪問人數/天或是處理的業務數/小時等單位來衡量。當然,從網路的角度來說,也可以用位元組數/天來考察網路流量。對於互動式應用來說,吞吐量指標反映的是伺服器承受的壓力。
4、效能計數器
效能計數器(Counter)是描述伺服器或作業系統效能的一些資料指標。例如,對Windows 系統來說,使用記憶體數(Memory In Usage),程序時間(Total Process Time)等都是常見的計數器。
5、思考時間
思考時間(Think Time),也被稱為“休眠時間”,從業務的角度來說,這個時間指的是使用者在進行操作時,每個請求之間的間隔時間。從自動化測試實現的角度來說,要真實地模擬使用者操作,就必須在測試指令碼中讓各個操作之間等待一段時間,體現在指令碼中,具體而言,就是在操作之間放置一個Think 的函式,使得指令碼在執行兩個操作之間等待一段時間。
6、TPS
TPS:Transaction per second,每秒鐘系統能夠處理的交易或者事務的數量。它是衡量系統處理能力的重要指標。
7、HPS
點選率:HPS,每秒鐘使用者向WEB伺服器提交的HTTP請求數。這個指標是WEB應用特有的一個指標,WEB應用是"請求—響應"模式,使用者發出一次申請,伺服器就要處理一次,所以點選是WEB應用能夠處理的交易的最小單位。
**十、自動化運維**
我覺得自動化運維能夠提高程式碼質量、縮短開發週期,提高生產力降低人力成本,作為開發人員要時刻想著怎樣去優化自己當前的工作流程,減少出錯率,提高效率是工作中創新重點之一
自動化運維大致包含程式碼管理、版本控制、持續整合、自動化測試、自動化資源收放,容器、系統、應用監控等多維一體的系統,大家在學習中可以逐步研究這些所設計的工具以及擴充套件型功能的開發,如github的hook機制,jenkins和三方結合程式碼規範、單體測試、部署指令碼等,docker容器的管理,Kubernetes實戰,系統監控軟體zabbix等。
Devops與持續整合
DevOps 是一個完整的面向IT運維的工作流,以 IT 自動化以及持續整合(CI)、持續部署(CD)為基礎,來優化程式開發、測試、系統運維等所有環節。
DevOps 是持續整合思想的延伸,持續整合/部署是 DevOps 的技術核心,在沒有自動化測試、持續整合/部署之下,DevOps就是空中樓閣。
DevOps 的技術棧與工具鏈
版本控制&協作開發:GitHub、GitLab、BitBucket、SubVersion、Coding、Bazaar
自動化構建和測試:Apache Ant、Maven 、Selenium、PyUnit、QUnit、JMeter、Gradle、PHPUnit
持續整合&交付:Jenkins、Capistrano、BuildBot、Fabric、Tinderbox、Travis CI、flow.ci Continuum、LuntBuild、CruiseControl、Integrity、Gump、Go
容器平臺: Docker、Rocket、Ubuntu(LXC)、第三方廠商如(AWS/阿里雲)
配置管理:Chef、Puppet、CFengine、Bash、Rudder、Powershell、RunDeck、Saltstack、Ansible
微服務平臺:OpenShift、Cloud Foundry、Kubernetes、Mesosphere
服務開通:Puppet、Docker Swarm、Vagrant、Powershell、OpenStack Heat
日誌管理:Logstash、CollectD、StatsD
監控,警告&分析:Nagios、Ganglia、Sensu、zabbix、ICINGA、Graphite、Kibana
**十一、架構的思想及方法**
怎樣架構,關鍵點在於自己解決問題的思路和方法,採用什麼語言,考慮研發、維護的成本,考慮完成的失效以及對業務影響的範圍。能力+別人的感受才能作出合適的架構,**架構不分好壞,適合很重要**!
業務架構
需要有著對業務很深的瞭解,從業務的角度怎樣去拆分業務模組,先總後分,分而治之,理想的化就像一塊蛋糕一樣,先整體分幾塊大的,然後在某塊細細拆分,這種場景適合新開發產品,如果是目前執行的系統,那就先從周邊慢慢重構改造,抽絲剝繭,甚至存在新老系統並行情況,最終完成整個系統的重構。
技術架構
技術架構相對業務比較容易,他侷限於技術部門的改造,對於業務部門應該是透明的,無感知的。主要涉及服務化改造,快取、訊息、定時任務的封裝,擴充套件spring功能,日誌監控、讀寫分離、分庫分表等技術方面的任務。
**不管業務架構還是業務架構,重構的產品務必經過多次的場景演練及效能測試,達到要求後逐步並行的上線,一定以穩定安全可靠為主。**
在通往大神級的架構師的道路上,你需要懂需求、設計、程式碼、部署、架構、伺服器、運維、調優等,在技術方面你要懂前端、後端、資料庫、運維、測試、效能調優,解決問題的敏感度,還有新技術的前瞻性,可以說是一個實實在在的全棧人才,不過知識面那麼多,也可以有所專攻,如jvm調優、安全方面、通訊方面、容器方面、中介軟體方面、微服務方面、大資料方面等等,只要做的深了那你就是專家,加油兄弟們!