簡介

最近都在弄微服務的東西,現在來記錄下收穫。我從一知半解到現在能從0搭建使用最大的感觸有兩點

1.微服務各大元件的版本很多,網上很多部落格內容不一定適合你的版本,很多時候苦苦琢磨都是無用功

2.網上部落格參差不齊,有些甚至錯誤的。更離譜的是,好的文章閱讀量除非高出天際,不然就都很低,比那些複製貼上,隨便應付的都低(這個搜尋推薦演算法不知道基於什麼的)

通過這段時間學習,我覺得最重要是從好的部落格入手,先不要著急怎麼元件怎麼使用,而是先了解元件的作用,大概的原理,然後才是使用,這樣搭建和嘗試的過程中才能更好的定位問題,最後再次回到原理和一些實際問題的處理(不知道實際問題怎樣的,直接搜那個元件的面試題往往效果最好)

接下來的內容,都以導航的形式展現給大家(畢竟優秀的輪子很多,直接看大佬寫的不香嘛),再順帶提些自己的理解

傳送門

更多微服務的介紹可點選下方連結

微服務介紹Nginx導航Nacos導航Gateway導航Ribbon導航Feign導航Sentinel導航

博主微服務git練手專案:https://github.com/NiceJason/SpringCloudDemo

Nginx介紹

Ng基礎原理介紹:https://blog.csdn.net/wang379275614/article/details/47777985

從以下幾個方面去了解Ng:

1.講了正向代理和反向代理的區別(其實就是請求方和接收方兩個角度看事情)

2.非阻塞高併發連結,其實底層使用了epoll事件模型

 這其實是linux核心+硬體的支援:https://blog.csdn.net/armlinuxww/article/details/92803381 通俗易懂的講解了epoll事件驅動是怎麼一回事

事件驅動簡單來說就是兩個階段的事件模型

第一階段:由硬體接收到資訊給核心傳送中斷訊號以此執行中斷程式

第二個階段:由核心傳送喚醒訊號將阻塞的程序喚醒,例如socket執行了accept()方法被阻塞了

由於是事件模型,那麼肯定是非同步的,因此NG能一口氣接收很多請求,間接保護了背後的系統,這個事件模型其實和我們寫程式碼時設計的事件模型一模一樣,只不過事件源的產生和傳送都是由核心發出,我們監聽就好(同樣核心也作為監聽者去監聽硬體)

3.Ng由多個模組組成(我們具體配置的地方),每個模組都負責不同的功能(我把這些模組理解為Web程式的過濾器,只要你寫了過濾器,那每個請求過來時都會執行下過濾器)

例如最常用的Http模組,裡面的各種引數常用的作用如下(具體實現百度)

負載均衡,反向代理,限流(限制併發量),限制下載速度,設定快取(靜態快取設定),設定http頭

4.Ng使用Master/Worker模型來保證可靠性(https://guisu.blog.csdn.net/article/details/8930668),這個模型引發了下面幾點思考

結合Linux程序與執行緒的原理(https://my.oschina.net/cnyinlinux/blog/422207)可以瞭解到父程序和子程序的關係

Ng採用的是父程序先繫結埠然後再fork子程序,這種模型會發生驚群現象(https://www.zhihu.com/question/360939266),多個程序監聽同一個埠,有訊息進來後全部驚醒,最終卻只有一個程序能夠處理

NG是這樣處理的(https://blog.csdn.net/wan_hust/article/details/38958545),將請求到來延時處理(相當於自身加個佇列,變成了非同步處理),然後設定一個互斥鎖讓多個worker去競爭,拿到鎖的程序自身監聽所有埠,沒拿到鎖的刪除所有監聽的埠(一開始由於繼承父程序而監聽所有埠),這樣就變成了實際只有1個程序監聽所有埠,等這個程序處理的事情滿了就把鎖釋放出來,自身不再監聽和爭搶鎖,消化完後再來

5.Nginx一般作為系統的最外層的閘道器,所有請求都先經過NG轉發,一般是轉發給系統服務的閘道器(如果有多個閘道器就能負載均衡啦,不過NG的負載均衡只有很簡單的輪詢或根據權重等,並不像Ribbon負載內部服務這麼多選擇),而這個轉發行為,對於外面的請求來講就是反向代理,對於系統來講就是正向代理(一定程度上就保護了系統啦)。

6.NG可以做靜態伺服器,像瀏覽器一樣儲存一些靜態資源的快取,從而能快速響應

小結

作為Java後端開發,博主還是菜雞一個,對於Ng只能淺嘗輒止,具體調優還是交給專業的運維人員,瞭解上面大概原理之後有如下好處:

1.最重要的好處是瞭解公司架構,公司肯定有自己伺服器,而開發是本地內網進行的,所以有些外部請求可能到不了你的內網機。例如微信支付的回撥,公司Ng會配轉發至內部伺服器,但不會轉發給你本地電腦ip。因此發現回撥無效就能排查出問題,而不是一個勁的去找是不是自己操作姿勢不對。

還有為了安全期間,有的環境還可能有託管機,不能直接訪問,這種也是讓Ng暴露一個埠。

2.清晰流程,資料的來去能更好的把握,碰到問題和新需求也能想想Ng能不能幫忙,跟運維人員吹水也不會一問三不知。個人感覺和學習前端知識一個道理,不求精通,但起碼要了解,這樣才能更好的開發