天天看點

深入分析java web技術内幕目錄一覽

如何發起請求:browser,httpclient

http解析:chrome ,cache

Dns域名解析:域名緩存

cdn:負載,動态加速,回源

I/0類庫的基本架構:位元組操作,字元操作,位元組字元的轉化

磁盤的I/O:核心空間,使用者空間,同步,異步,記憶體映射

網絡I/O工作機制:tcp狀态轉化,網絡傳輸的因素,socket的工作機制,通信鍊路,資料傳輸

NIO的工作方式:BIO cpu被搶占,channel,select,selectionkey,bytebuffer,資料分發

I/O優化:磁盤I/O優化:raid,

tcp網絡參數:timeout,端口範圍,網絡I/O:減少互動次數,減少網絡傳輸大小,編碼,同步/異步,阻塞/非阻塞。

設計模式:擴充卡模式(從一個接口态轉成另一種接口),裝飾器模式(擴充現有接口的功能)

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

編碼解碼

web中涉及的編碼:

url編碼:url編碼和querystring編碼分開,設定connector的編碼URLEncoding="UTF-8" useBodyEncodingForURI="true".

Http Header編碼:不可以傳輸費AscII字元,如果需要傳輸,先用URLEncoder編碼,服務端再解碼

POST表單:編碼由contenttype設定,服務端用filter設定request.setCharacterEncoding解碼,上傳是位元組流不編碼。

JS編碼:js檔案的編碼與html的編碼不一緻,是以預設設定下charset。encodeUrlComponent 兩次編碼解碼

多語言支援:Nginx 增加一個多語言轉換。

詞法分析,文法分析,符号表建構,annotation處理,标注和文法檢查,資料流分析,類型轉化,位元組碼

實作類:com.sun.tools.javac.parser.Scanner ,Parser

通路者模式:将穩定的資料結構和對資料結構變化多端的操作解耦

jvm指令集

class檔案頭

常量池

類資訊

Field和methods

類屬性

javap

classloader:class加載到jvm,類由誰加載,加載成jvm統一的對象格式

classloader:findClass,defineClass,resolveClass

類型:Bootstrap Classloader,ExtClassloader,AppClassLoader

自定義的class,類的熱部署:

java的動态加載:jsp動态加載

JVM體系結構:

通過模拟一個計算機達到計算機所具有的功能:指令集,計算單元,尋址,寄存器,存儲。

類加載,執行引擎(解釋執行,JIT本地執行,寄存器執行)不同的jvm實作不同,記憶體區,本地方法調用

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容器: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是為了保持使用者與後端伺服器的互動狀态,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的總體設計:

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的基本架構:所有的擴充元件都作為handler添加到server中,有handlerwrapper和handlercollection構成

Jetty的啟動過程:handler有父子關系,啟動注冊在jmx上的mbean,最後啟動connector

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

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

與Jboss內建:基于ajp內建

與tomcat的比較:短生命周期的連接配接采用tomcat,長連接配接采用jetty

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等多種實作。

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配置實作。

類層次結構:互動類型的架構 client,executor,session

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

運作原理:session負責事務管理

sql解析:配置檔案解析成statement

對象映射:DataExchange和AccessPlan實作真正的資料映射

工廠模式:DataExchangeFactory,DataSourceFactory。

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

解析:解析成JTree

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

常用優化:減少樹節點數量,

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

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

解釋器模式:将一定格式的文本解釋成特定的資料結構,将vm解釋成AST抽象文法樹。

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

高效的模闆引擎:将velocity編譯java類,将反射變成直接調用,字元輸出改成位元組輸出

其他方法:去掉非中文空格,壓縮tab和換行,合并相同的資料,異步渲染。

java的QPS上萬很難。

動靜區分

靜态化方案選擇

問題:是否一緻性hash,是否使用esi,是否使用實體機,誰來壓縮,網卡選擇

共享cache,與應用拆分,進行回源

失效:時間驅動被動失效,主動失效:監控變化,java釋出,vm釋出

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

解決什麼問題,現有架構是否不能解決,是不是比其他方案好

需要簡化開發的架構。

架構設計原則:ocp(開閉原則,擴充開放,修改關閉),LSP(裡氏代換,凡是父類能用的地方,子類皆可以);

DIP(依賴倒轉)依賴抽象,不依賴于具體,ISP(接口隔離):接口盡可能單一,CARP(合成/聚合複用原則)盡可能聚合/合成使用,不使用繼承。LOD(迪米特原則),一個對象應到對其他對象細節盡可能少的了解。

減少程式的封裝程度

簡單的程式複雜化

減少翻譯的代價

變的轉為不變的