refactor(trace): Refactoring the TraceAutoConfiguration class

- Separate Feign and WebClient-related configurations into separate configuration classes
- Added FeignTraceAutoConfiguration and WebClientTraceAutoConfiguration classes
- Optimized the use of conditional annotations and improved configuration flexibility
- Added logging to facilitate tracking of configuration loading
This commit is contained in:
gewuyou 2025-05-31 22:41:39 +08:00
parent 050c611dd6
commit 567e7cc2b7
5 changed files with 98 additions and 38 deletions

View File

@ -1,5 +1,6 @@
dependencies {
implementation(project(Modules.Core.EXTENSION))
compileOnly(platform(libs.springBootDependencies.bom))
compileOnly(platform(libs.springCloudDependencies.bom))
compileOnly(libs.springBootStarter.web)

View File

@ -0,0 +1,34 @@
package com.gewuyou.forgeboot.trace.autoconfig
import com.gewuyou.forgeboot.core.extension.log
import com.gewuyou.forgeboot.trace.impl.config.TraceProperties
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
/**
*Feign跟踪自动配置
*
* @since 2025-05-31 22:02:56
* @author gewuyou
*/
@Configuration
@ConditionalOnClass(name = ["feign.RequestInterceptor"])
open class FeignTraceAutoConfiguration {
/**
* Feign 拦截器仅当 Feign 存在时生效
*
* 该拦截器用于在Feign客户端中传递请求ID
* @param traceProperties 跟踪配置属性
* @return FeignRequestIdInterceptor实例
*/
@Bean
@ConditionalOnMissingBean(name = ["feignRequestIdInterceptor"])
open fun feignRequestIdInterceptor(traceProperties: TraceProperties): Any {
val clazz = Class.forName("com.gewuyou.forgeboot.trace.impl.interceptor.FeignRequestIdInterceptor")
val constructor = clazz.getConstructor(TraceProperties::class.java)
log.info( "创建FeignRequestIdInterceptor实例")
return constructor.newInstance(traceProperties)
}
}

View File

@ -1,23 +1,18 @@
package com.gewuyou.forgeboot.trace.autoconfig
import com.gewuyou.forgeboot.core.extension.log
import com.gewuyou.forgeboot.trace.api.RequestIdProvider
import com.gewuyou.forgeboot.trace.impl.config.TraceProperties
import com.gewuyou.forgeboot.trace.impl.decorator.RequestIdTaskDecorator
import com.gewuyou.forgeboot.trace.impl.filter.ReactiveRequestIdFilter
import com.gewuyou.forgeboot.trace.impl.filter.RequestIdFilter
import com.gewuyou.forgeboot.trace.impl.filter.WebClientRequestIdFilter
import com.gewuyou.forgeboot.trace.impl.interceptor.FeignRequestIdInterceptor
import com.gewuyou.forgeboot.trace.impl.provider.TraceRequestIdProvider
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.autoconfigure.condition.ConditionalOnProperty
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.cloud.openfeign.FeignAutoConfiguration
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.web.reactive.function.client.WebClient
/**
* 跟踪自动配置
@ -39,7 +34,10 @@ open class TraceAutoConfiguration {
@Bean
@ConditionalOnProperty(name = ["spring.main.web-application-type"], havingValue = "servlet", matchIfMissing = true)
@ConditionalOnMissingBean
open fun requestIdFilter(traceProperties: TraceProperties): RequestIdFilter = RequestIdFilter(traceProperties)
open fun requestIdFilter(traceProperties: TraceProperties): RequestIdFilter {
log.info("RequestIdFilter 已创建!")
return RequestIdFilter(traceProperties)
}
/**
* Spring WebFlux 过滤器仅当 Spring WebFlux 存在时生效
@ -51,8 +49,10 @@ open class TraceAutoConfiguration {
@Bean
@ConditionalOnProperty(name = ["spring.main.web-application-type"], havingValue = "reactive")
@ConditionalOnMissingBean
open fun reactiveRequestIdFilter(traceProperties: TraceProperties): ReactiveRequestIdFilter =
ReactiveRequestIdFilter(traceProperties)
open fun reactiveRequestIdFilter(traceProperties: TraceProperties): ReactiveRequestIdFilter {
log.info("ReactiveRequestIdFilter 已创建!")
return ReactiveRequestIdFilter(traceProperties)
}
/**
* 请求ID提供者用于生成请求ID
@ -62,20 +62,10 @@ open class TraceAutoConfiguration {
*/
@Bean
@ConditionalOnMissingBean(RequestIdProvider::class)
open fun traceRequestIdProvider(): TraceRequestIdProvider = TraceRequestIdProvider()
/**
* Feign 拦截器仅当 Feign 存在时生效
*
* 该拦截器用于在Feign客户端中传递请求ID
* @param traceProperties 跟踪配置属性
* @return FeignRequestIdInterceptor实例
*/
@Bean
@ConditionalOnClass(FeignAutoConfiguration::class)
@ConditionalOnMissingBean
open fun feignRequestIdInterceptor(traceProperties: TraceProperties): FeignRequestIdInterceptor =
FeignRequestIdInterceptor(traceProperties)
open fun traceRequestIdProvider(): TraceRequestIdProvider {
log.info("TraceRequestIdProvider 已创建!")
return TraceRequestIdProvider()
}
/**
* 线程池装饰器用于 @Async
@ -86,19 +76,9 @@ open class TraceAutoConfiguration {
*/
@Bean
@ConditionalOnMissingBean
open fun requestIdTaskDecorator(traceProperties: TraceProperties): RequestIdTaskDecorator =
RequestIdTaskDecorator(traceProperties)
open fun requestIdTaskDecorator(traceProperties: TraceProperties): RequestIdTaskDecorator {
log.info("RequestIdTaskDecorator 已创建!")
return RequestIdTaskDecorator(traceProperties)
}
/**
* 配置 WebClient 并自动添加请求 ID 过滤器仅在 WebClient 已存在时引入
*/
@Bean
@ConditionalOnBean(WebClient.Builder::class) // 如果 WebClient.Builder 已存在,则添加过滤器
open fun webClientRequestIdFilter(
webClientBuilder: WebClient.Builder,
traceProperties: TraceProperties
): WebClient.Builder {
// 在现有 WebClient 配置中添加请求 ID 过滤器
return webClientBuilder.filter(WebClientRequestIdFilter(traceProperties))
}
}

View File

@ -0,0 +1,43 @@
package com.gewuyou.forgeboot.trace.autoconfig
import com.gewuyou.forgeboot.core.extension.log
import com.gewuyou.forgeboot.trace.impl.config.TraceProperties
import com.gewuyou.forgeboot.trace.impl.filter.WebClientRequestIdFilter
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
/**
* Web客户端跟踪自动配置
*
* 该配置类用于自动配置Web客户端的请求ID过滤器以实现请求跟踪功能
* 它依赖于特定条件如类的存在和Bean的定义以确保在适当的时候进行配置
*
* @since 2025-05-31 21:59:02
* @author gewuyou
*/
@Configuration
@ConditionalOnClass(name = ["org.springframework.web.reactive.function.client.WebClient\$Builder"])
open class WebClientTraceAutoConfiguration {
/**
* 配置Web客户端的请求ID过滤器
*
* 该方法在满足条件时被调用它获取WebClient.Builder实例并应用请求ID过滤器
* 以便在发出请求时添加请求ID信息这对于跟踪请求跨多个服务非常有用
*
* @param webClientBuilder Web客户端构建器用于配置过滤器
* @param traceProperties 跟踪属性配置用于定制跟踪行为
* @return 配置后的WebClient.Builder实例
*/
@Bean
@ConditionalOnBean(name = ["webClientBuilder"])
open fun webClientRequestIdFilter(
webClientBuilder: org.springframework.web.reactive.function.client.WebClient.Builder,
traceProperties: TraceProperties
): org.springframework.web.reactive.function.client.WebClient.Builder {
log .info("配置Web客户端的请求ID过滤器")
return webClientBuilder.filter(WebClientRequestIdFilter(traceProperties))
}
}

View File

@ -1 +1,3 @@
com.gewuyou.forgeboot.trace.autoconfig.TraceAutoConfiguration
com.gewuyou.forgeboot.trace.autoconfig.WebClientTraceAutoConfiguration
com.gewuyou.forgeboot.trace.autoconfig.FeignTraceAutoConfiguration