服务追踪(上)
我們來講服務(wù)追蹤,創(chuàng)建訂單時候發(fā)一個請求,發(fā)現(xiàn)耗時很嚴(yán)重,2.2秒,下個訂單發(fā)這么多時間,用戶體驗(yàn)還是很不好的,那么問題原因出在哪兒呢,我們來看一下下單的代碼,我們猜測可能是在調(diào)用商品服務(wù)的時候,獲取商品信息這個接口,耗時比較嚴(yán)重,調(diào)用WEB服務(wù),也可能是扣庫存這個地方,耗時比較嚴(yán)重,那我怎么確認(rèn)是這個接口耗時比較嚴(yán)重呢,想到的方法是計(jì)時,在調(diào)用前我記一下時間,在調(diào)用之后記一下時間,這不就得出來了嗎,那假設(shè)定位到了這個問題,是調(diào)這個接口造成的,那我們就要和負(fù)責(zé)人去溝通了,我調(diào)你這個接口耗時很嚴(yán)重,你得給我解決,然后他開始看他的代碼了,他看他這個方法,他這個方法又可能調(diào)用WEB的服務(wù),就像這個圖里面的,A調(diào)用B,B再調(diào)用C,這是一整條鏈路,當(dāng)服務(wù)的鏈路越來越多,鏈路越來越長的時候,你再通過日志打點(diǎn)計(jì)時這種方法去排查問題,這效率也非常低,排查起來非常非常不方便,那應(yīng)該怎么辦呢,這就是我們的內(nèi)容,我們要做的事情其實(shí)有一個專有名詞,叫做鏈路監(jiān)控,Spring Cloud也提供了非常方便的組件,叫做Spring Cloud Sleuth,Sleuth翻譯成中文,就是偵查的意思,鏈路監(jiān)控這塊的內(nèi)容呢,要寫的并不是特別多,主要是要會看,呈現(xiàn)出來的界面指標(biāo),大家要學(xué)會去看,接下來我來演示一下,如何來使用這個組件,打開我們的項(xiàng)目,order這個服務(wù),第一步引入sleuth這個組件<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>localhost:8010/order/createWARN [order,4272188df7f7932b,4272188df7f7932b,false]看一下日志,多了好幾條這樣的日志,這個地方的日志就是我們剛剛用的sleuth,組件打印出來的,我們來看一下到底什么意思,第一個想都不用想,肯定是服務(wù)的名字,第二個值是ID,一條鏈路里面,最多包含一個ID,也就是唯一標(biāo)識,第三個值是ID,是一個基本單元,一條鏈路請求里面,包含多個ID,可以理解成一個基本的工作單元,比如發(fā)送一個HTTP請求,最后一個值看奧是false,true是標(biāo)識要把這個信息輸出到其他服務(wù),來搜集和展示,false就是不搜集,我們再多下幾個訂單看一下,可以看到?jīng)]有打印出來sleuth的指標(biāo),我們現(xiàn)在可以把日志級別給他調(diào)整了,可以看到更多的內(nèi)容,日志的級別改成debug模式logging.level.org.springframework.cloud.netflix.feign=debug
logging.file=springboot.log
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd} ==== [%thread] %-5level ==== %logger{50} ==== %msg%n我們現(xiàn)在給商品組件也加上sleuth組件logging.level.com.learn=trace日志級別也給他調(diào)整一下,logging.level.com.learn=trace已經(jīng)啟動了,我們再來下個單http://localhost:8010/createOrder可以看到這里日志打印出來了2019-09-09 10:45:12.195 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.290 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.650 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.686 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.730 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.739 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.781 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.784 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]http://localhost:8010/createOrder2019-09-09 10:50:37.430 INFO [product,,,]
2019-09-09 10:50:37.430 INFO [product,,,]
2019-09-09 10:50:38.023 INFO [product,,,]現(xiàn)在監(jiān)控的指標(biāo)內(nèi)容是產(chǎn)生了,我們看不能在控制臺看來看去,我們肯定需要一個界面化的東西,比較友好的展示出來,最主要的還是學(xué)會看,這里我們用到的是zipkin這個框架https://zipkin.io可以看一下他的介紹,這是官網(wǎng),我們看一下如何來使用,這里有一個quickstarthttps://zipkin.io/pages/quickstart.html我們使用到的方式呢,第一個也是提供了docker的方式,我們也用這個來做,特別方便,直接用docker來做,下面是用JAVA,使用他的源碼,我們就用docker他默認(rèn)的端口是9411docker run -d -p 9411:9411 openzipkin/zipkin大家在自己電腦上運(yùn)行得一段時間,看現(xiàn)在已經(jīng)啟動起來了
59.110.158.145:9411用docker就是方便,搭建了這么一個系統(tǒng),可以看到上面有服務(wù)名,這里有種種指標(biāo),他這里只是一個展示的界面,我們?nèi)绾伟褦?shù)據(jù)跟這個界面,給他接起來呢,我們要把數(shù)據(jù)發(fā)過來,我們回到項(xiàng)目里面,同樣的添加依賴,<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth-zipkin</artifactId>
</dependency>在這其實(shí)我們還有一個依賴,我們來看一下這三個依賴,<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>這三個,每一個是不一樣的,仔細(xì)看這單詞,spring-cloud-starter-zipkin這個包含了這兩個<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sleuth-zipkin</artifactId><version>${project.version}</version>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId><version>${project.version}</version>
</dependency>start-sleuth,sleuth-zipkin,剛好是包好了這兩個,所以我們可以只用這一個依賴,寫一個注釋,包含sleuth和zipkin,引入依賴之后,我們要把數(shù)據(jù)給傳過去,直接配置就好了zipkin.base-url=localhost:9411spring.zipkin.base-url=http://59.110.158.145:9411/我們現(xiàn)在order項(xiàng)目里面重啟一下,我們再來請求一下下單的接口你會發(fā)現(xiàn)這里還是沒有數(shù)據(jù)http://59.110.158.145:9411/zipkin/按理來說數(shù)據(jù)不是應(yīng)該發(fā)過來了嗎,怎么回事呢,還記得剛剛說的第四個值嗎,第四個值是是否將該信息給他輸出到外部去觀察,比如輸出到zipkin去觀察,這里都是false,沒有輸出過去,開發(fā)環(huán)境下我們要求所有的都輸出過去,要想輸出過去,在配置=文件里面還要配置一個東西,spring:zipkin:base-url: http://localhost:9411/sleuth:sampler:probability: 1 #樣本采集量,默認(rèn)為0.1,為了測試這里修改為1,正式環(huán)境一般使用默認(rèn)值。spring.sleuth.sampler.probability=1我們可以點(diǎn)進(jìn)去看,這個是個百分比,/*** Properties related to sampling** @author Marcin Grzejszczak* @author Adrian Cole* @since 1.0.0*/
@ConfigurationProperties("spring.sleuth.sampler")
public class SamplerProperties {/*** Percentage of requests that should be sampled. E.g. 1.0 - 100% requests should be* sampled. The precision is whole-numbers only (i.e. there's no support for 0.1% of* the traces).*/private float percentage = 0.1f;public float getPercentage() {return this.percentage;}public void setPercentage(float percentage) {this.percentage = percentage;}
}默認(rèn)的是0.1,0.1就是10%,這個什么意思呢,其實(shí)它并不是我們想象中的,把所有的請求都發(fā)出去,默認(rèn)的只將10%的請求,發(fā)送到外部的服務(wù),比如zipkin,那么他為什么不全部發(fā)出去呢,大家要想一下,如果全部發(fā)出去的話,對服務(wù)的性能啊,還有帶寬,都是有要求的,我們要監(jiān)控的請求,他就是10%,那么你萬個請求里面,挑1千個,其實(shí)也能夠發(fā)現(xiàn)問題的,這就是一個抽樣,抽樣觀察,那么開發(fā)環(huán)境我們可以設(shè)置為1,1就是百分之百,所有的數(shù)據(jù)都發(fā)送出去,spring.sleuth.sampler.percentage=1已經(jīng)重啟成功了,再來下個單,現(xiàn)在再來看一下鏈路追蹤,現(xiàn)在已經(jīng)有了,有了order這個服務(wù)http://59.110.158.145:9411/zipkin/http://localhost:8010/listForOrder我們點(diǎn)查找,就可以看到請求了
時間也看到了,時間都花到這兒,非常清楚了,我們目前只有兩個服務(wù),所以這邊還是比較少,你看到這官方的這個圖
當(dāng)調(diào)用鏈非常長的時候,看的就更加清楚了,哪個長哪個耗時就多,看得一清二楚
spanId是他自己獨(dú)有的,parentId就是父id了,它是一個接一個的,都是一些過濾器了其實(shí),過濾=指定的URL
?
總結(jié)
- 上一篇: hystrix-dashboard
- 下一篇: 服务追踪(下)