SpringCloud微服務(wù)架構(gòu)實(shí)戰(zhàn)之微服務(wù)治理功能的實(shí)現(xiàn)
微服務(wù)治理
Spring Cloud 工具套件為微服務(wù)治理提供了全面的技術(shù)支持。這些治理工具主要包括服務(wù)的注冊(cè)與發(fā)現(xiàn)、負(fù)載均衡管理、動(dòng)態(tài)路由、服務(wù)降級(jí)和故障轉(zhuǎn)移、鏈路跟蹤、服務(wù)監(jiān)控等。微服務(wù)治理的主要功能組件如下:
- 注冊(cè)管理服務(wù)組件Eureka,提供服務(wù)注冊(cè)和發(fā)現(xiàn)的功能。
- 負(fù)載均衡服務(wù)組件Ribbon,提供負(fù)載均衡調(diào)度管理的功能。
- 邊緣代理服務(wù)組件Zuul,提供網(wǎng)關(guān)服務(wù)和動(dòng)態(tài)路由的功能。
- 斷路器組件Hystrix,提供容錯(cuò)機(jī)制、服務(wù)降級(jí)、故障轉(zhuǎn)移等功能。
- 聚合服務(wù)事件流組件Turbine,可用來(lái)監(jiān)控集群中服務(wù)的運(yùn)行情況。
- 日志收集組件Sleuth,通過(guò)日志收集提供對(duì)服務(wù)間調(diào)用進(jìn)行跟蹤管理的功能。
- 配置管理服務(wù)組件Config,提供統(tǒng)一的配置管理服務(wù)功能。

有關(guān)這些組件的工作原理,我們可以通過(guò)一一個(gè)服務(wù)調(diào)用序列圖進(jìn)行說(shuō)明,如圖5-1 所示。

在這個(gè)序列圖中,Eureka 管理每個(gè)注冊(cè)的微服務(wù)實(shí)例,并為其建立元數(shù)據(jù)列表。當(dāng)一個(gè)服務(wù)消費(fèi)者需要調(diào)用微服務(wù)時(shí),Ribbon將依據(jù)微服務(wù)的實(shí)例列表實(shí)行負(fù)載均衡調(diào)度。這種調(diào)度默認(rèn)使用輪詢算法,從實(shí)例列表中取出一一個(gè)可用的實(shí)例,然后Zuul依據(jù)實(shí)例的元數(shù)據(jù),對(duì)服務(wù)進(jìn)行路由。在路由的過(guò)程中,Hystrix會(huì)檢查這個(gè)微服務(wù)實(shí)例的斷路器狀態(tài)。如果斷路器處于閉合狀態(tài),則提供正常的服務(wù);如果斷路器處打開(kāi)狀態(tài),則說(shuō)明服務(wù)已經(jīng)出現(xiàn)故障,Hystrix 將根據(jù)實(shí)例的配置情況進(jìn)行故障轉(zhuǎn)移、服務(wù)降級(jí)等。
此外,其他一些組件也對(duì)微服務(wù)的治理起到一定的輔助作用。例如,Turbine可以對(duì)微服務(wù)的斷路器實(shí)現(xiàn)全面監(jiān)控,Config可以構(gòu)建-一個(gè)在線更新的配置管理中心,Sleuth和Zipkin結(jié)合使用可以組建一個(gè)跟蹤服務(wù)器,等等。通過(guò)這些組件和服務(wù)的使用,可進(jìn)一步加大微服務(wù)治理的力度。
鑒于在新版本的Spring Cloud中,Eureka 已經(jīng)不再更新,所以這里使用一個(gè)功能更加強(qiáng)大的,由第三方提供的Consul來(lái)創(chuàng)建注冊(cè)中心。當(dāng)然,這個(gè)注冊(cè)中心在Spring Cloud工具集中,同樣提供了對(duì)相關(guān)組件的支持。
使用 Consul 創(chuàng)建注冊(cè)中心
Consul 是一個(gè)功能非常強(qiáng)大,性能相當(dāng)穩(wěn)定的注冊(cè)中心,而且還包 了統(tǒng) 配置管理功能。另外,它在 Docker 中運(yùn)行和搭建集群時(shí),更加容易整合。
Consul 的安裝并不復(fù)雜, 讀者可從 Consul 官網(wǎng)中根據(jù)自己使用的操作系統(tǒng),選擇相關(guān)的版本進(jìn)行下載。下載解壓縮后 ,可以使用如下指令用開(kāi)發(fā)模式啟動(dòng)
consul agent -dev
啟動(dòng)后即可通過(guò)瀏覽器打開(kāi)其控制臺(tái),鏈接地址如下:
http:l/localhost:8500
如能看到如圖 5-2 示的圖 ,則說(shuō)明注冊(cè)中心已經(jīng)啟動(dòng)就緒 Consul 默認(rèn)的服務(wù)端口為8500 ,控制臺(tái)管理和服務(wù)接入都使用這一端口。

為了能夠?qū)⑴渲眯畔⒈4嬖诖疟P文件中,這里使用了類似于生產(chǎn)環(huán)境中的啟動(dòng)參數(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ù)的意義如下。
- -server 表示以服務(wù)端身份啟動(dòng)。
- -bind 表示綁定到哪個(gè) 地址(有些服務(wù)器會(huì)綁定多塊網(wǎng)卡,可以通過(guò) bind 參數(shù)強(qiáng)制指定綁定的 地址)
- -client :指定客戶端訪問(wèn)的 地址( Consul 有豐富的 AP 接口,這里的客戶端指的是瀏覽器或調(diào)用方) ' 0.0 0.0 表示不限客戶端 地址。
- -bootstrap expect=3 :表示 Serv 集群最低節(jié)點(diǎn)數(shù)為 ,低于這個(gè)值將無(wú)法正常工作(注:ZooKeeper 類似,通常集群數(shù)為奇數(shù),以方便選舉。 onsul 采用的是 Raft 算法)。如果不使用集群,則可以設(shè)置為1.
- -d ata-d 表示指定數(shù)據(jù)的存放目錄(該目錄必須存在)。
- -node 表示節(jié)點(diǎn)在 We 中顯示的名稱。
其中, data-dir 可以設(shè)置配置信息保存的地址,可以根據(jù)所使用的機(jī)器設(shè)備輸入一個(gè)已經(jīng)存在的目錄路徑。
服務(wù)注冊(cè)與發(fā)現(xiàn)
微服務(wù)在 Consul 中進(jìn)行注冊(cè)后,就能夠被其他服務(wù)發(fā)現(xiàn)了。有關(guān)服務(wù)注冊(cè)的過(guò)程,主要需要完成以下步驟。
1. 儂賴引用
引用與 Co ul 相關(guān)的服務(wù)發(fā)現(xiàn)和配置管理依賴包,代碼如下所示:
<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 組件提供了服務(wù)注冊(cè)與發(fā)現(xiàn)的功能, onfig 組件是 遠(yuǎn)程配置管理工具。
2. 連接設(shè)置
連接注冊(cè)中 的配置,在配置文件 boot tr p. yml 中進(jìn)行設(shè)定,這個(gè)配置文件將在系統(tǒng)加載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 根據(jù)實(shí)際情況進(jìn)行設(shè)定,其他參數(shù)無(wú)須更改。 serviceName是微服務(wù)的 名稱,它所 用的變量需要在配置文件中 進(jìn)行設(shè)定,代碼如下所示:
s pri ng : application : name : catalogapi
即把微服務(wù)的名稱定義為 logapi 。這樣,當(dāng)其 服務(wù)程序需要對(duì)這個(gè)微服務(wù)進(jìn)行調(diào)用時(shí),使用這個(gè)名稱進(jìn)行調(diào)用即可。因而在一個(gè)注冊(cè)中心中,微服務(wù)的名稱必須具有唯一性。
3.注冊(cè)激活
在微服務(wù)應(yīng)用的主程序中增加一個(gè)注解@EnableDiscoveryClien,即可激活服務(wù)注冊(cè)與發(fā)現(xiàn)的功能,代碼如下所示:
@SpringBootApplication
@EnableDiscoveryClient
public class SortsRestApiApplication {
public static void main(String[) args) {
SpringApplication.run(SortsRestApiApplication.class, args);
}
}當(dāng)完成上述步驟之后,啟動(dòng)微服務(wù),即可在Consul的控制臺(tái)上看到已經(jīng)注冊(cè)的微服務(wù),如圖5-3所示。

從圖5-3中可以看出,除了consul服務(wù)本身,還有一一個(gè)catalogapi 服務(wù),這就是成功注冊(cè)的微服務(wù)。單擊catalogapi右邊的相關(guān)條款,還可以看到這個(gè)微服務(wù)健康狀態(tài)相關(guān)的詳細(xì)數(shù)據(jù)。
統(tǒng)一配置管理
在Consul上可以使用配置管理的功能,并且它還支持YAML的格式,配置的功能十分強(qiáng)大。另外,還可以將配置信息保存在磁盤文件中。
想要啟用配置管理的功能,就需要在微服務(wù)的配置文件bootstrap.yml中增加如下所示的設(shè)置:
spring:
cloud:
consul :
config:
enabled: true #默認(rèn)是true
format: YAML #表示Consul. 上面文件的格式
data-key: data #表示Consul上面的KEY值(或者說(shuō)文件的名字),默認(rèn)是data
defaultContext: ${ spring . application. name }這樣,在微服務(wù)啟動(dòng)時(shí),就最先從Consul中讀取配置。
我們可以為每個(gè)微服務(wù)配置一些獨(dú)立的參數(shù), 例如,數(shù)據(jù)源配置等。圖5-4是針對(duì)微服務(wù)catalogapi的數(shù)據(jù)源配置。

最終, 一個(gè)連接 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 #默認(rèn)是true
format: YAML #表示Consul.上面文件的格式有四種: YAML、PROPERTIES、KEY-VALUE
#和FILES
data-key: data #表示Consul上面的KEY值(或者說(shuō)文件的名字)默認(rèn)是data
de faultContext: $ { spring . application. name }合理發(fā)揮斷路器的作用
在微服務(wù)的相互調(diào)用中,為了提高微服務(wù)的高可用性,有時(shí)我們會(huì)啟用斷路器功能。斷路器就像電路的跳閘開(kāi)關(guān)一樣,當(dāng)負(fù)載過(guò)載時(shí)切斷電路,轉(zhuǎn)為降級(jí)調(diào)用或執(zhí)行故障轉(zhuǎn)移操作。當(dāng)負(fù)載釋放時(shí),再提供正常訪問(wèn)功能。
經(jīng)過(guò)多次測(cè)試,我們對(duì)啟用斷路器功能的應(yīng)用使用了下列配置,在高可用和高性能之間進(jìn)行了一個(gè)折中設(shè)置:
#是否開(kāi)啟斷路器(false) feign.hystrix. enabled: true #是否失敗重試(true) spring.cloud. loadbalancer. retry .enabled: true #斷路器超時(shí)配置(true) hystrix. command. default. execution. timeout. enabled: true #斷路器的超時(shí)時(shí)間需要大于ribbon的超時(shí)時(shí)間,否則不會(huì)觸發(fā)重試 (>ConnectT imeout+ReadTimeout) hystrix. command . de fault. execution. isolation. thread. timeoutInMilliseconds: 19000 #并發(fā)執(zhí)行的最大線程數(shù)(10) hystrix. threadpool .default.coreSize: 500 #負(fù)載超時(shí)配置 ribbon. ConnectTimeout: 3000 r ibbon. ReadTimeout: 15000 #對(duì)所有操作請(qǐng)求都進(jìn)行重試 r ibbon. OkToRetryOnAllOperations: true #切換實(shí)例的重試次數(shù) r ibbon. MaxAutoRetriesNextServer: 1 #對(duì)當(dāng)前實(shí)例的重試次數(shù) ribbon.MaxAutoRetries: 0
這個(gè)配置有兩點(diǎn)需要注意:
(1)斷路器的超時(shí)時(shí)間必須大于負(fù)載配置中的超時(shí)時(shí)間之和,例如,在上面的配置中,19000> 3000 + 15000。
(2)并發(fā)執(zhí)行的最大線程數(shù)默認(rèn)為10個(gè),這遠(yuǎn)遠(yuǎn)不夠,所以這里設(shè)置為500個(gè)。讀者可以根據(jù)服務(wù)器的CPU頻率和個(gè)數(shù)酌情設(shè)定。
當(dāng)然,對(duì)于一個(gè)微服務(wù)來(lái)說(shuō),只有不啟用斷路器功能,其性能才是最優(yōu)的。
如何實(shí)現(xiàn)有效的監(jiān)控
通過(guò)使用Spring Cloud工具套件提供的功能,結(jié)合第三方提供的工具,我們可以對(duì)所有微服務(wù)的運(yùn)行情況進(jìn)行更加有效的監(jiān)控,從而為微服務(wù)提供更加安全可靠的保障。
針對(duì)這些工具的使用,我們只需引用相關(guān)的工具組件,增加一-點(diǎn)簡(jiǎn)單的設(shè)計(jì),并進(jìn)行相關(guān)的配置,就可以使用其強(qiáng)大的功能。
服務(wù)健康狀態(tài)監(jiān)控
這里使用一個(gè)優(yōu)秀的第三方管理工具Spring Boot Admin實(shí)現(xiàn)服務(wù)的健康狀態(tài)監(jiān)控和告警。
這一部分的內(nèi)容在項(xiàng)目的base-admin模塊中,首先引用其工具組件的依賴,代碼如下所示:
<dependency> <groupid>de . codecentric</groupid> <artifactid>spring-boot- adrnin - starter-server</artifactid> <versio口> 1.0</version> </dependency>
該工具還提供了管理控制臺(tái)訪問(wèn)控制功能及其WebUI設(shè)計(jì),所以我們只需結(jié)合使用Spring的安全組件,增加一個(gè)安全管理配置,就可以啟用這些功能。這個(gè)配置的核心代碼如下所示:
@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() ;
}在上面的代碼中,主要是對(duì)一-些鏈接進(jìn)行授權(quán),同時(shí)在登錄頁(yè)面設(shè)置中使用loginPage頁(yè)面。loginPage頁(yè)面將使用由Spring Boot Admin提供的WebUI設(shè)計(jì),運(yùn)行效果如圖5-5所示。

圖5-5中的用戶名和密碼,使用了簡(jiǎn)單實(shí)現(xiàn)的策略設(shè)計(jì),可以直接在配置文件中進(jìn)行設(shè)置。
SpringBootAdmin是通過(guò)注冊(cè)中心對(duì)微服務(wù)進(jìn)行監(jiān)控的,所以它本身也需要接入注冊(cè)中心,而所有受監(jiān)控的服務(wù)都無(wú)須進(jìn)行設(shè)計(jì)。為了能夠提供完整的狀態(tài)數(shù)據(jù),我們需在配置文件中增加如下所示的配置:
management : e ndpoints : web : exposure : include :”* ” e ndpoi nt : health: show- details: ALWAYS
登錄Sping Boot Admin控制臺(tái),就可以看到所有在注冊(cè)中心中注冊(cè)的微服務(wù)的運(yùn)行情況,以及相關(guān)的一些健康數(shù)據(jù),如線程數(shù)、內(nèi)存使用情況等。Sping Boot Admin本身的運(yùn)行狀態(tài)及相關(guān)健康數(shù)據(jù)如圖5-6所示。

重大故障告警
SpringBootAdmin還可以對(duì)其監(jiān)控的服務(wù)提供告警功能,當(dāng)出現(xiàn)重大故障,如服務(wù)宕機(jī)時(shí),可以及時(shí)以郵件方式通知運(yùn)維人員。
想要實(shí)現(xiàn)這個(gè)功能,就必須結(jié)合使用Spring Boot Mail組件。在配置文件中使用如下所示的配置,啟動(dòng)Spring Boot Admin的郵件通知功能:
spring : boot: admin: notify: mail: to : devops@ai.com from : usercenter@ai . com
上面設(shè)置的郵箱地址必須是有效的,同時(shí)還要配置SpingBootMail郵件的收發(fā)功能。這樣,當(dāng)微服務(wù)重啟或宕機(jī)時(shí),運(yùn)維人員就可以收到來(lái)自Spring Boot Admin的告警通知郵件了。
斷路器儀表盤
base- microservice項(xiàng)目工程的base-hystrix 模塊是- - 個(gè)斷路器儀表盤設(shè)計(jì)。
斷路器儀表盤是Spring Cloud工具套件中的一一個(gè)組件,為了使用這個(gè)功能組件,我們需要引用如下所示的工具包:
<dependenc s> <dependency> <groupid>org .springframework.cloud</groupid> <artifactid>spring- cloud- starter- netflix- hystrix-dashboard</artifactid> </dependency> </dependencies>
單獨(dú)的斷路器儀表盤應(yīng)用程序,不用接入注冊(cè)中心,只需在主程序中增加如下所示代碼即可使用:
@SpringBootApplication
@Controller
@EnableHystrixDashboard
public class HystrixApplication {
@RequestMapping (” / ” )
public String home() {
return ” forward : /hystrix ” ;
}
...
}啟動(dòng)斷路器儀表盤應(yīng)用程序之后,通過(guò)下面鏈接打開(kāi)瀏覽器,即可看到如圖 5-7 所示的控制臺(tái)主頁(yè):
http://localhost : 7979

在控制臺(tái)中,我們輸入一個(gè)如下所示的需要監(jiān)控的服務(wù)鏈接地址和端口號(hào),并加上hytrix.stream字符串,單擊Monitor Stream按鈕,即可對(duì)相關(guān)微服務(wù)實(shí)行監(jiān)控:
http:/ / localhost: 8091/hystrix. stream
如果所監(jiān)控的服務(wù)有請(qǐng)求發(fā)生,就可以看到如圖5-8所示的情況。

這只是針對(duì)單獨(dú)一個(gè)微服務(wù)進(jìn)行的監(jiān)控,所以在實(shí)際中作用不是很大,只可以為進(jìn)行性能測(cè)試提供一些參考數(shù)據(jù)。
如果使用Turbine組件,就可以實(shí)現(xiàn)對(duì)一-組服務(wù)進(jìn)行監(jiān)控。這種聚合服務(wù)的斷路器儀表盤設(shè)計(jì),在項(xiàng)目工程的base-turbine模塊中。這里增加了對(duì)Turbine組件的引用,同時(shí)將這一-服務(wù)接入注冊(cè)中心之中,這樣,即可在配置文件中指定需要監(jiān)控的服務(wù)了,如下所示:
turbine:
appConfig: catalogapi, catalogweb
aggregator:
clusterConfig: default
clusterNameExpression: new String ("default")在這個(gè)配置中,我們只對(duì)catalogapi和catalogweb兩個(gè)微服務(wù)實(shí)施了監(jiān)控。這樣,在啟動(dòng)應(yīng)用之后,在首頁(yè)控制臺(tái)中輸入這個(gè)應(yīng)用的鏈接地址和端口號(hào),同時(shí)在后面加上turbine.stream字符串,即可開(kāi)啟聚合服務(wù)的斷路器儀表盤了。
http: / /localhost:8989/ turbine .stream
如圖5-9所示,是聚合服務(wù)斷路器儀表盤的一一個(gè)監(jiān)控實(shí)例的情況。

Zipkin 鏈路跟蹤
使用Zipkin可以實(shí)現(xiàn)對(duì)微服務(wù)的鏈路跟蹤功能。Zipkin 是一一個(gè)開(kāi)放源代碼的分布式鏈路跟蹤系統(tǒng),每個(gè)服務(wù)都向Zipkin發(fā)送實(shí)時(shí)數(shù)據(jù), Zipkin 會(huì)根據(jù)調(diào)用關(guān)系通過(guò)Zipkin UI生成依賴關(guān)系圖。
Zipkin提供的數(shù)據(jù)存儲(chǔ)方式有In-Memory、MySQL Cassandra 和Elasticsearch等。
Zipkin用Trace結(jié)構(gòu)表示對(duì)一次請(qǐng)求的追蹤,同時(shí)又把每個(gè)Trace拆分為若干個(gè)有依賴關(guān)系的Span。在微服務(wù)應(yīng)用中,一次用戶請(qǐng)求可能由后臺(tái)若干個(gè)微服務(wù)負(fù)責(zé)處理,而每個(gè)處理請(qǐng)求的微服務(wù)就可以理解為一個(gè)Span。
從網(wǎng)上下載一個(gè)可運(yùn)行的zipkin-server的jar包,創(chuàng)建Zipkin服務(wù)。
下載成功后,在Java環(huán)境中使用下列指令運(yùn)行(要求JDK的版本為1.7 及以上) :
java -jar zipkin-server-*.jar --logging.level. zipkin2=INFO
Zipkin默認(rèn)使用的端口號(hào)為9411,在程序啟動(dòng)成功之后,通過(guò)瀏覽器使用如下鏈接可以打開(kāi)其控制臺(tái):
http:// localhost:9411/
控制臺(tái)的初次打開(kāi)界面如圖5-10所示。

在一個(gè)微服務(wù)應(yīng)用中,可以通過(guò)以下步驟加入鏈路跟蹤功能。
(1)引用Spring Cloud工具套件中支持Zipkin 的組件,代碼如下所示:
<!--鏈路跟蹤--> <dependency> <groupId>org. springframework.cloud</groupId> <arti factId>spring-cloud-starter-zipkin</artifactId> </dependency>
(2)在配置文件中增加如下所示的配置項(xiàng):
#鏈路跟蹤 | spring: sleuth: sampler : probability: 1.0 zipkin: sender : type: web : base-url: http://localhost:9411/
經(jīng)上述配置之后,如果服務(wù)中有請(qǐng)求發(fā)生,那么就可以在Zipkin的控制臺(tái)中看到相關(guān)服務(wù)的調(diào)用記錄,如調(diào)用過(guò)程中涉及的方法、服務(wù)之間的依賴關(guān)系等,如圖5-11、圖5-12和圖5-13所示。



這里我們沒(méi)有保存Zipkin的跟蹤數(shù)據(jù),并且數(shù)據(jù)的傳輸也只是簡(jiǎn)單地使用了Web方式,因此只能在開(kāi)發(fā)時(shí)測(cè)試使用。在實(shí)際應(yīng)用中,可以將跟蹤數(shù)據(jù)保存在Elasticsearch中,同時(shí)數(shù)據(jù):
傳輸也可以使用異步消息通信實(shí)現(xiàn)。當(dāng)數(shù)據(jù)保存在Elasticsearch 中時(shí),默認(rèn)以天為單位進(jìn)行分割,這樣將造成Zipkin 的依賴信息無(wú)法正常顯示。這時(shí),需要使用另一個(gè)開(kāi)源工具包zipkin-dependencies進(jìn)行計(jì)算。打開(kāi)GitHub官網(wǎng),搜索zipkin-dependencies,下載后即可使用。
因?yàn)檫@個(gè)工具包在執(zhí)行一次計(jì)算之后就會(huì)自動(dòng)關(guān)閉,所以讀者需要根據(jù)實(shí)際情況,設(shè)定為固定時(shí)間間隔執(zhí)行一次。
ELK日志分析平臺(tái)
除可以對(duì)微服務(wù)的運(yùn)行和相互調(diào)用進(jìn)行監(jiān)控和跟蹤外,微服務(wù)的輸出日志也是故障分析中最直接的入口和切實(shí)依據(jù)。但是到每個(gè)微服務(wù)的控制臺(tái)上去查看日志是很不方便的,特別是微服務(wù),不僅使用Docker發(fā)布,并且還分布在很多不同的服務(wù)器上,所以這里將使用一個(gè)日志分析平臺(tái),將所有微服務(wù)的日志收集起來(lái),進(jìn)行集中管理,并且提供統(tǒng)一的管理平臺(tái)進(jìn)行查詢和分析。
創(chuàng)建日志分析平臺(tái)
日志分析平臺(tái)ELK 是由Elasticsearch、 Logstash 和Kibana 三個(gè)服務(wù)組成的。其中,Elasticsearch負(fù)責(zé)日志存儲(chǔ)并提供搜索功能,Logstash 負(fù)責(zé)日志收集,Kibana 提供Web查詢操作界面。這三個(gè)服務(wù)都是開(kāi)源的,可以使用Docker進(jìn)行安裝。
使用日志分析平臺(tái)
在微服務(wù)工程中增加如下所示的依賴引用,即可在應(yīng)用中使用日志分析平臺(tái)提供的日志收集功能:
<!--日志服務(wù)--> <dependency> <groupId>net. logstash. logback</groupId> <artifactId> logstash- logback-encoder</artifactId> <version>4. 10</version> </ dependency>
在應(yīng)用中增加一個(gè)“logback.xm1”配置文件,內(nèi)容如下所示:
<?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>
<!--設(shè)置日志級(jí)別-->
<root level="info">
<appender-ref ref="STDOUT" />
<!--輸出到ELK-->
<!--<appender-ref ref="stash" />-->
</ root>
</ configuration>在上面的配置中,“ stash”配置就是連接日志分析平臺(tái)的設(shè)置。在這個(gè)配置中,假設(shè)日志收集服務(wù)器的IP地址為“192.168.1.28” ,讀者可以根據(jù)實(shí)際情況進(jìn)行設(shè)定。
在應(yīng)用啟動(dòng)之后,即可通過(guò)下列鏈接打開(kāi)Kibana 日志查詢控制臺(tái):
在日志查詢控制臺(tái)中,可以查詢每個(gè)應(yīng)用的日志輸出,如圖5-14所示。

小結(jié)
本章首先講述了注冊(cè)中心的創(chuàng)建,以及微服務(wù)的注冊(cè)與配置。然后,以注冊(cè)中心為基礎(chǔ),通過(guò)健康監(jiān)控、服務(wù)告警、斷路器儀表盤和鏈路跟蹤等功能的實(shí)施,說(shuō)明如何對(duì)微服務(wù)進(jìn)行有效監(jiān)控。同時(shí),結(jié)合日志分析平臺(tái)的使用,對(duì)所有運(yùn)行的微服務(wù)應(yīng)用進(jìn)行全面而有效的治理。
后續(xù)的微服務(wù)的開(kāi)發(fā)和實(shí)施將在這個(gè)微服務(wù)治理環(huán)境的基礎(chǔ)上進(jìn)行,而涉及有關(guān)服務(wù)治理的引用和配置將不再做特別說(shuō)明。
本文給大家講解的內(nèi)容是SpringCloud微服務(wù)架構(gòu)實(shí)戰(zhàn):微服務(wù)治理 下篇文章給大家講解的是SpringCloud微服務(wù)架構(gòu)實(shí)戰(zhàn):類目管理微服務(wù)開(kāi)發(fā);覺(jué)得文章不錯(cuò)的朋友可以轉(zhuǎn)發(fā)此文關(guān)注小編;感謝大家的支持!
相關(guān)文章
Java調(diào)用opencv實(shí)現(xiàn)圖片矯正功能
這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用opencv實(shí)現(xiàn)圖片矯正功能,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09
Spring Boot Hazelcast Caching 使用和配置詳解
這篇文章主要介紹了Spring Boot Hazelcast Caching 使用和配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Java +Tomcat + SpringMVC實(shí)現(xiàn)頁(yè)面訪問(wèn)示例解析
這篇文章主要介紹了Java +Tomcat + SpringMVC實(shí)現(xiàn)頁(yè)面訪問(wèn)示例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
IntelliJ IDEA編譯項(xiàng)目報(bào)錯(cuò) "xxx包不存在" 或 "找不到符號(hào)"
這篇文章主要介紹了IntelliJ IDEA編譯項(xiàng)目報(bào)錯(cuò) "xxx包不存在" 或 "找不到符號(hào)" ,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Spring MVC 自定義數(shù)據(jù)轉(zhuǎn)換器的思路案例詳解
本文通過(guò)兩個(gè)案例來(lái)介紹下Spring MVC 自定義數(shù)據(jù)轉(zhuǎn)換器的相關(guān)知識(shí),每種方法通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
spring cloud feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用服務(wù)傳輸文件的方法
這篇文章主要介紹了spring cloud feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用服務(wù)傳輸文件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Java中基于Shiro,JWT實(shí)現(xiàn)微信小程序登錄完整例子及實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了Java中基于Shiro,JWT實(shí)現(xiàn)微信小程序登錄完整例子 ,實(shí)現(xiàn)了小程序的自定義登陸,將自定義登陸態(tài)token返回給小程序作為登陸憑證。需要的朋友可以參考下2018-11-11

