Start-Locator / Locators,哪个是客户端的,哪个是服务器的?

Start-Locator / Locators, which is for client and which is for server?

我一直在像这个例子一样配置 Pivotal GemFire:

@Configuration
public class GemfireConfiguration {

    @Bean
    Properties gemfireProperties() {
        Properties gemfireProperties = new Properties();
        gemfireProperties.setProperty("name","SpringDataGemFireApplication");
        gemfireProperties.setProperty("mcast-port", "0");
        gemfireProperties.setProperty("log-level", "config");
        return gemfireProperties;
    }

    @Bean
    CacheFactoryBean gemfireCache() {
        CacheFactoryBean gemfireCache = new CacheFactoryBean();
        gemfireCache.setClose(true);
        gemfireCache.setProperties(gemfireProperties());
        return gemfireCache;
    }

    @Bean(name="employee")
    LocalRegionFactoryBean<String, Employee> getEmployee(final GemFireCache cache) {
        LocalRegionFactoryBean<String, Employee> employeeRegion = new LocalRegionFactoryBean();
        employeeRegion.setCache(cache);
        employeeRegion.setName("employee");
        // ...
        return employeeRegion;
    }
}

我需要放置一个定位器“localhost[1099]”,但是当我放置:

gemfireProperties.setProperty("locators", "localhost[1099]");

我从 Spring 收到一条错误消息,说找不到定位器(更具体的是 NULL),但我将 setter 更改为:

gemfireProperties.setProperty("start-locator", "localhost[1099]");

应用程序运行,但我不知道 Spring 是否创建了定位器或发生了什么。我想指向localhost[1099],这样我不确定它是否正确。

我看过很多示例,但我仍然不清楚哪个 属性 用于客户端应用程序或服务器应用程序。

我正在开发 REST API spring-data-gemfire、宝石等...

谁能帮帮我?

Pivotal GemFire locatorsstart-locator 属性仅供服务器使用。 属性 均不适用于客户端。

locators 标识新成员将作为对等方加入的集群的定位器。它具有以下格式:host1[port1],host2[port2],...,hostN[portN].

start-locator 用于在对等 Cache [应用程序] 节点或服务器中启动嵌入式定位器。当在 IDE 中启动一个小型 GemFire 服务器集群(对等成员节点)时,这个 属性 非常方便。

TIP: Typically, in standalone, production environment, you want to startup multiple, separate and dedicated Locator nodes (JVM processes, and usually on different hosts) for resiliency. But during development, using the start-locator property is convenient, especially when testing.

您可以阅读有关 locatorsstart-locator 属性的更多信息 here. You can read more about Locators, and specifically member discovery, here and here

那么,第一个问题,为什么在这种情况下需要一个或多个定位器?

关于...

I need to put a Locator "localhost[1099]", but when a I put: gemfireProperties.setProperty("locators", "localhost[1099]"); I get an error from Spring saying that the Locator could not be found (more specific is NULL), ...

当您还没有启动定位器时就会出现这种情况。如果您指定 start-locator 那么您的 Spring (Pivotal GemFire 的数据),对等 Cache 应用程序将在启动时嵌入定位器(服务),在这种情况下,您不需要指定locators 属性 因为它是多余的。

使用嵌入式定位器,您可以开始,或让其他成员加入集群中的该成员。

例如,我经常使用这样的 classes 来启动一个小型的 Pivotal GemFire 集群,用于开发、测试和演示目的...

@SpringBootApplication
//@CacheServerApplication(name = "ExampleServerApplication", locators = "localhost[10334]")
@PeerCacheApplication(name = "BookExampleServerApplication", locators = "localhost[10334]")
@EnablePdx(readSerialized = true)
@SuppressWarnings("unused")
public class GeodeServerApplication {

  public static void main(String[] args) {

    new SpringApplicationBuilder(GeodeServerApplication.class)
      .web(WebApplicationType.NONE)
      .build()
      .run(args);
  }

  @Profile("locator-manager")
  @Configuration
  @EnableLocator
  @EnableManager(start = true)
  static class LocatorManagerConfiguration { }

}

完整的源代码可用 here

一些注意事项。

首先,@CacheServerApplication@PeerCacheApplication 注释几乎是同义词。他们都创建了一个 Spring Boot,Pivotal GemFire peer Cache 应用程序节点(服务器)。唯一的区别是,@CacheServerApplication 额外添加了一个 ServerSocket,允许基于 GemFire ClientCache 的应用程序(即用 SDG 的 @ClientClientApplication 注释的 Spring 启动应用程序)连接到服务器。

如您所见,我创建了一个内部静态 LocatorManagerConfiguration class。这个 class 被注释为 @EnableLocator@EnableManager@EnableLocator 等同于 start-locator 属性 并允许您控制嵌入式定位器服务将在启动时绑定到的 NIC 和端口。默认情况下,嵌入式定位器服务在绑定到默认定位器端口 10334.

的“localhost”上启动

我添加了 @EnableManager 注释以同时启动基于 GemFire JMX 的管理服务,它允许 Gfsh 连接到我们的 Spring Boot configured/bootstrapped GemFire 服务器。

我使用 Spring 配置文件 ("locator-manager") 启用此 Spring @Configuration class 以便只有 1 个服务器以嵌入式 Locator/Manager。当然,我可以让多个服务器启动一个 Locator and/or Manager,但是我需要小心地改变 Locator 和 Manager 服务在侦听客户端连接时使用的端口号(例如,Manager 侦听来自JMX 客户端,例如 Gfsh,或 JConsole,或 JVisualVM,等等)。

那么,我们如何运行这个?

好吧,假设我们要创建一个包含 3 个服务器的小型 GemFire 集群。在我的 IDE 中,我使用相同的 GeodeServerApplication class 创建了 3 个不同的 运行 配置文件。第一个 运行 配置文件将以“locator-manager” Spring 配置文件启用开始,就像这样...

-server -ea -Dspring.profiles.active=locator-manager -Dspring.data.gemfire.name=GeodeServerOne

我 IDE 中接下来的 2 运行 个配置文件是这样设置的...

-server -ea -Dspring.profiles.active=none -Dspring.data.gemfire.name=GeodeServerTwo

-server -ea -Dspring.profiles.active=none -Dspring.data.gemfire.name=GeodeServerThree

唯一的区别是,对于我的最后一个 运行 配置文件 运行 配置文件 3,我需要为服务器命名一些不同的名称,例如“GeodeServerThree”。 Pivotal GemFire 期望集群中对等成员的名称是唯一的。

现在,在我的 IDE 中,我可以先启动启用 Locator/Manager 的服务器,然后 运行 最后两台没有启用嵌入式 Locator/Manager 的服务器, 下一个。然后,我可以使用 Gfsh 检查我的集群,如下所示:

$ echo $GEODE_HOME
/Users/jblum/pivdev/apache-geode-1.2.1

$ gfsh
    _________________________     __
   / _____/ ______/ ______/ /____/ /
  / /  __/ /___  /_____  / _____  / 
 / /__/ / ____/  _____/ / /    / /  
/______/_/      /______/_/    /_/    1.2.1

Monitor and Manage Apache Geode

gfsh>connect
Connecting to Locator at [host=localhost, port=10334] ..
Connecting to Manager at [host=10.0.0.121, port=1099] ..
Successfully connected to: [host=10.0.0.121, port=1099]

gfsh>list members
      Name       | Id
---------------- | ---------------------------------------------
GeodeServerOne   | 10.0.0.121(GeodeServerOne:42883)<ec><v0>:1024
GeodeServerTwo   | 10.0.0.121(GeodeServerTwo:42911)<v1>:1025
GeodeServerThree | 10.0.0.121(GeodeServerThree:42913)<v2>:1026

如果您启用了这些 Spring Boot,Pivotal GemFire 对等 Cache 应用程序也将成为 CacheServers(通过将 @PeerCacheApplication 注释替换为 @CacheServerApplication), 然后你就可以连接缓存客户端应用程序了,类似于下面...

https://github.com/jxblum/contacts-application/blob/master/boot-example/src/main/java/example/app/geode/cache/client/BootExampleApplication.java

TIP: The BootExampleApplication is using the new Spring Boot for Apache Geode/Pivotal GemFire (SBDG) project which auto-configures a ClientCache instance, by default, when either spring-geode-starter or, alternatively, spring-gemfire-starter, is on your application's classpath. See the docs for additional details. If this project were not using SBDG, then you would explicitly have to annotate your Spring Boot application class with SDG's @ClientCacheApplication.

阅读此 chapter & section SDG 参考指南了解更多详情。

无论如何,我希望这能为您提供一些指导,让您了解这些属性的用途以及 SDG 注释的功能。另请查看新的 Spring Boot for Apache Geode/Pivotal GemFire 项目(参见 blog post) ,它使用约定优于配置 Spring Boot 的自动配置支持来进一步简化客户端或服务器 Apache Geode/Pivotal GemFire 应用程序的配置和引导。

干杯, -约翰