Sleuth是一個Spring Cloud的分佈式跟蹤解決方案。它由如下幾個方面組成java
如今咱們來具體看一下Sleuth的做用是什麼,當咱們沒有加Sleuth依賴的時候,假設咱們要訪問這樣一個接口web
@GetMapping(value = "/users-anon/internal", params = "username") public LoginAppUser findByUsername(String username) { return appUserService.findByUsername(username); }
在日誌中,咱們能夠看到是這個樣子的spring
2019-11-01 00:17:05.402 DEBUG 805 --- [nio-8001-exec-1] c.c.u.d.U.findUserByUsername : ==> Preparing: select u.* from app_user u inner join user_credentials c on c.userId = u.id where c.username = ?
2019-11-01 00:17:05.426 DEBUG 805 --- [nio-8001-exec-1] c.c.u.d.U.findUserByUsername : ==> Parameters: admin(String)
2019-11-01 00:17:05.503 DEBUG 805 --- [nio-8001-exec-1] c.c.u.d.U.findUserByUsername : <== Total: 1
2019-11-01 00:17:05.522 INFO 805 --- [nio-8001-exec-1] c.c.u.service.impl.AppUserServiceImpl : {"createTime":1516179419000,"enabled":true,"headImgUrl":"","id":1,"nickname":"測試1","password":"$2a$10$3uOoX1ps14CxuotogUoDreW8zXJOZB9XeGdrC/xDV36hhaE8Rn9HO","phone":"","province":"廣東","receiveAddress":"廣州天河珠村東橫五路紅噗公寓367","sex":1,"type":"APP","updateTime":1516179421000,"userIdentity":"SERVICEOPERATOR","username":"admin"}
2019-11-01 00:17:05.528 DEBUG 805 --- [nio-8001-exec-1] c.c.u.dao.UserRoleDao.findRolesByUserId : ==> Preparing: select r.* from sys_role_user ru inner join sys_role r on r.id = ru.roleId where ru.userId = ?
2019-11-01 00:17:05.529 DEBUG 805 --- [nio-8001-exec-1] c.c.u.dao.UserRoleDao.findRolesByUserId : ==> Parameters: 1(Long)
2019-11-01 00:17:05.584 DEBUG 805 --- [nio-8001-exec-1] c.c.u.dao.UserRoleDao.findRolesByUserId : <== Total: 1
2019-11-01 00:17:05.605 DEBUG 805 --- [nio-8001-exec-1] c.c.u.d.R.findPermissionsByRoleIds : ==> Preparing: select p.* from sys_permission p inner join sys_role_permission rp on p.id = rp.permissionId WHERE rp.roleId in ( ? )
2019-11-01 00:17:05.606 DEBUG 805 --- [nio-8001-exec-1] c.c.u.d.R.findPermissionsByRoleIds : ==> Parameters: 1(Long)
2019-11-01 00:17:06.245 DEBUG 805 --- [nio-8001-exec-1] c.c.u.d.R.findPermissionsByRoleIds : <== Total: 31sql
除了mybatis的sql代碼外,就只能看到相似nio-8001-exec-1這樣的線程名了。如今咱們加入依賴docker
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
重啓服務,咱們再來看一下日誌數據庫
2019-11-01 00:23:01.469 DEBUG [user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false] 816 --- [nio-8001-exec-1] c.c.u.d.U.findUserByUsername : ==> Preparing: select u.* from app_user u inner join user_credentials c on c.userId = u.id where c.username = ?
2019-11-01 00:23:01.487 DEBUG [user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false] 816 --- [nio-8001-exec-1] c.c.u.d.U.findUserByUsername : ==> Parameters: admin(String)
2019-11-01 00:23:01.649 DEBUG [user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false] 816 --- [nio-8001-exec-1] c.c.u.d.U.findUserByUsername : <== Total: 1
2019-11-01 00:23:01.671 INFO [user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false] 816 --- [nio-8001-exec-1] c.c.u.service.impl.AppUserServiceImpl : {"createTime":1516179419000,"enabled":true,"headImgUrl":"","id":1,"nickname":"測試1","password":"$2a$10$3uOoX1ps14CxuotogUoDreW8zXJOZB9XeGdrC/xDV36hhaE8Rn9HO","phone":"","province":"廣東","receiveAddress":"廣州天河珠村東橫五路紅噗公寓367","sex":1,"type":"APP","updateTime":1516179421000,"userIdentity":"SERVICEOPERATOR","username":"admin"}
2019-11-01 00:23:01.679 DEBUG [user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false] 816 --- [nio-8001-exec-1] c.c.u.dao.UserRoleDao.findRolesByUserId : ==> Preparing: select r.* from sys_role_user ru inner join sys_role r on r.id = ru.roleId where ru.userId = ?
2019-11-01 00:23:01.679 DEBUG [user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false] 816 --- [nio-8001-exec-1] c.c.u.dao.UserRoleDao.findRolesByUserId : ==> Parameters: 1(Long)
2019-11-01 00:23:01.834 DEBUG [user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false] 816 --- [nio-8001-exec-1] c.c.u.dao.UserRoleDao.findRolesByUserId : <== Total: 1
2019-11-01 00:23:01.852 DEBUG [user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false] 816 --- [nio-8001-exec-1] c.c.u.d.R.findPermissionsByRoleIds : ==> Preparing: select p.* from sys_permission p inner join sys_role_permission rp on p.id = rp.permissionId WHERE rp.roleId in ( ? )
2019-11-01 00:23:01.852 DEBUG [user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false] 816 --- [nio-8001-exec-1] c.c.u.d.R.findPermissionsByRoleIds : ==> Parameters: 1(Long)
2019-11-01 00:23:01.980 DEBUG [user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false] 816 --- [nio-8001-exec-1] c.c.u.d.R.findPermissionsByRoleIds : <== Total: 31瀏覽器
如今咱們能夠看到相似於user-center,d406e2f823a1c2a3,d406e2f823a1c2a3,false的東西。bash
固然要打印這些日誌,咱們須要在配置文件中加入以下配置信息服務器
logging: level: root: info com.cloud: debug file: logs/${spring.application.name}.log
如今咱們來看一下zipkin。mybatis
要使用zipkin咱們須要先下載zipkin server,下載方式爲
curl -sSL https://zipkin.io/quickstart.sh | bash -s
而後啓動它
java -jar zipkin.jar
固然咱們也可使用docker,建議在服務器上使用
docker pull openzipkin/zipkin
docker run -d --name zipkin -p 9411:9411 openzipkin/zipkin
啓動以後,咱們能夠訪問zipkin的UI界面
http://127.0.0.1:9411/zipkin/
在咱們的項目中添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
這裏zipkin的依賴已經包含了sleuth的依賴,因此咱們能夠去掉了以前sleuth的依賴。
添加配置
spring: zipkin: #。 在服務器上填入服務器的IP base-url: http://localhost:9411 enabled: true sender: type: web sleuth: sampler: # 抽樣率,默認是0.1(10%),如今取100%,只爲測試方便,生產環境勿設100% probability: 1.0
如今咱們從新啓動項目,進行一次請求訪問,日誌爲
2019-11-01 01:04:03.187 DEBUG [user-center,d7fa432636d9df52,d7fa432636d9df52,true] 956 --- [nio-8001-exec-1] c.c.u.d.U.findUserByUsername : ==> Preparing: select u.* from app_user u inner join user_credentials c on c.userId = u.id where c.username = ?
2019-11-01 01:04:03.203 DEBUG [user-center,d7fa432636d9df52,d7fa432636d9df52,true] 956 --- [nio-8001-exec-1] c.c.u.d.U.findUserByUsername : ==> Parameters: admin(String)
2019-11-01 01:04:03.276 DEBUG [user-center,d7fa432636d9df52,d7fa432636d9df52,true] 956 --- [nio-8001-exec-1] c.c.u.d.U.findUserByUsername : <== Total: 1
2019-11-01 01:04:03.290 INFO [user-center,d7fa432636d9df52,d7fa432636d9df52,true] 956 --- [nio-8001-exec-1] c.c.u.service.impl.AppUserServiceImpl : {"createTime":1516179419000,"enabled":true,"headImgUrl":"","id":1,"nickname":"測試1","password":"$2a$10$3uOoX1ps14CxuotogUoDreW8zXJOZB9XeGdrC/xDV36hhaE8Rn9HO","phone":"","province":"廣東","receiveAddress":"廣州天河珠村東橫五路紅噗公寓367","sex":1,"type":"APP","updateTime":1516179421000,"userIdentity":"SERVICEOPERATOR","username":"admin"}
2019-11-01 01:04:03.294 DEBUG [user-center,d7fa432636d9df52,d7fa432636d9df52,true] 956 --- [nio-8001-exec-1] c.c.u.dao.UserRoleDao.findRolesByUserId : ==> Preparing: select r.* from sys_role_user ru inner join sys_role r on r.id = ru.roleId where ru.userId = ?
2019-11-01 01:04:03.294 DEBUG [user-center,d7fa432636d9df52,d7fa432636d9df52,true] 956 --- [nio-8001-exec-1] c.c.u.dao.UserRoleDao.findRolesByUserId : ==> Parameters: 1(Long)
2019-11-01 01:04:03.347 DEBUG [user-center,d7fa432636d9df52,d7fa432636d9df52,true] 956 --- [nio-8001-exec-1] c.c.u.dao.UserRoleDao.findRolesByUserId : <== Total: 1
2019-11-01 01:04:03.367 DEBUG [user-center,d7fa432636d9df52,d7fa432636d9df52,true] 956 --- [nio-8001-exec-1] c.c.u.d.R.findPermissionsByRoleIds : ==> Preparing: select p.* from sys_permission p inner join sys_role_permission rp on p.id = rp.permissionId WHERE rp.roleId in ( ? )
2019-11-01 01:04:03.368 DEBUG [user-center,d7fa432636d9df52,d7fa432636d9df52,true] 956 --- [nio-8001-exec-1] c.c.u.d.R.findPermissionsByRoleIds : ==> Parameters: 1(Long)
2019-11-01 01:04:03.433 DEBUG [user-center,d7fa432636d9df52,d7fa432636d9df52,true] 956 --- [nio-8001-exec-1] c.c.u.d.R.findPermissionsByRoleIds : <== Total: 31
這裏咱們能夠看到全部的user-center,d7fa432636d9df52,d7fa432636d9df52,true都已經爲true了,表示所有提交給zipkin了。
咱們多刷新訪問幾回,來看一下zipkin的結果記錄
在頁面中點查找,結果以下
因爲咱們這個接口在數據庫中進行了3次查詢,而且我這裏鏈接的是雲端數據庫,因此時間會比較長一點,但不管如何,這裏都會記錄下每次調用的時間,它是按降序排序的,這樣咱們就能夠很輕鬆的插看到每次調用的狀況,知道調用訪問哪裏耗時。咱們點擊某一個進去,能夠看到
再點擊如上的service,能夠看到更加詳細的信息
這裏只有SR,SC的兩條數據,由於咱們是使用瀏覽器訪問的,而瀏覽器並無集成zipkin,它不會上報本身的數據,因此這裏沒有CS,CR的數據。若是咱們在多個微服務之間都配置了zipkin,此處就會把全部的SR,SC,CS,CR的數據都上報上來。