1. 程式人生 > >基於SpringBoot的微服務架構實踐

基於SpringBoot的微服務架構實踐

引言

    微服務是近期火爆IT業界的新概念,在某種意義上這算是一個全新架構,微服務繼承了面向服務架構(SOA)的整體思路,強調將巨石型應用或服務拆分為由微小的服務應用。按照通常理解和定義,微服務是指開發一個單個小型的但有業務功能的服務,每個服務都有自己的處理和輕量通訊機制,可以部署在單個或多個伺服器上。微服務也指一種種鬆耦合的、有一定的有界且有上下文的面向服務架構。在業務邏輯層面上,把集中整體的邏輯拆解為更細化的邏輯單元。在資料儲存層面上,也可以按照情況從集中的儲存拆解為更小的儲存單元。所謂微服務架構,就是一種架構風格和設計模式,將應用分割為一系列細小的服務,每個服務專注於單一的功能,執行在獨立的程序中,服務之間的邊界清晰,採用輕量級通訊機制相互溝通、配合來實現完整的應用,滿足業務和使用者的需求。微服務架構更多是屬於應用技術架構。
    本文主要介紹採用Spring Cloud框架平臺來搭建微服務平臺。Spring Cloud是Spring專案組的一個頂級專案,其主要內容是實現了基於JVM的雲應用開發中的服務配置管理、服務註冊、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等功能。談到Spring Cloud框架,就必須提及Spring Boot框架。因為Spring Cloud框架是基於Spring Boot框架的基礎上搭建而成的。而Spring Boot框架的設計目的就是簡化基於Spring應用的初始搭建以及開發過程。

相關技術

    Spring Boot框架是由Pivotal團隊提供的全新框架,其設計目的是用來簡化基於Spring應用的初始搭建以及開發過程。SpringBoot框架使用了特定的方式來進行應用系統的配置,從而使開發人員不再需要耗費大量精力去定義模板化的配置檔案。Spring Cloud Starters是Spring Boot式的啟動專案,也為Spring Cloud提供開箱即用的依賴管理。
    Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。Spring Cloud包含了多個子專案(針對分散式系統中涉及的多個不同開源產品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等專案。
    Spring Cloud Netflix,該專案是Spring Cloud的子專案之一,主要內容是對Netflix公司一系列開源產品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的註解,開發者就可以快速的在應用中配置一下常用模組並構建龐大的分散式系統。Spring Cloud Netflix主要提供的模組包括:服務發現(Eureka),斷路器(Hystrix),智慧路有(Zuul),客戶端負載均衡(Ribbon)等。Eureka(雲端服務發現)是一個基於 REST 的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。Hystrix(熔斷器)是容錯管理工具,旨在通過熔斷機制控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Zuul是在微服務平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架。Zuul 相當於裝置和 Netflix流應用的 Web 網站後端所有請求的前門。Ribbon提供雲端負載均衡,有多種負載均衡策略可供選擇,可配合服務發現和斷路器使用。Turbine是聚合伺服器傳送事件流資料的一個工具,用來監控叢集下hystrix的metrics情況。Feign是一種宣告式、模板化的HTTP客戶端。
  1. Spring Cloud Bus:事件、訊息匯流排,用於在叢集(例如,配置變化事件)中傳播狀態變化,可與Spring Cloud Config聯合實現熱部署。
  2. Spring Cloud Consul:封裝了Consul操作,consul是一個服務發現與配置工具,與Docker容器可以無縫整合。與Eureka服務具有同樣的角色功能。
  3. Spring Cloud for Cloud Foundry:通過Oauth2協議繫結服務到CloudFoundry,CloudFoundry是VMware推出的開源PaaS雲平臺。
  4. Spring Cloud Sleuth:日誌收集工具包,封裝了Dapper和log-based追蹤以及Zipkin和HTrace操作,為SpringCloud應用實現了一種分散式追蹤解決方案。
  5. Spring Cloud Data Flow:大資料操作工具,作為Spring XD的替代產品,它是一個混合計算模型,結合了流資料與批量資料的處理方式。
  6. Spring Cloud Security:基於spring security的安全工具包,為你的應用程式新增安全控制。
  7. Spring Cloud Zookeeper:操作Zookeeper的工具包,用於使用zookeeper方式的服務發現和配置管理。
  8. Spring Cloud Stream:資料流操作開發包,封裝了與Redis,Rabbit、Kafka等傳送接收訊息。
  9. Spring Cloud Connectors:便於雲端應用程式在各種PaaS平臺連線到後端,如:資料庫和訊息代理服務。
  10. Spring Cloud Cluster:提供Leadership選舉,如:Zookeeper, Redis, Hazelcast, Consul等常見狀態模式的抽象和實現。
    Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任意的機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。在機器和資料中心中執行幾乎沒有效能開銷。Docker不依賴於任何語言。

微服務總體架構

    微服務架構從組成部件和通訊機制來看,包括外部接入部件,服務註冊中心部件,微服務部件,服務之間的感應和呼叫,服務內的訊息機制,以及基於微服務架構的開發部署運維機制。其架構如圖所示。

架構
在微服務架構設計中,需要抽象出一些核心問題來統一解決,這包括九條核心問題。第一點是服務的註冊中心。第二是統一的接入服務介面。第三是服務的容錯和負載均衡保證服務的高可用。第四是服務的限流和降級保證核心服務的穩定性。第五是服務系統的安全及全鏈路日誌跟蹤。第六是支援多種通訊方式。第七是監控和日誌管理,第八是下面詳細描述各個核心問題的內容:
1. 服務註冊中心,主要實現服務註冊與服務發現。微服務架構由一組獨立的微服務組成,這些微服務之間存在一種發現機制,目前我們通過服務註冊與發現來讓微服務可以感知彼此,微服務框架在啟動的時候,將自己的資訊註冊到註冊中心,同時從註冊中心訂閱自己需要引用的服務。
2. 統一的接入服務介面。由於把UI和後端服務分離。API Gateway是一個閘道器伺服器,也可以說是進入系統的唯一節點。這跟面向物件設計模式中的Facade模式很像。API Gateway封裝內部系統的架構,並且提供API給各個客戶端。API Gateway還可能有其他功能,如授權、監控、負載均衡、快取、請求分片和管理、靜態響應處理等。
3. 服務的容錯和負載均衡保證服務的高可用。為了保證微服務的高可用,每個微服務一般會有多個例項服務提供服務,此時需要客戶端在進行服務的負載均衡;目前微服務框架中,現支援常見的負載均衡策略,如隨機,輪訓,hash,權重,連線數,預設是根據連線數,連線數越少,優先順序越高。
4. 服務的容錯可以保證核心服務的連續性。在呼叫服務叢集的時候,如果一個微服務呼叫異常,如超時,或者發生連線異常,網路異常,則根據容錯策略進行服務容錯,如果連續失敗多次,則需要直接熔斷,不再發起呼叫,這樣可以防止一個服務異常拖垮所有依賴它的服務。
5. 服務的限流和降級等措施可以保證核心服務的穩定性。隨著訪問量的增加,微服務架構設定了一個系統能夠處理的極限閥值,超過這個閥值的請求則直接拒絕。同時,為了保證某些核心服務可用,需要對某些非核心業務進行降級。這些操作可以自動降級也可以人工降級。
6. 安全控制和許可權驗證:保障系統的安全。微服務架構推薦採用token機制保證微服務的安全。使用者在登入的時候會頒發給使用者一個token,使用者每次訪問平臺的時候,需要傳遞此token,後臺校驗此token的合法性,如果合法則可以訪問,如果沒有token或者token不合法,則禁止訪問。
7. 支援多種通訊方式。在微服務架構下,一般採用輕量級的方式進行通訊,每個微服務都統一對外暴露RESTFul服務,無論是前端呼叫後端服務,還是後端服務間的呼叫,都統一走RESTFul,這樣統一了協議棧。
8. 日誌和監控管理。在微服務框架中,所有的系統呼叫邊界、請求接入接出邊界,都存在統一的日誌埋點,這些日誌埋點和監控系統對接,可以方便的檢視系統的執行各項指標,同時也可以根據日誌跟蹤到一個服務從前到後的整個呼叫鏈路。
9. 統一配置管理。統一的配置伺服器為各應用的所有環境提供了一箇中心化的外部配置。這樣可以簡化很多開發過程中的繁瑣工作。
10.CI/CD自動化。快速完成原始碼構建、映象打包、應用部署,實現微服務的高效運營。