+ * It uses imports on {@link ZipkinConfigurations} to guarantee the correct configuration ordering.
+ *
+ * @since 3.2.0
+ */
+@AutoConfiguration(after = RestTemplateAutoConfiguration.class)
+@ConditionalOnClass(Sender.class)
+@Import({SenderConfiguration.class,
+ ReporterConfiguration.class, BraveConfiguration.class,
+ OpenTelemetryConfiguration.class})
+@ConditionalOnDubboTracingEnable
+public class ZipkinAutoConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ public BytesEncoder spanBytesEncoder() {
+ return SpanBytesEncoder.JSON_V2;
+ }
+
+}
diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starter/dubbo-spring-boot-observability-autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinConfigurations.java b/dubbo-spring-boot/dubbo-spring-boot-observability-starter/dubbo-spring-boot-observability-autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinConfigurations.java
new file mode 100644
index 00000000000..c73fc2098ee
--- /dev/null
+++ b/dubbo-spring-boot/dubbo-spring-boot-observability-starter/dubbo-spring-boot-observability-autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinConfigurations.java
@@ -0,0 +1,171 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.spring.boot.observability.autoconfigure.exporter.zipkin;
+
+import org.apache.dubbo.config.nested.ExporterConfig;
+import org.apache.dubbo.spring.boot.autoconfigure.DubboConfigurationProperties;
+import org.apache.dubbo.spring.boot.observability.autoconfigure.exporter.zipkin.customizer.ZipkinRestTemplateBuilderCustomizer;
+import org.apache.dubbo.spring.boot.observability.autoconfigure.exporter.zipkin.customizer.ZipkinWebClientBuilderCustomizer;
+
+import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.reactive.function.client.WebClient;
+import zipkin2.Span;
+import zipkin2.codec.BytesEncoder;
+import zipkin2.reporter.AsyncReporter;
+import zipkin2.reporter.Reporter;
+import zipkin2.reporter.Sender;
+import zipkin2.reporter.brave.ZipkinSpanHandler;
+import zipkin2.reporter.urlconnection.URLConnectionSender;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Configurations for Zipkin. Those are imported by {@link ZipkinAutoConfiguration}.
+ */
+class ZipkinConfigurations {
+
+ @Configuration(proxyBeanMethods = false)
+ @Import({UrlConnectionSenderConfiguration.class, WebClientSenderConfiguration.class,
+ RestTemplateSenderConfiguration.class})
+ static class SenderConfiguration {
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass(URLConnectionSender.class)
+ @EnableConfigurationProperties(DubboConfigurationProperties.class)
+ static class UrlConnectionSenderConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean(Sender.class)
+ URLConnectionSender urlConnectionSender(DubboConfigurationProperties properties) {
+ URLConnectionSender.Builder builder = URLConnectionSender.newBuilder();
+ ExporterConfig.ZipkinConfig zipkinConfig = properties.getTracing().getTracingExporter().getZipkinConfig();
+ builder.connectTimeout((int) zipkinConfig.getConnectTimeout().toMillis());
+ builder.readTimeout((int) zipkinConfig.getReadTimeout().toMillis());
+ builder.endpoint(zipkinConfig.getEndpoint());
+ return builder.build();
+ }
+
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass(RestTemplate.class)
+ @EnableConfigurationProperties(DubboConfigurationProperties.class)
+ static class RestTemplateSenderConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean(Sender.class)
+ ZipkinRestTemplateSender restTemplateSender(DubboConfigurationProperties properties,
+ ObjectProvider