Spring Boot Reactive Redis 2 连接工厂导致健康检查失败

标签 spring spring-boot redis

当使用 Reactive Redis 和 Webflux 时,有 2 个 redis 连接工厂。一种 react 性和非 react 性。非 react 性的显示为 “DOWN” 状态,导致其余的健康检查失败。

为什么有 2 个连接工厂?

build.gradle.kts

dependencies {
    compile("org.springframework.boot:spring-boot-starter-data-redis-reactive:2.1.4.RELEASE")

    implementation("org.springframework.boot:spring-boot-starter-actuator")
    implementation("org.springframework.boot:spring-boot-starter-data-mongodb-reactive")
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.springframework.boot:spring-boot-starter-webflux")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("io.jsonwebtoken:jjwt:0.9.1")
    implementation("org.json:json:20180813")
    runtimeOnly("org.springframework.boot:spring-boot-devtools")

    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.3.1")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("de.flapdoodle.embed:de.flapdoodle.embed.mongo")
    testImplementation("io.projectreactor:reactor-test")
    testImplementation("org.springframework.security:spring-security-test")
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.3.1")
}

RedisConfig.kt

@Configuration
@EnableConfigurationProperties
class RedisConfig(@Value("\${redis.host}") private val redisHost: String,
                  @Value("\${redis.port}") private val redisPort: Int) {

    @Bean
    fun reactiveRedisConnectionFactory(): ReactiveRedisConnectionFactory {
        return LettuceConnectionFactory(redisHost, redisPort)
    }

    @Bean
    fun keyCommands(reactiveRedisConnectionFactory: ReactiveRedisConnectionFactory): ReactiveKeyCommands {
        return reactiveRedisConnectionFactory.reactiveConnection.keyCommands()
    }

    @Bean
    fun stringCommands(reactiveRedisConnectionFactory: ReactiveRedisConnectionFactory): ReactiveStringCommands {
        return reactiveRedisConnectionFactory.reactiveConnection.stringCommands()
    }

}

localhost:8080/actuator/health

{
    "status": "DOWN",
    "details": {
        "mongo": {
            "status": "UP",
            "details": {
                "version": "4.0.8"
            }
        },
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 101241290752,
                "free": 96678289408,
                "threshold": 10485760
            }
        },
        "redis": {
            "status": "DOWN",
            "details": {
                "reactiveRedisConnectionFactory": {
                    "status": "UP",
                    "details": {
                        "version": "5.0.4"
                    }
                },
                "redisConnectionFactory": {
                    "status": "DOWN",
                    "details": {
                        "error": "org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379"
                    }
                }
            }
        }
    }
}

最佳答案

不确定为什么在使用响应式(Reactive) Redis 时会有两个连接工厂,但是,我确实找到了一个临时解决方法来让健康检查通过。

我使用自己的属性来配置 redis redis.hostredis.port

通过切换使用spring.redis.hostspring.redis.port,它还会同时配置第二个非响应式(Reactive)连接工厂。由于它们现在都可以连接到 Redis,因此健康检查将通过。

{
    "status": "UP",
    "details": {
        "mongo": {
            "status": "UP",
            "details": {
                "version": "4.0.4"
            }
        },
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 499763888128,
                "free": 381951664128,
                "threshold": 10485760
            }
        },
        "redis": {
            "status": "UP",
            "details": {
                "reactiveRedisConnectionFactory": {
                    "status": "UP",
                    "details": {
                        "version": "5.0.4"
                    }
                },
                "redisConnectionFactory": {
                    "status": "UP",
                    "details": {
                        "version": "5.0.4"
                    }
                }
            }
        }
    }
}

关于Spring Boot Reactive Redis 2 连接工厂导致健康检查失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55671109/

相关文章:

java - Springs SimpleUrlHandlerMapping 没有映射我的 Controller

spring - 将动态资源注入(inject) Spring Batch ItemReader

java - 我的 application.properties 文件中的属性显示为灰色,我无法配置数据源 : 'url' attribute is not specified

go - 如何启动多名机械 worker ?

python - Flask应用中Redis与RDBMS共存(希望合作)

spring - 在 Spring+Tomcat 上使用 JSF 2.2.9 会导致 java.lang.NoClassDefFoundError : javax/enterprise/context/spi/Contextual

java - 为什么在Controller注解中使用@Component

java - 如何配置spring mvc根据Jackson注释填充@RequestMapping的参数?

spring-boot 默认的 EntityManager

Python使用类似于模拟补丁的技术缓存内部调用