Java 技術棧

JAVA是一個面向對象的編程語言,由SUN公司的程序員所開發、它不只吸取了C++的各類優勢,並且還撇棄了C++中難以理解的概念,如多繼承、指針等;所以JAVA語言具備功能強大且簡單易用兩個特徵, JAVA做爲靜態面嚮對象語言的表明,是全世界最受歡迎的計算機語言php

Java包含四個獨立卻又彼此相關的技術css

1. JVM,Java的虛擬機,在JVM上運行Java的bytecode(字節碼)html

2. Java的程序編程語言前端

3. Java Class,Java的類文件格式;其決定Java程序編譯出的字節碼應該遵循那些規範等html5

4. JAVA的應用程序接口(Java API);爲了能讓Java的應用程序獲得更快更高效的開發,Java官方提供了Java APIjava

 

Java展現的文件一般都是Java類的文件格式,而Java的源程序要轉換成字節碼才能在JVM上運行node

通常Java的程序代碼從寫到運行要通過如下幾個步驟:mysql

1. Java程序語言+Java APIreact

2. X.java源程序通過編譯器編譯爲Java的類文件如X.class(Java的類文件就是Java的字節碼)linux

3. 在JVM中,class loader(類加載器)加載X.class類文件,而後由解釋器將X.calss文件由字節碼格式解釋成對應的OS平臺二進制程序,這樣Java程序就能夠再JVM上運行了

注:.class文件就是字節碼,但字節碼不能直接運行,仍需在JVM中由解釋器解釋成對應的OS二進制程序,才能運行(機器只能理解二進制)

 

JVM進行解釋的實現方式:

1. 一次性解釋器,解釋字節碼並執行,但第二次執行須要從新解釋字節碼

2. 即時編譯器,解釋完的類(字節碼)會緩存再內存中,讓下次執行時直接使用,不用再次執行,但這樣對全部解釋產生的二進制程序都緩存會很是佔用內存

3. 自適應解釋器,只將執行頻率高的代碼進行解釋而後將解釋後的二進制程序進行緩存,下次執行無需解釋,通常只緩存20%的代碼解釋(認爲這20%的代碼完成了80%的操做)

下面是JAVA的執行過程

 

 

JVM(Java Virtual Machine)即Java虛擬機,是一種用於計算設備的規範,也是Java的核心和基礎,是Java解釋器和OS平臺之間的虛擬處理器,它是一種基於下層的操做系統和硬件平臺利用軟件方法抽象出的計算機。能夠在 上面執行Java的字節碼程序,正是由於JVM的存在Java才實現了一次編譯處處運行,可實現徹底跨平臺的運行。

Java的編譯器只需面向JVM,生成JVM能理解的字節碼文件,而後由JVM將每一條指令翻譯成爲不一樣平臺的機器代碼(二進制程序),而後既能夠在對應的平臺執行。

 

Java平臺由Java虛擬機(Java Virtual Machine,簡稱JVM)和Java 應用編程接口(Application Programming Interface,簡稱API)構成。Java應用編程接口爲此提供了一個獨立於操做系統的標準接口,可分爲基本部分和擴展部分。在硬件或操做系統平臺上安裝一個Java平臺以後,Java應用程序就可運行。Java平臺已經嵌入了幾乎全部的操做系統。這樣Java程序能夠只編譯一次,就能夠在各類系統中運行。Java應用編程接口已經從1.1x版發展到1.2版。經常使用的Java平臺基於Java1.5,最近版本爲Java7.0。

JRE (Java running Environment)Java的運行環境:JRE可讓編譯好的類(字節碼)運行起來,是讓Java運行起來的最小環境。簡單來講JRE=JVM+API(不包括與開發有關的API)

JDK (Java Development Kit)是Java語言的軟件開發工具包,是實現Java語言開發並讓其運行的最小環境。簡單來講JDK=Java語言+API+編譯器+JVM

依據Java應用領域的不一樣,JDK有如下幾種分類:

• Java SE(J2SE),standard edition,標準版,是咱們一般用的一個版本,從JDK 5.0開始,更名爲Java SE。

• Java EE(J2EE),enterprise edition,企業版,使用這種JDK開發J2EE應用程序,從JDK 5.0開始,更名爲Java EE。

• Java ME(J2ME),micro edition,主要用於移動設備、嵌入式設備上的java應用程序,從JDK 5.0開始,更名爲Java ME。

沒有JDK的話,沒法編譯Java程序,若是想只運行Java程序,要確保已安裝相應的JRE。


 

下面來說Java兩個特殊的類Applet和Servlet

Applet是採用Java編程語言編寫的,通過編譯後Applet小程序能夠嵌入到HTML中去(含有Applet的網頁的HTML文件代碼中部帶有<applet> 和</applet>這樣一對標記),而後client端的瀏覽器中只要安裝JRE插件就能夠在client端運行這個Apple應用小程序,並將結果顯示在client上,這即是客戶端動態網站

可是客戶端動態網站有一很危險的地方,那就是若是有人給你往HTML網頁中嵌入的是一個有害的applet程序,你在client一執行會對你的電腦形成破壞,並且applet的執行必須在client端安裝有JRE,因此applet如今已經不多見了

HTML文件中關於Applet的信息至少應包含如下三點:

1)字節碼文件名(編譯後的Java文件,以.class爲後綴)

2)字節碼文件的地址

3)在網頁上顯示Applet的方式。

Servlet(Server Applplet)是用Java編寫的服務器端程序,其主要功能爲交互式的瀏覽和修改數據,生成動態的Web資源;Servlet可讓Java語言依據相似的CGI(common gateway interface)技術開發運行在服務器端的動態web資源,但在通訊量大的服務器上,Java Servlet 的優勢在於它們的執行速度更快於 CGI 程序。各個用戶請求被激活成單個程序中的一個線程,而無需建立單獨的進程,這意味着服務器端處理請求的系統開銷將明顯下降。

Servlet 的主要功能在於交互式地瀏覽和修改數據,生成動態 Web 內容。這個過程爲:

1.客戶端發送請求至服務器端;

2.服務器將請求信息發送至 Servlet;

3.Servlet 生成響應內容並將其傳給服務器。響應內容動態生成,一般取決於客戶端的請求;

4.服務器將響應返回給客戶端。


 

JSP(Java Server Page)Java的服務器頁面,它是Servlet的一個特殊的類,在根本上是一個簡化的Servlet設計,JSP是在傳統的網頁HTML文件(*.html或*.htm)中插入Java的程序段,從而造成了JSP文件(一般爲*.jsp);用JSP開發的web應用是支持跨平臺的,既能在Linux上運行,也能在其餘的操做系統上運行,開發JSP程序的一個著名框架是SSH(Structs、Spring、Hebernate)

JSP實現了Html語法中的java擴展(以 <%, %>形式)。JSP與Servlet同樣,是在服務器端執行的。一般返回給客戶端的就是一個HTML文本,所以客戶端只要有瀏覽器就能瀏覽(Applet要在client上裝JRE)。

注:Applet只是將一個編譯後的Applet小程序嵌入到HTML中而後發送到client,在client端依據JRE運行。

Servlet主要是實現了用Java語言開發運行在server端的Web動態資源;而這些依據Java語言開發的web動態資源大多數都是.jsp資源。

JSP是一種腳本語言,主要實現了將JAVA代碼嵌入到HTML中(這也是JSP和Servlet的最主要區別),從而生成了.jsp類的web動態資源,從而實現了基於Java技術的動態網站開發。

JSP的運行性能要比PHP好,因此一些大型站點都用JSP開發,.jsp程序執行流程以下

1. .jsp由Jasper處理未.java源程序

2. .java由編譯器編譯爲.class

3. .class類在jvm上進行加載解釋並運行

JSP 的運程過程

一個JSP頁面有多個客戶訪問,下面是第一個客戶訪問JSP頁面時候,JSP頁面的執行流程:

客戶經過瀏覽器向服務器端的JSP頁面發送請求

• JSP引擎檢查JSP文件對應的Servlet源代碼是否存在,若不存在轉向第4步,不然執行下一步

• JSP引擎檢查JSP頁面是否須要修改,若沒修改,轉向第5步,不然執行下一步

• JSP引擎將JSP頁面文件轉譯爲Servlet源代碼(相應的 .java 代碼)

• JSP引擎將Servlet源代碼編譯爲相應字節碼( .class代碼 )

• JSP引擎加載字節碼到內存

• 字節碼處理客戶請求,並將結果返回給客戶

 

在不修改JSP頁面的狀況下,除了第一個客戶訪問JSP頁面須要通過以上幾個步驟外,之後訪問該JSP頁面的客戶請求,直接發送給JSP對應的字節碼程序處理,並將處理結果返回給客戶,這種狀況下,JSP頁面既不須要啓動服務器,以便從新加載修改後的JSP頁面。

CGI(Common Gateway Interface)通用網關接口,CGI是外部應用程序(CGI程序)和Web服務器之間的接口標準(也能夠理解爲一種協議或機制),是在CGI程序和Web服務器之間傳遞信息的過程;CGI可讓一個客戶端,從網頁瀏覽器向執行在網絡服務器上的程序傳輸數據CGI描述了客戶端和服務器之間傳輸的一種標準

下面列子能夠理解CGI的做用

客戶端請求服務器,web服務器響應一個HTML靜態的表單,而用戶填寫完表單後又將此表單交給了web服務器(至關於又一次http請求),web服務器收到client端填寫的表單後會以CGI協議的方式提交給後端的應用程序讓其處理

不少應用程序均可以傳遞參數,CGI可讓用戶經過表單提供一些數據,而後把這些數據當作參數傳遞給相應的後端應用程序(如PHP)讓程序對其加工處理(不事後端應用程序是PHP、C、C++甚至是一個腳本CGI均可以與其交互)讓後端程序或腳原本處理數據,處理完後,後端程序再次經過CGI機制返回給前段的web服務器(httpd/Nginx)再由web服務器將結果封裝響應給客戶端

在LAMP和LNMP架構中PHP與前段Apache/Nginx之間就是經過CGI機制結合的,用於將客戶端的動態請求(主要爲php的動態資源請求)從前端web_server傳遞到後端的PHP,讓PHP處理。

Servlet Container(Servlet容器):包含JDK及JDK所不具有的功能,可讓一個Servlet運行起來,有相應的Servlet進程,Servlet進程負責接收前端CGI傳遞來的請求,並在本地的JVM上運行處理,而且負責監控本地的.java程序是否發生了修改,一旦發生修改則從新讓編譯器(由JDK提供)編譯成.class類

Web Container (Web容器)是一個包含Jasper和Servlet相關的技術的框架,其中Jasper負責監控本地的.jsp程序是否發生修改,一旦修改就根據需求將其裝換爲.java源代碼,而.java就交給Servlet處理

注:Web Container比Servlet Container多了一個Jasper

而如今不少的Web容器均可以直接和用戶的請求直接進行交互(即前端沒有web server解碼http請求和封裝http響應)web容器能夠徹底依靠本身的組件(對Tomcat來講爲web container的鏈接器)實現直接與client進行交互。可是讓鏈接器直接面對用戶的請求,可能會形成壓力過大處理不過來的狀況(若是鏈接器的性能不是很好),因此通常會在前端加一個web代理(如Nginx),讓Nginx創建、維持、釋放用戶的請求和鏈接,而當用戶的請求資源在前端web server(Nginx)上沒有緩存時,再由Nginx將請求轉發到後端web Container(如Tomcat)處理。而對應的這種架構叫:

Nginx + Java的Web Container(有時也成爲應用程序服務器)

但不管是Web Container仍是Servlet Container或者是JDK都是在JVM中運行的,Web Container|Servlet Container|JDK真正啓動後再OS中表現的都是一個JVM進程(JVM實例),即在JVM中若是你是一個Web Containter它就有Web Container的功能,是JDK就有JDK的功能,負責只有JVM自身的功能

JVM實例能夠在同一個JVM實例中啓動多個線程,從而完成併發響應,JVM中還包括:

線程私有內存區

1. 程序計數器

2. Java虛擬機棧(主要用來保存本地變量)

線程共享內存區

1. 方法區

2. 堆(堆佔用的內存最大)主要用來存儲對象,當計數器爲0時就認爲對象已死,而後由GC(Garbage Collector)進行清除,避免堆溢出

而GC對對象的清理要依據必定的算法,有如下幾種

1. 標記清除算法(哪一個對象死了先進行標記,而後統一清除),但這種機制有個弊端就是在GC進行垃圾清除時會讓CPU飆升,形成服務器性能突然降低,且會產生大量的內存碎片

2. 複製算法,每一個對象存兩份,不會產生內存碎片可是內存使用率只有1/2

GC的種類

1. serial 一次只能回收一個對象,串行

2. parNew 一次能夠回收讀個,並行回收

3. CMS(Concurrent Mark Sweet)並行標記清除,多線程,儘量下降清除對JVM中程序的停頓,但缺點是沒法收集浮動垃圾(只要線程在運行,就不能收集)

4. G 1 特色是不會產生內存碎片、能夠定義停頓的時間

 

數據庫技術相關,這一部分主要講解sql,畢竟現有的關係型數據庫都支持sql,而且生產環境大部分仍是使用關係型數據庫。再者總結下mysql與oracle的優缺點,使用場景,注意事項。

  1. sql基礎:庫、表的建立,修改,刪除,查詢,索引,主從表,權限,事務,運算符,函數
  2. 經常使用查詢技術:多表鏈接,子查詢
  3. 觸發器,存儲過程
  4. 數據庫優化
  5. 備份,恢復

總結完這一部分,而後在概括寫javaweb經常使用的技術,包括:

  1. web基礎:xml,html/css/js,jsp/serlvet,jstl/EL,json,ajax
  2. 主流框架:spring/springmvc,log4j,junit,mybatis,maven
  3. 經常使用服務器:tomcat
  4. 經常使用第三方接口:如,支付寶支付接口,充值繳費接口等

上述內容只是基礎,並且仍是術的方面。我以爲要寫出優雅,健壯,可擴展的代碼。除了基礎紮實外,還須要瞭解,體會,感悟道的方面,好比說編程思想,規範,設計模式,軟件工程等相關的內容。所以下一個部分就是:

  1. 經常使用設計模式:例如工廠、單例、代理等
  2. 修煉數據:《clean code》,《java編程思想》,《代碼重構》,《effective java》,《敏捷技能修煉》,《think in java》


1、基礎篇

1.1 JVM

1.1.1. Java內存模型,Java內存管理,Java堆和棧,垃圾回收
1.1.2. 瞭解JVM各類參數及調優
1.1.3. 學習使用Java工具
    jps, jstack, jmap, jconsole, jinfo, jhat, javap, …
        http://kenai.com/projects/btrace 
        http://www.crashub.org/ 
        https://github.com/taobao/TProfiler 
        https://github.com/CSUG/HouseMD 
        http://wiki.cyclopsgroup.org/jmxterm 
        https://github.com/jlusdy/TBJMap
1.1.4. 學習Java診斷工具
    http://www.eclipse.org/mat/ 
    http://visualvm.java.net/oqlhelp.html
1.1.5. 本身編寫各類outofmemory,stackoverflow程序
    HeapOutOfMemory
    Young OutOfMemory
    MethodArea OutOfMemory
    ConstantPool OutOfMemory
    DirectMemory OutOfMemory
    Stack OutOfMemory
    Stack OverFlow
1.1.6. 使用工具嘗試解決如下問題,並寫下總結
    當一個Java程序響應很慢時如何查找問題
    當一個Java程序頻繁FullGC時如何解決問題,如何查看垃圾回收日誌
    當一個Java應用發生OutOfMemory時該如何解決,年輕代、年老代、永久代解決辦法不一樣,致使緣由也不一樣
1.1.7. 參考資料
    http://docs.oracle.com/javase/specs/jvms/se7/html/ 
    http://www.cs.umd.edu/~pugh/java/memoryModel/ 
    http://gee.cs.oswego.edu/dl/jmm/cookbook.html

1.2. Java基礎知識

1.2.1. 閱讀源代碼
    java.lang.String
    java.lang.Integer
    java.lang.Long
    java.lang.Enum
    java.math.BigDecimal
    java.lang.ThreadLocal
    java.lang.ClassLoader & java.net.URLClassLoader
    java.util.ArrayList & java.util.LinkedList
    java.util.HashMap & java.util.LinkedHashMap & java.util.TreeMap
    java.util.HashSet & java.util.LinkedHashSet & java.util.TreeSet
1.2.2. 熟悉Java中各類變量類型
1.2.3. 熟悉Java String的使用,熟悉String的各類函數
1.2.4. 熟悉Java中各類關鍵字
1.2.5. 學會使用List,Map,Stack,Queue,Set
    上述數據結構的遍歷
    上述數據結構的使用場景
    Java實現對Array/List排序
    java.uti.Arrays.sort()
    java.util.Collections.sort()
    Java實現對List去重
    Java實現對List去重,而且須要保留數據原始的出現順序
    Java實現最近最少使用cache,用LinkedHashMap
1.2.6. Java IO&Java NIO,並學會使用
    java.io.*
    java.nio.*
    nio和reactor設計模式
    文件編碼,字符集
1.2.7. Java反射與javassist
    反射與工廠模式
    java.lang.reflect.*
1.2.8. Java序列化
    java.io. Serializable
    什麼是序列化,爲何序列化
    序列化與單例模式
    google序列化protobuf
1.2.9. 虛引用,弱引用,軟引用
    java.lang.ref.*
    實驗這些引用的回收
1.2.10. 熟悉Java系統屬性
    java.util.Properties
1.2.11. 熟悉Annotation用法
    java.lang.annotation.*
1.2.12. JMS
    javax.jms.*
1.2.13. JMX
    java.lang.management.*
    javax.management.*
1.2.14. 泛型和繼承,泛型和擦除
1.2.15. 自動拆箱裝箱與字節碼
1.2.16. 實現Callback
1.2.17. java.lang.Void類使用
1.2.18. Java Agent,premain函數
    java.lang.instrument
1.2.19. 單元測試
    Junit, http://junit.org/ 
    Jmockit, https://code.google.com/p/jmockit/ 
    djUnit, http://works.dgic.co.jp/djunit/
1.2.20. Java實現經過正則表達式提取一段文本中的電子郵件,並將@替換爲#輸出
    java.lang.util.regex.*
1.2.21. 學習使用經常使用的Java工具庫
    commons.lang, commons.*…
    guava-libraries
    netty
1.2.22. 什麼是API&SPI
    http://en.wikipedia.org/wiki/Application_programming_interface 
    http://en.wikipedia.org/wiki/Service_provider_interface
1.2.23. 參考資料
    JDK src.zip 源代碼
    http://openjdk.java.net/ 
    http://commons.apache.org/ 
    https://code.google.com/p/guava-libraries/ 
    http://netty.io/ 
    http://stackoverflow.com/questions/2954372/difference-between-spi-and-api 
    http://stackoverflow.com/questions/11404230/how-to-implement-the-api-spi-pattern-in-java

1.3. Java併發編程

1.3.1. 閱讀源代碼,並學會使用
    java.lang.Thread
    java.lang.Runnable
    java.util.concurrent.Callable
    java.util.concurrent.locks.ReentrantLock
    java.util.concurrent.locks.ReentrantReadWriteLock
    java.util.concurrent.atomic.Atomic*
    java.util.concurrent.Semaphore
    java.util.concurrent.CountDownLatch
    java.util.concurrent.CyclicBarrier
    java.util.concurrent.ConcurrentHashMap
    java.util.concurrent.Executors
1.3.2. 學習使用線程池,本身設計線程池須要注意什麼
1.3.3. 鎖
    什麼是鎖,鎖的種類有哪些,每種鎖有什麼特色,適用場景是什麼
    在併發編程中鎖的意義是什麼
1.3.4. synchronized的做用是什麼,synchronized和lock
1.3.5. sleep和wait
1.3.6. wait和notify
1.3.7. 寫一個死鎖的程序
1.3.8. 什麼是守護線程,守護線程和非守護線程的區別以及用法
1.3.9. volatile關鍵字的理解
    C++ volatile關鍵字和Java volatile關鍵字
    happens-before語義
    編譯器指令重排和CPU指令重排
    http://en.wikipedia.org/wiki/Memory_ordering 
    http://en.wikipedia.org/wiki/Volatile_variable 
    http://preshing.com/20130702/the-happens-before-relation/
    1.3.10. 如下代碼是否是線程安全?爲何?若是爲count加上volatile修飾是否可以作到線程安全?你以爲該怎麼作是線程安全的?
    public class Sample{
      private static int count =0;
      public static void increment(){
        count++;
      }
    }
1.3.11. 解釋一下下面兩段代碼的差異
// 代碼1
public class Sample {
  private static int count = 0;
  synchronized public static void increment() {
    count++;
  }
}
// 代碼2
public class Sample {
  private static AtomicInteger count = new AtomicInteger(0);
  public static void increment() {
    count.getAndIncrement();
  }
}
1.3.12. 參考資料
    http://book.douban.com/subject/10484692/ 
    http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

2、 進階篇

2.1. Java底層知識

2.1.1. 學習瞭解字節碼、class文件格式
    http://en.wikipedia.org/wiki/Java_class_file 
    http://en.wikipedia.org/wiki/Java_bytecode 
    http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings 
    http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/ 
    http://asm.ow2.org/
2.1.2. 寫一個程序要求實現javap的功能(手工完成,不借助ASM等工具)
如Java源代碼:
public static void main(String[] args) {
  int i = 0;
  i += 1;
  i *= 1;
  System.out.println(i);
}
編譯後讀取class文件輸出如下代碼:
public static void main(java.lang.String[]);
  Code:
   Stack=2, Locals=2, Args_size=1
   0:   iconst_0
   1:   istore_1
   2:   iinc    1, 1
   5:   iload_1
   6:   iconst_1
   7:   imul
   8:   istore_1
   9:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   12:  iload_1
   13:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
   16:  return
  LineNumberTable: 
   line 4: 0
   line 5: 2
   line 6: 5
   line 7: 9
   line 8: 16
2.1.3. CPU緩存,L1,L2,L3和僞共享
    http://duartes.org/gustavo/blog/post/intel-cpu-caches/ 
    http://mechanical-sympathy.blogspot.com/2011/07/false-sharing.html
2.1.4. 什麼是尾遞歸
2.1.5. 熟悉位運算
    用位運算實現加、減、乘、除、取餘
2.1.6. 參考資料
    http://book.douban.com/subject/1138768/ 
    http://book.douban.com/subject/6522893/ 
    http://en.wikipedia.org/wiki/Java_class_file 
    http://en.wikipedia.org/wiki/Java_bytecode 
    http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

2.2. 設計模式

2.2.1. 實現AOP
    CGLIB和InvocationHandler的區別,http://cglib.sourceforge.net/ 
    動態代理模式
    Javassist實現AOP,http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/ 
    ASM實現AOP,http://asm.ow2.org/
2.2.2. 使用模板方法設計模式和策略設計模式實現IOC
2.2.3. 不用synchronized和lock,實現線程安全的單例模式
2.2.4. nio和reactor設計模式
2.2.5. 參考資料
    http://asm.ow2.org/ 
    http://cglib.sourceforge.net/

2.3. 網絡編程知識

2.3.1. Java RMI,Socket,HttpClient
2.3.2. 用Java寫一個簡單的靜態文件的HTTP服務器
    實現客戶端緩存功能,支持返回304
    實現可併發下載一個文件
    使用線程池處理客戶端請求
    使用nio處理客戶端請求
    支持簡單的rewrite規則
    上述功能在實現的時候須要知足「開閉原則」
2.3.3. 瞭解nginx和apache服務器的特性並搭建一個對應的服務器
    http://nginx.org/ 
    http://httpd.apache.org/
2.3.4. 用Java實現FTP、SMTP協議
2.3.5. 什麼是CDN?若是實現?DNS起到什麼做用?
    搭建一個DNS服務器
    搭建一個 Squid 或 Apache Traffic Server 服務器
    http://www.squid-cache.org/ 
    http://trafficserver.apache.org/ 
    http://en.wikipedia.org/wiki/Domain_Name_System
2.3.6. 參考資料
    http://www.ietf.org/rfc/rfc2616.txt 
    http://tools.ietf.org/rfc/rfc5321.txt 
    http://en.wikipedia.org/wiki/Open/closed_principle

2.4. 框架知識

spring,spring mvc,閱讀主要源碼
ibatis,閱讀主要源碼
用spring和ibatis搭建java server

2.5. 應用服務器知識

熟悉使用jboss, https://www.jboss.org/overview/ 
熟悉使用tomcat, http://tomcat.apache.org/ 
熟悉使用jetty, http://www.eclipse.org/jetty/

3、 高級篇

3.1. 編譯原理知識

3.1.1. 用Java實現如下表達式解析並返回結果(語法和Oracle中的select sysdate-1 from dual相似)
    sysdate
    sysdate -1
    sysdate -1/24
    sysdate -1/(12*2)
3.1.2. 實現對一個List經過DSL篩選
    QList<Map<String, Object>> mapList = new QList<Map<String, Object>>;
    mapList.add({"name": "hatter test"});
    mapList.add({"id": -1,"name": "hatter test"});
    mapList.add({"id": 0, "name": "hatter test"});
    mapList.add({"id": 1, "name": "test test"});
    mapList.add({"id": 2, "name": "hatter test"});
    mapList.add({"id": 3, "name": "test hatter"});
    mapList.query("id is not null and id > 0 and name like '%hatter%'");
    要求返回列表中匹配的對象,即最後兩個對象;
3.1.3. 用Java實現如下程序(語法和變量做用域處理都和JavaScript相似):
    代碼:
    var a = 1;
    var b = 2;
    var c = function() {
      var a = 3;
      println(a);
      println(b);
    };
    c();
    println(a);
    println(b);
    輸出:
    3212
3.1.4. 參考資料
    http://en.wikipedia.org/wiki/Abstract_syntax_tree 
    https://javacc.java.net/ 
    http://www.antlr.org/

3.2. 操做系統知識

Ubuntu
Centos
使用linux,熟悉shell腳本

3.3. 數據存儲知識

3.3.1. 關係型數據庫
MySQL
如何看執行計劃
如何搭建MySQL主備
binlog是什麼
Derby,H2,PostgreSQL
SQLite
3.3.2. NoSQL
Cache
Redis
Memcached
Leveldb
Bigtable
HBase
Cassandra
Mongodb
圖數據庫
neo4j
3.3.3. 參考資料
http://db-engines.com/en/ranking 
http://redis.io/ 
https://code.google.com/p/leveldb/ 
http://hbase.apache.org/ 
http://cassandra.apache.org/ 
http://www.mongodb.org/ 
http://www.neo4j.org/

3.4. 大數據知識

3.4.1. Zookeeper,在linux上部署zk
3.4.2. Solr,Lucene,ElasticSearch
    在linux上部署solr,solrcloud,新增、刪除、查詢索引
3.4.3. Storm,流式計算,瞭解Spark,S4
    在linux上部署storm,用zookeeper作協調,運行storm hello world,local和remote模式運行調試storm topology。
3.4.4. Hadoop,離線計算
    Hdfs:部署NameNode,SecondaryNameNode,DataNode,上傳文件、打開文件、更改文件、刪除文件
    MapReduce:部署JobTracker,TaskTracker,編寫mr job
    Hive:部署hive,書寫hive sql,獲得結果
    Presto:類hive,不過比hive快,很是值得學習
3.4.5. 分佈式日誌收集flume,kafka,logstash
3.4.6. 數據挖掘,mahout
3.4.7. 參考資料
    http://zookeeper.apache.org/ 
    https://lucene.apache.org/solr/ 
    https://github.com/nathanmarz/storm/wiki 
    http://hadoop.apache.org/ 
    http://prestodb.io/ 
    http://flume.apache.org/
    http://logstash.net/
    http://kafka.apache.org/
    http://mahout.apache.org/

3.5. 網絡安全知識

3.5.1. 什麼是DES、AES
3.5.2. 什麼是RSA、DSA
3.5.3. 什麼是MD5,SHA1
3.5.4. 什麼是SSL、TLS,爲何HTTPS相對比較安全
3.5.5. 什麼是中間人攻擊、若是避免中間人攻擊
3.5.6. 什麼是DOS、DDOS、CC攻擊
3.5.7. 什麼是CSRF攻擊
3.5.8. 什麼是CSS攻擊
3.5.9. 什麼是SQL注入攻擊
3.5.10. 什麼是Hash碰撞拒絕服務攻擊
3.5.11. 瞭解並學習下面幾種加強安全的技術
    http://www.openauthentication.org/ 
    HOTP http://www.ietf.org/rfc/rfc4226.txt 
    TOTP http://tools.ietf.org/rfc/rfc6238.txt 
    OCRA http://tools.ietf.org/rfc/rfc6287.txt 
    http://en.wikipedia.org/wiki/Salt_(cryptography)
3.5.12. 用openssl籤一個證書部署到apache或nginx
3.5.13. 參考資料
    http://en.wikipedia.org/wiki/Cryptographic_hash_function 
    http://en.wikipedia.org/wiki/Block_cipher 
    http://en.wikipedia.org/wiki/Public-key_cryptography 
    http://en.wikipedia.org/wiki/Transport_Layer_Security 
    http://www.openssl.org/ 
    https://code.google.com/p/google-authenticator/

4、 擴展篇

4.1. 相關知識

4.1.1. 雲計算,分佈式,高可用,可擴展
4.1.2. 虛擬化
    https://linuxcontainers.org/ 
    http://www.linux-kvm.org/page/Main_Page 
    http://www.xenproject.org/ 
    https://www.docker.io/
4.1.3. 監控
    http://www.nagios.org/ 
    http://ganglia.info/
4.1.4. 負載均衡
    http://www.linuxvirtualserver.org/
4.1.5. 學習使用git
    https://github.com/ 
    https://git.oschina.net/
4.1.6. 學習使用maven
    http://maven.apache.org/
4.1.7. 學習使用gradle
    http://www.gradle.org/
4.1.8. 學習一個小語種語言
    Groovy
    Scala
    LISP, Common LISP, Schema, Clojure
    R
    Julia
    Lua
    Ruby
4.1.9. 嘗試瞭解編碼的本質
    瞭解如下概念
    ASCII, ISO-8859-1
    GB2312, GBK, GB18030
    Unicode, UTF-8
    不使用 String.getBytes() 等其餘工具類/函數完成下面功能
    public static void main(String[] args) throws IOException {
        String str = "Hello, 咱們是中國人。";
        byte[] utf8Bytes = toUTF8Bytes(str);
        FileOutputStream fos = new FileOutputStream("f.txt");
        fos.write(utf8Bytes);
        fos.close();
    }
    public static byte[] toUTF8Bytes(String str) {
        return null; // TODO
    }
    想一下上面的程序能不能寫一個轉GBK的?
    寫個程序自動判斷一個文件是哪一種編碼
4.1.10. 嘗試瞭解時間的本質
    時區 & 冬令時、夏令時
    http://en.wikipedia.org/wiki/Time_zone 
    ftp://ftp.iana.org/tz/data/asia 
    http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9C%8B%E6%99%82%E5%8D%80 
    閏年, http://en.wikipedia.org/wiki/Leap_year 
    閏秒, ftp://ftp.iana.org/tz/data/leapseconds 
    System.currentTimeMillis() 返回的時間是什麼
4.1.11. 參考資料
    http://git-scm.com/ 
    http://en.wikipedia.org/wiki/UTF-8 
    http://www.iana.org/time-zones

4.2. 擴展學習

4.2.1. JavaScript知識

4.2.1.1. 什麼是prototype

修改代碼,使程序輸出「1 3 5」: http://jsfiddle.net/Ts7Fk/
4.2.1.2. 什麼是閉包

看一下這段代碼,並解釋一下爲何按Button1時沒有alert出「This is button: 1」,如何修改:
http://jsfiddle.net/FDPj3/1/
4.2.1.3. 瞭解並學習一個JS框架

    jQuery
    ExtJS
    ArgularJS
4.2.1.4. 寫一個Greasemonkey插件

    http://en.wikipedia.org/wiki/Greasemonkey
4.2.1.5. 學習node.js

    http://nodejs.org/
4.2.2. 學習html5
    ArgularJS, https://docs.angularjs.org/api
4.2.3. 參考資料
    http://www.ecmascript.org/ 
    http://jsfiddle.net/ 
    http://jsbin.com/ 
    http://runjs.cn/ 
    http://userscripts.org/

5、 推薦書籍



JAVA程序員技術棧、業務棧、工具棧 目錄: 一、技術棧 二、業務棧 三、工具棧 今天是實習期以來將近100天了,感謝公司給予的指望與同事們提供的幫助。很久沒更新博客了,一是懶於寫,二是文章寫得不夠深入、自身的知識體系還較零亂、理解不夠全面和精湛,甚至存在誤差和誤導,距離小目標的實現之路還很遠很遠,現總結一下我自身這三個月來做爲一名研發部->項目組->實習JAVA開發工程師用到的一些技術棧、業務棧及工具棧。 三個月來,共參與項目四個: 架構管控項目一個; 開發維護項目一個; 新開發項目一個; 維保項目一個; 針對本身參與的項目,下面列出三個月來我涉及的一些技術棧、業務棧及工具棧概述: 一、技術棧: Java: SSM(Spring + Spring MVC + Mybatis): Spring: Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架; Spring MVC: Spring MVC 分離了控制器、模型對象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定製; Mybatis: MyBatis是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了幾乎全部的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄; Java基礎 多線程、Future、Callable 內部類、閉包和回調 併發、Executor Apache Commons CLI 開發命令行工具 JVM: 類加載機制; 線程安全; 垃圾回收機制——新生代、老年代、永久代,可以對須要執行的程序配置相關參數; JAVA堆; HaaS:統一Hadoop資源池平臺,基於Hadoop等大數據技術,提供統一數據存儲、計算能力 HDFS(Hadoop Distributed File System):海量數據存儲 存儲並管理PB級數據; 處理非結構化數據; 注重數據處理的吞吐量; 應用模式Write_Once_Read_Many; YARN(Yet Another Resource Negotiator):統一資源調度和分配 ResourceManager:負責集羣資源管理和調度; ApplicationMaster:替代JobTracker負責計算任務的管理和調度; Nodemanager:替代TaskTracker負責每一個節點上計算Task的管理和調度; MapReduce:非結構化、半結構化數據的海量批處理 Map:映射,用來把一組鍵值對映射成一組新的鍵值對; Reduce:歸約,用來保證全部映射的鍵值對中的每個共享相同的鍵組,並進行聚合計算; 核心思想: 利用成百上千個CPU並行處理海量數據; 移動計算比移動數據更划算; Spark:分佈式內存計算框架 Spark是一種與Hadoop類似的開源集羣計算環境,Spark使用了內存內運算技術,能在數據還沒有寫入硬盤時即在內存內分析運算,而相對於傳統的大數據解決方案Hadoop的MapReduce會在運行完工做後將中介數據存放在磁盤中,Spark在內存內運行程序的運算速度能作到比Hadoop MapReduce的運算速度快上100倍; Spark Streaming:實時/準實時流的計算框架 Spark Streaming將數據劃分爲一個一個的數據塊(batch),每一個數據塊經過微批處理的方式對數據進行處理,在Spark Streaming中,數據處理的單位是一批而不是單條,而數據採集確是逐條進行的,所以Spark Streaming系統須要設置間隔使得數據彙總到必定的量後再一併操做,這個間隔就是批處理間隔。批處理間隔是Spark Streaming的核心概念和關鍵參數,它決定了Spark Streaming提交做業的頻率和數據處理的延遲,同時也影響着數據處理的吞吐量和性能; HBase:Key/Value、半結構化數據的海量存儲和檢索 分佈式的、面向列的開源數據庫; Hadoop HDFS爲HBase提供了高可靠性的底層存儲支持,Hadoop MapReduce爲HBase提供了高性能的計算能力,Zookeeper爲HBase提供了穩定服務和故障轉移機制。這使得HBase能夠用於支撐億級的海量數據存儲和應用; Hive:結構化數據的查詢和分析 Hive是基於Hadoop的一個數據倉庫工具,能夠將結構化的數據文件映射成一張數據庫表,並提供完整的SQL查詢功能,能夠將SQL語句轉換爲MapReduce任務運行; Hive擅長的是非實時的、離線的、對響應實時性要求不高的海量數據即席查詢(SQL查詢); Hive和傳統關係型數據庫有很大區別,Hive將外部的任務解析成一個MapReduce可執行計劃,每次提交任務和執行任務都須要消耗不少時間(能夠換用Tez計算框架來提高性能),這也就決定Hive只能處理一些高延遲的應用。 Zookeeper:分佈式協同工具 Zookeeper是利用Paxos算法解決消息傳遞一致性的分佈式服務框架; Zookeeper經過部署多臺機器,可以實現分佈式的負載均衡的訪問服務。不一樣的Client向Zookeeper中不一樣機器請求數據; 爲了實現集羣中配置數據的增刪改查保證一致性問題,須要有主節點,由主節點來作出修改的動做,並同步到其它節點上面; 當主節點出現故障時,將在其餘節點中自動經過必定的選舉方法選舉出新的主節點; Oozie:任務調度工具 Oozie是Hadoop平臺的一種工做流調度引擎,Oozie是一種Java Web應用程序,它運行在Java Servlet容器(Tomcat),並使用數據庫來存儲如下內容: 工做流定義; 當前運行的工做流實例,包括實例的狀態和變量; Oozie工做流是放置在控制依賴DAG中的一組動做,其中指定了動做執行的順序; Ambari:可視化集羣管理工具 部署、啓動、監控、查看、關閉Hadoop集羣,可視化監控、運維、告警; Ambari主要由兩部分組成: Ambari Server; Ambari Client; 用戶經過Ambari Server通知Ambari Agent安裝對應的軟件,Ambari Agent會定時地發送各個機器每一個軟件模塊的狀態給Ambari Server,最終這些狀態信息會呈如今Ambari的GUI,方便用戶瞭解到集羣的各類狀態,並進行相應的維護; Kafka:分佈式消息總線 Kafka是一個低延遲高吞吐的分佈式消息隊列,適用於離線和在線消息消費,用於低延遲地收集和發送大量的事件和日誌數據; 消息隊列(Message Queue)用於將消息生產的前端和後端服務架構解耦,它是一種pub-sub結構,前端消息生產者不須要知道後端消息消費者的狀況,只須要將消息發佈到消息隊列中,且只用發佈一次,便可認爲消息已經被可靠存儲了,不用再維護消息的一致性和持久化,同時消息只傳輸一次就能夠給後端多個消費者,避免了每一個消費者都直接去前端獲取形成的前端服務器計算資源和帶寬的浪費,甚至影響生產環境; 消息隊列分爲如下幾種角色: Producer:生產者,即消息生產者,好比實時信令數據; Consumer: 消費者,即消息的消費者,好比後端的實時統計程序和批量挖掘程序; Consumer Group:消費者組,即消費者的併發單位,在數據量比較大的時候,須要分佈式集羣來處理消息,針對同一種消息,一組消費者各自消費某一Topic(話題,表明一些消息,Topic 是一個邏輯單位,一個 Topic 被劃分紅 N 個 Partition,在數據量大的時候經過 Partition 來實現分佈式傳輸)的一部分,來協做處理; Broker:存儲節點,Kafka支持將消息進行短暫的持久化,好比存儲最近一週的數據,以便下游集羣故障時,從新訂閱以前丟失的數據。 在Kafka中,Producer自動經過Zookeeper獲取到Broker列表,經過Partition算法自動負載均衡將消息發送到Broker集羣。Broker 收到消息後自動分發到副本 Broker 上保證消息的可靠性。下游消費者經過 Zookeeper獲取Broker集羣位置和Topic等信息,自動完成訂閱消費等動做。 Kerberos & Ranger:安全加固 Kerberos: 經過密鑰系統爲客戶機/服務器應用程序提供強大的認證服務; Apache Ranger: 集中式安全管理框架,並解決受權和審計; 身份驗證(Authentication):基於Kerberos的用戶、服務身份驗證; 統一帳戶(Account):使用統一應用帳號訪問平臺衆多服務; 訪問受權(Authorization):基於Ranger的精細粒度訪問權限; 操做審計(Audit):基於Ranger的集中式審計日誌; DBaaS:開箱即用的關係型數據庫服務 MySQL高可用: 主從複製: 一主一從 + Keepalived + VRRP((Virtual Router Redundancy Protocol,虛擬路由冗餘協議): Keepalived: Keepalived是一個基於VRRP協議來實現的LVS服務高可用方案,能夠利用其來避免單點故障。一個LVS服務會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),可是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。 VRRP: 解決靜態路由單點故障問題,VRRP經過一競選(election)協議來動態的將路由任務交給LAN中虛擬路由器中的某臺VRRP路由器。 採用一主一從構建高可用MySQL服務,當主機宕機時,能夠自動觸發主從節點切換。經過使用VIP + Keepalived組件,實現主從切換時MySQL服務IP自動漂移,主從庫自動切換。 MHA(一主一從一隻讀) + Keepalived + VRRP: MHA由兩部分組成:MHA Manager(管理節點)和MHA Node(數據節點)。MHA Manager能夠單獨部署在一臺獨立的機器上管理多個master-slave集羣,也能夠部署在一臺slave節點上。MHA Node運行在每臺MySQL服務器上,MHA Manager會定時探測集羣中的master節點,當master出現故障時,它能夠自動將最新數據的slave提高爲新的master,而後將全部其餘的slave從新指向新的master。整個故障轉移過程對應用程序徹底透明。 CssS:提供標準化的容器技術和容器管理方案,支撐無狀態應用的標準化打包和部署 Docker:開源應用容器引擎 Docker是Docker公司開源的一個基於輕量級虛擬化技術的容器引擎項目,整個項目 基於 Go 語言開發,並聽從 Apache 2.0 協議; 當前,Docker能夠在容器內部快速自動化部署應用,並能夠經過內核虛擬化技術 (namespaces及cgroups等) 來提供容器的資源隔離與安全保障等; Docker經過操做系統層的虛擬化實現隔離,因此Docker容器在運行時,不須要相似 虛擬機(VM)額外的操做系統開銷,提升資源利用率,而且提高諸如I/O等方面的性能; Docker完全釋放了虛擬化的潛力和威力,極大下降了雲計算資源供應的成本,同時讓業務應用的開發、測試、部署都變得史無前例敏捷、高效和輕鬆; Kubernetes:容器集羣管理系統 Kubernetes是Google開源的容器集羣管理系統,其提供應用部署、維護、 擴展機制等功能,利用Kubernetes能方便地管理跨機器運行容器化的應用,其主要功能以下: 使用Docker對應用程序包裝(package)、實例化(instantiate)、運行(run); 以集羣的方式運行、管理跨機器的容器; 解決Docker跨機器容器之間的通信問題; Kubernetes的自我修復機制使得容器集羣老是運行在用戶指望的狀態; DevOps:開發運維一體化 第一階段:核心實踐和試點; 第二階段:持續集成和測試; 第三階段:持續部署和交付; 第四階段:持續運維; 第五階段:持續評估改進; 統一日誌服務:提供多租戶安全的系統、應用海量日誌分析、交互式查詢和可視化 核心能力: 規劃構建的統一日誌平臺核心能力包括: 多租戶安全:支持多租戶端到端業務日誌的存儲、分析、可視化能力,支持多租戶數據安全; 分析挖掘能力:經過Elasticsearch的結構化查詢,實現複雜的多維度聯合查詢及數據聚合,深度挖掘日誌數據; 可視化能力:支持圖表可視化呈現分析結果,支持Dashboard實時監控關鍵指標; Filebeat: 輕量級的日誌採集器,部署於應用側,負責實時採集日誌; Logstash: 負責日誌解析和轉發,靈活的正則配置可同時處理不一樣數據結構的日誌,並寫入Elasticsearch不一樣索引; Kafka: 分佈式消息隊列,在Filebeat和Logstash中引入分佈式消息隊列Kafka,能夠從容的應對峯值數據的高負載,而且在Logstash出現故障時,具有良好的恢復能力,可直接從Kafka作數據回放,避免回溯至若干上游應用; Elasticsearch: 負責日誌(原始數據、分析數據)的存儲、索引和搜索,是實時分析數據流程的核心組件; Kibana: 前端可視化工具,Elasticsearch的皮膚,結合Elasticsearch豐富的查詢邏輯,可定製多種圖表; Linux命令行: FTP、不一樣服務器之間、服務器與本地上傳/下載、進程監控、內存監控、JVM監控、打包部署、Vim編輯、文件受權、審閱日誌文件等等; Bash腳本開發: 可以閱讀並編寫簡單的腳本; Python: 可以閱讀通常的Python腳本,深刻後可學習爬蟲; 機器學習算法: 邏輯迴歸算法; 基於特徵的推薦算法; 分類算法; 聚類算法; 二、工具棧: 版本管理工具:Git,SVN; JAVA開發IDE:Intellij IDEA; 項目構建工具:Maven; 文本編輯器:Subline、NotePad等; 數據庫管理工具:Navicat、SQLite Free等; 終端仿真程序:SecureCRT、Xshell5等; 三、業務棧: Tower化記錄: 作好任務的Tower化記錄,包括: 需求由來; 任務的具體描述; 解決問題的過程當中關鍵細節記錄; 抄送給相關的項目負責人,並給出制定出解決問題的時間; 任務結論及相關解決方案文件的上傳; CPS工做清單: 對於維護過程當中出現的每個相關問題,應養成記錄的良好習慣,方便將來進行整理和排查。所以創建DMP項目維護工做清單,對於維護項的類別、詳細描述、維護時間、維護耗時、處理結果、維護相關人員及對應的Tower任務連接進行記錄; 現有任務梳理: 梳理遺留任務清單並標註優先級; 評估還須要多少人天能夠完成問題及Bug; 評估將來的運維(不含新需求)每週須要投入的人力; 每週工做明細: bug修復:總數 + 清單明細(包括分工、人天耗時); 新功能增長:總數 + 清單明細; 功能優化:總數 + 清單明細; 下週工做計劃: 遇到的問題: 解決方案: XXX 求助: XXX

1 java基礎: 1.1 算法 1.1 排序算法:直接插入排序、希爾排序、冒泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序 1.2 二叉查找樹、紅黑樹、B樹、B+樹、LSM樹(分別有對應的應用,數據庫、HBase) 1.3 BitSet解決數據重複和是否存在等問題 1.2 基本 2.1 字符串常量池的遷移 2.2 字符串KMP算法 2.3 equals和hashcode 2.4 泛型、異常、反射 2.5 string的hash算法 2.6 hash衝突的解決辦法:拉鍊法 2.7 foreach循環的原理 2.8 static、final、transient等關鍵字的做用 2.9 volatile關鍵字的底層實現原理 2.10 Collections.sort方法使用的是哪一種排序方法 2.11 Future接口,常見的線程池中的FutureTask實現等 2.12 string的intern方法的內部細節,jdk1.6和jdk1.7的變化以及內部cpp代碼StringTable的實現 1.3 設計模式 單例模式 工廠模式 裝飾者模式 觀察者設計模式 ThreadLocal設計模式 。。。 1.4 正則表達式 4.1 捕獲組和非捕獲組 4.2 貪婪,勉強,獨佔模式 1.5 java內存模型以及垃圾回收算法 5.1 類加載機制,也就是雙親委派模型 5.2 Java內存分配模型(默認HotSpot) 線程共享的:堆區、永久區 線程獨享的:虛擬機棧、本地方法棧、程序計數器 5.3 內存分配機制:年輕代(Eden區、兩個Survivor區)、年老代、永久代以及他們的分配過程 5.4 強引用、軟引用、弱引用、虛引用與GC 5.5 happens-before規則 5.6 指令重排序、內存柵欄 5.7 Java 8的內存分代改進 5.8 垃圾回收算法: 標記-清除(不足之處:效率不高、內存碎片) 複製算法(解決了上述問題,可是內存只能使用一半,針對大部分對象存活時間短的場景,引出了一個默認的8:1:1的改進,缺點是仍然須要藉助外界來解決可能承載不下的問題) 標記整理 5.8 經常使用垃圾收集器: 新生代:Serial收集器、ParNew收集器、Parallel Scavenge 收集器 老年代:Serial Old收集器、Parallel Old收集器、CMS(Concurrent Mark Sweep)收集器、 G1 收集器(跨新生代和老年代) 5.9 經常使用gc的參數:-Xmn、-Xms、-Xmx、-XX:MaxPermSize、-XX:SurvivorRatio、-XX:-PrintGCDetails 5.10 經常使用工具: jps、jstat、jmap、jstack、圖形工具jConsole、Visual VM、MAT 1.6 鎖以及併發容器的源碼 6.1 synchronized和volatile理解 6.2 Unsafe類的原理,使用它來實現CAS。所以誕生了AtomicInteger系列等 6.3 CAS可能產生的ABA問題的解決,如加入修改次數、版本號 6.4 同步器AQS的實現原理 6.5 獨佔鎖、共享鎖;可重入的獨佔鎖ReentrantLock、共享鎖 實現原理 6.6 公平鎖和非公平鎖 6.7 讀寫鎖 ReentrantReadWriteLock的實現原理 6.8 LockSupport工具 6.9 Condition接口及其實現原理 6.10 HashMap、HashSet、ArrayList、LinkedList、HashTable、ConcurrentHashMap、TreeMap的實現原理 6.11 HashMap的併發問題 6.12 ConcurrentLinkedQueue的實現原理 6.13 Fork/Join框架 6.14 CountDownLatch和CyclicBarrier 1.7 線程池源碼 7.1 內部執行原理 7.2 各類線程池的區別 2 web方面: 2.1 SpringMVC的架構設計 1.1 servlet開發存在的問題:映射問題、參數獲取問題、格式化轉換問題、返回值處理問題、視圖渲染問題 1.2 SpringMVC爲解決上述問題開發的幾大組件及接口:HandlerMapping、HandlerAdapter、HandlerMethodArgumentResolver、HttpMessageConverter、Converter、GenericConverter、HandlerMethodReturnValueHandler、ViewResolver、MultipartResolver 1.3 DispatcherServlet、容器、組件三者之間的關係 1.4 敘述SpringMVC對請求的總體處理流程 1.5 SpringBoot 2.2 SpringAOP源碼 2.1 AOP的實現分類:編譯期、字節碼加載前、字節碼加載後三種時機來實現AOP 2.2 深入理解其中的角色:AOP聯盟、aspectj、jboss AOP、spring自身實現的AOP、Spring嵌入aspectj。特別是能用代碼區分後二者 2.3 接口設計: AOP聯盟定義的概念或接口:Pointcut(概念,沒有定義對應的接口)、Joinpoint、Advice、MethodInterceptor、MethodInvocation SpringAOP針對上述Advice接口定義的接口及其實現類:BeforeAdvice、AfterAdvice、MethodBeforeAdvice、AfterReturningAdvice;針對aspectj對上述接口的實現AspectJMethodBeforeAdvice、AspectJAfterReturningAdvice、AspectJAfterThrowingAdvice、AspectJAfterAdvice。 SpringAOP定義的定義的AdvisorAdapter接口:將上述Advise轉化爲MethodInterceptor SpringAOP定義的Pointcut接口:含有兩個屬性ClassFilter(過濾類)、MethodMatcher(過濾方法) SpringAOP定義的ExpressionPointcut接口:實現中會引入aspectj的pointcut表達式 SpringAOP定義的PointcutAdvisor接口(將上述Advice接口和Pointcut接口結合起來) 2.4 SpringAOP的調用流程 2.5 SpringAOP本身的實現方式(表明人物ProxyFactoryBean)和藉助aspectj實現方式區分 2.3 Spring事務體系源碼以及分佈式事務Jotm Atomikos源碼實現 3.1 jdbc事務存在的問題 3.2 Hibernate對事務的改進 3.3 針對各類各樣的事務,Spring如何定義事務體系的接口,以及如何融合jdbc事務和Hibernate事務的 3.4 三種事務模型包含的角色以及各自的職責 3.5 事務代碼也業務代碼分離的實現(AOP+ThreadLocal來實現) 3.6 Spring事務攔截器TransactionInterceptor全景 3.7 X/Open DTP模型,兩階段提交,JTA接口定義 3.8 Jotm、Atomikos的實現原理 3.9 事務的傳播屬性 3.10 PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED的實現原理以及區別 3.11 事物的掛起和恢復的原理 2.4 數據庫隔離級別 4.1 Read uncommitted:讀未提交 4.2 Read committed : 讀已提交 4.3 Repeatable read:可重複讀 4.4 Serializable :串行化 2.5 數據庫 5.1 數據庫性能的優化 5.2 深刻理解MySQL的Record Locks、Gap Locks、Next-Key Locks 例以下面的在什麼狀況下會出現死鎖: start transaction; DELETE FROM t WHERE id =6; INSERT INTO t VALUES(6); commit; 5.3 insert into select語句的加鎖狀況 5.4 事務的ACID特性概念 5.5 innodb的MVCC理解 5.6 undo redo binlog 1 undo redo 均可以實現持久化,他們的流程是什麼?爲何選用redo來作持久化? 2 undo、redo結合起來實現原子性和持久化,爲何undo log要先於redo log持久化? 3 undo爲何要依賴redo? 4 日誌內容能夠是物理日誌,也能夠是邏輯日誌?他們各自的優勢和缺點是? 5 redo log最終採用的是物理日誌加邏輯日誌,物理到page,page內邏輯。還存在什麼問題?怎麼解決?Double Write 6 undo log爲何不採用物理日誌而採用邏輯日誌? 7 爲何要引入Checkpoint? 8 引入Checkpoint後爲了保證一致性須要阻塞用戶操做一段時間,怎麼解決這個問題?(這個問題仍是頗有廣泛性的,redis、ZooKeeper都有相似的狀況以及不一樣的應對策略)又有了同步Checkpoint和異步Checkpoint 9 開啓binlog的狀況下,事務內部2PC的通常過程(含有2次持久化,redo log和binlog的持久化) 10 解釋上述過程,爲何binlog的持久化要在redo log以後,在存儲引擎commit以前? 11 爲何要保持事務之間寫入binlog和執行存儲引擎commit操做的順序性?(即先寫入binlog日誌的事務必定先commit) 12 爲了保證上述順序性,以前的辦法是加鎖prepare_commit_mutex,可是這極大的下降了事務的效率,怎麼來實現binlog的group commit? 13 怎麼將redo log的持久化也實現group commit?至此事務內部2PC的過程,2次持久化的操做均可以group commit了,極大提升了效率 2.6 ORM框架: mybatis、Hibernate 6.1 最原始的jdbc->Spring的JdbcTemplate->hibernate->JPA->SpringDataJPA的演進之路 2.7 SpringSecurity、shiro、SSO(單點登陸) 7.1 Session和Cookie的區別和聯繫以及Session的實現原理 7.2 SpringSecurity的認證過程以及與Session的關係 7.3 CAS實現SSO(詳見Cas(01)——簡介) 2.8 日誌 8.1 jdk自帶的logging、log4j、log4j二、logback 8.2 門面commons-logging、slf4j 8.3 上述6種混戰時的日誌轉換 2.9 datasource 9.1 c3p0 9.2 druid 9.3 JdbcTemplate執行sql語句的過程當中對Connection的使用和管理 2.10 HTTPS的實現原理 3 分佈式、java中間件、web服務器等方面: 3.1 ZooKeeper源碼 1.1 客戶端架構 1.2 服務器端單機版和集羣版,對應的請求處理器 1.3 集羣版session的創建和激活過程 1.4 Leader選舉過程 1.5 事務日誌和快照文件的詳細解析 1.6 實現分佈式鎖、分佈式ID分發器 1.7 實現Leader選舉 1.8 ZAB協議實現一致性原理 3.2 序列化和反序列化框架 2.1 Avro研究 2.2 Thrift研究 2.3 Protobuf研究 2.4 Protostuff研究 2.5 Hessian 3.3 RPC框架dubbo源碼 3.1 dubbo擴展機制的實現,對比SPI機制 3.2 服務的發佈過程 3.3 服務的訂閱過程 3.4 RPC通訊的設計 3.4 NIO模塊以及對應的Netty和Mina、thrift源碼 4.1 TCP握手和斷開及有限狀態機 4.2 backlog 4.3 BIO NIO 4.4 阻塞/非阻塞的區別、同步/異步的區別 4.5 阻塞IO、非阻塞IO、多路複用IO、異步IO 4.6 Reactor線程模型 4.7 jdk的poll、epoll與底層poll、epoll的對接實現 4.8 Netty本身的epoll實現 4.9 內核層poll、epoll的大體實現 4.10 epoll的邊緣觸發和水平觸發 4.11 Netty的EventLoopGroup設計 4.12 Netty的ByteBuf設計 4.13 Netty的ChannelHandler 4.13 Netty的零拷貝 4.14 Netty的線程模型,特別是與業務線程以及資源釋放方面的理解 3.5 消息隊列kafka、RocketMQ、Notify、Hermes 5.1 kafka的文件存儲設計 5.2 kafka的副本複製過程 5.3 kafka副本的leader選舉過程 5.4 kafka的消息丟失問題 5.5 kafka的消息順序性問題 5.6 kafka的isr設計和過半對比 5.7 kafka自己作的很輕量級來保持高效,不少高級特性沒有:事務、優先級的消息、消息的過濾,更重要的是服務治理不健全,一旦出問題,不能直觀反應出來,不太適合對數據要求十分嚴苛的企業級系統,而適合日誌之類併發量大可是容許少許的丟失或重複等場景 5.8 Notify、RocketMQ的事務設計 5.9 基於文件的kafka、RocketMQ和基於數據庫的Notify和Hermes 5.10 設計一個消息系統要考慮哪些方面 5.11 丟失消息、消息重複、高可用等話題 3.6 數據庫的分庫分表mycat 3.7 NoSql數據庫mongodb 3.8 KV鍵值系統memcached redis 8.1 redis對客戶端的維護和管理,讀寫緩衝區 8.2 redis事務的實現 8.3 Jedis客戶端的實現 8.4 JedisPool以及ShardedJedisPool的實現 8.5 redis epoll實現,循環中的文件事件和時間事件 8.6 redis的RDB持久化,save和bgsave 8.7 redis AOF命令追加、文件寫入、文件同步到磁盤 8.8 redis AOF重寫,爲了減小阻塞時間採起的措施 8.9 redis的LRU內存回收算法 8.10 redis的master slave複製 8.11 redis的sentinel高可用方案 8.12 redis的cluster分片方案 3.9 web服務器tomcat、ngnix的設計原理 9.1 tomcat的總體架構設計 9.2 tomcat對通訊的併發控制 9.3 http請求到達tomcat的整個處理流程 3.10 ELK日誌實時處理查詢系統 10.1 Elasticsearch、Logstash、Kibana 3.11 服務方面 11.1 SOA與微服務 11.2 服務的合併部署、多版本自動快速切換和回滾 詳見基於Java容器的多應用部署技術實踐 11.3 服務的治理:限流、降級 具體見 張開濤大神的架構系列 服務限流:令牌桶、漏桶 服務降級、服務的熔斷、服務的隔離:netflix的hystrix組件 11.4 服務的線性擴展 無狀態的服務如何作線性擴展: 如通常的web應用,直接使用硬件或者軟件作負載均衡,簡單的輪訓機制 有狀態服務如何作線性擴展: 如Redis的擴展:一致性hash,遷移工具 11.5 服務鏈路監控和報警:CAT、Dapper、Pinpoint 3.12 Spring Cloud 12.1 Spring Cloud Zookeeper:用於服務註冊和發現 12.2 Spring Cloud Config:分佈式配置 12.2 Spring Cloud Netflix Eureka:用於rest服務的註冊和發現 12.3 Spring Cloud Netflix Hystrix:服務的隔離、熔斷和降級 12.4 Spring Cloud Netflix Zuul:動態路由,API Gateway 3.13 分佈式事務 13.1 JTA分佈式事務接口定義,對此與Spring事務體系的整合 13.2 TCC分佈式事務概念 13.3 TCC分佈式事務實現框架案例1:tcc-transaction 13.3.1 TccCompensableAspect切面攔截建立ROOT事務 13.3.2 TccTransactionContextAspect切面使遠程RPC調用資源加入到上述事務中,做爲一個參與者 13.3.3 TccCompensableAspect切面根據遠程RPC傳遞的TransactionContext的標記建立出分支事務 13.3.4 所有RPC調用完畢,ROOT事務開始提交或者回滾,執行全部參與者的提交或回滾 13.3.5 全部參與者的提交或者回滾,仍是經過遠程RPC調用,provider端開始執行對應分支事務的confirm或者cancel方法 13.3.6 事務的存儲,集羣共享問題13.3.7 事務的恢復,避免集羣重複恢復 13.4 TCC分佈式事務實現框架案例2:ByteTCC 13.4.1 JTA事務管理實現,類比Jotm、Atomikos等JTA實現 13.4.2 事務的存儲和恢復,集羣是否共享問題調用方建立CompensableTransaction事務,並加入資源 13.4.3 CompensableMethodInterceptor攔截器向spring事務注入CompensableInvocation資源 13.4.4 Spring的分佈式事務管理器建立做爲協調者CompensableTransaction類型事務,和當前線程進行綁定,同時建立一個jta事務 13.4.5 在執行sql等操做的時候,所使用的jdbc等XAResource資源加入上述jta事務 13.4.6 dubbo RPC遠程調用前,CompensableDubboServiceFilter建立出一個代理XAResource,加入上述 CompensableTransaction類型事務,並在RPC調用過程傳遞TransactionContext參與方建立分支的CompensableTransaction事務,並加入資源,而後提交jta事務 13.4.7 RPC遠程調用來到provider端,CompensableDubboServiceFilter根據傳遞過來的TransactionContext建立出對應的CompensableTransaction類型事務 13.4.8 provider端,執行時碰見@Transactional和@Compensable,做爲一個參與者開啓try階段的事務,即建立了一個jta事務 13.4.9 provider端try執行完畢開始準備try的提交,僅僅是提交上述jta事務,返回結果到RPC調用端調用方決定回滾仍是提交 13.4.10 所有執行完畢後開始事務的提交或者回滾,若是是提交則先對jta事務進行提交(包含jdbc等XAResource資源的提交),提交成功後再對CompensableTransaction類型事務進行提交,若是jta事務提交失敗,則須要回滾CompensableTransaction類型事務。 13.4.11 CompensableTransaction類型事務的提交就是對CompensableInvocation資源和RPC資源的提交,分別調用每個CompensableInvocation資源的confirm,以及每個RPC資源的提交CompensableInvocation資源的提交 13.4.12 此時每個CompensableInvocation資源的confirm又會準備開啓一個新的事務,當前線程的CompensableTransaction類型事務已存在,因此這裏開啓事務僅僅是建立了一個新的jta事務而已 13.4.13 針對此,每個CompensableInvocation資源的confirm開啓的事務,又開始重複上述過程,對於jdbc等資源都加入新建立的jta事務中,而RPC資源和CompensableInvocation資源仍然加入到當前線程綁定的CompensableTransaction類型事務 13.4.14 當前CompensableInvocation資源的confirm開啓的事務執行完畢後,開始執行commit,此時仍然是執行jta事務的提交,提交完畢,一個CompensableInvocation資源的confirm完成,繼續執行下一個CompensableInvocation資源的confirm,即又要從新開啓一個新的jta事務RPC資源的提交(參與方CompensableTransaction事務的提交) 13.4.15 當全部CompensableInvocation資源的confirm執行完畢,開始執行RPC資源的commit,會進行遠程調用,執行遠程provider分支事務的提交,遠程調用過程會傳遞事務id 13.4.16 provider端,根據傳遞過來的事務id找到對應的CompensableTransaction事務,開始執行提交操做,提交操做完成後返回響應結束 13.4.17 協調者收到響應後繼續執行下一個RPC資源的提交,當全部RPC資源也完成相應的提交,則協調者算是完全完成該事務 3.14 一致性算法 14.1 raft(詳見Raft算法賞析) 14.1.1 leader選舉過程,leader選舉約束,要包含全部commited entries,實現上log比過半的log都最新便可 14.1.2 log複製過程,leader給全部的follower發送AppendEntries RPC請求,過半follower回覆ok,則可提交該entry,而後向客戶端響應OK 14.1.3 在上述leader收到過半複製以後,掛了,則後續leader不能直接對這些以前term的過半entry進行提交(這一部分有詳細的案例來證實,並能說出根本緣由),目前作法是在當前term中建立空的entry,而後若是這些新建立的entry被大部分複製了,則此時就能夠對以前term的過半entry進行提交了 14.1.4 leader一旦認爲某個term能夠提交了,則更新本身的commitIndex,同時應用entry到狀態機中,而後在下一次與follower的heartbeat通訊中,將leader的commitIndex帶給follower,讓他們進行更新,同時應用entry到他們的狀態機中 14.1.5 從上述流程能夠看到,做爲client來講,可能會出現這樣的狀況:leader認爲某次client的請求能夠提交了(對應的entry已經被過半複製了),此時leader掛了,還沒來得及給client回覆,也就是說對client來講,請求雖然失敗了,可是請求對應的entry卻被持久化保存了,可是有的時候倒是請求失敗了(過半都沒複製成功)沒有持久化成功,也就是說請求失敗了,服務器端可能成功了也可能失敗了。因此這時候須要在client端下功夫,即cleint端重試的時候仍然使用以前的請求數據進行重試,而不是採用新的數據進行重試,服務器端也必需要實現冪等。 14.1.6 Cluster membership changes 14.2 ZooKeeper使用的ZAB協議(詳見ZooKeeper的一致性算法賞析) 14.2.1 leader選舉過程。要點:對於不一樣狀態下的server的投票的收集,投票是須要選舉出一個包含全部日誌的server來做爲leader 14.2.2 leader和follower數據同步過程,全量同步、差別同步、日誌之間的糾正和截斷,來保證和leader之間的一致性。以及follower加入已經完成選舉的系統,此時的同步的要點:阻塞leader處理寫請求,完成日誌之間的差別同步,還要處理現有進行中的請求的同步,完成同步後,解除阻塞。 14.2.3 廣播階段,即正常處理客戶端的請求,過半響應便可回覆客戶端。 14.2.4 日誌的恢復和持久化。持久化:每隔必定數量的事務日誌持久化一次,leader選舉前持久化一次。恢復:簡單的認爲已寫入日誌的的事務請求都算做已提交的請求(無論以前是否已過半複製),所有執行commit提交。具體的恢復是:先恢復快照日誌,而後再應用相應的事務日誌 14.3 paxos(詳見paxos算法證實過程) 14.3.1 paxos的運做過程: Phase 1: (a) 一個proposer選擇一個編號爲n的議案,向全部的acceptor發送prepare請求 Phase 1: (b) 若是acceptor已經響應的prepare請求中議案編號都比n小,則它承諾再也不響應prepare請求或者accept請求中議案編號小於n的, 而且找出已經accept的最大議案的value返回給該proposer。若是已響應的編號比n大,則直接忽略該prepare請求。 Phase 2:(a) 若是proposer收到了過半的acceptors響應,那麼將提出一個議案(n,v),v就是上述全部acceptor響應中最大accept議案的value,或者是proposer本身的value。而後將該議案發送給全部的acceptor。這個請求叫作accept請求,這一步纔是所謂發送議案請求,而前面的prepare請求更多的是一個構建出最終議案(n,v)的過程。 Phase 2:(b) acceptor接收到編號爲n的議案,若是acceptor尚未對大於n的議案的prepare請求響應過,則acceptor就accept該議案,不然拒絕 14.3.2 paxos的證實過程: 1 足夠多的問題 2 acceptor的初始accept 3 P2-對結果要求 4 P2a-對acceptor的accept要求 5 P2b-對proposer提出議案的要求(結果上要求) 6 P2c-對proposer提出議案的要求(作法上要求) 7 引出prepare過程和P1a 8 8 優化prepare 14.3.3 base paxos和multi-paxos 4 大數據方向 4.1 Hadoop 1.1 UserGroupInformation源碼解讀:JAAS認證、user和group關係的維護 1.2 RPC通訊的實現 1.3 代理用戶的過程 1.4 kerberos認證 4.2 MapReduce 2.1 MapReduce理論及其對應的接口定義 4.3 HDFS 3.1 MapFile、SequenceFile 3.2 ACL 4.4 YARN、Mesos 資源調度 4.5 oozie 5.1 oozie XCommand設計 5.2 DagEngine的實現原理 4.6 Hive 6.1 HiveServer二、metatore的thrift RPC通訊設計 6.2 Hive的優化過程 6.3 HiveServer2的認證和受權 6.4 metastore的認證和受權 6.5 HiveServer2向metatore的用戶傳遞過程 4.7 Hbase 7.1 Hbase的總體架構圖 7.2 Hbase的WAL和MVCC設計 7.3 client端的異步批量flush尋找RegionServer的過程 7.4 Zookeeper上HBase節點解釋 7.5 Hbase中的mini、major合併 7.6 Region的高可用問題對比kafka分區的高可用實現 7.7 RegionServer RPC調用的隔離問題 7.8 數據從內存刷寫到HDFS的粒度問題 7.9 rowKey的設計 7.10 MemStore與LSM《深刻Java虛擬機》 《深刻理解Java虛擬機》 《Effective Java》 《七週七語言》 《七週七數據》 《Hadoop技術內幕》 《Hbase In Action》 《Mahout In Action》 《這就是搜索引擎》 《Solr In Action》 《深刻分析Java Web技術內幕》 《大型網站技術架構》 《高性能MySQL》 《算法導論》 《計算機程序設計藝術》 《代碼大全》 《JavaScript權威指南》
JAVA程序員技術棧、業務棧、工具棧
目錄:
一、技術棧
二、業務棧
三、工具棧
今天是實習期以來將近100天了,感謝公司給予的指望與同事們提供的幫助。很久沒更新博客了,一是懶於寫,二是文章寫得不夠深入、自身的知識體系還較零亂、理解不夠全面和精湛,甚至存在誤差和誤導,距離小目標的實現之路還很遠很遠,現總結一下我自身這三個月來做爲一名研發部->項目組->實習JAVA開發工程師用到的一些技術棧、業務棧及工具棧。
 
三個月來,共參與項目四個:
架構管控項目一個;
開發維護項目一個;
新開發項目一個;
維保項目一個;
 

針對本身參與的項目,下面列出三個月來我涉及的一些技術棧業務棧工具棧概述:

一、技術棧:

Java:

SSM(Spring + Spring MVC + Mybatis):

Spring:

Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架;

Spring MVC:

Spring MVC 分離了控制器、模型對象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定製;

Mybatis:

MyBatis是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了幾乎全部的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄;

Java基礎

多線程、Future、Callable

內部類、閉包和回調

併發、Executor

Apache Commons CLI 開發命令行工具

JVM:

類加載機制;

線程安全;

垃圾回收機制——新生代、老年代、永久代,可以對須要執行的程序配置相關參數;

JAVA堆;

 

HaaS:統一Hadoop資源池平臺,基於Hadoop等大數據技術,提供統一數據存儲、計算能力

 

 

HDFS(Hadoop Distributed File System):海量數據存儲

 

 

存儲並管理PB級數據;

處理非結構化數據;

注重數據處理的吞吐量;

應用模式Write_Once_Read_Many;

 

 

YARN(Yet Another Resource Negotiator):統一資源調度和分配

 

 

ResourceManager:負責集羣資源管理和調度;

ApplicationMaster:替代JobTracker負責計算任務的管理和調度;

Nodemanager:替代TaskTracker負責每一個節點上計算Task的管理和調度;

 

 

MapReduce:非結構化、半結構化數據的海量批處理

 

 

Map:映射,用來把一組鍵值對映射成一組新的鍵值對;

Reduce:歸約,用來保證全部映射的鍵值對中的每個共享相同的鍵組,並進行聚合計算;

核心思想:

 

 

利用成百上千個CPU並行處理海量數據;

移動計算比移動數據更划算;

 

Spark:分佈式內存計算框架

Spark是一種與Hadoop類似的開源集羣計算環境,Spark使用了內存內運算技術,能在數據還沒有寫入硬盤時即在內存內分析運算,而相對於傳統的大數據解決方案Hadoop的MapReduce會在運行完工做後將中介數據存放在磁盤中,Spark在內存內運行程序的運算速度能作到比Hadoop MapReduce的運算速度快上100倍;

Spark Streaming:實時/準實時流的計算框架

Spark Streaming將數據劃分爲一個一個的數據塊(batch),每一個數據塊經過微批處理的方式對數據進行處理,在Spark Streaming中,數據處理的單位是一批而不是單條,而數據採集確是逐條進行的,所以Spark Streaming系統須要設置間隔使得數據彙總到必定的量後再一併操做,這個間隔就是批處理間隔。批處理間隔是Spark Streaming的核心概念和關鍵參數,它決定了Spark Streaming提交做業的頻率和數據處理的延遲,同時也影響着數據處理的吞吐量和性能;

HBase:Key/Value、半結構化數據的海量存儲和檢索

分佈式的、面向列的開源數據庫;

Hadoop HDFS爲HBase提供了高可靠性的底層存儲支持,Hadoop MapReduce爲HBase提供了高性能的計算能力,Zookeeper爲HBase提供了穩定服務和故障轉移機制。這使得HBase能夠用於支撐億級的海量數據存儲和應用;

Hive:結構化數據的查詢和分析

Hive是基於Hadoop的一個數據倉庫工具,能夠將結構化的數據文件映射成一張數據庫表,並提供完整的SQL查詢功能,能夠將SQL語句轉換爲MapReduce任務運行;

Hive擅長的是非實時的、離線的、對響應實時性要求不高的海量數據即席查詢(SQL查詢);

Hive和傳統關係型數據庫有很大區別,Hive將外部的任務解析成一個MapReduce可執行計劃,每次提交任務和執行任務都須要消耗不少時間(能夠換用Tez計算框架來提高性能),這也就決定Hive只能處理一些高延遲的應用。

Zookeeper:分佈式協同工具

Zookeeper是利用Paxos算法解決消息傳遞一致性的分佈式服務框架;

Zookeeper經過部署多臺機器,可以實現分佈式的負載均衡的訪問服務。不一樣的Client向Zookeeper中不一樣機器請求數據;

爲了實現集羣中配置數據的增刪改查保證一致性問題,須要有主節點,由主節點來作出修改的動做,並同步到其它節點上面;

當主節點出現故障時,將在其餘節點中自動經過必定的選舉方法選舉出新的主節點;

Oozie:任務調度工具

Oozie是Hadoop平臺的一種工做流調度引擎,Oozie是一種Java Web應用程序,它運行在Java Servlet容器(Tomcat),並使用數據庫來存儲如下內容:

工做流定義;

當前運行的工做流實例,包括實例的狀態和變量;

Oozie工做流是放置在控制依賴DAG中的一組動做,其中指定了動做執行的順序;

Ambari:可視化集羣管理工具

部署、啓動、監控、查看、關閉Hadoop集羣,可視化監控、運維、告警;

Ambari主要由兩部分組成:

Ambari Server;

Ambari Client;

用戶經過Ambari Server通知Ambari Agent安裝對應的軟件,Ambari Agent會定時地發送各個機器每一個軟件模塊的狀態給Ambari Server,最終這些狀態信息會呈如今Ambari的GUI,方便用戶瞭解到集羣的各類狀態,並進行相應的維護;

Kafka:分佈式消息總線

Kafka是一個低延遲高吞吐的分佈式消息隊列,適用於離線和在線消息消費,用於低延遲地收集和發送大量的事件和日誌數據;

消息隊列(Message Queue)用於將消息生產的前端和後端服務架構解耦,它是一種pub-sub結構,前端消息生產者不須要知道後端消息消費者的狀況,只須要將消息發佈到消息隊列中,且只用發佈一次,便可認爲消息已經被可靠存儲了,不用再維護消息的一致性和持久化,同時消息只傳輸一次就能夠給後端多個消費者,避免了每一個消費者都直接去前端獲取形成的前端服務器計算資源和帶寬的浪費,甚至影響生產環境;

消息隊列分爲如下幾種角色: 

Producer:生產者,即消息生產者,好比實時信令數據;

Consumer: 消費者,即消息的消費者,好比後端的實時統計程序和批量挖掘程序;

Consumer Group:消費者組,即消費者的併發單位,在數據量比較大的時候,須要分佈式集羣來處理消息,針對同一種消息,一組消費者各自消費某一Topic(話題,表明一些消息,Topic 是一個邏輯單位,一個 Topic 被劃分紅 N 個 Partition,在數據量大的時候經過 Partition 來實現分佈式傳輸)的一部分,來協做處理;

Broker:存儲節點,Kafka支持將消息進行短暫的持久化,好比存儲最近一週的數據,以便下游集羣故障時,從新訂閱以前丟失的數據。

在Kafka中,Producer自動經過Zookeeper獲取到Broker列表,經過Partition算法自動負載均衡將消息發送到Broker集羣。Broker 收到消息後自動分發到副本 Broker 上保證消息的可靠性。下游消費者經過 Zookeeper獲取Broker集羣位置和Topic等信息,自動完成訂閱消費等動做。 

Kerberos & Ranger:安全加固

Kerberos:

經過密鑰系統爲客戶機/服務器應用程序提供強大的認證服務;

Apache Ranger:

集中式安全管理框架,並解決受權和審計;

身份驗證(Authentication):基於Kerberos的用戶、服務身份驗證;

統一帳戶(Account):使用統一應用帳號訪問平臺衆多服務;

訪問受權(Authorization):基於Ranger的精細粒度訪問權限;

操做審計(Audit):基於Ranger的集中式審計日誌;

DBaaS:開箱即用的關係型數據庫服務

MySQL高可用:

主從複製

一主一從 + Keepalived + VRRP((Virtual Router Redundancy Protocol,虛擬路由冗餘協議)

Keepalived:

Keepalived是一個基於VRRP協議來實現的LVS服務高可用方案,能夠利用其來避免單點故障。一個LVS服務會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),可是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。

VRRP:

解決靜態路由單點故障問題,VRRP經過一競選(election)協議來動態的將路由任務交給LAN中虛擬路由器中的某臺VRRP路由器。

採用一主一從構建高可用MySQL服務,當主機宕機時,能夠自動觸發主從節點切換。經過使用VIP + Keepalived組件,實現主從切換時MySQL服務IP自動漂移,主從庫自動切換。

MHA(一主一從一隻讀) + Keepalived + VRRP:

MHA由兩部分組成:MHA Manager(管理節點)和MHA Node(數據節點)。MHA Manager能夠單獨部署在一臺獨立的機器上管理多個master-slave集羣,也能夠部署在一臺slave節點上。MHA Node運行在每臺MySQL服務器上,MHA Manager會定時探測集羣中的master節點,當master出現故障時,它能夠自動將最新數據的slave提高爲新的master,而後將全部其餘的slave從新指向新的master。整個故障轉移過程對應用程序徹底透明

CssS:提供標準化的容器技術和容器管理方案,支撐無狀態應用的標準化打包和部署

Docker:開源應用容器引擎

Docker是Docker公司開源的一個基於輕量級虛擬化技術的容器引擎項目,整個項目 基於 Go 語言開發,並聽從 Apache 2.0 協議;
當前,Docker能夠在容器內部快速自動化部署應用,並能夠經過內核虛擬化技術 (namespaces及cgroups等) 來提供容器的資源隔離與安全保障等;
Docker經過操做系統層的虛擬化實現隔離,因此Docker容器在運行時,不須要相似 虛擬機(VM)額外的操做系統開銷,提升資源利用率,而且提高諸如I/O等方面的性能;
Docker完全釋放了虛擬化的潛力和威力,極大下降了雲計算資源供應的成本,同時讓業務應用的開發、測試、部署都變得史無前例敏捷、高效和輕鬆;

Kubernetes:容器集羣管理系統

Kubernetes是Google開源的容器集羣管理系統,其提供應用部署、維護、 擴展機制等功能,利用Kubernetes能方便地管理跨機器運行容器化的應用,其主要功能以下:

使用Docker對應用程序包裝(package)、實例化(instantiate)、運行(run);

以集羣的方式運行、管理跨機器的容器;

解決Docker跨機器容器之間的通信問題;

Kubernetes的自我修復機制使得容器集羣老是運行在用戶指望的狀態;

DevOps:開發運維一體化

第一階段:核心實踐和試點;
第二階段:持續集成和測試;
第三階段:持續部署和交付;
第四階段:持續運維;
第五階段:持續評估改進;

統一日誌服務:提供多租戶安全的系統、應用海量日誌分析、交互式查詢和可視化

核心能力:

規劃構建的統一日誌平臺核心能力包括:

多租戶安全:支持多租戶端到端業務日誌的存儲、分析、可視化能力,支持多租戶數據安全;

分析挖掘能力:經過Elasticsearch的結構化查詢,實現複雜的多維度聯合查詢及數據聚合,深度挖掘日誌數據;

可視化能力:支持圖表可視化呈現分析結果,支持Dashboard實時監控關鍵指標;

Filebeat:

輕量級的日誌採集器,部署於應用側,負責實時採集日誌;

Logstash:

負責日誌解析和轉發,靈活的正則配置可同時處理不一樣數據結構的日誌,並寫入Elasticsearch不一樣索引;

Kafka:

分佈式消息隊列,在Filebeat和Logstash中引入分佈式消息隊列Kafka,能夠從容的應對峯值數據的高負載,而且在Logstash出現故障時,具有良好的恢復能力,可直接從Kafka作數據回放,避免回溯至若干上游應用;

Elasticsearch:

負責日誌(原始數據、分析數據)的存儲、索引和搜索,是實時分析數據流程的核心組件;

Kibana:

前端可視化工具,Elasticsearch的皮膚,結合Elasticsearch豐富的查詢邏輯,可定製多種圖表;

 

Linux命令行:

 

FTP、不一樣服務器之間、服務器與本地上傳/下載、進程監控、內存監控、JVM監控、打包部署、Vim編輯、文件受權、審閱日誌文件等等;

 

Bash腳本開發:

 

可以閱讀並編寫簡單的腳本;

 

Python:

 

可以閱讀通常的Python腳本,深刻後可學習爬蟲;

 

機器學習算法:

 

邏輯迴歸算法;

 

基於特徵的推薦算法;

 

分類算法; 

聚類算法;

 

 

二、工具棧:

版本管理工具:Git,SVN;

JAVA開發IDE:Intellij IDEA;

項目構建工具:Maven;

文本編輯器:Subline、NotePad等;

數據庫管理工具:Navicat、SQLite Free等;

終端仿真程序:SecureCRT、Xshell5等;

三、業務棧:

Tower化記錄:

作好任務的Tower化記錄,包括:

需求由來;

任務的具體描述;

解決問題的過程當中關鍵細節記錄;

抄送給相關的項目負責人,並給出制定出解決問題的時間;

任務結論及相關解決方案文件的上傳;

CPS工做清單:

對於維護過程當中出現的每個相關問題,應養成記錄的良好習慣,方便將來進行整理和排查。所以創建DMP項目維護工做清單,對於維護項的類別、詳細描述、維護時間、維護耗時、處理結果、維護相關人員及對應的Tower任務連接進行記錄;

現有任務梳理:

梳理遺留任務清單並標註優先級;

評估還須要多少人天能夠完成問題及Bug;

評估將來的運維(不含新需求)每週須要投入的人力;

相關文章
相關標籤/搜索