如何發起請求: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(迪米特原則),一個對象應到對其他對象細節盡可能少的了解。
減少程式的封裝程度
簡單的程式複雜化
減少翻譯的代價
變的轉為不變的