由於同源策略, 當客戶端和服務端再也不同一域下時, 要解決請求的跨域問題java
通常有兩種方法 1) JSONP 2) CORSnode
JSONP僅限於GET請求,有必定的侷限性web
CORS能夠知足多種方法的請求, 須要作的是對response的響應頭改寫, 處理方式能夠用Filter過濾指定範圍的請求面試
CORS請求分爲簡單請求和非簡單請求redis
簡單請求要知足如下條件算法
Accept
、Accept-Language
、Content-Language
、Last-Event-ID
、Content-Type
(只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain)非簡單請求時指對服務器有特殊要求的請求數據庫
好比PUT \ DELETE方法, Content-Type是application/json的請求編程
非簡單請求會先發送一個預檢請求, 用OPTION方法.json
Remote Procedure Call \ 遠程過程調用 : 一個計算機通信協議, 能夠實現像調用本地服務同樣調用遠程服務, 而且讓網絡通信過程透明. 通常使用IDL接口定義語言, 方便跨平臺遠程過程調用.設計模式
如阿里巴巴的hsf、dubbo(開源)、Facebook的thrift(開源)、Google grpc(開源)、Twitter的finagle(開源)等都是基於RPC的框架.
RPC作到讓中間的網絡通信過程透明化, 通常選擇動態代理的方式實現.
序列化是將數據結構或者對象轉化成二進制串, 也就是編碼的過程.
反序列化是將二進制串轉換成數據結構或者對象的過程.
序列化是爲了 進行網絡傳輸
反序列化是爲了 後續對其處理
Netty是一款基於NIO開發的網絡通訊框架, 對比於BIO, 他的併發性能獲得很大提升.
不少RPC框架是基於Netty這一IO通訊框架, 好比阿里的HSF, Dubbo, Twitter的finagle等.
RPC是基於TCP/IP協議的 , HTTP是基於HTTP協議的 , 傳輸效率RPC效率更高一些 .
結構性模式,不是建立型模式
咱們建立具備現有對象的對象, 並向外界提供功能接口. 以解決直接訪問對象時帶來的問題, 好比訪問情景多樣化, 直接訪問會給使用者或者系統結構帶來不少麻煩, 因此在訪問此對象時, 加上一個對此對象的訪問層.
代理模式是指 一個公共接口,一個實現類,一個代理類,代理類持有實現類實例,代理執行實例方法。 執行過程當中不直接訪問實體對象,而是經過代理對象訪問。
代理過程當中能夠加上一些其餘的用途。Spring的AOP面向切面編程是基於動態代理, 切入的點就是一個個被代理的類.
代理類和實體類已經肯定, 在編譯以前已經完成.
在程序執行過程當中建立代理類是動態代理. 能夠統一的管理代理類.
java.lang.reflect包下的Proxy類用來動態建立一個代理對象的類
而且須要實現InvocationHandler這個接口,讓每一個代理類的實例都關聯到了一個handler,當咱們經過代理對象調用一個方法的時候,這個方法的調用就會被轉發爲由InvocationHandler這個接口的 invoke 方法來進行調用
RESTful是一種架構風格, REST意思是表示層狀態轉化(Representation state transfer)
REST的特色是
程序同步執行 , 當代碼A執行完以後再執行B , 若是A沒有執行完 , B要等待 .
程序異步執行 , 當代碼A執行中 , B不須要等待A執行完再執行 , 能夠進入就緒狀態準備執行 .
在A代碼片斷中 , 會執行B , 當B執行完 , B會執行A的callback函數 . 這是一種機制 . 能夠將A和B抽象成接口 , 易於擴展 .
核心功能 , 核心容器提供IoC
面向切面編程
提供了針對web開發的特性
集成了JDBC , 簡化了DAO的開發步驟
整合了第三方持久層框架
提供了web的MVC實現
根據數據流和變化作出響應 , 經過異步和回調的方式 .
TCP須要創建鏈接,UDP不須要創建鏈接 TCP的數據是可靠的,UDP不可靠 TCP的採用流的形式,UDP是報文的形式
Vector和ArrayList都是數組形式的集合,Vector是線程安全的,ArrayList不是. ArrayList讀取比較快,增刪比較慢, LinkedLIst不是線程安全的,是鏈表形式的,他的增刪比較快,可是讀取慢 ArrayList初始容量是10,當有數組添加時才真正的分配容量 每次都是經過copyOf的方式擴容到以前的1.5倍
索引的數據結構是:B+樹 B-樹 散列表 索引是放在內存中的,能夠實現快速查詢,可是會下降更新表的速度。 索引不走like,可是‘xx%’會走 索引列不能有null值
儘可能在常常用的where和order by上建索引 儘可能不要用in not in ,會掃描全表 儘可能少用or ,會放棄索引
面向服務的架構 , 鬆耦合 位置透明 可在異構平臺複用 便於測試
Dubbo是一個開源的SOA治理方案,是一個分佈式服務框架。 註冊中心嚴重依賴第三方zookeeper或者redis,組件出現問題,服務會中斷 Dubbo只支持RPC調用 SpringCloud有本身的註冊組件Eureka 支持RESTfulAPI 消息組建是Stream 集成了MQ和Apache kafka
線程本地副本 每一個線程都會有一個副本,ThreadLocal建立的副本是存在線程的ThreadLocals裏面 應用在數據庫鏈接 session管理方面 解決了線程安全問題 線程能夠隨時訪問 適用set/get方法。
java支持序列化機制,將一個對象表示爲一個字節序列
callable的方法是call(),runnable的方法是run() Callable執行方法有返回值 Runnable的執行方法沒有返回值 Callable返回一個Future對象,能夠經過get獲取結果
具備可見性,就是被修飾的變量,一旦被其餘線程修改,會當即同步給主存,讓其餘線程知道 沒有原子性 由於被修飾的變量能夠被多線程修改
頻繁的建立和銷燬線程會下降工做效率 提升線程利用率 經常使用參數 corePoolSize(線程池大小) maximumPoolSize(最大線程數) keepAliveTime(可空閒時間) 執行順序 1. 當前線程小於核心線程數,建立線程 2. 當前線程大於核心線程數,進入任務隊列 3. 任務隊列滿了,核心線程數小於最大線程數,建立線程 4. 拋出異常
-127~128
synchronized最慢 synchronized和lock是實現同步鎖(原子性)的兩種方式 Lock提供了更普遍,更優雅的方式. synchronized在執行完後會自動釋放,lock要手動釋放 synchronized是jvm裏面的,是java的關鍵字,lock是一個類 synchronized會讓等待的線程一直等待,lock會嘗試得到鎖
ConrurentHashMap作了什麼 線程安全:Vector HashTable StringBuffer 線程不安全:ArrayList LinkedList HashMap HashSet TreeMap TreeSet StringBuilder Collections.synchronizedMap()可使集合線程安全 ConrurentHashMap是線程安全的HashMap
談談你對HashMap的掌握 HashMap不是線程安全的,以數組方式存儲Key-value構成的Entry對象,無限量擴容,擴容時要從新計算Hash
String StringBuffer StringBuider有什麼區別 String 是不可變的,不能被繼承和修改,用final修飾的類,線程安全. StringBuffer能夠被改變,可是線程不安全. StringBuilder也是可變的,線程安全.
如何排除 線程T1和T2,T1得到L1,可是要得到L2後才能釋放L1,T2得到L2,可是要得到L1之後才能釋放L2,這樣有可能會出現死鎖,避免方式是加synchronized同步鎖.
程序計數器(至關於指針 不共享) 虛擬機棧 (運行時的數據,方法 不共享) 方法區 (常量,類信息,變異後的代碼 線程共享) 堆 (建立的對象 線程共享) 本地方法棧 (本地方法運行時的數據 不共享)
BeanFactory根據標識建立bean的過程
singleton做用域建立的bean , SpringIoC容器中只有一個對應的實例 .
SpringAOP基於JDK的動態代理
ApplicationListener的實現 . 定義一種一對多的關係 , 當一個對象狀態發生改變時 , 其餘的對象也對應發生改變 .
不是一個框架,而是快速構建項目的方式 默認的代碼和註釋配置 以最少的配置或者零配置開發和構建 適用新項目,不適合將SpringFramework的項目轉化 SpringBoot約定過配置,不須要聲明資源映射,資源映射會自動處理。
單例模式不必定線程安全,涉及多線程時要對其改造,通常是加鎖或者適用threadlocal。
在分佈式系統中 協調各個節點 監視各個節點的狀態 根據節點提交的反饋進行下一步的合理操做
提供了文件系統 通知機制
根據是否持久化 / 是否有編號 分爲四種znode節點 .
通知機制 是watch關心的節點 當發生變化時 , 通知客戶端 .
命名服務
惟一的path 能夠經過path相互發現
配置管理
管理配置 , 將配置信息放到zk的節點上去 並監聽對應的節點 當有配置發生變化時能夠通知應用程序 .
集羣管理
有新的節點加入或退出 選舉master
分佈式鎖
能夠把zk的節點當作一把鎖 , 全部程序都去建立這個節點 , 成功的即獲得鎖 , 用完刪除便可釋放鎖 .
其餘未獲得鎖的程序能夠排序建立節點 , 等鎖釋放了 , 按照順序獲得鎖 .
單例做用域下 scope = singleton , 表示一個bean 在Spring IoC 容器中只有一個實例 .
prototype做用域中 , 每一次請求都會建立一個實例 , 並配置和裝飾 , 但不會調用對象的生命週期回調函數 , 不會負責bean的生命週期 .
在每一次的HTTP 的request / session中建立實例 , 而且盡在request / session中有效 .
java的反射機制能夠得到對象的類 , 以及屬性 , 方法 , 和構造函數 .
動態代理基於反射機制 . IoC的依賴注入也是基於反射機制 .
抽象類經過extends繼承 , 接口是經過implements實現接口 .
抽象類能夠有構造器 , 接口沒有構造器 .
抽象類和接口都不能實例化
接口中的方法只能是public的 , 但抽象方法沒有限制
只能繼承一個抽象類 , 能夠實現多個接口
事務要完整 , 要麼所有作完 , 要麼沒有作
事務開始到結束 , 數據庫的完整約束沒有變 .
事務在訪問數據庫時 , 不被幹擾 , 相互隔離 .
事務完成後 , 數據庫不能回滾 .
髒讀
不可重複讀
幻讀
使用緩存技術 / 查詢語句的優化 / 優化表結構加索引 / 集羣的方式
基於C開發 / 跨平臺 / 能夠做爲HTTP服務器做爲網站的發佈處理 / 做爲反向代理服務器實現負載均衡
將一個數據表和索引分別存儲在不一樣的物理文件中
-- 增長 partition by range(id){ partition user_1 values less than (10), partition user_2 values less than (20) } --刪除 alter table user drop partition user_1 ; alter talbe user drop partition user_2;
分區的表不支持外鍵 , 可能會讓索引失靈 .
map.get(key);
map.put(key, value);
list.get(location);
list.add(object);
boolean flag = set.add(object);
dataType[] array = new dataType[size]
加載 - 鏈接(驗證 - 準備 - 解析) - 初始化 - 使用 - 卸載
加載
將class加載到jvm的方法區中
鏈接
驗證 檢驗加載類是否有問題
準備 將靜態變量分配內存
解析 將符號轉化成直接引用
初始化
執行Static靜態的代碼塊 - 執行構造函數 (從父類開始)
BootstrapClassLoader jre/lib/rt下的
ExtensionClassLoader jre/lib/ext下的
AppClassLoader classpath下的
CustomClassLoader 自定義的