Spring Boot只读查询访问只读副本:配置与验证方法问询
一、简便配置方式(基于Spring Cloud AWS)
1. 添加依赖
在pom.xml中引入Spring Cloud AWS的RDS starter:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-aws-rds</artifactId> <version>2.1.3.RELEASE</version> </dependency>
2. 配置文件
在application.yml中配置主库与只读副本信息:
spring: cloud: aws: rds: database-name: your-db-name username: your-db-user password: your-db-pass read-replicas: - url: jdbc:postgresql://replica-1-endpoint:5432/your-db-name - url: jdbc:postgresql://replica-2-endpoint:5432/your-db-name # 主库URL url: jdbc:postgresql://primary-endpoint:5432/your-db-name
3. 标记只读查询
- 方法级别:用
@ReadOnly注解标记需要路由到副本的SELECT方法:
@ReadOnly public List<User> getUsers() { return jdbcTemplate.query("SELECT * FROM users", new UserRowMapper()); }
- 事务级别:使用
@Transactional(readOnly = true),框架会自动将只读事务路由至副本:
@Transactional(readOnly = true) public User getUserById(Long id) { return jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?", new UserRowMapper(), id); }
二、验证查询是否命中副本
1. 应用日志验证
开启数据源连接日志,比如HikariCP的日志(在logback.xml中配置):
<logger name="com.zaxxer.hikari" level="DEBUG"/>
查看日志中打印的连接URL,确认只读方法使用的是副本节点的地址。
2. 数据库端验证
对于Postgres RDS,可登录副本节点执行以下SQL查看当前活跃查询:
SELECT query, client_addr FROM pg_stat_activity WHERE query LIKE 'SELECT%';
检查结果中的client_addr是否为应用服务器的IP,且查询来自副本实例。
3. 自定义拦截器验证
实现DataSource的代理类,在获取连接时记录当前使用的数据源地址,输出到日志或监控系统。
三、AWS日志验证
1. RDS查询日志
开启RDS的通用查询日志或慢查询日志:
- 登录AWS控制台,进入RDS实例的“配置”页面,开启对应日志选项。
- 日志会自动推送至CloudWatch Logs,在CloudWatch中搜索日志内容,可通过
host字段区分主库与副本实例,同时查看SQL语句是否为只读查询。
2. CloudWatch指标辅助
查看RDS实例的DatabaseConnections指标,对比主库与副本的连接数变化,确认只读查询带来的连接数增长集中在副本节点。
四、Postgres兼容性说明
该方案完全适用于RDS Postgres,Spring Cloud AWS的只读路由逻辑基于JDBC层面的数据源切换,与数据库类型无关,只要正确配置副本的JDBC URL即可实现路由,和MySQL的实现逻辑一致。
参考Spring Cloud AWS 2.1.3文档内容:
Spring Cloud AWS支持配置Amazon RDS只读副本,将只读查询路由至副本节点以减轻主库负载。配置时需指定主库JDBC URL及一个或多个副本的JDBC URL。通过@ReadOnly注解或@Transactional(readOnly = true)事务注解标记只读方法,框架会自动将对应操作路由至只读副本。同时可通过spring.cloud.aws.rds.read-replicas属性定义副本列表,框架会自动处理负载均衡与故障转移。
内容的提问来源于stack exchange,提问作者Isidora

