Spring Boot Data Geode Remote Locator的Java连接被拒绝错误

时间:2019-12-19 12:22:25

标签: geode

根据我的问题Apache Geode Web framework,我检查了here中的各种弹簧指南和here中的spring数据geode样本,并编写了一个简短的spring data geode应用程序,但无法连接到远程GFSH启动了Geode定位器。 Application类是:

    <div class = 'level_1'>
      <div class = 'level_2'>
           <div class = 'level_31'></div>
           <div class = 'level_32'></div>
           <div class = 'level_33'></div>
           <div class = 'level_special'></div>
       </div>
    </div>   

    <div class = 'level_1'>
      <div class = 'level_2'>
           <div class = 'level_31'></div>
           <div class = 'level_32'></div>
           <div class = 'level_33'></div>
      </div>
    </div>   

并在资源目录package cm; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.gemfire.config.annotation.ClientCacheApplication; import org.springframework.data.gemfire.config.annotation.ClientCacheApplication.Locator; import org.springframework.data.gemfire.config.annotation.EnablePdx; import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories; @SpringBootApplication @ClientCacheApplication(name = "CmWeb", locators = @Locator, subscriptionEnabled = true) @EnableGemfireRepositories(basePackageClasses= {CmRequest.class}) @EnablePdx public class CmWeb { public static void main(String[] args) { SpringApplication.run(CmWeb.class, args); } } 中设置了远程定位器:

application.properties

构建并运行该应用程序,它会发现定位器(它将作为服务器名称返回)

# Configure the client's connection Pool to the servers in the cluster
spring.data.gemfire.pool.locators=1.2.3.4[10334]

几秒钟后,它引发错误:

[Timer-DEFAULT-2] o.a.g.c.c.i.AutoConnectionSourceImpl : AutoConnectionSource discovered new locators [UAT:10334]

[Timer-DEFAULT-2] o.a.g.c.c.i.AutoConnectionSourceImpl : locator UAT:10334 is not running.

经过大量调查,我认为这是spring数据geode客户端希望使用符合Connecting GemFire using Spring Boot and Spring Data GemFire的spring boot geode服务器,因此我下载了ListRegionsOnServerFunction jar并将其部署到GFSH服务器上得到了相同的结果(尚未重新启动服务器...),但这会导致相同的错误情况。

如果通过Spring-Data-Gemfire - Unable to contact a Locator service. Operation either timed out or Locator does not exist,我尝试从以下位置更改application.properties

java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_232]
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_232]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_232]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:204) ~[na:1.8.0_232]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_232]
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_232]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_232]
    at java.net.Socket.connect(Socket.java:607) ~[na:1.8.0_232]
    at org.apache.geode.internal.net.SocketCreator.connect(SocketCreator.java:958) ~[geode-core-1.9.2.jar:na]
    at org.apache.geode.internal.net.SocketCreator.connect(SocketCreator.java:899) ~[geode-core-1.9.2.jar:na]
    at org.apache.geode.internal.net.SocketCreator.connect(SocketCreator.java:888) ~[geode-core-1.9.2.jar:na]
    at org.apache.geode.distributed.internal.tcpserver.TcpClient.getServerVersion(TcpClient.java:290) ~[geode-core-1.9.2.jar:na]
    at org.apache.geode.distributed.internal.tcpserver.TcpClient.requestToServer(TcpClient.java:184) ~[geode-core-1.9.2.jar:na]
    at org.apache.geode.cache.client.internal.AutoConnectionSourceImpl.queryOneLocatorUsingConnection(AutoConnectionSourceImpl.java:209) [geode-core-1.9.2.jar:na]
    at org.apache.geode.cache.client.internal.AutoConnectionSourceImpl.queryOneLocator(AutoConnectionSourceImpl.java:199) [geode-core-1.9.2.jar:na]
    at org.apache.geode.cache.client.internal.AutoConnectionSourceImpl.queryLocators(AutoConnectionSourceImpl.java:287) [geode-core-1.9.2.jar:na]
    at org.apache.geode.cache.client.internal.AutoConnectionSourceImpl$UpdateLocatorListTask.run2(AutoConnectionSourceImpl.java:500) [geode-core-1.9.2.jar:na]
    at org.apache.geode.cache.client.internal.PoolImpl$PoolTask.run(PoolImpl.java:1371) [geode-core-1.9.2.jar:na]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_232]
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_232]
    at org.apache.geode.internal.ScheduledThreadPoolExecutorWithKeepAlive$DelegatingScheduledFuture.run(ScheduledThreadPoolExecutorWithKeepAlive.java:276) [geode-core-1.9.2.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_232]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_232]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_232]

spring.data.gemfire.pool.locators=1.2.3.4[10334]

或其他版本,则应用无法找到远程定位器并抛出:

spring.gemfire.locators=1.2.3.4[10334]

提出这个问题,我终于找到了How to connect a remote-locator in Geode,也无法从SPRING应用程序PING GFSH服务器。但是,服务器绑定地址是为远程定位器客户端和各种其他服务正确设置的,并且可以使用本地构建的Geode v 1.10的Geode Native Client进行UI连接。我怀疑默认情况下,此(半内部)网络可能会禁用PING。我还禁用了端口10334、1099、40404的防火墙规则,以允许所有流量,但仍然会遇到相同的错误情况。

事实证明,从Spring Boot应用程序 之后重复的INFO消息中,连接被拒绝:

[Timer-DEFAULT-3] o.a.g.c.c.i.AutoConnectionSourceImpl : locator localhost/127.0.0.1:10334 is not running.

,然后在服务器上运行[Timer-DEFAULT-2] o.a.g.c.c.i.AutoConnectionSourceImpl : updateLocatorInLocatorList changing locator list: loc form: LocatorAddress [socketInetAddress=UAT:10334, hostname=UAT, isIpString=false] ,loc to: UAT:10334 [Timer-DEFAULT-2] o.a.g.c.c.i.AutoConnectionSourceImpl : updateLocatorInLocatorList locator list from:[UAT:10334, /1.2.3.4:10334] to: [LocatorAddress [socketInetAddress=UAT:10334, hostname=UAT, isIpString=false], LocatorAddress [socketInetAddress=/1.2.3.4:10334, hostname=1.2.3.4, isIpString=true]] ,实际上已经建立了从Spring Boot应用程序到Geode服务器v 1.10的连接。啊!

虽然并没有解释为什么list clients错误。

1 个答案:

答案 0 :(得分:1)

关于Spring Boot应用程序类的1条简短说明...

@SpringBootApplication
@ClientCacheApplication(name = "CmWeb", locators = @Locator, subscriptionEnabled = true)
@EnableGemfireRepositories(basePackageClasses= {CmRequest.class})
@EnablePdx
public class CmWeb {

    public static void main(String[] args) {
        SpringApplication.run(CmWeb.class, args);
    }
}

如果强烈建议使用 Apache Geode的Spring Boot (或Pivotal GemFire),则以下说法是正确的。

使用SBDG时(通过在应用程序类路径上声明正确的org.springframework.geode:spring-geode-starter依赖性),则无需显式声明@ClientCacheApplication@EnableGemfireRepositories@EnablePdx注释,因为SBDG默认情况下会自动配置ClientCache实例,所以会自动配置SD存储库,尤其是当所有实体类与Spring Boot应用程序位于同一包或子包中且SBDG默认情况下会自动配置PDX时,好吧。

locator = @Locator仅指定在通过Pool进行配置时,“ DEFAULT” GemFire / Geode ClientCacheFactory应该使用默认设置通过localhost上的定位器连接到集群。定位器端口10334。因此,该属性几乎没有用,我建议使用SBDG的 new @EnableClusterAware注释(请参见here)。

其他属性可以通过Spring Boot application.properties进行配置,如下所示:

spring.application.name=CmWeb
spring.data.gemfire.pool.subscription-enabled=true

提示:如果您在应用程序中使用的连接数超过Pools,则可以通过属性单独配置“ Pool”上的订阅,也许可以基于到群集中不同“分组”服务器的工作流等上。

您已经开始使用...来配置application.properties中的“ DEFAULT” Pool

# Configure the client's connection Pool to the servers in the cluster
spring.data.gemfire.pool.locators=1.2.3.4[10334]

关于...

经过大量调查,我认为这是spring数据geode客户端期望使用spring boot geode服务器

否,SDG根本不希望使用Spring配置或引导(服务器的)集群。使用Gfsh是完全有效的。对于instance。如果ListRegionsOnServerFunction不可用,SDG将退回到其他方式(由Gfsh知道并使用的GemFire / Geode本身提供)。

您在Spring Boot应用程序日志中看到的所有消息均来自Geode本身,即与Spring无关。简而言之,FWIW,SDG / SBDG是围绕Apache Geode(关键GemFire)API和Java客户端驱动程序的外观。 SDG / SBDG受此客户端的约束,只能做正确的事,这当然部分取决于正确的配置。仍然……我真的只是在想一想,因为我怀疑您已经充分意识到(或发现)了所有这一切。

我还要说Java客户端和Native Client也不完全是Apple与Apple的比较。意思是,如果您仅使用不带Spring的Apache Geode(Pivotal GemFire)API开发了一个客户端,那么您将遇到完全相同的问题。

我从未见过建立第一个连接,但随后的连接却收到“连接被拒绝”的情况,噢,#argh

您是否曾尝试对较旧的Geode版本进行相同的配置/安排,例如1.9?

很抱歉给您带来麻烦。我会考虑更多。