Spring Boot OAuth2 Client:自定义RestClient实现令牌调用可观测性
1. 为Spring Boot OAuth2自动集成方案添加可观测性(追踪+指标)
Spring OAuth2自动配置默认使用的RestTemplate如果未配置观测增强,会丢失令牌请求的追踪数据。可通过以下步骤修复:
确保依赖齐全
引入观测相关的starter依赖(以Maven为例):<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>配置带观测能力的RestTemplate
自定义RestTemplateBean,使用Spring Boot提供的RestTemplateBuilder自动注入观测拦截器:@Bean public RestTemplate oauth2RestTemplate(RestTemplateBuilder builder) { return builder.build(); }该Builder默认会添加
ObservationClientHttpRequestInterceptor,自动为请求生成追踪链路和指标。开启观测配置
在application.yml中配置采样率和端点暴露:management: tracing: sampling: probability: 1.0 # 测试阶段全采样,生产可按需调整 endpoints: web: exposure: include: metrics, traces验证
调用受保护接口后,访问/actuator/traces查看完整链路(包含令牌请求),或通过/actuator/metrics查看请求指标。
2. 为令牌调用传入自定义RestClient
要替换内部的RestTemplate为RestClient,核心是自定义OAuth2令牌响应客户端,通过适配器将RestClient适配为RestOperations接口:
自定义OAuth2AccessTokenResponseClient
根据你的授权类型(授权码模式/客户端模式),替换对应的令牌响应客户端:// 授权码模式 @Bean public OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> authorizationCodeAccessTokenResponseClient() { DefaultAuthorizationCodeTokenResponseClient tokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient(); tokenResponseClient.setRestOperations(createRestClientAdapter()); return tokenResponseClient; } // 客户端模式 @Bean public OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest> clientCredentialsAccessTokenResponseClient() { DefaultClientCredentialsTokenResponseClient tokenResponseClient = new DefaultClientCredentialsTokenResponseClient(); tokenResponseClient.setRestOperations(createRestClientAdapter()); return tokenResponseClient; } // 将RestClient适配为RestOperations private RestOperations createRestClientAdapter() { // 可自定义RestClient的配置,比如添加观测拦截器 RestClient restClient = RestClient.builder() .requestInterceptor(new ObservationClientHttpRequestInterceptor()) .build(); return new RestClientAdapter(restClient); }RestClientAdapter是Spring提供的适配器类,能让依赖RestOperations的OAuth2组件直接使用RestClient。验证
查看日志可确认令牌请求已使用RestClient,同时访问/actuator/traces能看到完整的令牌请求追踪链路。
内容的提问来源于stack exchange,提问作者PatPanda

