如何让普罗米修斯 webflux r2dbc 在春天一起工作?当我尝试从服务运行实际 api 时,它给了我错误

Posted

技术标签:

【中文标题】如何让普罗米修斯 webflux r2dbc 在春天一起工作?当我尝试从服务运行实际 api 时,它给了我错误【英文标题】:how to get prometheus webflux r2dbc in spring work together? It gives me error when I try to run actual apis from service 【发布时间】:2020-04-23 12:44:29 【问题描述】:

我在 spring-boot2 中使用 prometheus 生成指标,并且我正在使用 webflux 和 r2dbc lib 进行反应式编程,但是我不确定它们是否可以一起使用。请帮助我了解我做错了什么。

它给出以下错误

java.lang.NoSuchMethodError: org.springframework.transaction.reactive.TransactionSynchronizationManager.currentTransaction()Lreactor/core/publisher/Mono;
    at org.springframework.data.r2dbc.connectionfactory.ConnectionFactoryUtils.doGetConnection(ConnectionFactoryUtils.java:88) ~[spring-data-r2dbc-1.0.0.M2.jar:1.0.0.M2]   at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.data.repository.core.support.MethodInvocationValidator.invoke(MethodInvocationValidator.java:99) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at 

我的 build.gradle 看起来像这样:

 plugins     
        id("org.springframework.boot") version "2.2.2.RELEASE",
        id ("io.spring.dependency-management") version "1.0.8.RELEASE"
     
   dependencies 
       implementation ("org.springframework.boot.experimental:spring-boot-starter-r2dbc")
       implementation ("org.springframework.boot.experimental:spring-boot-starter-data-r2dbc")
       implementation ("org.springframework.boot:spring-boot-starter")
       implementation("org.springframework.boot:spring-boot-starter-actuator")
       implementation("io.micrometer:micrometer-registry-prometheus")
       implementation ("org.springframework.boot:spring-boot-starter-webflux")
       testImplementation ("io.projectreactor:reactor-test")
  

控制器函数如下所示:

@Timed(histogram = true )
@GetMapping("/abc")
fun process(@PathVariable ab: String): Mono<xyz> 
    return service.getXYZ(xyz)
 

【问题讨论】:

【参考方案1】:

当使用 spring 初始化器生成一个新项目时,它将为您提供以下依赖项:

dependencies 
    implementation 'org.springframework.boot.experimental:spring-boot-actuator-autoconfigure-r2dbc'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot.experimental:spring-boot-starter-data-r2dbc'
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    testImplementation('org.springframework.boot:spring-boot-starter-test') 
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    
    testImplementation 'org.springframework.boot.experimental:spring-boot-test-autoconfigure-r2dbc'
    testImplementation 'io.projectreactor:reactor-test'

您似乎缺少spring-boot-actuator-autoconfigure-r2dbc,您可以删除

implementation ("org.springframework.boot.experimental:spring-boot-starter-r2dbc")

因为spring-boot-starter-data-r2dbc 会引入它的传递依赖。

由于 R2DBC 仍处于实验阶段,它的自动配置尚未合并到 Spring Boot 中,必须单独包含。我已经向开发人员提出了一个问题,并要求现在这部分应该在官方文档中提及。

【讨论】:

以上是关于如何让普罗米修斯 webflux r2dbc 在春天一起工作?当我尝试从服务运行实际 api 时,它给了我错误的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 R2DBC Postgresql WebFlux 获得响应

(WebFlux)003多数据源R2dbc事务失效分析

(WebFlux)003多数据源R2dbc事务失效分析

(WebFlux)003多数据源R2dbc事务失效分析

是时候考虑Spring非阻塞编程模式?R2DBC pk JDBC 和 WebFlux pk Web MVC 评测数据

带有 JPA 和 R2DBC 的 Spring Boot 2.4 混合项目无法启动