Bootiful GCP:使用 Spring Cloud GCP Stackdriver Trace 支持可观测性 (6/8)

工程 | Josh Long | 2018年9月6日 | ...

嗨,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。谢谢,伙计!

本系列共有八篇文章。它们都在这里

](https://springframework.org.cn/blog/2018/09/06/bootiful-gcp-supporting-observability-with-spring-cloud-gcp-stackdriver-trace-6-8)

  • [Bootiful GCP:使用 Spring Cloud GCP 连接其他 GCP 服务 (7/8)

](https://springframework.org.cn/blog/2018/09/10/bootiful-gcp-use-spring-cloud-gcp-to-connect-to-other-gcp-services-7-8)

随着我们将越来越多的应用程序迁移到云端,并引入越来越多的微服务,理解问题出在哪里以及在哪里变得越来越复杂。分布式跟踪解决了这个问题。理论上,分布式跟踪是一项简单的任务。对于每个进入或退出系统的请求……对于系统中的每个入口或出口,如果尚未存在 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-weborg.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 Cloud GCP 的跟踪支持。您可以在本地运行代码时禁用它,但在生产环境中使用此标志启用它。
  • 这些属性告诉 Spring Cloud Sleuth 跟踪所有内容(“概率”为 1.0 表示将对 100% 的观察到的请求进行采样和跟踪)。
  • 如果您在同一台机器上运行此演示,则需要避免客户端中的端口冲突
  • 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
  • 启用 Spring Cloud GCP 跟踪……
  • 确保跟踪所有请求
  • 为我们的客户端提供一个逻辑名称
  • 并在与服务不同的端口上启动

为了查看其运行效果,您需要先启动服务,然后启动客户端,然后转到Google Cloud Console。单击屏幕左侧的“汉堡包”菜单,然后单击 STACKDRIVER → TRACE。在那里,您将能够检查刚刚通过服务的请求。

Looking at trace information in the Google Cloud Console

Stackdriver 是许多服务的总称,包括监控、跟踪以及——这太酷了!——正在运行的应用程序的实时调试。您可以在控制台的此部分花费更多时间——您应该这样做!——总之,Google 非常了解可观测性,这体现在他们的服务中。

获取 Spring 时事通讯

通过 Spring 时事通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加快您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部