1. Omówienie
Rozproszone śledzenie jest ważne, ponieważ pozwala uzyskać statystyki i obserwację wielowarstwowej architektury mikroserwisów. Jeśli udało Ci się utworzyć łańcuch wywołań usługi z usługi A do usługi B i usługi C, musisz wiedzieć, czy wywołania były udane, a także opóźnienia na każdym kroku.
W Spring Boot możesz użyć usługi Spring Cloud Sleuth, aby płynnie dodać do swojej aplikacji instrumentację rozproszonego śledzenia. Domyślnie może przekazywać dane śledzenia do Zipkin.
W Google Cloud Platform jest usługa zarządzana Cloud Trace, która umożliwia przechowywanie danych śledzenia bez konieczności zarządzania własną instancją Zipkin ani jej pamięcią. Cloud Trace może również generować raporty z rozkładem czasu oczekiwania i automatycznie wykrywać spadki wydajności.
Cloud Trace możesz używać z aplikacji Spring Boot na 2 sposoby:
- Użyj serwera proxy usługi Stackdriver Trace Zipkin i skonfiguruj aplikację Spring Cloud Sleuth tak, aby używała tego serwera proxy jako punktu końcowego Zipkin
- Możesz też użyć logu czasu usługi Spring Cloud GCP, który płynnie integruje się z usługą Spring Cloud Sleuth i przekazuje dane z logów czasu bezpośrednio do Cloud Trace.
Z tego ćwiczenia w Codelabs dowiesz się, jak utworzyć nową aplikację Spring Boot i użyć śledzenia usługi Spring Cloud GCP do śledzenia rozproszonego.
Czego się nauczysz
- Jak utworzyć aplikację Spring Boot w Javie i skonfigurować Cloud Trace.
Czego potrzebujesz
- Projekt Google Cloud Platform
- przeglądarkę, np. Chrome lub Firefox;
- znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, EMAC lub Nano;
Jak wykorzystasz ten samouczek?
Jak oceniasz swoje doświadczenie z tworzeniem aplikacji internetowych HTML/CSS?
Jak oceniasz swoje wrażenia z korzystania z usług Google Cloud Platform?
2. Konfiguracja i wymagania
Samodzielne konfigurowanie środowiska
- Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.
- Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zaktualizować.
- Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz podać swój identyfikator projektu (zwykle identyfikowany jako
PROJECT_ID
). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu. - Jest jeszcze trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
- Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nic nie kosztuje. Aby wyłączyć zasoby w celu uniknięcia naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.
Google Cloud Shell,
Google Cloud i Kubernetes możesz obsługiwać zdalnie z Twojego laptopa, ale w ramach tego ćwiczenia z programowania użyjemy Google Cloud Shell – środowiska wiersza poleceń działającego w chmurze.
Aktywowanie Cloud Shell
- W konsoli Cloud kliknij Aktywuj Cloud Shell .
Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tej usługi. Jeśli wyświetlił się ekran pośredni, kliknij Dalej.
Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.
Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość zadań w ramach tego ćwiczenia z programowania można wykonać w przeglądarce.
Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.
- Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list
Dane wyjściowe polecenia
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project
Dane wyjściowe polecenia
[core] project = <PROJECT_ID>
Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:
gcloud config set project <PROJECT_ID>
Dane wyjściowe polecenia
Updated property [core/project].
3. Utwórz nową usługę Spring Boot REST
Po uruchomieniu Cloud Shell możesz użyć wiersza poleceń, aby wygenerować nową aplikację Spring Boot za pomocą Spring Initializr:
$ 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
Utwórz nowy kontroler REST, dodając nową klasę:
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!";
}
}
Upewnij się, że masz właściwą wersję JVM dla aplikacji:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Aplikację Spring Boot możesz uruchomić w zwykły sposób, używając wtyczki Spring Boot. W tym module pomińmy testy:
$ ./mvnw -DskipTests spring-boot:run
Po uruchomieniu aplikacji kliknij ikonę podglądu w przeglądarce na pasku narzędzi Cloud Shell i wybierz podgląd na porcie 8080.
Wynik powinien pojawić się po krótkim czasie:
W Cloud Shell powinny być też widoczne komunikaty logu z identyfikatorami logu czasu i identyfikatorami spanu:
4. Korzystanie z Cloud Trace
Włącz Cloud Trace API
Zanim użyjesz Cloud Trace do przechowywania danych logu czasu, musisz włączyć interfejs Cloud Trace API. Aby włączyć interfejs API, wykonaj:
$ gcloud services enable cloudtrace.googleapis.com
Skonfiguruj domyślne dane logowania aplikacji
W tym module musisz skonfigurować domyślne dane logowania aplikacji. Te dane logowania będą automatycznie pobierane przez polecenie inicjujące logi czasu Spring Cloud GCP.
Najpierw się zaloguj:
$ 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: ...
Kliknij link, aby otworzyć nową kartę przeglądarki, a następnie kliknij Zezwól.
Następnie skopiuj kod weryfikacyjny, wklej go z powrotem do Cloud Shell i naciśnij Enter. Zobaczysz, że:
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
Dodaj log czasu Spring Cloud GCP
W tej usłudze używamy już do śledzenia usługi Spring Cloud Sleuth. Dodajmy polecenie inicjujące logi czasu Spring Cloud GCP, aby przekierować dane do Cloud Trace.
Dodaj zależność śledzenia usługi Spring Cloud GCP:
pom.xml
<project>
...
<dependencies>
...
<!-- Add Cloud Trace Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Domyślnie Spring Cloud Sleuth nie sprawdza wszystkich żądań. Aby ułatwić testowanie, zwiększ w application.properties
częstotliwość próbkowania do 100%, aby mieć pewność, że widzisz dane logu czasu, a potem zignoruj niektóre adresy URL, które są dla nas nieistotne:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Uruchom aplikację jeszcze raz i użyj podglądu Cloud Shell w przeglądarce, aby ją wyświetlić:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
Domyślnie usługa Spring Cloud GCP Trace zbiera dane śledzenia i wysyła je co 10 sekund lub po otrzymaniu minimalnej liczby takich danych. Możesz to skonfigurować. Więcej informacji znajdziesz w dokumentacji dotyczącej śledzenia usługi Spring Cloud GCP.
Wyślij żądanie do usługi:
$ curl localhost:8080
W konsoli Google Cloud wybierz Operacje → Śledzenie → Lista logów czasu
U góry zawęź zakres czasu do 1 godziny. Domyślnie opcja Automatyczne odświeżanie jest włączona. Gdy przyjdą dane logu czasu, powinny się one pojawić w konsoli.
Dane logu czasu powinny się pojawić w ciągu około 30 sekund.
Aby zobaczyć szczegóły logu czasu, kliknij niebieską kropkę:
To było całkiem proste.
5. Tworzenie drugiej aplikacji internetowej Spring Boot
Otwórz nową sesję Cloud Shell, klikając ikonę +:
W nowej sesji utwórz drugą aplikację 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
Utwórz nowy kontroler REST, dodając nową klasę:
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";
}
}
Dodaj ślad Spring Cloud GCP do pliku 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>
Skonfiguruj w usłudze Sleuth próbkowanie 100% żądań:
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Możesz też uruchomić aplikację Spring Boot na porcie 8081, używając wtyczki 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. Zaktualizuj pierwszą usługę, aby skorzystać z drugiej usługi
Gdy masz uruchomiony pakiet trace-service-two
, wróć do pierwszego okna sesji Cloud Shell i wprowadź zmiany do trace-service-one
.
Najpierw zainicjuj nowy komponent bean 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);
}
}
W WorkController.meeting()
zadzwoń do usługi spotkań.
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);
}
...
}
Uruchom usługę ponownie i aktywuj punkt końcowy za pomocą wiersza poleceń:
$ 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
W obu oknach sesji powinny być widoczne komunikaty dziennika, w których identyfikator logu czasu jest przekazywany między usługami.
Na liście logów czasu Cloud Trace powinien pojawić się drugi log czasu:
Możesz kliknąć nową niebieską kropkę i zobaczyć szczegóły logu czasu:
Możesz też kliknąć dowolny rozpiętość na tym diagramie, aby zobaczyć jego szczegóły.
7. Dystrybucja czasu oczekiwania i Raport skuteczności
Gdy używasz Cloud Trace do przechowywania danych śledzenia, Cloud Trace może wykorzystać te dane do utworzenia raportu rozkładu opóźnień. Aby utworzyć taki raport, potrzebujesz ponad 100 śladów:
Możesz uruchomić te 100 pierwszych żądań za pomocą polecenia hej, które jest już zainstalowane w Cloud Shell.
$ hey localhost:8080 -n 150
Dodatkowo Cloud Trace może automatycznie wykrywać w raporcie analizy spadek wydajności tej samej usługi w 2 różnych okresach.
8. Podsumowanie
W tym module udało Ci się utworzyć 2 proste usługi, dodać śledzenie rozproszone za pomocą usługi Spring Cloud Sleuth oraz wykorzystać platformę Spring Cloud GCP do przekazania informacji logu czasu do Cloud Trace.
9. Gratulacje!
Wiesz już, jak napisać swoją pierwszą aplikację internetową App Engine.
Więcej informacji
- Usługa Cloud Trace: https://cloud.google.com/trace/
- Projekt wiosenny w GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repozytorium Spring on GCP na GitHubie: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java w Google Cloud Platform: https://cloud.google.com/java/
Licencja
To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.