容易遺忘的知識點總結
主要是工作中不常用,導致記得不是很清晰。但是很重要的知識點,慢慢積累…
1.七層協議
- 從上到下是:應用層、表示層、會話層、傳輸層、網路層、數據鏈路層、物理層;
- 協議類型:
應用層中,有FTP:文件傳輸協議; http:超文本傳輸協議; SMTP:郵件傳輸協議; DNS:域名系統;
傳輸層中,有TCP:傳輸控制協議; UDP:用戶數據協議
2.Http的工作過程
對於請求的地址,從地址中分離出協議名、主機名、埠、對象路徑等
-
地址解析
使用域名系統DNS解析域名,得到主機的IP地址 -
封裝HTTP請求數據包
把解析出的資訊結合自己本機的資訊,封裝成一個HTTP請求數據包 -
封裝成TCP包,建立TCP連接
(三次連接) -
客戶機發送請求命令
建立連接後,客戶機發送一個請求給伺服器,請求方式的格式為:統一資源標識符(URL)、協議版本號,後面是MIME資訊。 -
伺服器響應
-
伺服器是否關閉TCP連接
若在請求頭中加入了Connection:keep-alive,則表示仍然保持連接
3.API網關的作用
身份驗證、監控、負載均衡、快取、請求分片與管理、靜態響應處理、限流控制等
- 性能:API網關高可用,負載均衡,容錯機制。
- 安全:許可權身份認證、脫敏,流量清洗,後端簽名(保證全鏈路可信調用),黑名單(非法調用的限制)。
- 日誌:日誌記錄(spainid,traceid)一旦涉及分散式,全鏈路跟蹤必不可少。
- 快取:數據快取。
- 監控:記錄請求響應數據,api耗時分析,性能監控。
- 限流:流量控制,錯峰流控,可以定義多種限流規則。
- 灰度:線上灰度部署,可以減小風險。路由:動態路由規則。
Nginx和Api Gateway的說明
Nginx和Api gateway在功能上是有一些重疊的,都可以做服務轉發。但是網關在大型微服務系統中是一個很重要的角色
- Api網關是轉為網關的角色而設計的,功能強大,在大型系統開發中基本上都會選用次組件
- Nginx只能實現一些上面說的部分用牛奶,一般都是選用Nginx做靜態資源快取和前端調用介面的負載均衡
總結:現在前後端分離的系統一般都會如下設計:Nginx做靜態資源伺服器,前端頁面調用後端介面時先請求到Nginx,Nginx做負載君合路由到後端網關,然後網關做請求身份驗證,日誌記錄等操作,再轉發業務處理介面,處理完返回數據。
4.攔截器和過濾器的區別
Filter過濾器:本質是基於函數回調
1.修改字元編碼(CharacterEncodingFilter)、在過濾器中修改HttpServletRequest的一些參數
2.過濾低俗文字、危險字元
3.對URL地址做處理
缺點:只能對controller請求進行攔截,對於其他直接訪問的靜態資源的請求無法進行攔截處理。
Interceptor攔截器:本質是基於Java的反射機制
1.Filter能做的都可以做
2.在請求前和請求後都可以攔截,比較靈活。
5.關於前端提交格式【Content-Type】與後端接受格式 互相對應點
- 前端格式為 Content-Type:application/x-www-form-urlencoded;charset=UTF-8 時(表單提交方式),
後端接受時,在路徑的RequestMapping上,加上consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE;接受的參數可以通過@RequestParam成功獲取(不可用@RequestBody接受),後端如下圖:
採用其他格式或參數接受,會報如下錯誤,Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported
- 當前端格式為 Content-Type:application/json 時(Payload提交方式),後端接受方式為 consumes = MediaType.APPLICATION_JSON_VALUE,參數可通過@RequestBody接受,如下所示:
註:@RequestParam和@RequestBody接受參數,@ReqeustParam底層是通過request.getParameter方式獲得參數的,get和post提交都可以接受到;@RequestBody接受的是json對象的字元串,而不是json對象。
6. 運算符
關於運算符,總是容易混淆和遺忘。特總結如下:
- 位運算符
- & 與運算符:參與運算的兩個值,如果兩個相應位都是1,則該位的結果位1,否則為0;
- | 或運算符:參與運算的兩個值,如果其中有一個位是1,則該位的結果為1,否則為0;
- ^ 異或運算符:當兩對應的位相異時,結果為1;
- ~ 取反運算符:對數據的每個二進位為取反,即把1改為0,把0改為1;
- << 左移運算符:各二進位位全部左移若干位,由「<<」 右邊的數指定移動的位數,高位丟棄,低位補0;相當於乘以2的n次方
- >> 右移運算符:與左移剛好相反。例:11 >> 2,11右移2位,11的二進位為:1011,右移的結果為:0010,即對應的十進位為2。右移n位相當於除以2的n次方,值取商,餘數捨棄。
- >>> : 無符號右移,忽略符號位,空位都以0補齊
不斷積累中,未完待續…