深刻分析java web技術內幕目錄一覽

Web請求過程

  • 如何發起請求:browser,httpclient
  • http解析:chrome ,cache
  • Dns域名解析:域名緩存
  • cdn:負載,動態加速,回源

Java I/O

  • I/0類庫的基本架構:字節操做,字符操做,字節字符的轉化
  • 磁盤的I/O:內核空間,用戶空間,同步,異步,內存映射
  • 網絡I/O工做機制:tcp狀態轉化,網絡傳輸的因素,socket的工做機制,通訊鏈路,數據傳輸
  • NIO的工做方式:BIO cpu被搶佔,channel,select,selectionkey,bytebuffer,數據分發
  • I/O優化:磁盤I/O優化:raid,
  • tcp網絡參數:timeout,端口範圍,網絡I/O:減小交互次數,減小網絡傳輸大小,編碼,同步/異步,阻塞/非阻塞。

設計模式:適配器模式(從一個接口態轉成另外一種接口),裝飾器模式(擴展示有接口的功能)html

Java編碼問題

  • 常見的編碼:ASCII(128),ISO-8859-1(256),GB2312,GBK,GB18030,UTF-16,UTF-8java

  • 編碼解碼
    web中涉及的編碼:web

  • url編碼:url編碼和querystring編碼分開,設置connector的編碼URLEncoding="UTF-8" useBodyEncodingForURI="true".
  • Http Header編碼:不能夠傳輸費AscII字符,若是須要傳輸,先用URLEncoder編碼,服務端再解碼
  • POST表單:編碼由contenttype設定,服務端用filter設置request.setCharacterEncoding解碼,上傳是字節流不編碼。
  • JS編碼:js文件的編碼與html的編碼不一致,因此默認設置下charset。encodeUrlComponent 兩次編碼解碼spring

  • 多語言支持:Nginx 增長一個多語言轉換。sql

Javac編譯原理

  • 詞法分析,語法分析,符號表構建,annotation處理,標註和語法檢查,數據流分析,類型轉化,字節碼
  • 實現類:com.sun.tools.javac.parser.Scanner ,Parser
  • 訪問者模式:將穩定的數據結構和對數據結構變化無窮的操做解耦

深刻class文件結構

  • jvm指令集
  • class文件頭
  • 常量池
  • 類信息
  • Field和methods
  • 類屬性
  • javap

深刻classloader工做機制

  • classloader:class加載到jvm,類由誰加載,加載成jvm統一的對象格式
  • classloader:findClass,defineClass,resolveClass
  • 類型:Bootstrap Classloader,ExtClassloader,AppClassLoader
  • 自定義的class,類的熱部署:
  • java的動態加載:jsp動態加載

JVM體系結構與工做方式

  • JVM體系結構:chrome

    經過模擬一個計算機達到計算機所具備的功能:指令集,計算單元,尋址,寄存器,存儲。後端

    類加載,執行引擎(解釋執行,JIT本地執行,寄存器執行)不一樣的jvm實現不一樣,內存區,本地方法調用設計模式

  • JVM工做機制瀏覽器

    基於棧的工做機制:與平臺無關,指令緊湊,減小數據量spring-mvc

JVM內存管理

  • 物理內存與虛擬內存:虛擬內存與物理內存 n:1 當一個虛擬內存不活躍時,會將該映射的物理內存移到磁盤文件中(頁面文件)。

  • 內核空間與用戶空間,

  • Java內存組件:堆,線程,類and類加載,NIO,JNI

  • JVM內存結構:寄存器,堆,棧,方法區,常量池

  • JVM內存分配:靜態分配,堆分配,棧分配

  • JVM內存回收:根對象沒法到達的對象能夠回收(垃圾檢測),分代垃圾回收 y,s1,s2,old,perm
    serial collector,parallel collector,cms collector
    cms針對old和perm區,minor gc採用多線程
    DisableExplicitGC,System.gc().變成空調,沒有釋放NIO,須要改爲 ExplicitGCInvokesConcurrent
    direct memory 分析工具 sjdrectmem

Servlet工做原理

  • Servlet容器:tomcat的啓動類 XX.startup.Tomcat,一個web應用對應一個StandardContext容器,添加的listener繼承了lifecyclelistener接口
    globalwebXml>webfragement.xml>web.xml;Servlet被包裝成StandardWrapper

  • Servlet實例:DefaultServlet和JspServlet

  • Servlet體系結構:採用門面設計模式拿到該拿的數據

  • Servlet如何工做:經過 XX.http.mapper 找到對應的wrapper容器,必需要要執行filter鏈

  • Servlet中的listener:ServletContextListener在啓動後不能再添加新的,spring 的ContextLoadListener實現了該listener,初始化spring容器

  • Filter如何工做:多個filter串成一個FilterChain,url匹配:精確匹配,路勁匹配,後綴匹配

Session與Cookie

session與cookie是爲了保持用戶與後端服務器的交互狀態,cookie的數量與大小有限制

  • 理解cookie:不超過50個,大小不超過4095

  • 理解session:standardsession對象持久化到session.ser中,必須調用sevlet容器的stop方法,request.getSession() 建立

  • cookie安全與壓縮:cookie可修改(失效時間,加密,結合瀏覽器或ip特色的惟一key,httpOnly),有安全隱患,能夠採用gzip和deflate進行壓縮突破存儲限制,減小帶寬

  • 分佈式session框架:應用可寫的session項和cookie項統一管理,session分佈式緩存存儲,InputHttpSession
    跳轉應用,sessionId在全部域名下都寫入cookie中,另外根據用戶的私密信息生成惟一key(好比請求ip,證書文件,瀏覽器信息)。

  • 表單重複提交:每次請求是帶上一個token,校驗token和session中的是否一致,請求後disable按鈕

  • 多端session統一:cookie和session要統一,拿統一的session,二維碼掃碼登陸:PC定時拉取該二維碼登陸有沒有登陸,手機掃完以後,發送二維碼信息,用戶的sessionid,發送到服務,標誌校驗經過,把sessionid發送到終點,惟一信息。

Tomcat的系統架構與設計模式

  • tomcat的整體設計:

    connector和container,container對應多個service,一個service能夠設置多個connector

    connector負責請求數據和返回數據的封裝成request和response,處理這個請求由container完成

    tomcat5中默認的connector是coyote。

    container是責任鏈模式,包含engine>host>context>Wrapper,容器能夠在backgroudprocess中定義週期性的事件,

    其餘組件:security,logger,session,mbeans,naming

  • 門面模式

不能將本身的數據過多的暴露出去,經過一層門面進行限制,httprequest和httprequestfacade

  • 觀察者模式

    由 subject,concretesubject,observer組成,

    LifecycleEvent定義主題,LifecycleSupport管理event和observer的關係

  • 命令模式

把發出命令的責任和執行命令的責任分開 command,invoker,receiver組成,HttpProcessor和ContainerBase

  • 責任鏈模式

    責任鏈模式就是不少對象與對象的家引用造成一條鏈,例如tomcat中的pipeline和valve。

Jetty的工做原理解析

  • Jetty的基本架構:全部的擴展組件都做爲handler添加到server中,有handlerwrapper和handlercollection構成

  • Jetty的啓動過程:handler有父子關係,啓動註冊在jmx上的mbean,最後啓動connector

  • 接受請求:基於http請求:connectorendpoint,ajp請求:基於ajp13parser上完成,NIO處理:監聽和處理分開

  • 處理請求:ServletHolder 是 Servlet的裝飾類,添加到handler中

  • 與Jboss集成:基於ajp集成

  • 與tomcat的比較:短生命週期的鏈接採用tomcat,長鏈接採用jetty

spring框架的設計理念

  • spring的骨骼架構:核心爲bean,core,context,core是發現,創建和維護bean之間關係的幫助類,context是最終管理平臺,bean是業務模型。

  • 核心組件:bean:BeanFactory,BeanDefinition,

ApplicationContext:繼承beanfactory和resourceloader,core:資源的訪問方式,context的資源加載,解析和描述委託給resolver

BeanFactoryPostProcessor和BeanPostProcessor:beanfactory和bean初始化時執行。
InitializingBean和DisposableBean 分佈在bean實例建立和銷燬時調用。

FactoryBean:不是預設的球模型,由用戶自定義

  • AOP的特性:繼承FactoryBean,以及月java Proxy實現動態代理

  • 代理模式:爲實際對象建立代理對象,實際執行時,能夠增長一些對原對象的額外操做。

  • 策略模式:完成某個操做有多種實現,根據不一樣場景選擇不一樣的實現,例如動態代理有cglib,jdk proxy等多種實現。

Spring MVC的工做機制和設計模式

  • mvc的整體設計:dispatchServlet是核心,實現8個功能:initMultipartResolver 處理文件上傳;initLocalResolver 處理應用的國際化;initThemeResolver:定義一個主題;initHandlerMappings,請求映射關係;initHandlerAdapters,根據handler類型定義不一樣的處理規則;initHandlerExceptionsResolvers:handler出錯時統一處理;initRequestToViewNameTranslator;initViewResolver

  • control的整體設計:HandlerMapping和HandlerAdapters兩個組件提供,handlerMapping管理url與handler的對應關係,全部的interceptor必須實現HandlerInterceptor。HandlerAdapter幫助定義各類handler,默認提供4種。
    整個調用從dispatch的doService方法開始。

  • Model設計:頁面渲染須要的參數存儲在modelmao中

  • view設計:InternalResourceViewResolver create和render頁面。

  • 模板模式:大的邏輯已經定義,業務只須要實現一些具體步驟,例如spring的abstractview

Ibatis的系統架構和映射原理

將固定不變的腳本ibatis配置實現。

  • 類層次結構:交互類型的框架 client,executor,session

  • 設計策略:parametermap和resultmap,typehandler負責類型轉換

  • 運行原理:session負責事務管理

  • sql解析:配置文件解析成statement

  • 對象映射:DataExchange和AccessPlan實現真正的數據映射

  • 工廠模式:DataExchangeFactory,DataSourceFactory。

Velocity工做原理

  • 整體架構:主要由app、context、runtime一些輔助類,暴露使用的有Velocity和VelocityEngine,context封裝了渲染所需的變量

  • 解析:解析成JTree

  • 事件處理:判空,include,取值$

  • 經常使用優化:減小樹節點數量,

  • 與jsp比較:ParserController將jsp編譯成servlet,jsp依賴servlet環境,編譯執行velocity反射執行

  • 合成模式:部分總體模式,部分和總體都實現一個方法,來實現子處理

  • 解釋器模式:將必定格式的文本解釋成特定的數據結構,將vm解釋成AST抽象語法樹。

Velocity優化實踐

  • 現實存在的問題:頁面大,cpu壓力大,臨時對象多,gc影響大,空白字符多,浪費帶寬

  • 高效的模板引擎:將velocity編譯java類,將反射變成直接調用,字符輸出改爲字節輸出

  • 其餘方法:去掉非中文空格,壓縮tab和換行,合併相同的數據,異步渲染。

大瀏覽量系統的靜態化設計

  • java的QPS上萬很難。

  • 動靜區分

  • 靜態化方案選擇

問題:是否一致性hash,是否使用esi,是否使用物理機,誰來壓縮,網卡選擇
共享cache,與應用拆分,進行回源

  • 失效:時間驅動被動失效,主動失效:監控變化,java發佈,vm發佈

  • cdn化,cdn分佈全國,主動發purge給cache失效,二級cdn。

框架設計的思考

  • 解決什麼問題,現有框架是否不能解決,是否是比其餘方案好

  • 須要簡化開發的框架。

  • 框架設計原則:ocp(開閉原則,擴展開放,修改關閉),LSP(里氏代換,凡是父類能用的地方,子類皆能夠);
    DIP(依賴倒轉)依賴抽象,不依賴於具體,ISP(接口隔離):接口儘量單一,CARP(合成/聚合複用原則)儘量聚合/合成使用,不使用繼承。LOD(迪米特原則),一個對象應到對其餘對象細節儘量少的瞭解。

優化的理論基礎

    • 減小程序的封裝程度

    • 簡單的程序複雜化

    • 減小翻譯的代價

    • 變的轉爲不變的

相關文章
相關標籤/搜索