不支持geode客户端服务器版本-不支持序数为100的对等或客户端版本

时间:2020-04-08 20:09:19

标签: java gemfire geode spring-data-gemfire spring-boot-data-geode

我在PCF上托管了一个springboot应用程序,试图连接到PCC(关键云缓存)。我启动了一个PCC实例,并将其绑定到我的应用程序,然后将该应用程序推送到了Cloud Foundry。我已经将所有必需的gemfire启动器依赖项添加到springboot中,看起来好像能够从VCAP_SERVICES中读取定位器和服务器信息。但是,我在春季启动应用启动时看到以下错误。

org.apache.geode.cache.client.internal.ConnectionFactoryImpl.createClientToServerConnection(ConnectionFactoryImpl.java:120) - Could not create a new connection to server: XXX.XXX.XX.XXX(cacheserver-c3a291d1-9664-40d5-b20c-ad8dca8cd19e:1)<v3>:56152(version:GEODE 1.7.0) refused connection: 
Peer or client version with ordinal 100 not supported. Highest known version is 1.7.0 Client: /XXX.XXX.XX.XXX:39192.

at org.apache.geode.internal.cache.tier.sockets.Handshake.readMessage(Handshake.java:330) ~[geode-core-1.9.2.jar!/:?]

我不确定序号在这里是什么意思,还有哪些依赖项需要更新。

这是我的maven依赖项。

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-gemfire</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.geode</groupId>
            <artifactId>spring-geode</artifactId>
            <version>1.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>io.pivotal.gemfire</groupId>
            <artifactId>geode-core</artifactId>
            <version>9.8.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-geode</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.geode</groupId>
            <artifactId>spring-geode-starter</artifactId>
            <version>1.2.6.RELEASE</version>
        </dependency>

这是我的配置文件。

@Configuration
@ClientCacheApplication(name = "Test", logLevel = "info")
@EnableCachingDefinedRegions(
    clientRegionShortcut = ClientRegionShortcut.PROXY,
    serverRegionShortcut = RegionShortcut.REPLICATE_HEAP_LRU)
@EnableClusterAware
@EnablePdx
public class CloudConfiguration {}

有帮助吗?

2 个答案:

答案 0 :(得分:1)

尽管您自己解决了问题,并且已经掌握了要点,但我想在此提供一些详细信息(供感兴趣的读者使用),并提供一些指导。

让我们从头开始:

首先,您的应用程序依赖性(如上面的Maven POM所示)非常混乱!

您要声明对 Spring Data GemFire (即org.springframework.data:spring-data-gemfire:2.2.1.RELEASE)和 Spring Data Geode (即org.springframework.data:spring-data-geode:2.2.6.RELEASE的直接“版本化”依赖,它们不匹配; SD GemFire 2.2.1!= SD Geode 2.2.6)以及 Apache Geode和Pivotal GemFire的Spring Boot (SBDG)(org.springframework.geode:spring-geode-starter:1.2.6.RELEASE),然后不必要拉入SBDG的spring-geode(核心)模块,无论如何,它都将由spring-geode-starter暂时引入,并声明org.apache.geode:geode-core模块,! :)

在这种情况下,您需要声明的唯一依赖项是SBDG的启动器之一,使用Apache Geode时为org.springframework.geode:spring-geode-starter,使用Pivotal GemFire时为org.springframework.geode:spring-gemfire-starter,或者在部署 Spring Boot时也可以声明应用到使用PCC的PCF(在这种情况下,建议使用spring-gemfire-starter依赖项,尽管不是绝对必要的,因为可以混合GemFire / Geode对等体,并让Geode客户与GemFire服务对话,反之亦然)

启动器引入 Spring Data Geode (或 Spring Data GemFire ,具体取决于 starter ),从而引入Geode(或GemFire) )位给您。这首先就是Maven / Gradle依赖关系管理的重点,最好尽可能减少应用程序依赖关系的声明,让框架/启动程序为您确定传递依赖关系的版本,尤其是当您不这样做时。没关系。

Spring Boot 项目通常会为您提供curate and harmonize all the dependency versions(包括 Spring 和第3方库/传递依赖项)的大力支持。您只需根据所需的应用程序依赖项版本(例如Apache Geode或Pivotal GemFire)选择 Spring Boot 的版本。

我们在这里尝试为您总结这些内容:

https://github.com/spring-projects/spring-boot-data-geode/wiki/Spring-Boot-for-Apache-Geode-and-Pivotal-GemFire-Version-Compatibility-Matrix

具体请参见:

https://github.com/spring-projects/spring-boot-data-geode/wiki/Spring-Boot-for-Apache-Geode-and-Pivotal-GemFire-Version-Compatibility-Matrix#version-compatibility-matrix

为透明起见,此版本兼容性表/表格大致翻译为:

  1. 作为开发人员,我正在使用或选择使用SBDG 1.2.6.RELEASE
  2. SBDG 1.2.6.RELEASEbased on Spring Boot 2.2.6.RELEASE
  3. Spring Boot 2.2.6.RELEASE pulls in Spring Data Moore-SR6
  4. Spring Data Moore-SR6thisincludes Spring Data GemFire / Geode 2.2.6.RELEASE
  5. Spring Data Geode (SDG)Moore-SR6/2.2.6.RELEASEbased on Apache Geode 1.9.x
  6. Spring Data GemFire (SDG)Moore-SR6/2.2.6.RELEASEbased on Pivotal GemFire 9.8.x
  7. Spring Data Geode includes(由SDG提供)并更正Apache Geode位(相关性)。
  8. Spring Data GemFire includes(由SDG提供)并更正Pivotal GemFire位(相关性)。

因此,与PCF中的PCC一起使用哪个版本的SBDG(即哪个spring-[geode|gemfire]-starter版本)有关?

为此,您必须大致了解GemFire / Geode客户端只能与该客户端或更高版本的GemFire / Geode服务器连接并与其通信。新的客户端无法与旧的GemFire / Geode服务器通信。这不是Spring限制,而是GemFire / Geode限制本身。造成这种情况的原因有很多,我在这里不作解释(但是大致可以归结为协议,分布式算法和其他内容)。

通过示例,您可以将GemFire 9.8客户端连接到GemFire 9.8.x服务器,一切都很好。相同的GemFire 9.8客户端也可以连接到GeFire 9.9.x和9.10.x服务器并与之交谈。但是,GemFire 9.8客户端无法连接到GemFire 9.7、9.6、9.5或更早版本的服务器或与之交谈。补丁程序或维护版本与AFAIR无关紧要,例如,只要major.minor版本匹配,则GemFire 9.8.7客户端应该能够连接并与GemFire 9.8.4服务器通信。

因此,现在基本上可以归结为,您正在部署 Spring Boot Data Geode )应用程序的PCF中的哪个版本的Pivotal GemFire是PCC的版本。到,基于?

为此,您需要查看PCF / PCC文档。

例如,PCF的PCC(现称为VM的VMware Tanzue GemFire)版本1.11基于Pivotal GemFire 9.9.1。参见here

这意味着您可以使用基于 Spring Boot 1.2.6.RELEASE的SBDG 2.2.6.RELEASE,它可以导入 Spring Data {{1} },其中包括基于Apache Geode Moore-SR6 / Pivotal GemFire 2.2.6.RELEASE的SDG 1.9.2。这种组合很好,因为较旧的客户端(即GemFire 9.8.7)可以连接到GemFire 9.8.7并与之通信,GemFire 9.9.1是VMS 1.11的PCC / VMware Tanzu GemFire的基准。

有道理吗?

如果我们看一下PCC 1.10,那又是based on Pivotal GemFire 9.9.1。

如果我们看一下PCC 1.9,则为based on Pivotal GemFire 9.8.6。同样,我们在这里还可以。

如果我们回到PCC 1.7,我们会看到PCC 1.7是based on Pivotal GemFire 9.7.2。

现在,由于SBDG 1.2.6.RELEASE基于GemFire 9.8(较新),而PCC 1.7基于GemFire 9.7(较旧),因此SBDG 1.2.6.RELEASE将不适用于PCC 1.7。 9.8客户端无法连接到9.7服务器并与之通信,因此,我们必须将SBDG major.minor版本返回到SBDG 1.1.x,其中SBDG 1.1.x基于 Spring Boot 2.1,它引入了 Spring Data Lovelace/2.1,其中包括SDG 2.1.x,它基于Apache Geode 1.6和Pivotal分别是GemFire 9.5

注意:尽管SDG与较新的GemFire / Geode的“基准”版本“兼容”,但我们不“支持”该组合。例如,SDG Lovelace / 2.1仅“基于” GemFire 9.5 / Geode 1.6,但与“ GemFire 9.6 / 9.7和Geode 1.7 / 1.8”兼容。如果您超越了GemFire 9.7,例如9.8和Geode 1.8到1.9,那么您当然应该转到SDG Moore / 2.2,因为它“基于” GemFire 9.8 / Geode 1.9。兼容性!=支持。 无论如何,这就是说,您可以升级客户端驱动程序版本(例如,如有必要,可以升级为GemFire / Geode客户端版本)。有关更多详细信息,请参见here。该Wiki页面是一个WIP。

Cloud Cache Developer网站还包含有助于您入门的详细信息。

最后,我还在SBDG项目本身中构建了 入门示例 (使用GuideSource Code),这使您入门并从start.spring.io开始快速运行。

现在,关于您的配置...

@Configuration
@ClientCacheApplication(name = "Test", logLevel = "info")
@EnableCachingDefinedRegions(
    clientRegionShortcut = ClientRegionShortcut.PROXY,
    serverRegionShortcut = RegionShortcut.REPLICATE_HEAP_LRU)
@EnableClusterAware
@EnablePdx
public class CloudConfiguration {}

这可以简化为:

@Configuration
@EnableCachingDefinedRegions(
  serverRegionShortcut = RegionShortcut.REPLICATE_HEAP_LRU
)
@EnableClusterAware
public class CloudConfiguration {}
默认情况下,为您的ClientCache实例

SBDG“ 自动配置”。参见here

实际上,显式声明注解时应小心,因为那样您将覆盖自动配置(即通过应用来覆盖“ 惯例”明确的“ 配置”,它告诉启动您知道自己在做什么;请确保确实如此!)请参见here和{{3} }和hereherehere

许多注释属性(例如ClientCacheApplication.nameClientCacheApplication.logLevel)可以在 Spring Boot applications.properties文件中表示为SDG属性,从而使配置更加合理。 “可配置”。

例如:

# Spring Boot application.properties.
spring.data.gemfire.name=Test
spring.data.gmefire.cache.log-level=INFO

有关更多详细信息,请参见herehere

您也不需要显式启用PDX,因为SBDG再次为您自动配置 PDX。参见here

默认的ClientRegionShortcut是PROXY,尽管我也不介意对此“显式”。您只需在带有 auto-configuration Spring Boot 上下文中小心,因为您可能会“覆盖” auto-config 并将负责正确管理自己的配置。因此,请故意而不是盲目地声明配置。

希望这会有所帮助!

答案 1 :(得分:0)

解决方案:我将SpringBoot客户端版本降级为v1.7,并且运行良好。虽然,我现在看到身份验证问题。