领先一步
VMware 提供培训和认证,以加快您的进步。
了解更多嗨,Spring 粉丝们!在这个简短的系列中,我们将了解 Google Cloud Platform 的 Spring Cloud 集成,称为 Spring Cloud GCP。Spring Cloud GCP 代表了 Google 和 Pivotal 之间的共同努力,旨在为在使用 Google Cloud Platform 时提供 Spring Cloud 开发人员一流的体验。Pivotal Cloud Foundry 用户将享受更轻松与 GCP 服务代理集成。这些部分是在 Google Cloud 开发者倡导者以及我的朋友Ray Tsang的帮助下撰写的。您还可以在我们的 Google Next 2018 会议中观看 Spring Cloud GCP 的演练,Bootiful Google Cloud Platform。谢谢,伙计!
本系列共有八篇文章。它们都在这里
随着我们将越来越多的应用程序迁移到云端,并引入越来越多的微服务,理解问题出在哪里以及在哪里变得越来越复杂。分布式跟踪解决了这个问题。理论上,分布式跟踪是一项简单的任务。对于每个进入或退出系统的请求……对于系统中的每个入口或出口,如果尚未存在 UUID,则附加一个 UUID,如果已存在,则传播它。不幸的是,随着请求在不同节点之间同步和异步地跨线程和网络边界移动,这种逻辑很繁琐且难以正确实现。Spring Cloud Sleuth 解决了这个问题,并提供了一个 SPI,后端分布式跟踪系统(如 OpenZipkin 和 Google Cloud Stack Driver)可以插入其中。
与所有 GCP API 一样,我们必须首先启用此 API。
gcloud services enable cloudtrace.googleapis.com
我们将设置一个简单的 REST API 和一个简单的 REST 客户端,并使用 Spring Cloud GCP Stack Driver 支持轻松地跟踪这些交互。
让我们首先看看我们的简单 REST API。启动一个新项目(使用上面的骨架 pom.xml
)并添加 org.springframework.boot
: spring-boot-starter-web
和 org.springframework.cloud
: spring-cloud-gcp-starter-trace
。我们的 REST API(无论如何,是端点)将在调用 https://127.0.0.1:8080/greeting/{id}}
时返回“问候,此处为姓名!”。以下是服务的代码,首先
package com.example.gcp.trace;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class TraceServiceApplication {
@GetMapping("/greeting/{id}")
String greet(@PathVariable String id) {
return "greetings, " + id + "!";
}
public static void main(String args[]) {
SpringApplication.run(TraceServiceApplication.class, args);
}
}
配置可以说更有趣。
src/main/resources/application.properties。
spring.cloud.gcp.trace.enabled=true
spring.sleuth.sampler.probability=1
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
server.port=8081
spring.application.name=trace-service
spring.application.name
是我们应用程序的逻辑名称,可用于将其与跟踪树、服务注册表等中的其他应用程序区分开来。客户端在应用程序启动时发出 100 个 HTTP 请求。它使用的 RestTemplate
已由 Spring Cloud Sleuth 自动配置后处理,以拦截和跟踪所有 HTTP 调用。
package com.example.gcp.trace;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.cloud.sleuth.annotation.NewSpan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.stream.IntStream;
@Slf4j
@SpringBootApplication
public class TraceClientApplication {
@Component
public static class Client {
private final RestTemplate restTemplate;
public Client(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@EventListener(ApplicationReadyEvent.class)
@NewSpan("client")
public void before() {
IntStream
.range(0, 100)
.mapToObj(i ->
restTemplate
.getForEntity("https://127.0.0.1:8081/greeting/{id}", String.class, i)
.getBody())
.forEach(response -> log.info("result: " + response));
}
}
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String args[]) {
SpringApplication.run(TraceClientApplication.class, args);
}
}
RestTemplate
的简单用法,用于连接到我们的服务。如果我们想发送 100 个没有共享父跨度的请求,则不需要 @NewSpan
。如果我们有 100 个请求从外部到达并点击客户端中的 HTTP 端点,并且该端点然后导致 100 个请求发送到服务,我们将拥有一个共享的总跨度。一个具有多个跨度的单个跟踪。并且此节点的配置与服务的配置几乎相同。
spring.cloud.gcp.trace.enabled=true
spring.sleuth.sampler.probability=1
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
spring.application.name=trace-client
server.port=8080
为了查看其运行效果,您需要先启动服务,然后启动客户端,然后转到Google Cloud Console。单击屏幕左侧的“汉堡包”菜单,然后单击 STACKDRIVER → TRACE。在那里,您将能够检查刚刚通过服务的请求。
Stackdriver 是许多服务的总称,包括监控、跟踪以及——这太酷了!——正在运行的应用程序的实时调试。您可以在控制台的此部分花费更多时间——您应该这样做!——总之,Google 非常了解可观测性,这体现在他们的服务中。