1. Przegląd
Integracja Spring zapewnia mechanizm przesyłania wiadomości, który umożliwia wymianę Messages za pomocą MessageChannels. Do komunikacji z systemami zewnętrznymi używa adapterów kanałów.
W tym ćwiczeniu utworzymy 2 aplikacje, które będą się komunikować za pomocą adapterów kanałów integracji Spring udostępnianych przez Spring Cloud GCP. Dzięki tym adapterom integracja Spring będzie używać Google Cloud Pub/Sub jako zaplecza do wymiany wiadomości.
Dowiesz się, jak używać Cloud Shell i narzędzia wiersza poleceń gcloud z pakietu Cloud SDK.
W tym samouczku używamy przykładowego kodu z przewodnika Spring Boot Getting Started.
Czego się nauczysz
- Jak wymieniać wiadomości między aplikacjami za pomocą Google Cloud Pub/Sub przy użyciu integracji Spring i Spring Cloud GCP
Czego potrzebujesz
- Projekt Google Cloud Platform
- Przeglądarka, np. Chrome lub Firefox
- Znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, EMACs lub Nano
Jak będziesz korzystać z tego samouczka?
Jak oceniasz swoje doświadczenie w tworzeniu aplikacji internetowych w HTML/CSS?
Jak oceniasz swoje doświadczenie w korzystaniu 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 użyj istniejącego. Jeśli nie masz jeszcze konta Gmail lub Google Workspace, musisz je utworzyć.



- Nazwa projektu to nazwa wyświetlana dla uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Możesz go w każdej chwili zaktualizować.
- Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i niezmienny (nie można go zmienić po ustawieniu). Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń będziesz musiał odwoływać się do identyfikatora projektu (zwykle oznaczanego jako
PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy. Możesz też spróbować użyć własnego i sprawdzić, czy jest dostępny. Po wykonaniu tego kroku nie można go zmienić i pozostanie on taki przez cały czas trwania projektu. - Dla Twojej informacji istnieje trzecia wartość – numer projektu , której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
- Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Cloud. Wykonanie tego ćwiczenia nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć 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
Chociaż Google Cloud można obsługiwać zdalnie z laptopa, w tym ćwiczeniu będziemy używać Google Cloud Shell, czyli ś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 tego środowiska. W takim przypadku kliknij Dalej.

Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość, jeśli nie wszystkie, zadań w tym ćwiczeniu można wykonać w przeglądarce.
Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.
- Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list
Wynik polecenia
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
Wynik polecenia
[core] project = <PROJECT_ID>
Jeśli tak nie jest, możesz ustawić go za pomocą tego polecenia:
gcloud config set project <PROJECT_ID>
Wynik polecenia
Updated property [core/project].
3. Inicjowanie zasobów Pub/Sub
Otwórz stronę tematów Google Cloud Pub/Sub.
Kliknij Utwórz temat.

Jako nazwę tematu wpisz exampleTopic, a następnie kliknij Utwórz.

Po utworzeniu tematu pozostań na stronie Tematy. Znajdź utworzony temat, naciśnij 3 pionowe kropki na końcu wiersza i kliknij Nowa subskrypcja.

W polu tekstowym nazwy subskrypcji wpisz exampleSubscription i kliknij Utwórz.

4. Inicjowanie aplikacji Spring Boot
Po uruchomieniu Cloud Shell możesz użyć wiersza poleceń, aby wygenerować 2 nowe aplikacje Spring Boot za pomocą Spring Initializr:
$ curl https://start.spring.io/starter.tgz \
-d bootVersion=3.0.5 \
-d dependencies=web,integration,cloud-gcp-pubsub \
-d type=maven-project \
-d baseDir=spring-integration-sender | tar -xzvf -
$ curl https://start.spring.io/starter.tgz \
-d bootVersion=3.0.5 \
-d dependencies=web,integration,cloud-gcp-pubsub \
-d type=maven-project \
-d baseDir=spring-integration-receiver | tar -xzvf -
5. Tworzenie aplikacji do wysyłania wiadomości
Teraz utwórzmy aplikację do wysyłania wiadomości. Przejdź do katalogu aplikacji wysyłającej.
$ cd spring-integration-sender
Chcemy, aby nasza aplikacja zapisywała wiadomości w kanale. Gdy wiadomość znajdzie się w kanale, zostanie pobrana przez adapter kanału wychodzącego, który przekształci ją z ogólnej wiadomości Spring na wiadomość Google Cloud Pub/Sub i opublikuje w temacie Google Cloud Pub/Sub.
Aby aplikacja mogła zapisywać dane w kanale, możemy użyć bramy przesyłania wiadomości Spring Integration. Za pomocą edytora tekstu vim, emacs lub nano zadeklaruj interfejs PubsubOutboundGateway w klasie DemoApplication.
src/main/java/com/example/demo/DemoApplication.java
...
import org.springframework.integration.annotation.MessagingGateway;
@SpringBootApplication
public class DemoApplication {
...
@MessagingGateway(defaultRequestChannel = "pubsubOutputChannel")
public interface PubsubOutboundGateway {
void sendToPubsub(String text);
}
}
Mamy teraz mechanizm wysyłania wiadomości do kanału, ale dokąd te wiadomości trafiają po umieszczeniu w kanale?
Potrzebujemy adaptera kanału wychodzącego, który będzie pobierać nowe wiadomości z kanału i publikować je w temacie Google Cloud Pub/Sub.
src/main/java/com/example/demo/DemoApplication.java
...
import com.google.cloud.spring.pubsub.core.PubSubTemplate;
import com.google.cloud.spring.pubsub.integration.outbound.PubSubMessageHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.MessageHandler;
@SpringBootApplication
public class DemoApplication {
...
@Bean
@ServiceActivator(inputChannel = "pubsubOutputChannel")
public MessageHandler messageSender(PubSubTemplate pubsubTemplate) {
return new PubSubMessageHandler(pubsubTemplate, "exampleTopic");
}
}
Adnotacja @ServiceActivator powoduje, że ten MessageHandler jest stosowany do wszystkich nowych wiadomości w inputChannel. W tym przypadku wywołujemy nasz adapter kanału wychodzącego, PubSubMessageHandler, aby opublikować wiadomość w temacie exampleTopic Google Cloud Pub/Sub.
Gdy adapter kanału jest już na miejscu, możemy automatycznie połączyć obiekt PubsubOutboundGateway i użyć go do zapisania wiadomości w kanale.
src/main/java/com/example/demo/DemoApplication.java
...
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.view.RedirectView;
@SpringBootApplication
public class DemoApplication {
...
@Autowired
private PubsubOutboundGateway messagingGateway;
@PostMapping("/postMessage")
public RedirectView postMessage(@RequestParam("message") String message) {
this.messagingGateway.sendToPubsub(message);
return new RedirectView("/");
}
}
Dzięki adnotacji @PostMapping mamy teraz punkt końcowy, który nasłuchuje żądań HTTP POST, ale nie bez dodania adnotacji @RestController do klasy DemoApplication, aby oznaczyć ją jako kontroler REST.
src/main/java/com/example/demo/DemoApplication.java
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
...
}
Upewnij się, że zmienna JAVA_HOME jest ustawiona na właściwą wersję.
export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Uruchom aplikację wysyłającą.
# Set the Project ID in environmental variable
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw spring-boot:run
Aplikacja nasłuchuje żądań POST zawierających wiadomość na porcie 8080 i punkcie końcowym /postMessage, ale do tego wrócimy później.
6. Tworzenie aplikacji do odbierania wiadomości
Właśnie utworzyliśmy aplikację, która wysyła wiadomości za pomocą Google Cloud Pub/Sub. Teraz utworzymy kolejną aplikację, która będzie odbierać te wiadomości i je przetwarzać.
Kliknij + , aby otworzyć nową sesję Cloud Shell.

Następnie w nowej sesji Cloud Shell przejdź do katalogu aplikacji odbierającej:
$ cd spring-integration-receiver
W poprzedniej aplikacji deklaracja bramy przesyłania wiadomości utworzyła dla nas kanał wychodzący. Ponieważ nie używamy bramy przesyłania wiadomości do odbierania wiadomości, musimy zadeklarować własny MessageChannel, do którego będą docierać wiadomości przychodzące.
src/main/java/com/example/demo/DemoApplication.java
...
import org.springframework.context.annotation.Bean;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.messaging.MessageChannel;
@SpringBootApplication
public class DemoApplication {
...
@Bean
public MessageChannel pubsubInputChannel() {
return new DirectChannel();
}
}
Będziemy potrzebować adaptera kanału przychodzącego, aby odbierać wiadomości z Google Cloud Pub/Sub i przekazywać je do pubsubInputChannel.
src/main/java/com/example/demo/DemoApplication.java
...
import com.google.cloud.spring.pubsub.core.PubSubTemplate;
import com.google.cloud.spring.pubsub.integration.inbound.PubSubInboundChannelAdapter;
import org.springframework.beans.factory.annotation.Qualifier;
@SpringBootApplication
public class DemoApplication {
...
@Bean
public PubSubInboundChannelAdapter messageChannelAdapter(
@Qualifier("pubsubInputChannel") MessageChannel inputChannel,
PubSubTemplate pubSubTemplate) {
PubSubInboundChannelAdapter adapter =
new PubSubInboundChannelAdapter(pubSubTemplate, "exampleSubscription");
adapter.setOutputChannel(inputChannel);
return adapter;
}
}
Ten adapter wiąże się z pubsubInputChannel i nasłuchuje nowych wiadomości z subskrypcji exampleSubscription Google Cloud Pub/Sub.
Mamy kanał, do którego są wysyłane wiadomości przychodzące, ale co z nimi zrobić?
Przetwórzmy je za pomocą @ServiceActivator, który jest wywoływany, gdy nowe wiadomości docierają do pubsubInputChannel. W tym przypadku będziemy tylko rejestrować ładunek wiadomości.
src/main/java/com/example/demo/DemoApplication.java
...
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.integration.annotation.ServiceActivator;
@SpringBootApplication
public class DemoApplication {
...
private static final Log LOGGER = LogFactory.getLog(DemoApplication.class);
@ServiceActivator(inputChannel = "pubsubInputChannel")
public void messageReceiver(String payload) {
LOGGER.info("Message arrived! Payload: " + payload);
}
}
Upewnij się, że zmienna JAVA_HOME jest ustawiona na właściwą wersję.
export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Uruchom aplikację odbierającą.
$ ./mvnw spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"
Teraz wszystkie wiadomości wysyłane do aplikacji wysyłającej będą rejestrowane w aplikacji odbierającej. Aby to przetestować, otwórz nową sesję Cloud Shell i wyślij żądanie HTTP POST do aplikacji wysyłającej.
$ curl --data "message=Hello world!" localhost:8080/postMessage
Następnie sprawdź, czy aplikacja odbierająca zarejestrowała wysłaną wiadomość.
INFO: Message arrived! Payload: Hello world!
7. Czyszczenie
Usuń subskrypcję i temat utworzone w ramach tego ćwiczenia.
$ gcloud pubsub subscriptions delete exampleSubscription
$ gcloud pubsub topics delete exampleTopic
8. Podsumowanie
Skonfigurowaliśmy 2 aplikacje Spring Boot, które używają adapterów kanałów integracji Spring dla Google Cloud Pub/Sub. Wymieniają one między sobą wiadomości bez interakcji z interfejsem API Google Cloud Pub/Sub.
9. Gratulacje!
Dowiedziałeś się, jak używać adapterów kanałów integracji Spring dla Google Cloud Pub/Sub.
Więcej informacji
- Google Cloud Pub/Sub: https://cloud.google.com/pubsub/
- Projekt Spring on GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repozytorium Spring on GCP w GitHub: 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.