JAVA架構師技能概覽——自用收藏

*一、先說說當前常用框架以及開發流程**

*常用框架*


    談起java web開發框架,先是SSH(StrutsSpringHibernate),後來升級爲Struts2

    到後來Struts2spring mvc替換掉,變成了Spring + SpringMVC + Hibernate/ibatis架構,然後Hibernate配置維護需要的人力成本大而慢慢被ibatis代替,後來MyBatis出現了,從iBatisMyBatisMyBatis提供了更爲強大的功能,同時並沒有損失其易用性,相反,在很多地方都藉助於JDK的泛型和註解特性進行了簡化,變成爲了Spring+SpringMVC+Mybatis目前很多公司比較流行的框架,但最近開始向Springboot+Mybatis架構轉變,同時基於springbootspringcloud微服務框架開始成爲前沿框架。

    

    目前應該Spring+SpringMVC+Mybatis這樣的框架佔主流,Springboot+Mybatis架構開始興起。所以對於初學者或有豐富經驗的開發人員或架構師,在技術學習或選型上應該考慮Springboot+Mybatis


    Mas最近幾年比較火,基於SOA的服務會慢慢退出歷史舞臺,微服務的框架有很多,其實瞭解主流的springbootdubbo就可以了,springboot+dubbo目前很多公司也在用。Spring Boot讓你可以通過嵌入式服務器將它提供的Java應用程序與你自己的應用程序一起使用,Spring Boot擁有你的應用程序所需的所有基礎架構,springboot的優點大家可以去官網學習下,這裏不在敘述。


開發流程


    我們在開發測試部署上線過程,我叫他工程化概念,大多數企業目前已經使用jenkins進行持續化集成,加上自動化測試及代碼掃描功能,很有部分企業處於純手工階段,所以第一步要實現開發部門狹隘的工程化,如下圖所示,開發只關心開發,開發和測試之間有交集,測試完成後,轉交給運維,那麼開發的生命週期就結束了。這樣的好處是通過軟件工程化,使每個人各司其職,把自己分內的事情做好,達到最大的產能輸出。

     ![enter image description here](http://images.gitbook.cn/3c601ad0-6c68-11e8-a3f1-8d9f51994466)

    所以從開發到測試,測試到運維部署上線,包括採用docker技術實現虛擬機、容器自動化的創建和部署。

目前搭建基於Kubernetes+DockerPaaS平臺,實現DevOps也是相當火的,大家有時間可以研究下。


**二、 Java必備知識**

千里之行始於足下,java的基礎務必夯實


    java的基本數據類型

    作用域public,private,protected,以及不寫時的區別

    Static Nested Class  Inner Class的不同

    接口與抽象類的區別?

    Java中的異常有哪幾類?分別怎麼使用?

    常用的集合類有哪些?比如List如何排序?

    ArrayListLinkedList內部的實現大致是怎樣的?他們之間的區別和優缺點?

    內存溢出是怎麼回事?請舉一個例子?

    ==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的幾種數據結構線程安全、性能差異要搞清楚,在不同的場景應該選擇那種數據結構


    VectorArrayListLinkedList區別。

    hashmaphashtable的區別

    ConurrentHashMapHashtable的區別

   

    


算法分析,用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的實現原理是

    sleepwait區別

    notifynotifyAll區別

    volatile關鍵字的作

    ThreadLocal的作用與實現

    兩個線程如何串行執行

    上下文切換是什麼含義

    可以運行時kill掉一個線程嗎

    什麼是條件鎖、讀寫鎖、自旋鎖、可重入鎖

    線程池ThreadPoolExecutor的實現原理

    Locksynchronized的區別


其他泛型、註解之類的

    Java中的泛型是什麼 ? 使用泛型的好處是什麼

    Java的泛型是如何工作的 ? 什麼是類型擦除 

    什麼是泛型中的限定通配符和非限定通配符 

    List<? extends T>List <? super T>之間有什麼區別 

    List<String>和原始類型List之間的區別

    註解的功能

    註解的屬性

    自定義註解怎麼實現


**三、 Spring必備知識**

Spring的原理及常用功能的掌握(如果之前沒有使用過可以在springboot基礎上學習一網打盡,忘記之前繁重的xml配置),


    SpringBean的生命週期。

    Spring註解自定義

    SpringMVC的原理

    Spring AOP原理及常用功能

    Spring事務的傳播屬性是怎麼回事?它會影響什麼?

    SpringBeanFactoryFactoryBean有什麼區別?

    Spring框架中IOC的原理是什麼?

    spring的依賴注入有哪幾種方式

    Spring如何實現一個切面?

    Spring 如何實現數據庫事務?

    Spring常用接口

    Springmybatis結合原理

    spring上下文的範圍


框架比較


spring


    Spring最重要的特徵是依賴注入。所有SpringModules不是依賴注入就是 IOC 控制反轉。

    當我們恰當的使用 DI 或者是 IOC 的時候,我們可以開發鬆耦合應用。鬆耦合應用的單元測試可以很容易的進行。

SpringMVC`


    提供了一種分離式的方法來開發 Web 應用。通過運用像DispatcherServeletMoudlAndViewViewResolver等一些簡單的概念,開發 Web 應用將會變的非常簡單。

SpringBoot


    讓你可以通過嵌入式服務器將它提供的Java應用程序與你自己的應用程序一起使用。它使用了Tomcat,因此你不必使用其他的Java EE容器。


Spring Boot的工程包括:

[SpringBoot快速入門,講解了Springbootdubbo的原理,有興趣可以去看看](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第三方結合


    Mybatisactivemqrabbitmqredismemcachedquartz

**四、分佈式緩存**


   緩存常用框架java自身、ehcachememcachedredis還有很多數據庫、操作系統自己的緩存,Spring緩存、mybatis緩存等等

緩存的優點

   

    提高系統的性能,儘量減少IO的操作(網絡io、硬盤io等),特別是磁盤IO的操作,提高大數據量的讀取速度。

緩存的缺點


    是不支持事務,存儲對象必須進行序列化操作,不支持關係型數據庫那樣的sql查詢。


緩存選型務必要懂得各緩存的優缺點,根據不同的業務場景選擇不同的框架

這裏簡單說下redismemcached原理及使用

redis


    Redis是一個開源的key—value型數據庫,支持stringlistsetzsethash類型數據。對這些數據的操作都是原子性的,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規範

  

     JMSjava的消息服務,JMS的客戶端之間可以通過JMS服務進行異步的消息傳輸。


消息類型


    點對點、發佈訂閱


角色

    消費者、生產者


開發常用的屬性


   ConnectionFactory


    創建Connection對象的工廠,針對兩種不同的jms消息模型,分別有QueueConnectionFactoryTopicConnectionFactory兩種。可以通過JNDI來查找ConnectionFactory對象。

   Destination


    Destination的意思是消息生產者的消息發送目標或者說消息消費者的消息來源。對於消息生產者來說,它的Destination是某個隊列(Queue)或某個主題(Topic);對於消息消費者來說,它的Destination也是某個隊列或主題(即消息來源)。

        所以,Destination實際上就是兩種類型的對象:QueueTopic可以通過JNDI來查找Destination

  Connection


    Connection表示在客戶端和JMS系統之間建立的鏈接(對TCP/IP socket的包裝)。Connection可以產生一個或多個Session。跟ConnectionFactory一樣,Connection也有兩種類型:QueueConnectionTopicConnection

 Session


    Session是我們操作消息的接口。可以通過session創建生產者、消費者、消息等。Session提供了事務的功能。當我們需要使用session發送/接收多個消息時,可以將這些發送/接收動作放到一個事務中。同樣,也分QueueSessionTopicSession

   消息的生產者

   


     消息生產者由Session創建,並用於將消息發送到Destination。同樣,消息生產者分兩種類型:QueueSenderTopicPublisher。可以調用消息生產者的方法(sendpublish方法)發送消息。


   消息消費者


    消息消費者由Session創建,用於接收被髮送到Destination的消息。兩種類型:QueueReceiverTopicSubscriber。可分別通過sessioncreateReceiver(Queue)或createSubscriber(Topic)來創建。當然,也可以sessioncreatDurableSubscriber方法來創建持久化的訂閱者。

   MessageListener


    消息監聽器。如果註冊了消息監聽器,一旦消息到達,將自動調用監聽器的onMessage方法。

消息中間件知識,需要掌握


    高可用集羣方案怎麼實現

    消息持久化策略是什麼

    消息的重發機制

    消息事務原理

    死信隊列處理

    消息消費的屬性有哪些

    消息延遲消費機制


消息中間件之間差異


    Activemqrabbitmqtibcojavaq



**六、 定時任務**

各種定時任務的原理及實戰比較,從單節點的分佈式集羣分片執行,下面羅列下知識點,在這裏不再詳細講解


    基於crontable的定時任務

    基於javatimer的定時任務

    基於quartz的定時任務

    基於Saturn的分佈式定時任務

    基於spring的定時任務

    基於Elastic-Job分佈式定時任務

    基於zookeeper的分佈式定時任務

    基於消息隊列的分佈式定時任務

    基於springquartz的分佈式定時任務

    Cron表達式要掌握

    線程池參數及其用途

   Spring整合

 


     Spring quartz整合


**七、 數據庫**


關係型

 

    掌握ACID特性

    掌握CRUD操作,SQL基礎打牢

    慢查詢的sql要會分析優化

    根據執行計劃sql調優,一定要使用索引查詢

    數據建模技能,根據情況可以存在冗餘

    分庫分表(垂直拆分、水平拆分)

    讀寫分離

    主從方案

    集羣方案

    常用數據庫:mysqloraclesqlserver


Nosql數據庫


常用的有HBaseRedisMongoDBCouchbaseLevelDB,掌握他們的特點以及使用場景


    理解ACIDBASE的區別(ACID是關係型數據庫強一致性的四個要求,而BASENoSQL數據庫通常對可用性及一致性的弱要求原則)

    理解持久化與非持久化的區別。這麼說是因爲有的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的一種預測系統行爲和性能的負載測試工具

    JMeterApache JMeterApache組織開發的基於Java的壓力測試工具

  性能指標


    1、響應時間

    響應時間指的是“系統響應時間”,定義爲應用系統從發出請求開始到客戶端接收到響應所消耗的時間。把它作爲用戶視角的軟件性能的主要體現。它包括網絡上的傳輸時間,web服務器上處理時間,APP服務器上處理時間,DB服務器上處理時間,但不包括瀏覽器上的內容顯示時間,即“呈現時間”,這是因爲呈現時間在很大程度上取決於客戶端的表現。

    2、最大併發用戶數

    有兩種理解方式,一種是從業務的角度來模擬真實的用戶訪問,體現的是業務併發用戶數,指在同一時間段內訪問系統的用戶數量。另一種是從服務器端承受的壓力來考慮,這裏的“併發用戶數”指的是同時向服務器端發出請求的客戶數,該概念一般結合併發測試(Concurrency Testing)使用,體現的是服務端承受的最大併發訪問數。

    3、吞吐量

    吞吐量是指“單位時間內系統處理的客戶請求的數量”,直接體現軟件系統的性能承載能力。一般來說,吞吐量用請求數/秒或是頁面數/秒來衡量,從業務的角度,吞吐量也可以用訪問人數/天或是處理的業務數/小時等單位來衡量。當然,從網絡的角度來說,也可以用字節數/天來考察網絡流量。對於交互式應用來說,吞吐量指標反映的是服務器承受的壓力。

    4、性能計數器

    性能計數器(Counter)是描述服務器或操作系統性能的一些數據指標。例如,對Windows 系統來說,使用內存數(Memory In Usage),進程時間(Total Process Time)等都是常見的計數器。

    5、思考時間

    思考時間(Think Time),也被稱爲“休眠時間”,從業務的角度來說,這個時間指的是用戶在進行操作時,每個請求之間的間隔時間。從自動化測試實現的角度來說,要真實地模擬用戶操作,就必須在測試腳本中讓各個操作之間等待一段時間,體現在腳本中,具體而言,就是在操作之間放置一個Think 的函數,使得腳本在執行兩個操作之間等待一段時間。

    6TPS

    TPS:Transaction per second,每秒鐘系統能夠處理的交易或者事務的數量。它是衡量系統處理能力的重要指標。

    7HPS

    點擊率:HPS,每秒鐘用戶向WEB服務器提交的HTTP請求數。這個指標是WEB應用特有的一個指標,WEB應用是"請求響應"模式,用戶發出一次申請,服務器就要處理一次,所以點擊是WEB應用能夠處理的交易的最小單位。

**十、 自動化運維**


    我覺得自動化運維能夠提高代碼質量、縮短開發週期,提高生產力降低人力成本,作爲開發人員要時刻想着怎樣去優化自己當前的工作流程,減少出錯率,提高效率是工作中創新重點之一

    自動化運維大致包含代碼管理、版本控制、持續集成、自動化測試、自動化資源收放,容器、系統、應用監控等多維一體的系統,大家在學習中可以逐步研究這些所設計的工具以及擴展型功能的開發,如githubhook機制,jenkins和三方結合代碼規範、單體測試、部署腳本等,docker容器的管理,Kubernetes實戰,系統監控軟件zabbix等。

    

Devops與持續集成


    DevOps 是一個完整的面向IT運維的工作流,以 IT 自動化以及持續集成(CI)、持續部署(CD)爲基礎,來優化程式開發、測試、系統運維等所有環節。

    DevOps 是持續集成思想的延伸,持續集成/部署是 DevOps 的技術核心,在沒有自動化測試、持續集成/部署之下,DevOps就是空中樓閣。

  DevOps 的技術棧與工具鏈

  


    版本控制&協作開發:GitHubGitLabBitBucketSubVersionCodingBazaar

    自動化構建和測試:Apache AntMaven SeleniumPyUnitQUnitJMeterGradlePHPUnit

    持續集成&交付:JenkinsCapistranoBuildBotFabricTinderboxTravis CIflow.ci ContinuumLuntBuildCruiseControlIntegrityGumpGo

    容器平臺: DockerRocketUbuntuLXC)、第三方廠商如(AWS/阿里雲)

    配置管理:ChefPuppetCFengineBashRudderPowershellRunDeckSaltstackAnsible

    微服務平臺:OpenShiftCloud FoundryKubernetesMesosphere

    服務開通:PuppetDocker SwarmVagrantPowershellOpenStack Heat

    日誌管理:LogstashCollectDStatsD

    監控,警告&分析:NagiosGangliaSensuzabbixICINGAGraphiteKibana




**十一、 架構的思想及方法**

怎樣架構,關鍵點在於自己解決問題的思路和方法,採用什麼語言,考慮研發、維護的成本,考慮完成的失效以及對業務影響的範圍。能力+別人的感受才能作出合適的架構,**架構不分好壞,適合很重要**

 

業務架構


    需要有着對業務很深的瞭解,從業務的角度怎樣去拆分業務模塊,先總後分,分而治之,理想的化就像一塊蛋糕一樣,先整體分幾塊大的,然後在某塊細細拆分,這種場景適合新開發產品,如果是目前運行的系統,那就先從周邊慢慢重構改造,抽絲剝繭,甚至存在新老系統並行情況,最終完成整個系統的重構。


技術架構

  


      技術架構相對業務比較容易,他侷限於技術部門的改造,對於業務部門應該是透明的,無感知的。主要涉及服務化改造,緩存、消息、定時任務的封裝,擴展spring功能,日誌監控、讀寫分離、分庫分表等技術方面的任務。


**不管業務架構還是業務架構,重構的產品務必經過多次的場景演練及性能測試,達到要求後逐步並行的上線,一定以穩定安全可靠爲主。**


在通往大神級的架構師的道路上,你需要懂需求、設計、代碼、部署、架構、服務器、運維、調優等,在技術方面你要懂前端、後端、數據庫、運維、測試、性能調優,解決問題的敏感度,還有新技術的前瞻性,可以說是一個實實在在的全棧人才,不過知識面那麼多,也可以有所專攻,如jvm調優、安全方面、通訊方面、容器方面、中間件方面、微服務方面、大數據方面等等,只要做的深了那你就是專家,加油兄弟們!


轉自https://blog.csdn.net/weixin_42231253/article/details/80740285

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章