Informacje o tym ćwiczeniu (w Codelabs)
1. Opis
Rozproszone trafikowanie jest ważne, ponieważ pozwala uzyskać wgląd w wielowarstwową architekturę mikroserwisów i umożliwia obserwację. Jeśli usługi są powiązane z wezwaniami do usług – od usługi A do usługi B i usługi C – ważne jest, aby mieć pewność, że wywołania zakończyły się powodzeniem, a także opóźnienie na każdym etapie.
W Spring Rozruch możesz użyć Spring Cloud Sleuth, aby płynnie dodać do aplikacji rozproszoną instrumentację śledzącą. Domyślnie może ona przekazywać dane śledzenia do aplikacji Zipkin.
Google Cloud Platform to usługa Stackdriver Trace, która umożliwia zarządzanie danymi logu czasu bez konieczności zarządzania własnym wystąpieniem Zipkin ani pamięcią. Usługa Stackdriver Trace może też generować raporty dotyczące rozkładu opóźnień i automatycznie wykrywać regresje wydajności.
Istnieją 2 możliwości korzystania z usługi Stackdriver Trace z aplikacji Spring rozruchu:
- Użyj Stackdriver Trace Zipkin Proxy i skonfiguruj Spring Cloud Sleuth, aby używać tego serwera proxy jako punktu końcowego Zipkin.
- Możesz też użyć usługi Spring Cloud GCP Trace, która płynnie integruje się ze Spring Cloud Sleuth i przekazuje dane śledzenia bezpośrednio do Stackdriver Trace.
Z tego ćwiczenia dowiesz się, jak stworzyć nową aplikację Spring Cloud Run i korzystać ze śledzenia Spring Cloud GCP do dystrybucji rozproszonej.
Czego się nauczysz:
- Jak utworzyć aplikację w wersji Spring rozruchowej Java i skonfigurować funkcję Stackdriver Trace.
Czego potrzebujesz
- Projekt Google Cloud Platform
- Przeglądarka, na przykład Chrome lub Firefox.
- znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, EMAC czy Nano.
Jak będziesz korzystać z tego samouczka?
Jak oceniasz tworzenie aplikacji internetowych HTML/CSS?
Jak oceniasz korzystanie z usług Google Cloud Platform?
2. Konfiguracja i wymagania
Konfiguracja środowiska we własnym tempie
Jeśli nie masz jeszcze konta Google (Gmail lub Google Apps), musisz je utworzyć. Zaloguj się w konsoli Google Cloud Platform (console.cloud.google.com) i utwórz nowy projekt:
Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa została już użyta i nie będzie działać). W ćwiczeniach nazywamy je później PROJECT_ID
.
Aby móc używać zasobów Google Cloud, musisz najpierw włączyć płatności w Cloud Console.
Ćwiczenia z programowania nie powinny kosztować więcej niż kilka dolarów, ale mogą być większe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz to uruchomione (zobacz sekcję „Czyszczenie” na końcu tego dokumentu).
Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnej wersji próbnej o wartości 300 USD.
Google Cloud Shell,
Google Cloud i Kubernetes można uruchomić zdalnie z laptopa, ale w trakcie tego ćwiczenia wykorzystamy Google Cloud Shell – środowisko wiersza poleceń działające w chmurze.
Aktywuj Google Cloud Shell
W konsoli GCP kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:
Następnie kliknij "Uruchom Cloud Shell"
Udostępnienie środowiska i połączenie się z nim powinno zająć tylko kilka chwil:
Ta maszyna wirtualna jest wyposażona we wszystkie potrzebne narzędzia dla programistów. Oferuje trwały katalog domowy o pojemności 5 GB oraz działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Znaczna część (lub nawet całość) zadań wykonywanych w tym module można wykonać w przeglądarce lub na Chromebooku Google.
Po połączeniu z Cloud Shell zobaczysz, że uwierzytelniono już projekt i masz już ustawiony identyfikator PROJECT_ID.
Uruchom następujące polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list
Polecenie wyjściowe
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Polecenie wyjściowe
[core] project = <PROJECT_ID>
Jeśli nie, możesz ustawić ją za pomocą tego polecenia:
gcloud config set project <PROJECT_ID>
Polecenie wyjściowe
Updated property [core/project].
3. Utwórz nową usługę Spring rozruchu REST
Po uruchomieniu Cloud Shell możesz użyć wiersza poleceń, aby wygenerować nową aplikację Spring rozruchu za pomocą Spring Initializr:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
-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!";
}
}
Możesz uruchomić aplikację Spring Run przy użyciu wtyczki Spring rozruchu. Pomińmy te testy:
$ ./mvnw -DskipTests spring-boot:run
Po uruchomieniu aplikacji kliknij ikonę Podgląd w przeglądarce na pasku narzędzi Cloud Shell i wybierz Podgląd na porcie 8080.
Po krótkim czasie powinien pojawić się wynik:
W Cloud Shell powinny być też widoczne komunikaty logu z identyfikatorem logu czasu i identyfikatorem zakresu:
4. Używanie Stackdriver Trace
Włącz Stackdriver Trace API
Aby korzystać z usługi Stackdriver Trace do przechowywania danych śledzenia, musisz najpierw włączyć interfejs Stackdriver Trace API. Aby włączyć interfejs API, otwórz Usługi API → Biblioteka.
Wyszukaj Stackdriver Trace.
Kliknij Stackdriver Trace API, a potem kliknij Włącz, jeśli nie jest jeszcze włączona.
Konfigurowanie domyślnych danych logowania aplikacji
W tym module musisz skonfigurować domyślne dane logowania aplikacji. Dane logowania zostaną automatycznie pobrane przez mechanizm uruchamiania Spring Cloud GCP.
Najpierw zaloguj się:
$ 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, i kliknij Zezwól.
Następnie skopiuj i wklej kod weryfikacyjny 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 śledzenie wiosennego GCP w Cloud
W tej usłudze korzystaliśmy już ze Spring Cloud Sleuth do śledzenia. Dodajmy początek Spring Cloud do śledzenia w GCP, aby przekazywać dane do Stackdriver Trace.
Dodaj zależność z GCP Spring Cloud:
pom.xml
<project>
...
<dependencies>
...
<!-- Add Stackdriver Trace Starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Domyślnie Spring Cloud Sleuth nie sprawdza każdego żądania. Aby nieco to ułatwić, zwiększ współczynnik próbkowania do 100% w application.properties
, aby mieć pewność, że zobaczymy dane śledzenia, i zignoruj niektóre adresy URL, które nas nie interesują:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Ponownie uruchom aplikację i wyświetl ją za pomocą narzędzia Cloud Shell Web Preview:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
Domyślnie usługa Spring Cloud GCP Trace grupuje dane śledzenia i wysyła je co 10 sekund lub po otrzymaniu minimalnej ilości danych śledzenia. To ustawienie można skonfigurować. Więcej informacji znajdziesz w dokumentacji referencyjnej dotyczącej usługi Spring Cloud GCP.
Wyślij żądanie do usługi:
$ curl localhost:8080
W Cloud Console przejdź do Stackdriver → Trace→ Lista logów czasu
U góry zawęź zakres czasu do 1 godziny. Domyślnie funkcja Automatyczne doładowanie jest włączona. Gdy pojawią się dane śledzenia, powinny się one pojawić w konsoli.
Dane śledzenia powinny zostać wyświetlone po około 30 sekundach.
Kliknij niebieski punkt, by zobaczyć szczegóły logu czasu:
To było bardzo proste.
5. Utwórz drugą aplikację internetową Spring rozruchu
Otwórz nową sesję Cloud Shell, klikając ikonę +:
W nowej sesji utwórz drugą aplikację Spring Run:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
-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 Trasę do GCP w Cloud Spring do pliku pom.xml
pom.xml
<project>
...
<dependencies>
...
<!-- Add Stackdriver Trace starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Skonfiguruj Sleuth na przykład 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
Na koniec możesz uruchomić aplikację Spring Run na porcie 8081, korzystając z wtyczki Spring Run:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dserver.port=8081
6. Zaktualizuj pierwszą usługę, aby korzystać z drugiej usługi
Po uruchomieniu usługi trace-service-two
wróć do pierwszego okna sesji Cloud Shell i zmień trace-service-one
.
Najpierw zainicjuj nową fasolę 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);
}
}
Zadzwoń do usługi Meet za 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);
}
...
}
Ponownie uruchom usługę i uruchom punkt końcowy na podglądzie w przeglądarce:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
W obu oknach sesji powinny być widoczne komunikaty dziennika, a identyfikator śledzenia jest rozpowszechniany między usługami.
Na liście logów czasu usługi Stackdriver Trace powinny pojawić się drugie dane śledzenia:
Możesz kliknąć nową niebieską kropkę i wyświetlić szczegóły logu czasu:
Możesz też kliknąć dowolny rozpiętość na tym diagramie, aby wyświetlić szczegóły.
7. Raport skuteczności i czas oczekiwania
Jeśli używasz usługi Stackdriver Trace jako magazynu danych śledzenia, Stackdriver Trace może używać tych danych do tworzenia raportu rozkładu opóźnień. Aby utworzyć taki raport, potrzebujesz ponad 100 danych śledzenia.
Oprócz tego usługa Stackdriver Trace może automatycznie wykrywać regresję wydajności tej samej usługi w dwóch różnych okresach w raporcie Analiza.
8. Podsumowanie
W tym module udało Ci się utworzyć 2 proste usługi i dodać rozproszone śledzenie w Spring Cloud Sleuth oraz użyć aplikacji Spring Cloud GCP do przekazania informacji o śledzeniu do usługi Stackdriver Trace.
9. Gratulacje!
Wiesz już, jak napisać pierwszą aplikację internetową App Engine.
Więcej informacji
- Usługa Stackdriver Trace: https://cloud.google.com/trace/
- Wiosna w projekcie GCP: http://cloud.spring.io/spring-cloud-gcp/
- Spring w repozytorium GCP na GitHubie: https://github.com/spring-cloud/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.