SpringCloud是微服務的技術落地方案,微服務是分散式架構的一種,是為了解決專案發展過程中出現的各種問題而出現的新的專案架構方案。
專案中模組繁多,耦合度無法避免的變高,最好的方案就是對服務進行拆分:將一個大型專案根據模組拆分成不同的小模組專案,各司其職完成各自的功能。
單體應用適合小型的專案,存取量小或者業務簡單的專案。但是對於大型的、高可用、高並行的專案而言,單體是存在很多弊端的。單個服務並行難以控制、專案更新需要停機、模組更新導致耦合度越來越緊此類的問題,雖然可以通過負載均衡策略或者制定企業開發相關規範來避免,但是在專案體量越來越大、員工越來越多、更新迭代越來越頻繁的情況下此類的維護成本也會指數級增加。
微服務提倡將模組以獨立服務的方式獨立管理,整個專案依靠多個小型的服務同時運作來支撐,單個服務只關注自己的業務實現並且有專業的團隊進行開發。服務之間使用輕量的協定進行訊息傳送,並且對於單個模組的升級不應影響其他服務,也不應該被其他服務感知。每個服務可以釋出多個範例,所有的服務組建成一個網狀的服務叢集。
從前單體專案中也會涉及到跨模組間方法的呼叫,那在微服務中同樣也可以通過網路進行跨模組呼叫。模組之間的依賴關係錯綜複雜,並且因為每個服務都是獨立啟動的,相互之間必要的存在一些呼叫和互動,呼叫誰、怎麼呼叫、呼叫失敗怎麼辦,那微服務思想就是對此類服務叢集的治理提供一套解決標準和思想。
剛剛說到服務之間要做相互的呼叫,那呼叫誰就是一個問題。服務之間要想完成呼叫首先要知道誰和自己是同一個叢集的,註冊中心就是用來統計叢集中的各個服務以及服務狀態的。
未來微服務叢集中,單個服務並不是單個範例執行的:如果某個模組的負載較高,就需要多範例負載均衡執行。那多個範例的設定在管理過程中如果要每個都進行獨立設定和管理,運維期間是很麻煩的,所以需要一個設定中心對微服務叢集的設定進行統一的管理,在設定中心的設定將同步到所有的需要此設定的服務中。
閘道器就是網路關卡,每一個微服務講將到的訊息有兩種:來自使用者端的、來自其他微服務的。來自其他微服務的大可放行,但使用者端的就需要進行鑑權和認證類的判斷,並且使用者端所請求的服務極有可能正處在負載均衡的狀態,那就還要在多個同服務範例中選擇最佳的一個。閘道器就是攔截在使用者端與伺服器之間的一道關卡,通過負載均衡演演算法進行具體服務的呼叫然後響應使用者端。
PS:使用者端是直接存取閘道器的,閘道器再對服務進行負載均衡。如果要對閘道器進行負載均衡的話,就需要採用Nginx類反向代理工具對閘道器進行負載均衡。
當一個請求通過閘道器落到一個具體的服務之後,此服務可能會請求其他服務進行相關操作,同樣的這個呼叫鏈路可能非常的長。那使用者端等待的時間就是所有服務執行時間之和,但對於使用者端來說也許大多數的等待是沒有意義的。所以可以採用非同步的訊息佇列,來完成各個服務之間的無需返回的請求呼叫,降低響應時長。
在微服務中多個範例的健康管理非常複雜,所以需要藉助服務治理工具對服務進行監控和管理,並對紀錄檔採集、響應速度、健康狀況等進行統一的統計,以解決運維過程中複雜問題的排查和服務健康管理。
龐大叢集下每個服務範例的啟動和部署將非常複雜,所以對於專案編譯部署可以通過相關工具進行自動化管理。
需要明確的是雖然每個服務都會提供CRUD操作,但永遠查詢大於其他操作。分散式系統中通常會採用分散式儲存方案,但為減輕資料庫查詢壓力,通常會在資料庫前攔截一層快取層,用於快取介面的查詢資料。
資料庫和快取都是無法支撐海量資料查詢的,並且在分散式快取和儲存架構下,查詢效率也會降低,所以要採用分散式搜尋引擎來解決資料的搜尋問題。
PS:在分散式資料儲存設計中,快取儲存的是熱點資料,資料庫主要做寫操作和對事務要求較高的操作,分散式搜尋主要做大規模資料快速搜尋操作。