我想将 fcm 令牌保存在 Redis 中,但我得到,无法连接到 Redis(RedisConnectionFailureException)。 springboot 容器无法与 redis 容器通信。
server.port=9000
spring.redis.host=redis
spring.redis.port=6379
docker 撰写
version: "3"
services:
spring-boot-app:
build:
context: .
dockerfile: Dockerfile
image: imageone
container_name: imageone_container
networks:
- my_network
ports:
- "9000:9000"
depends_on:
- redis
environment:
SPRING_REDIS_HOST: redis
SPRING_REDIS_PORT: 6379
redis:
image: redis
container_name: redis_container
networks:
- my_network
ports:
- "6379:6379"
networks:
my_network:
driver: bridge
依赖关系
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
控制器
@PostMapping("/fcm-token")
public String verifyTokenGetMethod(@RequestBody Map<String, String> token) {
try { redisTemplate.opsForValue().set("fcmToken", token.get("fcmToken"));
return "Fcm token saved successfully";
} catch (Exception e) {e.printStackTrace();return "Fcm token not saved";
} }
假设您的项目如下所示:
├── docker-compose.yml
├── Dockerfile
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── example
│ └── demo
│ ├── config
│ │ └── RedisConnectionCheck.java
│ └── DemoApplication.java
└── resources
└── application.properties
application.properties
的内容如问题中所指定。
🗎
Dockerfile
FROM maven:3.6.3-openjdk-11-slim AS build
WORKDIR /home/app
COPY src src
COPY pom.xml /home/app
RUN mvn clean package -DskipTests
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/spring-boot-app-0.0.1-SNAPSHOT.jar /usr/local/lib/spring-boot-app.jar
EXPOSE 9000
ENTRYPOINT ["java","-jar","/usr/local/lib/spring-boot-app.jar"]
🗎
docker-compose.yml
version: "3"
services:
spring-boot-app:
build:
context: .
dockerfile: Dockerfile
image: imageone
ports:
- "9000:9000"
depends_on:
- redis
environment:
SPRING_REDIS_HOST: redis
SPRING_REDIS_PORT: 6379
redis:
image: redis
ports:
- "6379:6379"
🗎
RedisConnectionCheck.java
package com.example.demo.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class RedisConnectionCheck implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(RedisConnectionCheck.class);
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
private final StringRedisTemplate redisTemplate;
public RedisConnectionCheck(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public void run(String... args) {
logger.info("🔴 Making connection to Redis at {}:{}.", redisHost, redisPort);
String key = "redis_connection_test";
String value = "success";
redisTemplate.opsForValue().set(key, value);
logger.info("🟢 Connected to Redis at {}:{}.", redisHost, redisPort);
}
}