微服務(wù)治理Spring Cloud 工具套件為微服務(wù)治理提供了全面的技術(shù)支持。這些治理工具主要包括服務(wù)的注冊與發(fā)現(xiàn)、負載均衡管理、動態(tài)路由、服務(wù)降級和故障轉(zhuǎn)移、鏈路跟蹤、服務(wù)監(jiān)控等。微服務(wù)治理的主要功能組件如下:
有關(guān)這些組件的工作原理,我們可以通過一一個服務(wù)調(diào)用序列圖進行說明,如圖5-1 所示。 在這個序列圖中,Eureka 管理每個注冊的微服務(wù)實例,并為其建立元數(shù)據(jù)列表。當一個服務(wù)消費者需要調(diào)用微服務(wù)時,Ribbon將依據(jù)微服務(wù)的實例列表實行負載均衡調(diào)度。這種調(diào)度默認使用輪詢算法,從實例列表中取出一一個可用的實例,然后Zuul依據(jù)實例的元數(shù)據(jù),對服務(wù)進行路由。在路由的過程中,Hystrix會檢查這個微服務(wù)實例的斷路器狀態(tài)。如果斷路器處于閉合狀態(tài),則提供正常的服務(wù);如果斷路器處打開狀態(tài),則說明服務(wù)已經(jīng)出現(xiàn)故障,Hystrix 將根據(jù)實例的配置情況進行故障轉(zhuǎn)移、服務(wù)降級等。 此外,其他一些組件也對微服務(wù)的治理起到一定的輔助作用。例如,Turbine可以對微服務(wù)的斷路器實現(xiàn)全面監(jiān)控,Config可以構(gòu)建-一個在線更新的配置管理中心,Sleuth和Zipkin結(jié)合使用可以組建一個跟蹤服務(wù)器,等等。通過這些組件和服務(wù)的使用,可進一步加大微服務(wù)治理的力度。 鑒于在新版本的Spring Cloud中,Eureka 已經(jīng)不再更新,所以這里使用一個功能更加強大的,由第三方提供的Consul來創(chuàng)建注冊中心。當然,這個注冊中心在Spring Cloud工具集中,同樣提供了對相關(guān)組件的支持。 使用 Consul 創(chuàng)建注冊中心Consul是一個功能非常強大,性能相當穩(wěn)定的注冊中心,而且還包 了統(tǒng)配置管理功能。另外,它在Docker 中運行和搭建集群時,更加容易整合。 Consul 的安裝并不復(fù)雜,讀者可從 Consul 官網(wǎng)中根據(jù)自己使用的操作系統(tǒng),選擇相關(guān)的版本進行下載。下載解壓縮后,可以使用如下指令用開發(fā)模式啟動 consul agent -dev 啟動后即可通過瀏覽器打開其控制臺,鏈接地址如下:
如能看到如圖 5-2示的圖,則說明注冊中心已經(jīng)啟動就緒 Consul 默認的服務(wù)端口為8500 ,控制臺管理和服務(wù)接入都使用這一端口。 為了能夠?qū)⑴渲眯畔⒈4嬖诖疟P文件中,這里使用了類似于生產(chǎn)環(huán)境中的啟動參數(shù),如下所示: 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 這些配置參數(shù)的意義如下。
其中,data-dir 可以設(shè)置配置信息保存的地址,可以根據(jù)所使用的機器設(shè)備輸入一個已經(jīng)存在的目錄路徑。 服務(wù)注冊與發(fā)現(xiàn) 微服務(wù)在 Consul中進行注冊后,就能夠被其他服務(wù)發(fā)現(xiàn)了。有關(guān)服務(wù)注冊的過程,主要需要完成以下步驟。 1. 儂賴引用 引用與 Coul相關(guān)的服務(wù)發(fā)現(xiàn)和配置管理依賴包,代碼如下所示:
其中,discovery 組件提供了服務(wù)注冊與發(fā)現(xiàn)的功能,onfig組件是 遠程配置管理工具。 2. 連接設(shè)置 連接注冊中 的配置,在配置文件boot tr p. yml中進行設(shè)定,這個配置文件將在系統(tǒng)加載Application.yml 之前被加載,代碼如下所示: spring :cloud :consul :host : 127.0 . 0 . 1port : 8500discovery :serviceName : ${spring . application . name}healthCheckPath : /actuator/healthhealthCheckinterval : 15stags :urlprefix-/${spr ng application . name}ins tance Id :${spring . application . name} : ${vcap.application.instance id ♀{ spr ng application . instance id ♀{ random value}}} 在上面的配置中host port 根據(jù)實際情況進行設(shè)定,其他參數(shù)無須更改。serviceName是微服務(wù)的 名稱,它所 用的變量需要在配置文件中 進行設(shè)定,代碼如下所示:
即把微服務(wù)的名稱定義為logapi。這樣,當其服務(wù)程序需要對這個微服務(wù)進行調(diào)用時,使用這個名稱進行調(diào)用即可。因而在一個注冊中心中,微服務(wù)的名稱必須具有唯一性。 3.注冊激活 在微服務(wù)應(yīng)用的主程序中增加一個注解@EnableDiscoveryClien,即可激活服務(wù)注冊與發(fā)現(xiàn)的功能,代碼如下所示:@SpringBootApplication@EnableDiscoveryClientpublic class SortsRestApiApplication {public static void main(String[) args) {SpringApplication.run(SortsRestApiApplication.class, args);}} 當完成上述步驟之后,啟動微服務(wù),即可在Consul的控制臺上看到已經(jīng)注冊的微服務(wù),如圖5-3所示。 從圖5-3中可以看出,除了consul服務(wù)本身,還有一一個catalogapi 服務(wù),這就是成功注冊的微服務(wù)。單擊catalogapi右邊的相關(guān)條款,還可以看到這個微服務(wù)健康狀態(tài)相關(guān)的詳細數(shù)據(jù)。 統(tǒng)一配置管理 在Consul上可以使用配置管理的功能,并且它還支持YAML的格式,配置的功能十分強大。另外,還可以將配置信息保存在磁盤文件中。 想要啟用配置管理的功能,就需要在微服務(wù)的配置文件bootstrap.yml中增加如下所示的設(shè)置:
這樣,在微服務(wù)啟動時,就最先從Consul中讀取配置。 我們可以為每個微服務(wù)配置一些獨立的參數(shù), 例如,數(shù)據(jù)源配置等。圖5-4是針對微服務(wù)catalogapi的數(shù)據(jù)源配置。 最終, 一個連接 Consul 的完整配置如下所示: spring:appl ication:name: catalogapicloud:consul :host: 127.0.0.1port: 8500discovery:serviceName: ${spr ing. application. name}heal thCheckPath: /actuator/healthhealthCheckInterval: 15stags: urlprefix-/$ {spring . application. name }instanceId:$ { spring.application.name} :${vcap.application. instance id:$ {spring. application. instance_ id:$ {random. value}} }#配置中心config:enabled: true #默認是trueformat: YAML #表示Consul.上面文件的格式有四種: YAML、PROPERTIES、KEY-VALUE#和FILESdata-key: data #表示Consul上面的KEY值(或者說文件的名字)默認是datade faultContext: $ { spring . application. name } 合理發(fā)揮斷路器的作用在微服務(wù)的相互調(diào)用中,為了提高微服務(wù)的高可用性,有時我們會啟用斷路器功能。斷路器就像電路的跳閘開關(guān)一樣,當負載過載時切斷電路,轉(zhuǎn)為降級調(diào)用或執(zhí)行故障轉(zhuǎn)移操作。當負載釋放時,再提供正常訪問功能。 經(jīng)過多次測試,我們對啟用斷路器功能的應(yīng)用使用了下列配置,在高可用和高性能之間進行了一個折中設(shè)置:
這個配置有兩點需要注意: (1)斷路器的超時時間必須大于負載配置中的超時時間之和,例如,在上面的配置中,19000> 3000 + 15000。 (2)并發(fā)執(zhí)行的最大線程數(shù)默認為10個,這遠遠不夠,所以這里設(shè)置為500個。讀者可以根據(jù)服務(wù)器的CPU頻率和個數(shù)酌情設(shè)定。 當然,對于一個微服務(wù)來說,只有不啟用斷路器功能,其性能才是最優(yōu)的。 如何實現(xiàn)有效的監(jiān)控通過使用Spring Cloud工具套件提供的功能,結(jié)合第三方提供的工具,我們可以對所有微服務(wù)的運行情況進行更加有效的監(jiān)控,從而為微服務(wù)提供更加安全可靠的保障。 針對這些工具的使用,我們只需引用相關(guān)的工具組件,增加一-點簡單的設(shè)計,并進行相關(guān)的配置,就可以使用其強大的功能。 服務(wù)健康狀態(tài)監(jiān)控 這里使用一個優(yōu)秀的第三方管理工具Spring Boot Admin實現(xiàn)服務(wù)的健康狀態(tài)監(jiān)控和告警。 這一部分的內(nèi)容在項目的base-admin模塊中,首先引用其工具組件的依賴,代碼如下所示: <dependency><groupid>de . codecentric</groupid><artifactid>spring-boot- adrnin - starter-server</artifactid><versio口> 1.0</version></dependency> 該工具還提供了管理控制臺訪問控制功能及其WebUI設(shè)計,所以我們只需結(jié)合使用Spring的安全組件,增加一個安全管理配置,就可以啟用這些功能。這個配置的核心代碼如下所示:
在上面的代碼中,主要是對一-些鏈接進行授權(quán),同時在登錄頁面設(shè)置中使用loginPage頁面。loginPage頁面將使用由Spring Boot Admin提供的WebUI設(shè)計,運行效果如圖5-5所示。 圖5-5中的用戶名和密碼,使用了簡單實現(xiàn)的策略設(shè)計,可以直接在配置文件中進行設(shè)置。 SpringBootAdmin是通過注冊中心對微服務(wù)進行監(jiān)控的,所以它本身也需要接入注冊中心,而所有受監(jiān)控的服務(wù)都無須進行設(shè)計。為了能夠提供完整的狀態(tài)數(shù)據(jù),我們需在配置文件中增加如下所示的配置: management :e ndpoints :web :exposure :include :”* ”e ndpoi nt :health:show- details: ALWAYS 登錄Sping Boot Admin控制臺,就可以看到所有在注冊中心中注冊的微服務(wù)的運行情況,以及相關(guān)的一些健康數(shù)據(jù),如線程數(shù)、內(nèi)存使用情況等。Sping Boot Admin本身的運行狀態(tài)及相關(guān)健康數(shù)據(jù)如圖5-6所示。 重大故障告警 SpringBootAdmin還可以對其監(jiān)控的服務(wù)提供告警功能,當出現(xiàn)重大故障,如服務(wù)宕機時,可以及時以郵件方式通知運維人員。 想要實現(xiàn)這個功能,就必須結(jié)合使用Spring Boot Mail組件。在配置文件中使用如下所示的配置,啟動Spring Boot Admin的郵件通知功能:
上面設(shè)置的郵箱地址必須是有效的,同時還要配置SpingBootMail郵件的收發(fā)功能。這樣,當微服務(wù)重啟或宕機時,運維人員就可以收到來自Spring Boot Admin的告警通知郵件了。 斷路器儀表盤 base- microservice項目工程的base-hystrix 模塊是- - 個斷路器儀表盤設(shè)計。 斷路器儀表盤是Spring Cloud工具套件中的一一個組件,為了使用這個功能組件,我們需要引用如下所示的工具包: <dependenc s><dependency><groupid>org .springframework.cloud</groupid><artifactid>spring- cloud- starter- netflix- hystrix-dashboard</artifactid></dependency></dependencies> 單獨的斷路器儀表盤應(yīng)用程序,不用接入注冊中心,只需在主程序中增加如下所示代碼即可使用:
啟動斷路器儀表盤應(yīng)用程序之后,通過下面鏈接打開瀏覽器,即可看到如圖 5-7 所示的控制臺主頁: http://localhost : 7979 在控制臺中,我們輸入一個如下所示的需要監(jiān)控的服務(wù)鏈接地址和端口號,并加上hytrix.stream字符串,單擊Monitor Stream按鈕,即可對相關(guān)微服務(wù)實行監(jiān)控:
如果所監(jiān)控的服務(wù)有請求發(fā)生,就可以看到如圖5-8所示的情況。 這只是針對單獨一個微服務(wù)進行的監(jiān)控,所以在實際中作用不是很大,只可以為進行性能測試提供一些參考數(shù)據(jù)。 如果使用Turbine組件,就可以實現(xiàn)對一-組服務(wù)進行監(jiān)控。這種聚合服務(wù)的斷路器儀表盤設(shè)計,在項目工程的base-turbine模塊中。這里增加了對Turbine組件的引用,同時將這一-服務(wù)接入注冊中心之中,這樣,即可在配置文件中指定需要監(jiān)控的服務(wù)了,如下所示: turbine:appConfig: catalogapi, catalogwebaggregator:clusterConfig: defaultclusterNameExpression: new String ('default') 在這個配置中,我們只對catalogapi和catalogweb兩個微服務(wù)實施了監(jiān)控。這樣,在啟動應(yīng)用之后,在首頁控制臺中輸入這個應(yīng)用的鏈接地址和端口號,同時在后面加上turbine.stream字符串,即可開啟聚合服務(wù)的斷路器儀表盤了。
如圖5-9所示,是聚合服務(wù)斷路器儀表盤的一一個監(jiān)控實例的情況。 Zipkin 鏈路跟蹤使用Zipkin可以實現(xiàn)對微服務(wù)的鏈路跟蹤功能。Zipkin 是一一個開放源代碼的分布式鏈路跟蹤系統(tǒng),每個服務(wù)都向Zipkin發(fā)送實時數(shù)據(jù), Zipkin 會根據(jù)調(diào)用關(guān)系通過Zipkin UI生成依賴關(guān)系圖。 Zipkin提供的數(shù)據(jù)存儲方式有In-Memory、MySQL Cassandra 和Elasticsearch等。 Zipkin用Trace結(jié)構(gòu)表示對一次請求的追蹤,同時又把每個Trace拆分為若干個有依賴關(guān)系的Span。在微服務(wù)應(yīng)用中,一次用戶請求可能由后臺若干個微服務(wù)負責處理,而每個處理請求的微服務(wù)就可以理解為一個Span。 從網(wǎng)上下載一個可運行的zipkin-server的jar包,創(chuàng)建Zipkin服務(wù)。 下載成功后,在Java環(huán)境中使用下列指令運行(要求JDK的版本為1.7 及以上) : java -jar zipkin-server-*.jar --logging.level. zipkin2=INFO Zipkin默認使用的端口號為9411,在程序啟動成功之后,通過瀏覽器使用如下鏈接可以打開其控制臺:
控制臺的初次打開界面如圖5-10所示。 在一個微服務(wù)應(yīng)用中,可以通過以下步驟加入鏈路跟蹤功能。 (1)引用Spring Cloud工具套件中支持Zipkin 的組件,代碼如下所示: <!--鏈路跟蹤--><dependency><groupId>org. springframework.cloud</groupId><arti factId>spring-cloud-starter-zipkin</artifactId></dependency> (2)在配置文件中增加如下所示的配置項:
經(jīng)上述配置之后,如果服務(wù)中有請求發(fā)生,那么就可以在Zipkin的控制臺中看到相關(guān)服務(wù)的調(diào)用記錄,如調(diào)用過程中涉及的方法、服務(wù)之間的依賴關(guān)系等,如圖5-11、圖5-12和圖5-13所示。 這里我們沒有保存Zipkin的跟蹤數(shù)據(jù),并且數(shù)據(jù)的傳輸也只是簡單地使用了Web方式,因此只能在開發(fā)時測試使用。在實際應(yīng)用中,可以將跟蹤數(shù)據(jù)保存在Elasticsearch中,同時數(shù)據(jù): 傳輸也可以使用異步消息通信實現(xiàn)。當數(shù)據(jù)保存在Elasticsearch 中時,默認以天為單位進行分割,這樣將造成Zipkin 的依賴信息無法正常顯示。這時,需要使用另一個開源工具包zipkin-dependencies進行計算。打開GitHub官網(wǎng),搜索zipkin-dependencies,下載后即可使用。 因為這個工具包在執(zhí)行一次計算之后就會自動關(guān)閉,所以讀者需要根據(jù)實際情況,設(shè)定為固定時間間隔執(zhí)行一次。 ELK日志分析平臺除可以對微服務(wù)的運行和相互調(diào)用進行監(jiān)控和跟蹤外,微服務(wù)的輸出日志也是故障分析中最直接的入口和切實依據(jù)。但是到每個微服務(wù)的控制臺上去查看日志是很不方便的,特別是微服務(wù),不僅使用Docker發(fā)布,并且還分布在很多不同的服務(wù)器上,所以這里將使用一個日志分析平臺,將所有微服務(wù)的日志收集起來,進行集中管理,并且提供統(tǒng)一的管理平臺進行查詢和分析。 創(chuàng)建日志分析平臺 日志分析平臺ELK 是由Elasticsearch、 Logstash 和Kibana 三個服務(wù)組成的。其中,Elasticsearch負責日志存儲并提供搜索功能,Logstash 負責日志收集,Kibana 提供Web查詢操作界面。這三個服務(wù)都是開源的,可以使用Docker進行安裝。 使用日志分析平臺 在微服務(wù)工程中增加如下所示的依賴引用,即可在應(yīng)用中使用日志分析平臺提供的日志收集功能: <!--日志服務(wù)--><dependency><groupId>net. logstash. logback</groupId><artifactId> logstash- logback-encoder</artifactId><version>4. 10</version></ dependency> 在應(yīng)用中增加一個“l(fā)ogback.xm1”配置文件,內(nèi)容如下所示:
在上面的配置中,“ stash”配置就是連接日志分析平臺的設(shè)置。在這個配置中,假設(shè)日志收集服務(wù)器的IP地址為“192.168.1.28” ,讀者可以根據(jù)實際情況進行設(shè)定。 在應(yīng)用啟動之后,即可通過下列鏈接打開Kibana 日志查詢控制臺: http://192.168.1.28:5601 在日志查詢控制臺中,可以查詢每個應(yīng)用的日志輸出,如圖5-14所示。 小結(jié)本章首先講述了注冊中心的創(chuàng)建,以及微服務(wù)的注冊與配置。然后,以注冊中心為基礎(chǔ),通過健康監(jiān)控、服務(wù)告警、斷路器儀表盤和鏈路跟蹤等功能的實施,說明如何對微服務(wù)進行有效監(jiān)控。同時,結(jié)合日志分析平臺的使用,對所有運行的微服務(wù)應(yīng)用進行全面而有效的治理。 后續(xù)的微服務(wù)的開發(fā)和實施將在這個微服務(wù)治理環(huán)境的基礎(chǔ)上進行,而涉及有關(guān)服務(wù)治理的引用和配置將不再做特別說明。 本文給大家講解的內(nèi)容是SpringCloud微服務(wù)架構(gòu)實戰(zhàn):微服務(wù)治理
|
|