SpringCloud微服務架構實戰之微服務治理功能的實現
微服務治理
Spring Cloud 工具套件為微服務治理提供瞭全面的技術支持。這些治理工具主要包括服務的註冊與發現、負載均衡管理、動態路由、服務降級和故障轉移、鏈路跟蹤、服務監控等。微服務治理的主要功能組件如下:
- 註冊管理服務組件Eureka,提供服務註冊和發現的功能。
- 負載均衡服務組件Ribbon,提供負載均衡調度管理的功能。
- 邊緣代理服務組件Zuul,提供網關服務和動態路由的功能。
- 斷路器組件Hystrix,提供容錯機制、服務降級、故障轉移等功能。
- 聚合服務事件流組件Turbine,可用來監控集群中服務的運行情況。
- 日志收集組件Sleuth,通過日志收集提供對服務間調用進行跟蹤管理的功能。
- 配置管理服務組件Config,提供統一的配置管理服務功能。
有關這些組件的工作原理,我們可以通過一一個服務調用序列圖進行說明,如圖5-1 所示。
在這個序列圖中,Eureka 管理每個註冊的微服務實例,並為其建立元數據列表。當一個服務消費者需要調用微服務時,Ribbon將依據微服務的實例列表實行負載均衡調度。這種調度默認使用輪詢算法,從實例列表中取出一一個可用的實例,然後Zuul依據實例的元數據,對服務進行路由。在路由的過程中,Hystrix會檢查這個微服務實例的斷路器狀態。如果斷路器處於閉合狀態,則提供正常的服務;如果斷路器處打開狀態,則說明服務已經出現故障,Hystrix 將根據實例的配置情況進行故障轉移、服務降級等。
此外,其他一些組件也對微服務的治理起到一定的輔助作用。例如,Turbine可以對微服務的斷路器實現全面監控,Config可以構建-一個在線更新的配置管理中心,Sleuth和Zipkin結合使用可以組建一個跟蹤服務器,等等。通過這些組件和服務的使用,可進一步加大微服務治理的力度。
鑒於在新版本的Spring Cloud中,Eureka 已經不再更新,所以這裡使用一個功能更加強大的,由第三方提供的Consul來創建註冊中心。當然,這個註冊中心在Spring Cloud工具集中,同樣提供瞭對相關組件的支持。
使用 Consul 創建註冊中心
Consul 是一個功能非常強大,性能相當穩定的註冊中心,而且還包 瞭統 配置管理功能。另外,它在 Docker 中運行和搭建集群時,更加容易整合。
Consul 的安裝並不復雜, 讀者可從 Consul 官網中根據自己使用的操作系統,選擇相關的版本進行下載。下載解壓縮後 ,可以使用如下指令用開發模式啟動
consul agent -dev
啟動後即可通過瀏覽器打開其控制臺,鏈接地址如下:
http:l/localhost:8500
如能看到如圖 5-2 示的圖 ,則說明註冊中心已經啟動就緒 Consul 默認的服務端口為8500 ,控制臺管理和服務接入都使用這一端口。
為瞭能夠將配置信息保存在磁盤文件中,這裡使用瞭類似於生產環境中的啟動參數,如下所示:
consul agent – server – bind=127 . 0 . 0.l – client=0.0.0 . 0 -bootstrap-expect=3-data-dir=/Users/apple/consul_data/application/data/- node=server
這些配置參數的意義如下。
- -server 表示以服務端身份啟動。
- -bind 表示綁定到哪個 地址(有些服務器會綁定多塊網卡,可以通過 bind 參數強制指定綁定的 地址)
- -client :指定客戶端訪問的 地址( Consul 有豐富的 AP 接口,這裡的客戶端指的是瀏覽器或調用方) ' 0.0 0.0 表示不限客戶端 地址。
- -bootstrap expect=3 :表示 Serv 集群最低節點數為 ,低於這個值將無法正常工作(註:ZooKeeper 類似,通常集群數為奇數,以方便選舉。 onsul 采用的是 Raft 算法)。如果不使用集群,則可以設置為1.
- -d ata-d 表示指定數據的存放目錄(該目錄必須存在)。
- -node 表示節點在 We 中顯示的名稱。
其中, data-dir 可以設置配置信息保存的地址,可以根據所使用的機器設備輸入一個已經存在的目錄路徑。
服務註冊與發現
微服務在 Consul 中進行註冊後,就能夠被其他服務發現瞭。有關服務註冊的過程,主要需要完成以下步驟。
1. 儂賴引用
引用與 Co ul 相關的服務發現和配置管理依賴包,代碼如下所示:
<dependency> <groupid>org . springframework . cloud</groupid> <artifactid>spring-cloud-starter co sul discovery</artifactid> </dependency> <dependency> <group d>org spri gframework cloud</groupid> <artifactid>spri ng-cloud-starter- consul- config</artifactid>
其中, discovery 組件提供瞭服務註冊與發現的功能, onfig 組件是 遠程配置管理工具。
2. 連接設置
連接註冊中 的配置,在配置文件 boot tr p. yml 中進行設定,這個配置文件將在系統加載Application.yml 之前被加載,代碼如下所示:
spring : cloud : consul : host : 127.0 . 0 . 1 port : 8500 discovery : serviceName : ${spring . application . name} healthCheckPath : /actuator/health healthCheckinterval : 15s tags : urlprefix-/${spr ng application . name} ins tance Id : ${spring . application . name} : ${vcap.application.instance id ♀{ spr ng applicati on . instance id ♀{ random value}}}
在上面的配置中 host port 根據實際情況進行設定,其他參數無須更改。 serviceName是微服務的 名稱,它所 用的變量需要在配置文件中 進行設定,代碼如下所示:
s pri ng : application : name : catalogapi
即把微服務的名稱定義為 logapi 。這樣,當其 服務程序需要對這個微服務進行調用時,使用這個名稱進行調用即可。因而在一個註冊中心中,微服務的名稱必須具有唯一性。
3.註冊激活
在微服務應用的主程序中增加一個註解@EnableDiscoveryClien,即可激活服務註冊與發現的功能,代碼如下所示: @SpringBootApplication @EnableDiscoveryClient public class SortsRestApiApplication { public static void main(String[) args) { SpringApplication.run(SortsRestApiApplication.class, args); } }
當完成上述步驟之後,啟動微服務,即可在Consul的控制臺上看到已經註冊的微服務,如圖5-3所示。
從圖5-3中可以看出,除瞭consul服務本身,還有一一個catalogapi 服務,這就是成功註冊的微服務。單擊catalogapi右邊的相關條款,還可以看到這個微服務健康狀態相關的詳細數據。
統一配置管理
在Consul上可以使用配置管理的功能,並且它還支持YAML的格式,配置的功能十分強大。另外,還可以將配置信息保存在磁盤文件中。
想要啟用配置管理的功能,就需要在微服務的配置文件bootstrap.yml中增加如下所示的設置:
spring: cloud: consul : config: enabled: true #默認是true format: YAML #表示Consul. 上面文件的格式 data-key: data #表示Consul上面的KEY值(或者說文件的名字),默認是data defaultContext: ${ spring . application. name }
這樣,在微服務啟動時,就最先從Consul中讀取配置。
我們可以為每個微服務配置一些獨立的參數, 例如,數據源配置等。圖5-4是針對微服務catalogapi的數據源配置。
最終, 一個連接 Consul 的完整配置如下所示:
spring: appl ication: name: catalogapi cloud: consul : host: 127.0.0.1 port: 8500 discovery: serviceName: ${spr ing. application. name} heal thCheckPath: /actuator/health healthCheckInterval: 15s tags: urlprefix-/$ {spring . application. name } instanceId: $ { spring.application.name} :${vcap.application. instance id:$ {spring. application. instance_ id:$ {random. value}} } #配置中心 config: enabled: true #默認是true format: YAML #表示Consul.上面文件的格式有四種: YAML、PROPERTIES、KEY-VALUE #和FILES data-key: data #表示Consul上面的KEY值(或者說文件的名字)默認是data de faultContext: $ { spring . application. name }
合理發揮斷路器的作用
在微服務的相互調用中,為瞭提高微服務的高可用性,有時我們會啟用斷路器功能。斷路器就像電路的跳閘開關一樣,當負載過載時切斷電路,轉為降級調用或執行故障轉移操作。當負載釋放時,再提供正常訪問功能。
經過多次測試,我們對啟用斷路器功能的應用使用瞭下列配置,在高可用和高性能之間進行瞭一個折中設置:
#是否開啟斷路器(false) feign.hystrix. enabled: true #是否失敗重試(true) spring.cloud. loadbalancer. retry .enabled: true #斷路器超時配置(true) hystrix. command. default. execution. timeout. enabled: true #斷路器的超時時間需要大於ribbon的超時時間,否則不會觸發重試 (>ConnectT imeout+ReadTimeout) hystrix. command . de fault. execution. isolation. thread. timeoutInMilliseconds: 19000 #並發執行的最大線程數(10) hystrix. threadpool .default.coreSize: 500 #負載超時配置 ribbon. ConnectTimeout: 3000 r ibbon. ReadTimeout: 15000 #對所有操作請求都進行重試 r ibbon. OkToRetryOnAllOperations: true #切換實例的重試次數 r ibbon. MaxAutoRetriesNextServer: 1 #對當前實例的重試次數 ribbon.MaxAutoRetries: 0
這個配置有兩點需要註意:
(1)斷路器的超時時間必須大於負載配置中的超時時間之和,例如,在上面的配置中,19000> 3000 + 15000。
(2)並發執行的最大線程數默認為10個,這遠遠不夠,所以這裡設置為500個。讀者可以根據服務器的CPU頻率和個數酌情設定。
當然,對於一個微服務來說,隻有不啟用斷路器功能,其性能才是最優的。
如何實現有效的監控
通過使用Spring Cloud工具套件提供的功能,結合第三方提供的工具,我們可以對所有微服務的運行情況進行更加有效的監控,從而為微服務提供更加安全可靠的保障。
針對這些工具的使用,我們隻需引用相關的工具組件,增加一-點簡單的設計,並進行相關的配置,就可以使用其強大的功能。
服務健康狀態監控
這裡使用一個優秀的第三方管理工具Spring Boot Admin實現服務的健康狀態監控和告警。
這一部分的內容在項目的base-admin模塊中,首先引用其工具組件的依賴,代碼如下所示:
<dependency> <groupid>de . codecentric</groupid> <artifactid>spring-boot- adrnin - starter-server</artifactid> <versio口> 1.0</version> </dependency>
該工具還提供瞭管理控制臺訪問控制功能及其WebUI設計,所以我們隻需結合使用Spring的安全組件,增加一個安全管理配置,就可以啟用這些功能。這個配置的核心代碼如下所示:
@Override protected void configure (HttpSecurity http) throws Exception { SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthent icationSuccessHandler() ; successHandler . setTargetUrlParameter ("redi rectTo") ; http. authorizeRequests () . antMatchers ("/assets/**") .permitAll () . antMatchers (" /actuator/**") .permitAll () . antMatchers ("/ login") .permitAll () . anyRequest () . authenticated() .and() . formLogin() .loginPage ("/login") . successHandler (successHandler) .and() logout () . logoutUrl (" /logout") .and() . httpBasic() .and() .csrf() .disable() ; }
在上面的代碼中,主要是對一-些鏈接進行授權,同時在登錄頁面設置中使用loginPage頁面。loginPage頁面將使用由Spring Boot Admin提供的WebUI設計,運行效果如圖5-5所示。
圖5-5中的用戶名和密碼,使用瞭簡單實現的策略設計,可以直接在配置文件中進行設置。
SpringBootAdmin是通過註冊中心對微服務進行監控的,所以它本身也需要接入註冊中心,而所有受監控的服務都無須進行設計。為瞭能夠提供完整的狀態數據,我們需在配置文件中增加如下所示的配置:
management : e ndpoints : web : exposure : include :”* ” e ndpoi nt : health: show- details: ALWAYS
登錄Sping Boot Admin控制臺,就可以看到所有在註冊中心中註冊的微服務的運行情況,以及相關的一些健康數據,如線程數、內存使用情況等。Sping Boot Admin本身的運行狀態及相關健康數據如圖5-6所示。
重大故障告警
SpringBootAdmin還可以對其監控的服務提供告警功能,當出現重大故障,如服務宕機時,可以及時以郵件方式通知運維人員。
想要實現這個功能,就必須結合使用Spring Boot Mail組件。在配置文件中使用如下所示的配置,啟動Spring Boot Admin的郵件通知功能:
spring : boot: admin: notify: mail: to : [email protected] from : usercenter@ai . com
上面設置的郵箱地址必須是有效的,同時還要配置SpingBootMail郵件的收發功能。這樣,當微服務重啟或宕機時,運維人員就可以收到來自Spring Boot Admin的告警通知郵件瞭。
斷路器儀表盤
base- microservice項目工程的base-hystrix 模塊是- – 個斷路器儀表盤設計。
斷路器儀表盤是Spring Cloud工具套件中的一一個組件,為瞭使用這個功能組件,我們需要引用如下所示的工具包:
<dependenc s> <dependency> <groupid>org .springframework.cloud</groupid> <artifactid>spring- cloud- starter- netflix- hystrix-dashboard</artifactid> </dependency> </dependencies>
單獨的斷路器儀表盤應用程序,不用接入註冊中心,隻需在主程序中增加如下所示代碼即可使用:
@SpringBootApplication @Controller @EnableHystrixDashboard public class HystrixApplication { @RequestMapping (” / ” ) public String home() { return ” forward : /hystrix ” ; } ... }
啟動斷路器儀表盤應用程序之後,通過下面鏈接打開瀏覽器,即可看到如圖 5-7 所示的控制臺主頁:
http://localhost : 7979
在控制臺中,我們輸入一個如下所示的需要監控的服務鏈接地址和端口號,並加上hytrix.stream字符串,單擊Monitor Stream按鈕,即可對相關微服務實行監控:
http:/ / localhost: 8091/hystrix. stream
如果所監控的服務有請求發生,就可以看到如圖5-8所示的情況。
這隻是針對單獨一個微服務進行的監控,所以在實際中作用不是很大,隻可以為進行性能測試提供一些參考數據。
如果使用Turbine組件,就可以實現對一-組服務進行監控。這種聚合服務的斷路器儀表盤設計,在項目工程的base-turbine模塊中。這裡增加瞭對Turbine組件的引用,同時將這一-服務接入註冊中心之中,這樣,即可在配置文件中指定需要監控的服務瞭,如下所示:
turbine: appConfig: catalogapi, catalogweb aggregator: clusterConfig: default clusterNameExpression: new String ("default")
在這個配置中,我們隻對catalogapi和catalogweb兩個微服務實施瞭監控。這樣,在啟動應用之後,在首頁控制臺中輸入這個應用的鏈接地址和端口號,同時在後面加上turbine.stream字符串,即可開啟聚合服務的斷路器儀表盤瞭。
http: / /localhost:8989/ turbine .stream
如圖5-9所示,是聚合服務斷路器儀表盤的一一個監控實例的情況。
Zipkin 鏈路跟蹤
使用Zipkin可以實現對微服務的鏈路跟蹤功能。Zipkin 是一一個開放源代碼的分佈式鏈路跟蹤系統,每個服務都向Zipkin發送實時數據, Zipkin 會根據調用關系通過Zipkin UI生成依賴關系圖。
Zipkin提供的數據存儲方式有In-Memory、MySQL Cassandra 和Elasticsearch等。
Zipkin用Trace結構表示對一次請求的追蹤,同時又把每個Trace拆分為若幹個有依賴關系的Span。在微服務應用中,一次用戶請求可能由後臺若幹個微服務負責處理,而每個處理請求的微服務就可以理解為一個Span。
從網上下載一個可運行的zipkin-server的jar包,創建Zipkin服務。
下載成功後,在Java環境中使用下列指令運行(要求JDK的版本為1.7 及以上) :
java -jar zipkin-server-*.jar --logging.level. zipkin2=INFO
Zipkin默認使用的端口號為9411,在程序啟動成功之後,通過瀏覽器使用如下鏈接可以打開其控制臺:
http:// localhost:9411/
控制臺的初次打開界面如圖5-10所示。
在一個微服務應用中,可以通過以下步驟加入鏈路跟蹤功能。
(1)引用Spring Cloud工具套件中支持Zipkin 的組件,代碼如下所示:
<!--鏈路跟蹤--> <dependency> <groupId>org. springframework.cloud</groupId> <arti factId>spring-cloud-starter-zipkin</artifactId> </dependency>
(2)在配置文件中增加如下所示的配置項:
#鏈路跟蹤 | spring: sleuth: sampler : probability: 1.0 zipkin: sender : type: web : base-url: http://localhost:9411/
經上述配置之後,如果服務中有請求發生,那麼就可以在Zipkin的控制臺中看到相關服務的調用記錄,如調用過程中涉及的方法、服務之間的依賴關系等,如圖5-11、圖5-12和圖5-13所示。
這裡我們沒有保存Zipkin的跟蹤數據,並且數據的傳輸也隻是簡單地使用瞭Web方式,因此隻能在開發時測試使用。在實際應用中,可以將跟蹤數據保存在Elasticsearch中,同時數據:
傳輸也可以使用異步消息通信實現。當數據保存在Elasticsearch 中時,默認以天為單位進行分割,這樣將造成Zipkin 的依賴信息無法正常顯示。這時,需要使用另一個開源工具包zipkin-dependencies進行計算。打開GitHub官網,搜索zipkin-dependencies,下載後即可使用。
因為這個工具包在執行一次計算之後就會自動關閉,所以讀者需要根據實際情況,設定為固定時間間隔執行一次。
ELK日志分析平臺
除可以對微服務的運行和相互調用進行監控和跟蹤外,微服務的輸出日志也是故障分析中最直接的入口和切實依據。但是到每個微服務的控制臺上去查看日志是很不方便的,特別是微服務,不僅使用Docker發佈,並且還分佈在很多不同的服務器上,所以這裡將使用一個日志分析平臺,將所有微服務的日志收集起來,進行集中管理,並且提供統一的管理平臺進行查詢和分析。
創建日志分析平臺
日志分析平臺ELK 是由Elasticsearch、 Logstash 和Kibana 三個服務組成的。其中,Elasticsearch負責日志存儲並提供搜索功能,Logstash 負責日志收集,Kibana 提供Web查詢操作界面。這三個服務都是開源的,可以使用Docker進行安裝。
使用日志分析平臺
在微服務工程中增加如下所示的依賴引用,即可在應用中使用日志分析平臺提供的日志收集功能:
<!--日志服務--> <dependency> <groupId>net. logstash. logback</groupId> <artifactId> logstash- logback-encoder</artifactId> <version>4. 10</version> </ dependency>
在應用中增加一個“logback.xm1”配置文件,內容如下所示:
<?xm1 version="1.0" encoding="UTF-8"?> | <configuration> <property name="LOG_ HOME" value="/logs" /> <appender name=" STDOUT" class="ch. qos. logback. core. ConsoleAppender"> <encoder charset="UTF-8"> <pattern>ad{yyyy-MM-dd HH :mm:ss.Sss} [8thread] 8-5level glogger{50} - 8msg&n</pattern> </encoder> </ appender> <appender name="stash" class="net. logstash. logback. appender . LogstashTcpSocketAppender"> <destination>192. 168.1.28: 5000</destination> <encoder charset="UTF-8" class= "net. logstash. logback. encoder . LogstashEncoder" /> </ appender> <appender name="async" class="ch. qos. logback. classic.AsyncAppender"> <appender-ref ref="stash" /> </appender> <!--設置日志級別--> <root level="info"> <appender-ref ref="STDOUT" /> <!--輸出到ELK--> <!--<appender-ref ref="stash" />--> </ root> </ configuration>
在上面的配置中,“ stash”配置就是連接日志分析平臺的設置。在這個配置中,假設日志收集服務器的IP地址為“192.168.1.28” ,讀者可以根據實際情況進行設定。
在應用啟動之後,即可通過下列鏈接打開Kibana 日志查詢控制臺:
http://192.168.1.28:5601
在日志查詢控制臺中,可以查詢每個應用的日志輸出,如圖5-14所示。
小結
本章首先講述瞭註冊中心的創建,以及微服務的註冊與配置。然後,以註冊中心為基礎,通過健康監控、服務告警、斷路器儀表盤和鏈路跟蹤等功能的實施,說明如何對微服務進行有效監控。同時,結合日志分析平臺的使用,對所有運行的微服務應用進行全面而有效的治理。
後續的微服務的開發和實施將在這個微服務治理環境的基礎上進行,而涉及有關服務治理的引用和配置將不再做特別說明。
本文給大傢講解的內容是SpringCloud微服務架構實戰:微服務治理 下篇文章給大傢講解的是SpringCloud微服務架構實戰:類目管理微服務開發;覺得文章不錯的朋友可以轉發此文關註小編;感謝大傢的支持!
推薦閱讀:
- SpringCloud整合Consul的實現
- spring cloud config和bus組件實現自動刷新功能
- SpringCloud分佈式鏈路追蹤組件Sleuth配置詳解
- 五分鐘解鎖springboot admin監控新技巧
- Spring Cloud Consul的服務註冊與發現