Spring Boot Data Geode连接远程Locator遇Connection Refused问题求助
根据你描述的现象——已经发现Locator但后续连接被拒绝,且原生Geode客户端能正常连接,我梳理了几个针对性的排查方向:
1. 定位Locator主机名解析的问题
从日志里看到AutoConnectionSource discovered new locators [UAT:10334],这里的关键是:客户端后续会尝试用Locator返回的主机名(UAT)建立连接,而不是你配置的IP(1.2.3.4)。如果你的客户端机器无法解析UAT这个主机名,或者解析后的地址无法访问,就会出现连接拒绝的错误。
解决方法:
- 在Locator启动时指定
--bind-address参数为对外可访问的IP(1.2.3.4),让Locator返回正确的可连接地址:gfsh> start locator --name=locator1 --bind-address=1.2.3.4 --port=10334 - 或者在客户端配置中禁用主机名解析,强制使用配置的IP:
在application.properties添加:spring.data.gemfire.pool.resolve-hostname=false
2. 清理重复的Locator配置,确保优先级正确
你在@ClientCacheApplication中使用了locators = @Locator但没有指定参数,这会触发默认的localhost:10334配置,可能和application.properties中的配置产生冲突。Spring Data Geode的注解配置优先级通常高于properties,导致客户端优先尝试连接localhost,后续虽然通过AutoConnectionSource发现了远程Locator,但连接逻辑出现混乱。
解决方法:
- 修改
@ClientCacheApplication注解,移除locators属性,完全通过properties配置连接:@ClientCacheApplication(name = "CmWeb", subscriptionEnabled = true) - 确保
application.properties中的spring.data.gemfire.pool.locators=1.2.3.4[10334]是唯一的Locator连接配置。
3. 验证Pool的连接超时与配置正确性
连接拒绝也可能是Pool的连接超时设置过短,或者配置未生效导致的。可以添加以下配置调整超时参数,并确认Pool配置正确:
# 调整连接和读取超时时间(单位:毫秒) spring.data.gemfire.pool.connection-timeout=5000 spring.data.gemfire.pool.read-timeout=5000 # 确保只使用配置的Locator,不自动发现其他节点 spring.data.gemfire.pool.pr-single-hop-enabled=false
4. 检查Spring Data Geode与Apache Geode的版本兼容性
Spring Data Geode和Apache Geode的版本需要严格匹配,否则可能出现协议不兼容导致的连接问题。比如:
- Spring Data Geode 2.2.x 对应 Apache Geode 1.10.x
- Spring Data Geode 2.3.x 对应 Apache Geode 1.11.x
你可以检查项目中Spring Data Geode的版本,确保和服务器端的Apache Geode 1.10版本匹配。
5. 排除客户端本地网络/防火墙干扰
虽然你开放了端口,但客户端机器的本地防火墙、代理或者网络策略可能拦截了连接。可以在客户端机器执行以下命令测试连通性:
telnet 1.2.3.4 10334
如果无法连通,说明客户端本地存在网络限制;如果能连通,再回到Geode配置层面排查。
另外,对比原生Geode客户端的配置,看看是否有额外的参数(比如禁用主机名解析)是Spring Data Geode客户端没有配置的,参考原生配置调整Spring端的参数。
内容的提问来源于stack exchange,提问作者rupweb

