如果想學Java工程,高性能和分布式,容易理解。從事微服、Spring、MyBatis、Netty源代碼分析的朋友可以加我高級Java交流:854630135。有阿裏大牛直播講解技術和Java大規模互聯網技術的視頻免費分享給大家。
微服務的實現需要大量的技術努力來開發基礎設施,這對於很多公司來說顯然是不現實的。不用擔心,業界已經有了優秀的開源框架供我們參考。目前業內比較成熟的微服務框架有網飛、春雲、阿裏的Dubbo等。Spring Cloud是壹套基於Spring Boot的微服務框架,提供了開發微服務所需的組件。如果和Spring Boot壹起使用,用微服務架構開發雲服務會非常方便。春雲包含很多子框架,春雲網飛就是其中的壹組框架。在我們的微服務架構設計中,使用了Spring Cloud網飛框架的很多組件。春雲網飛項目時間不長,相關文獻也很少。當時博主研究這個框架,啃了壹大堆英文文檔,簡直痛苦不堪。對於剛接觸這個框架的學生來說,他們可能不知道如何構建微服務應用程序架構。接下來,我們將介紹我們的微服務架構構建流程,以及需要哪些框架或組件來支持微服務架構。
為了直觀清晰地展示微服務架構的組成和原理,繪制了系統架構圖,如下:
從上圖可以看出,微服務訪問的大致路徑是:外部請求→負載均衡→服務網關)→微服務→數據服務/消息服務。服務網關和微服務都使用服務註冊和發現來調用其他依賴服務,每個服務集群都可以通過配置中心服務獲取配置信息。
服務網關(網關)
網關是外部系統(如客戶端瀏覽器、移動設備等)之間的壹扇門。)和企業內部系統,所有客戶端都請求通過網關訪問後臺服務。為了應對高並發訪問,服務網關以集群的形式部署,這意味著需要負載均衡。我們使用Amazon EC2作為虛擬雲服務器,使用ELB(彈性負載平衡)進行負載平衡。EC2具有自動配置容量的功能。當用戶流量達到峰值時,EC2可以自動添加更多容量來維持虛擬主機的性能。ELB彈性負載平衡會自動在多個實例之間分配應用程序的傳入流量。為了保證安全,客戶端請求需要通過https加密來保護,這就需要我們卸載SSL,使用Nginx卸載加密請求。外部請求在ELB負載平衡後被路由到網關集群中的網關服務,並由網關服務轉發到微服務。作為內部系統的邊界,服務網關具有以下基本功能:
1.動態路由:將請求動態路由到所需的後端服務集群。雖然內部是復雜的分布式微服務網狀結構,但是外部系統從網關看起來是壹個整體服務,網關屏蔽了後端服務的復雜性。
2.限流和容錯:為每類請求分配容量,當請求數量超過閾值時丟棄外部請求,限制流量,保護後臺服務不被大流量沖走;當壹方內部服務失效時,直接在邊界創建壹些響應集中進行容錯處理,而不是將請求轉發到內部集群,保證良好的用戶體驗。
3.身份認證和安全控制:對每個外部請求進行用戶認證,拒絕認證失敗的請求,通過訪問模式分析可以實現反爬蟲功能。
4.監控:網關可以收集有意義的數據和統計,為後臺服務優化提供數據支持。
5.訪問日誌:網關可以收集訪問日誌信息,比如訪問了哪個服務?處理過程(什麽是異常)和結果?需要多長時間?通過分析日誌內容,進壹步優化後臺系統。
我們使用Zuul(Spring Cloud網飛框架的開源組件)來實現網關服務。Zuul使用壹系列不同類型的過濾器。通過重寫過濾器,我們可以靈活地實現網關的各種功能。
如果想學Java工程,高性能和分布式,容易理解。從事微服、Spring、MyBatis、Netty源代碼分析的朋友可以加我高級Java交流:854630135。有阿裏大牛直播講解技術和Java大規模互聯網技術的視頻免費分享給大家。
服務註冊和發現
因為微服務架構是由壹系列具有單壹職責的細粒度服務組成的網狀結構,服務通過輕量級機制進行通信,這就引入了服務註冊和發現的問題。服務提供者應該註冊並報告服務地址,服務調用者應該能夠找到目標服務。在我們的微服務架構中使用了Eureka組件來實現服務註冊和發現。所有微服務(通過配置Eureka服務信息)都在Eureka服務器中註冊,並定期發送心跳進行健康檢查。Eureka的默認配置是每30秒發送壹次心跳,表示服務仍然有效。發送心跳的時間間隔可以通過Eureka本身的配置參數來配置。在Eureka服務器接收到服務實例的最後壹次心跳後,妳需要等待90秒(默認配置為90秒,可以通過配置參數修改)才能判定服務已經死亡(即連續三次沒有接收到心跳),關閉Eureka自我保護模式後服務的註冊信息將被清除。所謂自保模式,就是當有網絡分區,Eureka短時間內丟失太多服務時,會進入自保模式,即壹個服務很長時間沒有發送心跳,Eureka不會刪除。自保護模式默認開啟,可通過配置參數設置為關閉。
Eureka服務部署在壹個集群中(Eureka集群的部署模式在博主的另壹篇文章中有詳細介紹),集群中的所有Eureka節點會定期自動同步微服務的註冊信息,從而保證所有Eureka服務的註冊信息壹致。那麽尤裏卡節點是如何在尤裏卡集群中找到其他節點的呢?我們使用DNS服務器來建立所有Eureka節點的關聯,除了部署Eureka集群,我們還需要構建DNS服務器。
當網關服務在後臺微服務之間轉發外部請求或調用時,會去Eureka服務器查找目標服務的註冊信息,找到目標服務並調用,這樣就形成了服務註冊和發現的全過程。Eureka的配置參數很多,多達數百個,博主會在另壹篇文章中詳細講解。
微服務部署
微服務是壹系列單壹職責、細粒度的服務,就是把我們的業務拆分成獨立的服務單元,具有良好的可擴展性和低耦合性。不同的微服務可以用不同的語言開發,每個服務處理壹個業務。微服務可以分為前端服務(也叫邊緣服務)和後端服務(也叫中間服務)。前端服務向不同的外部設備(PC、電話等)公開。)經過必要的聚合和後端服務的裁剪。所有服務在啟動時都會向Eureka server註冊,服務之間會有復雜的依賴關系。當網關服務轉發外部請求調用前端服務時,可以通過查詢服務註冊中心找到要調用的目標服務。前端服務調用後端服務也是如此。壹個請求可能涉及多個服務之間的相互調用。由於每個微服務都是以集群的形式部署的,所以在服務相互調用時需要做負載均衡,所以每個服務都有壹個LB組件來實現負載均衡。
微服務以鏡像的形式運行在Docker容器中。Docker容器技術使我們的服務部署簡單高效。傳統的部署方式需要在每臺服務器上安裝運行環境。如果我們的服務器數量龐大,在每臺服務器上安裝運行環境將是壹項極其繁重的任務。壹旦運行環境改變,就要重裝,簡直是災難性的。使用Docker容器技術,我們只需要生成所需基本映像的新映像(jdk等。)和微服務,並將這個最終映像部署在Docker容器中運行。這種方式簡單高效,可以快速部署服務。每個Docker容器中可以運行多個微服務。Docker容器部署在集群中,由Docker Swarm管理。我們創建壹個圖像倉庫來存儲所有的基本圖像和生成的最終交付圖像,並管理圖像倉庫中的所有圖像。
服務容錯
微服務之間存在復雜的依賴關系。壹個請求可能依賴於多個後端服務,這可能導致實際生產中的失敗或延遲。在高流量系統中,壹旦服務被延遲,可能會在短時間內耗盡系統資源並使整個系統停機。因此,如果壹個服務不能隔離和容忍它的故障,它本身就是災難性的。Hystrix組件用於我們的微服務架構,以實現容錯。Hystrix是網飛的開源組件,通過熔斷模式、隔離模式、回退和限流機制為服務提供靈活的容錯保護,保證系統的穩定性。
1.熔絲模式:熔絲模式的原理類似於電路熔絲。當電路短路時,保險絲被燒斷,以保護電路免受災難性損失。當服務出現異常或大量延遲時,服務調用方會在滿足fuse條件時主動啟動fuse,執行fallback邏輯並直接返回,不會繼續調用服務進壹步拖累系統。fuse的默認配置服務調用錯誤率閾值是50%。如果超過閾值,將自動啟動保險絲模式。服務被隔離壹段時間後,熔絲會進入半熔斷狀態,即允許少量請求嘗試,如果調用仍然失敗,則返回熔斷狀態,如果調用成功,則關閉熔斷模式。
2.隔離方式:Hystrix默認采用線程隔離,不同的服務使用不同的線程池,互不影響。當壹個服務出現故障,耗盡其線程池資源時,其他服務的正常運行不受影響,達到隔離的效果。例如,我們配置壹個服務來使用壹個名為TestThreadPool through和ThreadPoolKey的線程池來實現與其他命名線程池的隔離。
3.fallback):fallback機制實際上是服務失敗時的壹種容錯方式,其原理類似於Java中的異常處理。只需要繼承HystixCommand並重寫getFallBack()方法,在這個方法中編寫處理邏輯,比如可以直接拋出異常(快速失敗),返回null或默認值,或者返回備份數據。當服務調用異常時,會轉而執行getFallBack()。在下列情況下可以觸發回退:
1)程序拋出壹個非Hystrixbadrequestxception異常。當拋出Hystrixbadrequestxception異常時,調用程序可以在不觸發回退的情況下捕捉異常,當拋出其他異常時,會觸發回退;
2)程序超時運行;
3)熔絲啟動;
4)線程池已滿。
4.限流:限流是指限制服務的並發訪問,設置單位時間內的並發訪問次數,對超過限制的請求進行拒絕和回退,防止後臺服務被沖走。
Hystix使用命令模式HystrixCommand包裝依賴調用邏輯,使相關調用自動處於Hystrix的彈性容錯保護之下。調用者需要繼承HystrixCommand並在run()中編寫調用邏輯,使用execute()(同步阻塞)或queue()(異步非阻塞)來觸發run()的執行。
動態配置中心
微業務有很多依賴配置,在業務運行過程中可能會動態修改壹些配置參數,比如根據訪問流量動態調整熔斷閾值。傳統的實現信息配置的方法,比如放在xml、yml等配置文件中,和應用程序打包,每次修改都要重新提交代碼,打包構建,生成新的鏡像,重啟服務,這顯然是不合理的。因此,我們需要構建壹個動態配置中心服務來支持微服務的動態配置。我們使用Spring Cloud的configserver服務來幫助我們建立壹個動態配置中心。我們開發的微服務代碼存儲在git服務器的私有倉庫中,所有需要動態配置的配置文件都存儲在git服務器下的configserver(配置中心,也是微服務)服務中。部署在Docker容器中的微服務從git服務器動態讀取配置文件的信息。當本地git倉庫修改代碼並推送到git服務器倉庫時,git服務器鉤子(post-receive,在服務器完成代碼更新後會自動調用)會自動檢測是否有配置文件更新。如果有,git服務器通過消息隊列向配置中心(configserver,部署在容器中的微服務)發送消息,通知配置中心刷新相應的配置文件。這樣微服務就可以獲得最新的配置文件信息,實現動態配置。
這些框架或組件是支持微服務架構實現的核心。在實際生產中,我們還會用到許多其他組件,如日誌服務組件和消息服務組件等。,並根據業務需要選擇使用它們。在我們的微服務架構實現案例中,參考了很多Spring Cloud網飛框架的開源組件,包括Zuul(服務網關)、Eureka(服務註冊和發現)、Hystrix(服務容錯)、Ribbon(客戶端負載均衡)等等。這些優秀的開源組件為我們實現微服務架構提供了捷徑。
如果想學Java工程,高性能和分布式,容易理解。從事微服、Spring、MyBatis、Netty源代碼分析的朋友可以加我高級Java交流:854630135。有阿裏大牛直播講解技術和Java大規模互聯網技術的視頻免費分享給大家。