当前位置: 首页 > 知识库问答 >
问题:

我们必须在Zipkins中从WebClient传递头值吗

闾丘京
2023-03-14

我在客户端和服务器端使用Spring boot和以下库,

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:Finchley.SR2"
    }
}
 // Spring Cloud Sleuth
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-sleuth', version: '2.0.1.RELEASE'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-zipkin', version: '2.0.1.RELEASE'

基于spring文档,”https://cloud.spring.io/spring-cloud-sleuth/"

运行此应用程序,然后点击主页。您将看到日志中填充了traceId和spanId。如果此应用程序调用另一个应用程序(例如,使用RestTemplate),它将在标题中发送跟踪数据,如果接收器是另一个侦探应用程序,您将看到跟踪在那里继续。

这将如何与Spring5 web客户端配合使用?

共有1个答案

鲍健柏
2023-03-14

它将以同样的方式工作。注入WebClientWebClientBuilder类型的bean就足够了。看看这个样品https://github.com/spring-cloud-samples/sleuth-documentation-apps/blob/master/service1/src/main/java/io/spring/cloud/sleuth/docs/service1/Service2Client.java

/**
 * @author Marcin Grzejszczak
 */
@Component
class Service2Client {

    private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

    private final WebClient webClient;
    private final String serviceAddress;
    private final Tracer tracer;

    Service2Client(WebClient webClient,
            @Value("${service2.address:localhost:8082}") String serviceAddress,
            Tracer tracer) {
        this.webClient = webClient;
        this.serviceAddress = serviceAddress;
        this.tracer = tracer;
    }

    public String start() throws InterruptedException {
        log.info("Hello from service1. Setting baggage foo=>bar");
        Span span = tracer.currentSpan();
        String secretBaggage = ExtraFieldPropagation.get("baggage");
        log.info("Super secret baggage item for key [baggage] is [{}]", secretBaggage);
        if (StringUtils.hasText(secretBaggage)) {
            span.annotate("secret_baggage_received");
            span.tag("baggage", secretBaggage);
        }
        String baggageKey = "key";
        String baggageValue = "foo";
        ExtraFieldPropagation.set(baggageKey, baggageValue);
        span.annotate("baggage_set");
        span.tag(baggageKey, baggageValue);
        log.info("Hello from service1. Calling service2");
        String response = webClient.get()
                .uri("http://" + serviceAddress + "/foo")
                .exchange()
                .block()
                .bodyToMono(String.class).block();
        Thread.sleep(100);
        log.info("Got response from service2 [{}]", response);
        log.info("Service1: Baggage for [key] is [" + ExtraFieldPropagation.get("key") + "]");
        return response;
    }

    @NewSpan("first_span")
    String timeout(@SpanTag("someTag") String tag) {
        try {
            Thread.sleep(300);
            log.info("Hello from service1. Calling service2 - should end up with read timeout");
            String response = webClient.get()
                    .uri("http://" + serviceAddress + "/readtimeout")
                    .retrieve()
                    .onStatus(httpStatus -> httpStatus.isError(), clientResponse -> {
                        throw new IllegalStateException("Exception!");
                    })
                    .bodyToMono(String.class)
                    .block();
            log.info("Got response from service2 [{}]", response);
            return response;
        } catch (Exception e) {
            log.error("Exception occurred while trying to send a request to service 2", e);
            throw new RuntimeException(e);
        }
    }
}
 类似资料:
  • 我对Java是个新手,我正在尝试做一个非常基本的测试,检查API的响应是否为200ok。你能告诉我,为了传递多个标题Id、Key和ConId,我需要在下面的脚本中更改什么吗?

  • 问题内容: 有时,当我重写方法时,在第一次调用时会出现异常,如下所示: 为什么我们被迫打电话?父类有义务是有意义的,但是更重要的是,我们如何知道需要调用一个方法,而不是等待它崩溃? 问题答案: 为什么我们被迫调用super.method()? 组成Android SDK的类非常复杂。例如,活动和片段都必须执行许多操作才能正常运行(即管理生命周期,优化内存使用,在屏幕上绘制布局等)。要求客户端调用基

  • 对于命令和 如果我是对的: 如果我想从packagist向我的项目添加库,我需要使用 我有一个项目,我不想将其发布到https://packagist.org/ 我只想在我的项目中添加一些库。 在运行之前,是否必须运行? 我看了一个教程,其中他们使用命令,然后调用,这让我很困惑,因为我认为与在Packagist上发布库有关。

  • 我正在使用ADFS2.0和WIF来验证和授权我的用户使用ASP.NET MVC4应用程序WebAppa。WebAppA使用WebClient.DownloadString(url)调用另一个WebAppB,我希望将委托用户的凭据传递给WebAppB,以检索用户的定制内容。 我看到了几个web应用程序使用CreateChannelActingAs调用WCF服务的示例,但这与我的情况不同。 谢谢你的帮

  • C++20概念的一个特点是,在某些情况下,您必须编写。例如,[expr.prim.req]/3中的这个示例:

  • 问题内容: 在我们的J2EE应用程序中,我们使用EJB-3有状态bean来允许前端代码创建,修改和保存持久性实体(通过JPA-2管理)。 看起来像这样: 非常重要的是,为了避免过早提交,只有方法位于事务内,因此,如果调用,则不会在数据库中插入任何内容。 奇怪的是,在方法中,我们必须调用才能真正访问数据库。实际上,我尝试过发现,我们也可以调用或,以及与“ em有关”的任何东西。 我不明白这一点。与事