1. 總覽
如要取得多層微服務架構的深入分析資訊和觀測能力,分散式追蹤功能是很重要的。當您將服務呼叫 (從服務 A 到服務 B 到服務 C) 時,必須瞭解呼叫成功,以及每個步驟的延遲時間。
在 Spring Boot 中,您可以使用 Spring Cloud Sleuth,在應用程式中順利新增分散式追蹤檢測功能。根據預設,系統會將追蹤記錄資料轉送至 Zipkin。
Google Cloud Platform 的 Cloud Trace 是代管服務,可讓您儲存追蹤記錄資料,而不必管理自己的 Zipkin 執行個體或儲存空間。Cloud Trace 也可以產生延遲分佈報表,並自動偵測效能迴歸問題。
在 Spring Boot 應用程式中使用 Cloud Trace 的方法有兩種:
- 使用 Stackdriver Trace Zipkin Proxy,只要設定 Spring Cloud Sleuth,即可將這個 Proxy 做為 Zipkin 端點使用
- 或者,您也可以使用 Spring Cloud GCP Trace,以便與 Spring Cloud Sleuth 完美整合,並將追蹤記錄資料直接轉送至 Cloud Trace。
在本程式碼研究室中,您將瞭解如何建構新的 Spring Boot 應用程式,並使用 Spring Cloud GCP Trace 進行分散式追蹤。
課程內容
- 如何建立 Spring Boot Java 應用程式並設定 Cloud Trace。
軟硬體需求
您會如何使用這個教學課程?
針對建立 HTML/CSS 網頁應用程式的經驗,您會給予什麼評價?
根據您使用 Google Cloud Platform 服務的經驗,您會給予什麼評價?
2. 設定和需求
自修環境設定
- 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。
- 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新。
- 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為
PROJECT_ID
)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。或者,您也可以自行嘗試,看看是否支援。在這個步驟後,這個名稱即無法變更,而且在專案期間內仍會保持有效。 - 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行本程式碼研究室不會產生任何費用 (如果有的話)。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。新使用者符合 $300 美元免費試用計畫的資格。
Google Cloud Shell
雖然 Google Cloud 和 Kubernetes 可以從筆記型電腦遠端操作,但在本程式碼研究室中,我們會使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。
啟用 Cloud Shell
- 在 Cloud 控制台中,按一下「啟用 Cloud Shell」圖示 。
如果您是第一次啟動 Cloud Shell,系統會顯示中繼畫面,說明這項服務的內容。如果系統顯示中繼畫面,請按一下「繼續」。
佈建並連線至 Cloud Shell 只需幾分鐘的時間。
這個虛擬機器已載入所有必要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可透過瀏覽器完成。
連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。
- 在 Cloud Shell 中執行下列指令,確認您已通過驗證:
gcloud auth list
指令輸出
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案:
gcloud config list project
指令輸出
[core] project = <PROJECT_ID>
如果尚未設定,請使用下列指令進行設定:
gcloud config set project <PROJECT_ID>
指令輸出
Updated property [core/project].
3. 建立新的 Spring Boot REST 服務
Cloud Shell 啟動後,您可以使用指令列,透過 Spring Initializr 產生新的 Spring Boot 應用程式:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d bootVersion=2.7.6 \
-d dependencies=web,lombok,cloud-gcp,distributed-tracing \
-d jvmVersion=17 \
-d type=maven-project \
-d baseDir=trace-service-one | tar -xzvf - \
&& cd trace-service-one
透過新增類別來建立新的 REST 控制器:
src/main/java/com/example/demo/WorkController.java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@Slf4j
public class WorkController {
Random r = new Random();
public void meeting() {
try {
log.info("meeting...");
// Delay for random number of milliseconds.
Thread.sleep(r.nextInt(500));
} catch (InterruptedException e) {
}
}
@GetMapping("/")
public String work() {
// What is work? Meetings!
// When you hit this URL, it'll call meetings() 5 times.
// Each time will have a random delay.
log.info("starting to work");
for (int i = 0; i < 5; i++) {
this.meeting();
}
log.info("finished!");
return "finished work!";
}
}
確認應用程式的 JVM 版本正確無誤:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
您可以使用 Spring Boot 外掛程式正常啟動 Spring Boot 應用程式。讓我們略過本研究室的測試:
$ ./mvnw -DskipTests spring-boot:run
應用程式啟動後,請點選 Cloud Shell 工具列中的「網頁預覽」圖示 ,然後選擇「透過以下通訊埠預覽:8080」。
稍候片刻,您應該會看到結果:
在 Cloud Shell 中,您也會看到含有追蹤記錄 ID 和時距 ID 的記錄訊息:
4. 使用 Cloud Trace
啟用 Cloud Trace API
您必須先啟用 Cloud Trace API,才能使用 Cloud Trace 儲存追蹤記錄資料。如要啟用 API,請執行以下指令:
$ gcloud services enable cloudtrace.googleapis.com
設定應用程式預設憑證
在本研究室中,您必須設定應用程式預設憑證。這個憑證將由 Spring Cloud GCP Trace 啟動條件自動選取。
首先,登入:
$ gcloud auth application-default login
You are running on a Google Compute Engine virtual machine.
The service credentials associated with this virtual machine
will automatically be used by Application Default
Credentials, so it is not necessary to use this command.
If you decide to proceed anyway, your user credentials may be visible
to others with access to this virtual machine. Are you sure you want
to authenticate with your personal account?
Do you want to continue (Y/n)? Y
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth...
Enter verification code: ...
按一下連結開啟新的瀏覽器分頁,然後按一下「Allow」
接著複製驗證碼並貼到 Cloud Shell 中,然後按下 Enter 鍵。畫面上會顯示下列訊息:
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
新增 Spring Cloud GCP Trace
在這個服務中,我們已經使用 Spring Cloud Sleuth 進行追蹤。讓我們新增 Spring Cloud GCP Trace 範例應用程式,將資料轉送至 Cloud Trace。
新增 Spring Cloud GCP Trace 依附元件:
pom.xml
<project>
...
<dependencies>
...
<!-- Add Cloud Trace Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
根據預設,Spring Cloud Sleuth 不會對每個要求進行取樣。如要簡化測試程序,請將 application.properties
中的取樣率提高至 100%,確保能查看追蹤記錄資料,並忽略一些我們不關注的網址:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
再次執行應用程式,並使用 Cloud Shell 網頁預覽功能查看應用程式:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
根據預設,Spring Cloud GCP Trace 會批次處理追蹤記錄資料,每 10 秒或收到最低限度的追蹤記錄資料就會傳送一次。這項設定可以設定,詳情請參閱 Spring Cloud GCP Trace 參考說明文件。
向服務提出要求:
$ curl localhost:8080
在 Cloud 控制台中,依序前往「Operations」→「Trace」→「Trace list」。
在頂端將時間範圍縮小至 1 小時。「自動重新載入」功能預設為啟用。因此當追蹤記錄資料送達時,應該就會顯示在控制台中!
追蹤記錄資料應該會在 30 秒內顯示。
按一下藍點即可查看追蹤記錄詳細資料:
很簡單吧!
5. 建立第二個 Spring Boot 網頁應用程式
按一下 + 圖示,開啟新的 Cloud Shell 工作階段:
在新工作階段中,建立第二個 Spring Boot 應用程式:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d bootVersion=2.7.6 \
-d dependencies=web,lombok,cloud-gcp,distributed-tracing \
-d jvmVersion=17 \
-d type=maven-project \
-d baseDir=trace-service-two | tar -xzvf - \
&& cd trace-service-two
透過新增類別來建立新的 REST 控制器:
src/main/java/com/example/demo/MeetingController.java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@Slf4j
public class MeetingController {
Random r = new Random();
@GetMapping("/meet")
public String meeting() {
try {
log.info("meeting...");
Thread.sleep(r.nextInt(500 - 20 + 1) + 20);
} catch (InterruptedException e) {
}
return "finished meeting";
}
}
將 Spring Cloud GCP Trace 新增至 pom.xml
pom.xml
<project>
...
<dependencies>
...
<!-- Add Cloud Trace starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
設定 Sleuth 來取樣 100% 的要求:
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
最後,您可以使用 Spring Boot 外掛程式在通訊埠 8081 啟動 Spring Boot 應用程式:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"
6. 更新第一項服務以使用第二項服務
正在執行 trace-service-two
,請返回第一個 Cloud Shell 工作階段視窗,並修改 trace-service-one
。
首先,請初始化新的 RestTemplate
豆:
src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
...
import org.springframework.web.client.RestTemplate;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class DemoApplication {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在 WorkController.meeting()
中撥打會議服務通話。
src/main/java/com/example/demo/WorkController.java
package com.example.demo;
...
import org.springframework.web.client.RestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
@RestController
@Slf4j
public class WorkController {
@Autowired
RestTemplate restTemplate;
public void meeting() {
String result = restTemplate.getForObject("http://localhost:8081/meet", String.class);
log.info(result);
}
...
}
再次啟動服務,並透過指令列觸發端點:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
# The '&' places the process in the background. Bring it back to the foreground with 'fg'.
$ ./mvnw -DskipTests spring-boot:run &
$ curl localhost:8080
這兩個工作階段視窗中應該會顯示記錄訊息,且追蹤 ID 已從一項服務傳播至另一項服務。
Cloud Trace 的追蹤記錄清單會顯示第二個追蹤記錄:
您可以按一下新的藍色圓點,查看追蹤記錄詳細資料:
您也可以按一下圖中的任意時距,查看時距詳細資料。
7. 延遲時間分佈與成效報表
您將 Cloud Trace 當做追蹤記錄資料儲存使用時,Cloud Trace 就能運用這些資料建構延遲分佈情形報表。您需要超過 100 個追蹤記錄,才能建立類似報表:
您可以使用 Cloud Shell 預先安裝的 hey 執行前 100 多個要求。
$ hey localhost:8080 -n 150
此外,Cloud Trace 也能在數據分析報表下,自動偵測同一項服務在兩個不同時間範圍內的效能迴歸。
8. 摘要
在這個研究室中,您利用 Spring Cloud Sleuth 建立了 2 項簡易服務並加入分散式追蹤功能,並透過 Spring Cloud GCP 將追蹤記錄資訊轉送至 Cloud Trace。
9. 恭喜!
您已瞭解如何編寫第一個 App Engine 網頁應用程式!
瞭解詳情
- Cloud Trace:https://cloud.google.com/trace/
- Spring on GCP 專案:http://cloud.spring.io/spring-cloud-gcp/
- GCP GitHub 存放區的 Spring:https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- 在 Google Cloud Platform 上使用 Java:https://cloud.google.com/java/
授權
這項內容採用的是創用 CC 姓名標示 2.0 通用授權。