705 lines
35 KiB
Plaintext
705 lines
35 KiB
Plaintext
[[geode-clientcache-applications]]
|
|
== Building ClientCache Applications
|
|
|
|
The first, opinionated option provided to you by Spring Boot for Apache Geode & Pivotal GemFire (SBDG) out-of-the-box is
|
|
a {apache-geode-javadoc}/org/apache/geode/cache/client/ClientCache.html[ClientCache] instance, simply by declaring
|
|
either Spring Boot for Apache Geode or Spring Boot for Pivotal GemFire on your application classpath.
|
|
|
|
It is assumed that most application developers using Spring Boot to build applications backed by either Apache Geode
|
|
or Pivotal GemFire will be building cache client applications deployed in an Apache Geode or Pivotal GemFire
|
|
{apache-geode-docs}/topologies_and_comm/cs_configuration/chapter_overview.html[Client/Server topology].
|
|
A client/server topology is the most common and traditional architecture employed by enterprise applications.
|
|
|
|
For example, you can begin building a Spring Boot, Apache Geode or Pivotal GemFire, `ClientCache` application
|
|
with either the `spring-geode-starter` or `spring-gemfire-starter` on your application's classpath:
|
|
|
|
.Spring Boot for Apache Geode on the application classpath
|
|
[source,xml]
|
|
----
|
|
<dependency>
|
|
<groupId>org.springframework.geode</groupId>
|
|
<artifactId>spring-geode-starter</artifactId>
|
|
</dependency>
|
|
----
|
|
|
|
Then, you configure and bootstrap your Spring Boot, Apache Geode `ClientCache` application with the following
|
|
main application class:
|
|
|
|
.Spring Boot, Apache Geode `ClientCache` Application
|
|
[source,java]
|
|
----
|
|
@SpringBootApplication
|
|
public class SpringBootApacheGeodeClientCacheApplication {
|
|
|
|
public static void main(String[] args) {
|
|
SpringApplication.run(SpringBootApacheGeodeClientCacheApplication.class, args);
|
|
}
|
|
}
|
|
----
|
|
|
|
Your application now has a `ClientCache` instance, which is able to connect to an Apache Geode or Pivotal GemFire server
|
|
running on `localhost`, listening on the default `CacheServer` port, `40404`.
|
|
|
|
By default, an Apache Geode or Pivotal GemFire server (i.e. `CacheServer`) must be running in order to use
|
|
the `ClientCache` instance. However, it is perfectly valid to create a `ClientCache` instance and perform
|
|
data access operations using `LOCAL` Regions. This is very useful during development.
|
|
|
|
TIP: To develop with `LOCAL` Regions, you only need to define your cache Regions with the
|
|
{apache-geode-javadoc}/org/apache/geode/cache/client/ClientRegionShortcut.html#LOCAL[`ClientRegionShortcut.LOCAL`]
|
|
data management policy.
|
|
|
|
When you are ready to switch from your local development environment (IDE) to a client/server architecture in a managed
|
|
environment, you simply change the data management policy of the client Region from `LOCAL` back to the default `PROXY`,
|
|
or even a `CACHING_PROXY`, data management policy which will cause the data to be sent/received to and from 1 or more
|
|
servers, respectively.
|
|
|
|
TIP: Compare and contrast the above configuration with Spring Data for Apache Geode/Pivotal GemFire's
|
|
{spring-data-geode-docs-html}/#bootstrap-annotation-config-geode-applications[approach].
|
|
|
|
It is uncommon to ever need a direct reference to the `ClientCache` instance provided by SBDG injected into your
|
|
application components (e.g. `@Service` or `@Repository` beans defined in a Spring `ApplicationContext`) whether you
|
|
are configuring additional GemFire/Geode objects (e.g. Regions, Indexes, etc) or simply using those objects indirectly
|
|
in your applications. However, it is also possible to do so if and when needed.
|
|
|
|
For example, perhaps you want to perform some additional `ClientCache` initialization in a Spring Boot
|
|
{spring-boot-javadoc}/org/springframework/boot/ApplicationRunner.html[ApplicationRunner] on startup:
|
|
|
|
.Injecting a `GemFireCache` reference
|
|
[source,java]
|
|
----
|
|
@SpringBootApplication
|
|
public class SpringBootApacheGeodeClientCacheApplication {
|
|
|
|
public static void main(String[] args) {
|
|
SpringApplication.run(SpringBootApacheGeodeClientCacheApplication.class, args);
|
|
}
|
|
|
|
@Bean
|
|
ApplicationRunner runAdditionalClientCacheInitialization(GemFireCache gemfireCache) {
|
|
|
|
return args -> {
|
|
|
|
ClientCache clientCache = (ClientCache) gemfireCache;
|
|
|
|
// perform additional ClientCache initialization as needed
|
|
};
|
|
}
|
|
}
|
|
----
|
|
|
|
[[geode-peercache-applications]]
|
|
=== Building Embedded (Peer & Server) Cache Applications
|
|
|
|
What if you want to build an embedded, peer `Cache` application instead?
|
|
|
|
Perhaps you need an actual peer cache member, configured and bootstrapped with Spring Boot, along with the ability
|
|
to join this member to an existing cluster (of data servers) as a peer node. Well, you can do that too.
|
|
|
|
Remember the 2nd goal in Spring Boot's {spring-boot-docs-html}/#getting-started-introducing-spring-boot[documentation]:
|
|
|
|
> _Be opinionated out of the box but get out of the way quickly as requirements start to diverge from the defaults._
|
|
|
|
It is the 2nd part, "_get out of the way quickly as requirements start to diverge from the defaults_"
|
|
that we refer to here.
|
|
|
|
If your application requirements demand you use Spring Boot to configure and bootstrap an embedded, peer `Cache`
|
|
Apache Geode or Pivotal GemFire application, then simply declare your intention with either SDG's
|
|
{spring-data-geode-javadoc}/org/springframework/data/gemfire/config/annotation/PeerCacheApplication.html[`@PeerCacheApplication`] annotation,
|
|
or alternatively, if you need to enable connections from `ClientCache` apps as well, use the SDG
|
|
{spring-data-geode-javadoc}/org/springframework/data/gemfire/config/annotation/CacheServerApplication.html[`@CacheServerApplication`] annotation:
|
|
|
|
.Spring Boot, Apache Geode/Pivotal GemFire CacheServer Application
|
|
[source,java]
|
|
----
|
|
@SpringBootApplication
|
|
@CacheServerApplication(name = "MySpringBootApacheGeodeCacheServerApplication")
|
|
public class SpringBootApacheGeodeCacheServerApplication {
|
|
|
|
public static void main(String[] args) {
|
|
SpringApplication.run(SpringBootApacheGeodeCacheServerApplication.class, args);
|
|
}
|
|
}
|
|
----
|
|
|
|
TIP: An Apache Geode/Pivotal GemFire "server" is not necessarily a "`CacheServer`" capable of serving cache clients.
|
|
It is merely a peer member node in a GemFire/Geode cluster (a.k.a. distributed system) that stores and manages data.
|
|
|
|
By explicitly declaring the `@CacheServerApplication` annotation, you are telling Spring Boot that you do not want
|
|
the default, `ClientCache` instance, but rather an embedded, peer `Cache` instance with a `CacheServer` component,
|
|
which enables connections from `ClientCache` apps.
|
|
|
|
You can also enable 2 other GemFire/Geode services, an embedded _Locator_, which allows clients or even other peers
|
|
to "locate" servers in a cluster, as well as an embedded _Manager_, which allows the GemFire/Geode application process
|
|
to be managed and monitored using {apache-geode-docs}/tools_modules/gfsh/chapter_overview.html[_Gfsh_], GemFire/Geode's
|
|
shell tool:
|
|
|
|
.Spring Boot, Apache Geode/Pivotal GemFire CacheServer Application with _Locator_ and _Manager_ services enabled
|
|
[source,java]
|
|
----
|
|
@SpringBootApplication
|
|
@CacheServerApplication(name = "SpringBootApacheGeodeCacheServerApplication")
|
|
@EnableLocator
|
|
@EnableManager
|
|
public class SpringBootApacheGeodeCacheServerApplication {
|
|
|
|
public static void main(String[] args) {
|
|
SpringApplication.run(SpringBootApacheGeodeCacheServerApplication.class, args);
|
|
}
|
|
}
|
|
----
|
|
|
|
Then, you can use _Gfsh_ to connect to and manage this server:
|
|
|
|
[source,text]
|
|
----
|
|
$ echo $GEMFIRE
|
|
/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
|
|
------------------------------------------- | --------------------------------------------------------------------------
|
|
SpringBootApacheGeodeCacheServerApplication | 10.0.0.121(SpringBootApacheGeodeCacheServerApplication:29798)<ec><v0>:1024
|
|
|
|
gfsh>
|
|
gfsh>describe member --name=SpringBootApacheGeodeCacheServerApplication
|
|
Name : SpringBootApacheGeodeCacheServerApplication
|
|
Id : 10.0.0.121(SpringBootApacheGeodeCacheServerApplication:29798)<ec><v0>:1024
|
|
Host : 10.0.0.121
|
|
Regions :
|
|
PID : 29798
|
|
Groups :
|
|
Used Heap : 168M
|
|
Max Heap : 3641M
|
|
Working Dir : /Users/jblum/pivdev/spring-boot-data-geode/spring-geode-docs/build
|
|
Log file : /Users/jblum/pivdev/spring-boot-data-geode/spring-geode-docs/build
|
|
Locators : localhost[10334]
|
|
|
|
Cache Server Information
|
|
Server Bind :
|
|
Server Port : 40404
|
|
Running : true
|
|
Client Connections : 0
|
|
----
|
|
|
|
You can even start additional servers in _Gfsh_, which will connect to your Spring Boot configured and bootstrapped
|
|
Apache Geode or Pivotal GemFire `CacheServer` application. These additional servers started in _Gfsh_ know about
|
|
the Spring Boot, GemFire/Geode server because of the embedded _Locator_ service, which is running on `localhost`,
|
|
listening on the default _Locator_ port, `10334`:
|
|
|
|
[source,text]
|
|
----
|
|
gfsh>start server --name=GfshServer --log-level=config --disable-default-server
|
|
Starting a Geode Server in /Users/jblum/pivdev/lab/GfshServer...
|
|
...
|
|
Server in /Users/jblum/pivdev/lab/GfshServer on 10.0.0.121 as GfshServer is currently online.
|
|
Process ID: 30031
|
|
Uptime: 3 seconds
|
|
Geode Version: 1.2.1
|
|
Java Version: 1.8.0_152
|
|
Log File: /Users/jblum/pivdev/lab/GfshServer/GfshServer.log
|
|
JVM Arguments: -Dgemfire.default.locators=10.0.0.121:127.0.0.1[10334] -Dgemfire.use-cluster-configuration=true -Dgemfire.start-dev-rest-api=false -Dgemfire.log-level=config -XX:OnOutOfMemoryError=kill -KILL %p -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
|
|
Class-Path: /Users/jblum/pivdev/apache-geode-1.2.1/lib/geode-core-1.2.1.jar:/Users/jblum/pivdev/apache-geode-1.2.1/lib/geode-dependencies.jar
|
|
|
|
|
|
gfsh>list members
|
|
Name | Id
|
|
------------------------------------------- | --------------------------------------------------------------------------
|
|
SpringBootApacheGeodeCacheServerApplication | 10.0.0.121(SpringBootApacheGeodeCacheServerApplication:29798)<ec><v0>:1024
|
|
GfshServer | 10.0.0.121(GfshServer:30031)<v1>:1025
|
|
----
|
|
|
|
Perhaps you want to start the other way around. As developer, I may need to connect my Spring Boot configured
|
|
and bootstrapped GemFire/Geode server application to an existing cluster. You can start the cluster in _Gfsh_
|
|
by executing the following commands:
|
|
|
|
[source,text]
|
|
----
|
|
gfsh>start locator --name=GfshLocator --port=11235 --log-level=config
|
|
Starting a Geode Locator in /Users/jblum/pivdev/lab/GfshLocator...
|
|
...
|
|
Locator in /Users/jblum/pivdev/lab/GfshLocator on 10.0.0.121[11235] as GfshLocator is currently online.
|
|
Process ID: 30245
|
|
Uptime: 3 seconds
|
|
Geode Version: 1.2.1
|
|
Java Version: 1.8.0_152
|
|
Log File: /Users/jblum/pivdev/lab/GfshLocator/GfshLocator.log
|
|
JVM Arguments: -Dgemfire.log-level=config -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
|
|
Class-Path: /Users/jblum/pivdev/apache-geode-1.2.1/lib/geode-core-1.2.1.jar:/Users/jblum/pivdev/apache-geode-1.2.1/lib/geode-dependencies.jar
|
|
|
|
Successfully connected to: JMX Manager [host=10.0.0.121, port=1099]
|
|
|
|
Cluster configuration service is up and running.
|
|
|
|
|
|
gfsh>start server --name=GfshServer --log-level=config --disable-default-server
|
|
Starting a Geode Server in /Users/jblum/pivdev/lab/GfshServer...
|
|
....
|
|
Server in /Users/jblum/pivdev/lab/GfshServer on 10.0.0.121 as GfshServer is currently online.
|
|
Process ID: 30270
|
|
Uptime: 4 seconds
|
|
Geode Version: 1.2.1
|
|
Java Version: 1.8.0_152
|
|
Log File: /Users/jblum/pivdev/lab/GfshServer/GfshServer.log
|
|
JVM Arguments: -Dgemfire.default.locators=10.0.0.121[11235] -Dgemfire.use-cluster-configuration=true -Dgemfire.start-dev-rest-api=false -Dgemfire.log-level=config -XX:OnOutOfMemoryError=kill -KILL %p -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
|
|
Class-Path: /Users/jblum/pivdev/apache-geode-1.2.1/lib/geode-core-1.2.1.jar:/Users/jblum/pivdev/apache-geode-1.2.1/lib/geode-dependencies.jar
|
|
|
|
|
|
gfsh>list members
|
|
Name | Id
|
|
----------- | --------------------------------------------------
|
|
GfshLocator | 10.0.0.121(GfshLocator:30245:locator)<ec><v0>:1024
|
|
GfshServer | 10.0.0.121(GfshServer:30270)<v1>:1025
|
|
----
|
|
|
|
Then, modify the `SpringBootApacheGeodeCacheServerApplication` class to connect to the existing cluster, like so:
|
|
|
|
.Spring Boot, Apache Geode/Pivotal GemFire CacheServer Application with _Locator_ and _Manager_ services enabled
|
|
[source,java]
|
|
----
|
|
@SpringBootApplication
|
|
@CacheServerApplication(name = "MySpringBootApacheGeodeCacheServerApplication", locators = "localhost[11235]")
|
|
public class SpringBootApacheGeodeCacheServerApplication {
|
|
|
|
public static void main(String[] args) {
|
|
SpringApplication.run(SpringBootApacheGeodeClientCacheApplication.class, args);
|
|
}
|
|
}
|
|
----
|
|
|
|
TIP: Notice I configured the `SpringBootApacheGeodeCacheServerApplication` class, `@CacheServerApplication` annotation's
|
|
`locators` property with the host and port (i.e. "_localhost[11235]_") on which I started my _Locator_ using _Gfsh_.
|
|
|
|
After running your Spring Boot, Apache Geode `CacheServer` application again, and then running `list members` in _Gfsh_,
|
|
you should see:
|
|
|
|
[source,text]
|
|
----
|
|
gfsh>list members
|
|
Name | Id
|
|
------------------------------------------- | ----------------------------------------------------------------------
|
|
GfshLocator | 10.0.0.121(GfshLocator:30245:locator)<ec><v0>:1024
|
|
GfshServer | 10.0.0.121(GfshServer:30270)<v1>:1025
|
|
SpringBootApacheGeodeCacheServerApplication | 10.0.0.121(SpringBootApacheGeodeCacheServerApplication:30279)<v2>:1026
|
|
|
|
|
|
gfsh>describe member --name=SpringBootApacheGeodeCacheServerApplication
|
|
Name : SpringBootApacheGeodeCacheServerApplication
|
|
Id : 10.0.0.121(SpringBootApacheGeodeCacheServerApplication:30279)<v2>:1026
|
|
Host : 10.0.0.121
|
|
Regions :
|
|
PID : 30279
|
|
Groups :
|
|
Used Heap : 165M
|
|
Max Heap : 3641M
|
|
Working Dir : /Users/jblum/pivdev/spring-boot-data-geode/spring-geode-docs/build
|
|
Log file : /Users/jblum/pivdev/spring-boot-data-geode/spring-geode-docs/build
|
|
Locators : localhost[11235]
|
|
|
|
Cache Server Information
|
|
Server Bind :
|
|
Server Port : 40404
|
|
Running : true
|
|
Client Connections : 0
|
|
----
|
|
|
|
In both scenarios, the Spring Boot configured and bootstrapped Apache Geode (or Pivotal GemFire) server
|
|
and the _Gfsh_ _Locator_ and _Server_ formed a cluster.
|
|
|
|
While you can use either approach and Spring does not care, it is far more convenient to use Spring Boot and your IDE
|
|
to form a small cluster while developing. By leveraging Spring profiles, it is far simpler and much faster to
|
|
configure and start a small cluster.
|
|
|
|
Plus, this is useful for rapidly prototyping, testing and debugging your entire, end-to-end application
|
|
and system architecture, all right from the comfort and familiarity of your IDE of choice. No additional tooling
|
|
(e.g. _Gfsh_) or knowledge is required to get started quickly and easily.
|
|
|
|
Just _build_ and _run_!
|
|
|
|
TIP: Be careful to vary your port numbers for the embedded services, like the `CacheServer`, _Locators_ and _Manager_,
|
|
especially if you start multiple instances, otherwise you will run into a `java.net.BindException`
|
|
due to port conflicts.
|
|
|
|
TIP: See the Appendix, <<geode-cluster-configuration-bootstrapping>> for more details.
|
|
|
|
[[geode-locator-applications]]
|
|
=== Building Locator Applications
|
|
|
|
In addition to `ClientCache`, `CacheServer` and peer `Cache` applications, SDG, and by extension SBDG, now supports
|
|
Locator-based, Spring Boot applications.
|
|
|
|
An Apache Geode or Pivotal GemFire Locator is a location-based service, or alternatively and more typically,
|
|
a standalone process enabling clients to "locate" a cluster of Apache Geode/Pivotal GemFire servers to manage data.
|
|
Many cache clients can connect to the same cluster in order to share data. Running multiple clients is common in a
|
|
Microservices architecture where you need to scale-up the number of app instances to satisfy the demand.
|
|
|
|
A Locator is also used by joining members of an existing cluster to scale-out and increase capacity of the logically
|
|
pooled system resources (i.e. Memory, CPU and Disk). A Locator maintains metadata that is sent to the clients to
|
|
enable capabilities like single-hop data access, routing data access operations to the data node in the cluster
|
|
maintaining the data of interests. A Locator also maintains load information for servers in the cluster, which enables
|
|
the load to be uniformly distributed across the cluster while also providing fail-over services to a redundant member
|
|
if the primary fails. A Locator provides many more benefits and you are encouraged to read
|
|
the {apache-geode-docs}/configuring/running/running_the_locator.html[documentation] for more details.
|
|
|
|
As shown above, a Locator service can be embedded within either a peer `Cache` or `CacheServer`, Spring Boot application
|
|
using the SDG `@EnableLocator` annotation:
|
|
|
|
.Embedded Locator Service
|
|
[source,java]
|
|
----
|
|
@SpringBootApplication
|
|
@CacheServerApplication
|
|
@EnableLocator
|
|
class SpringBootCacheServerWithEmbeddedLocatorApplication {
|
|
// ...
|
|
}
|
|
----
|
|
|
|
However, it is more common to start standalone Locator JVM processes. This is useful when you want to increase
|
|
the resiliency of your cluster in face of network and process failures, which are bound to happen. If a Locator JVM
|
|
process crashes or gets severed from the cluster due to a network failure, then having multiple Locators provides a
|
|
higher degree of availability (HA) through redundancy.
|
|
|
|
Not to worry though, if all Locators in the cluster go down, then the cluster will still remain intact.
|
|
You simply won't be able to add more peer members (i.e. scale-up the number of data nodes in the cluster)
|
|
or connect any more clients. If all the Locators in the cluster go down, then it is safe to simply restart them
|
|
only after a thorough diagnosis.
|
|
|
|
NOTE: Once a client receives metadata about the cluster of servers, then all data access operations are sent directly
|
|
to servers in the cluster, not a Locator. Therefore, existing, connected clients will remain connected and operable.
|
|
|
|
To configure and bootstrap Locator-based, Spring Boot applications as standalone JVM processes, use the following
|
|
configuration:
|
|
|
|
.Standalone Locator Process
|
|
[source,java]
|
|
----
|
|
@SpringBootApplication
|
|
@LocatorApplication
|
|
class SpringBootApacheGeodeLocatorApplication {
|
|
// ...
|
|
}
|
|
----
|
|
|
|
Instead of using the `@EnableLocator` annotation, you now use the `@LocatorApplication` annotation.
|
|
|
|
The `@LocatorApplication` annotation works in the same way as the `@PeerCacheApplication` and `@CacheServerApplication`
|
|
annotations, bootstrapping a Apache Geode or Pivotal GemFire process, overriding the default `ClientCache` instance
|
|
provided by SBDG out-of-the-box.
|
|
|
|
NOTE: If your `@SpringBootApplication` class is annotated with `@LocatorApplication`, then it can only be a `Locator`
|
|
and not a `ClientCache`, `CacheServer` or peer `Cache` application. If you need the application to function as a
|
|
peer `Cache`, perhaps with an embedded `CacheServer` components and embedded Locator, then you need to follow
|
|
the approach shown above using the `@EnableLocator` annotation with either the `@PeerCacheApplication`
|
|
or `@CacheServerApplication` annotation.
|
|
|
|
With our Spring Boot, Apache Geode Locator application, we can connect both Spring Boot configured and bootstrapped
|
|
peer members (peer `Cache`, `CacheServer` and `Locator` applications) as well as _Gfsh_ started Locators and Servers.
|
|
|
|
First, let's startup 2 Locators using our Apache Geode Locator, Spring Boot application class.
|
|
|
|
.SpringBootApacheGeodeLocatorApplication class
|
|
[source,java]
|
|
----
|
|
include::{docs-src-dir}/org/springframework/geode/docs/example/app/locator/SpringBootApacheGeodeLocatorApplication.java[tags=class]
|
|
----
|
|
|
|
We also need to vary the configuration for each Locator app instance.
|
|
|
|
Apache Geode and Pivotal GemFire requires each peer member in the cluster to be uniquely named. We can set the name
|
|
of the Locator by using the `spring.data.gemfire.locator.name` SDG property set as a JVM System Property in your IDE's
|
|
Run Configuration Profile for the application main class like so: `-Dspring.data.gemfire.locator.name=SpringLocatorOne`.
|
|
We name the second Locator app instance, "_SpringLocatorTwo_".
|
|
|
|
Additionally, we must vary the port numbers that the Locators use to listen for connections. By default,
|
|
an Apache Geode or Pivotal GemFire Locator listens on port `10334`. We can set the Locator port using the
|
|
`spring.data.gemfire.locator.port` SDG property.
|
|
|
|
For our first Locator app instance (i.e. "_SpringLocatorOne_"), we also enable the "_manager_" Profile so that
|
|
we can connect to the Locator using _Gfsh_.
|
|
|
|
Our IDE Run Configuration Profile for our first Locator app instance appears as:
|
|
|
|
`-server -ea -Dspring.profiles.active=manager -Dspring.data.gemfire.locator.name=SpringLocatorOne -Dlogback.log.level=INFO`
|
|
|
|
And our IDE Run Configuration Profile for our second Locator app instance appears as:
|
|
|
|
`-server -ea -Dspring.profiles.active= -Dspring.data.gemfire.locator.name=SpringLocatorTwo -Dspring.data.gemfire.locator.port=11235 -Dlogback.log.level=INFO`
|
|
|
|
You should see log output similar to the following when you start a Locator app instance:
|
|
|
|
.Spring Boot, Apache Geode Locator log output
|
|
[source,txt]
|
|
----
|
|
. ____ _ __ _ _
|
|
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
|
|
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
|
|
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
|
|
' |____| .__|_| |_|_| |_\__, | / / / /
|
|
=========|_|==============|___/=/_/_/_/
|
|
:: Spring Boot :: (v2.2.0.BUILD-SNAPSHOT)
|
|
|
|
2019-09-01 11:02:48,707 INFO .SpringBootApacheGeodeLocatorApplication: 55 - Starting SpringBootApacheGeodeLocatorApplication on jblum-mbpro-2.local with PID 30077 (/Users/jblum/pivdev/spring-boot-data-geode/spring-geode-docs/out/production/classes started by jblum in /Users/jblum/pivdev/spring-boot-data-geode/spring-geode-docs/build)
|
|
2019-09-01 11:02:48,711 INFO .SpringBootApacheGeodeLocatorApplication: 651 - No active profile set, falling back to default profiles: default
|
|
2019-09-01 11:02:49,374 INFO xt.annotation.ConfigurationClassEnhancer: 355 - @Bean method LocatorApplicationConfiguration.exclusiveLocatorApplicationBeanFactoryPostProcessor is non-static and returns an object assignable to Spring's BeanFactoryPostProcessor interface. This will result in a failure to process annotations such as @Autowired, @Resource and @PostConstruct within the method's declaring @Configuration class. Add the 'static' modifier to this method to avoid these container lifecycle issues; see @Bean javadoc for complete details.
|
|
2019-09-01 11:02:49,919 INFO ode.distributed.internal.InternalLocator: 530 - Starting peer location for Distribution Locator on 10.99.199.24[11235]
|
|
2019-09-01 11:02:49,925 INFO ode.distributed.internal.InternalLocator: 498 - Starting Distribution Locator on 10.99.199.24[11235]
|
|
2019-09-01 11:02:49,926 INFO distributed.internal.tcpserver.TcpServer: 242 - Locator was created at Sun Sep 01 11:02:49 PDT 2019
|
|
2019-09-01 11:02:49,927 INFO distributed.internal.tcpserver.TcpServer: 243 - Listening on port 11235 bound on address 0.0.0.0/0.0.0.0
|
|
2019-09-01 11:02:49,928 INFO ternal.membership.gms.locator.GMSLocator: 162 - GemFire peer location service starting. Other locators: localhost[10334] Locators preferred as coordinators: true Network partition detection enabled: true View persistence file: /Users/jblum/pivdev/spring-boot-data-geode/spring-geode-docs/build/locator11235view.dat
|
|
2019-09-01 11:02:49,928 INFO ternal.membership.gms.locator.GMSLocator: 416 - Peer locator attempting to recover from localhost/127.0.0.1:10334
|
|
2019-09-01 11:02:49,963 INFO ternal.membership.gms.locator.GMSLocator: 422 - Peer locator recovered initial membership of View[10.99.199.24(SpringLocatorOne:30043:locator)<ec><v0>:41000|0] members: [10.99.199.24(SpringLocatorOne:30043:locator)<ec><v0>:41000]
|
|
2019-09-01 11:02:49,963 INFO ternal.membership.gms.locator.GMSLocator: 407 - Peer locator recovered state from LocatorAddress [socketInetAddress=localhost/127.0.0.1:10334, hostname=localhost, isIpString=false]
|
|
2019-09-01 11:02:49,965 INFO ode.distributed.internal.InternalLocator: 644 - Starting distributed system
|
|
2019-09-01 11:02:50,007 INFO he.geode.internal.logging.LoggingSession: 82 -
|
|
---------------------------------------------------------------------------
|
|
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
contributor license agreements. See the NOTICE file distributed with this
|
|
work for additional information regarding copyright ownership.
|
|
|
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
(the "License"); you may not use this file except in compliance with the
|
|
License. You may obtain a copy of the License at
|
|
|
|
https://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
License for the specific language governing permissions and limitations
|
|
under the License.
|
|
|
|
---------------------------------------------------------------------------
|
|
Build-Date: 2019-04-19 11:49:13 -0700
|
|
Build-Id: onichols 0
|
|
Build-Java-Version: 1.8.0_192
|
|
Build-Platform: Mac OS X 10.14.4 x86_64
|
|
Product-Name: Apache Geode
|
|
Product-Version: 1.9.0
|
|
Source-Date: 2019-04-19 11:11:31 -0700
|
|
Source-Repository: release/1.9.0
|
|
Source-Revision: c0a73d1cb84986d432003bd12e70175520e63597
|
|
Native version: native code unavailable
|
|
Running on: 10.99.199.24/10.99.199.24, 8 cpu(s), x86_64 Mac OS X 10.13.6
|
|
Communications version: 100
|
|
Process ID: 30077
|
|
User: jblum
|
|
Current dir: /Users/jblum/pivdev/spring-boot-data-geode/spring-geode-docs/build
|
|
Home dir: /Users/jblum
|
|
Command Line Parameters:
|
|
-ea
|
|
-Dspring.profiles.active=
|
|
-Dspring.data.gemfire.locator.name=SpringLocatorTwo
|
|
-Dspring.data.gemfire.locator.port=11235
|
|
-Dlogback.log.level=INFO
|
|
-javaagent:/Applications/IntelliJ IDEA 19 CE.app/Contents/lib/idea_rt.jar=51961:/Applications/IntelliJ IDEA 19 CE.app/Contents/bin
|
|
-Dfile.encoding=UTF-8
|
|
Class Path:
|
|
...
|
|
..
|
|
.
|
|
2019-09-01 11:02:54,112 INFO ode.distributed.internal.InternalLocator: 661 - Locator started on 10.99.199.24[11235]
|
|
2019-09-01 11:02:54,113 INFO ode.distributed.internal.InternalLocator: 769 - Starting server location for Distribution Locator on 10.99.199.24[11235]
|
|
2019-09-01 11:02:54,134 INFO nt.internal.locator.wan.LocatorDiscovery: 138 - Locator discovery task exchanged locator information 10.99.199.24[11235] with localhost[10334]: {-1=[10.99.199.24[10334]]}.
|
|
2019-09-01 11:02:54,242 INFO .SpringBootApacheGeodeLocatorApplication: 61 - Started SpringBootApacheGeodeLocatorApplication in 6.137470354 seconds (JVM running for 6.667)
|
|
Press <enter> to exit!
|
|
----
|
|
|
|
Next, start up the second Locator app instance (you should see log output similar to above). Then, connect to
|
|
the cluster of Locators using _Gfsh_:
|
|
|
|
.Cluster of Locators
|
|
[source,txt]
|
|
----
|
|
$ echo $GEMFIRE
|
|
/Users/jblum/pivdev/apache-geode-1.9.0
|
|
|
|
$ gfsh
|
|
_________________________ __
|
|
/ _____/ ______/ ______/ /____/ /
|
|
/ / __/ /___ /_____ / _____ /
|
|
/ /__/ / ____/ _____/ / / / /
|
|
/______/_/ /______/_/ /_/ 1.9.0
|
|
|
|
Monitor and Manage Apache Geode
|
|
|
|
gfsh>connect
|
|
Connecting to Locator at [host=localhost, port=10334] ..
|
|
Connecting to Manager at [host=10.99.199.24, port=1099] ..
|
|
Successfully connected to: [host=10.99.199.24, port=1099]
|
|
|
|
gfsh>list members
|
|
Name | Id
|
|
---------------- | ------------------------------------------------------------------------
|
|
SpringLocatorOne | 10.99.199.24(SpringLocatorOne:30043:locator)<ec><v0>:41000 [Coordinator]
|
|
SpringLocatorTwo | 10.99.199.24(SpringLocatorTwo:30077:locator)<ec><v1>:41001
|
|
----
|
|
|
|
Using our `SpringBootApacheGeodeCacheServerApplication` main class from the previous section, we can configure
|
|
and bootstrap an Apache Geode `CacheServer` application with Spring Boot and connect it to our cluster of Locators.
|
|
|
|
.SpringBootApacheGeodeCacheServerApplication class
|
|
[source,java]
|
|
----
|
|
include::{docs-src-dir}/org/springframework/geode/docs/example/app/server/SpringBootApacheGeodeCacheServerApplication.java[tags=class]
|
|
----
|
|
|
|
Simply enable the "clustered" Profile by using a IDE Run Profile Configuration similar to:
|
|
|
|
`-server -ea -Dspring.profiles.active=clustered -Dspring.data.gemfire.name=SpringServer -Dspring.data.gemfire.cache.server.port=41414 -Dlogback.log.level=INFO`
|
|
|
|
After the server starts up, you should see the new peer member in the cluster:
|
|
|
|
.Cluster with Spring Boot configured and bootstrapped Apache Geode `CacheServer`
|
|
[source,txt]
|
|
----
|
|
gfsh>list members
|
|
Name | Id
|
|
---------------- | ------------------------------------------------------------------------
|
|
SpringLocatorOne | 10.99.199.24(SpringLocatorOne:30043:locator)<ec><v0>:41000 [Coordinator]
|
|
SpringLocatorTwo | 10.99.199.24(SpringLocatorTwo:30077:locator)<ec><v1>:41001
|
|
SpringServer | 10.99.199.24(SpringServer:30216)<v2>:41002
|
|
----
|
|
|
|
Finally, we can even start additional Locators and Servers connected to this cluster using _Gfsh_:
|
|
|
|
.Gfsh started Locators and Servers
|
|
[source,txt]
|
|
----
|
|
gfsh>start locator --name=GfshLocator --port=12345 --log-level=config
|
|
Starting a Geode Locator in /Users/jblum/pivdev/lab/GfshLocator...
|
|
......
|
|
Locator in /Users/jblum/pivdev/lab/GfshLocator on 10.99.199.24[12345] as GfshLocator is currently online.
|
|
Process ID: 30259
|
|
Uptime: 5 seconds
|
|
Geode Version: 1.9.0
|
|
Java Version: 1.8.0_192
|
|
Log File: /Users/jblum/pivdev/lab/GfshLocator/GfshLocator.log
|
|
JVM Arguments: -Dgemfire.default.locators=10.99.199.24[11235],10.99.199.24[10334] -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false -Dgemfire.log-level=config -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
|
|
Class-Path: /Users/jblum/pivdev/apache-geode-1.9.0/lib/geode-core-1.9.0.jar:/Users/jblum/pivdev/apache-geode-1.9.0/lib/geode-dependencies.jar
|
|
|
|
gfsh>start server --name=GfshServer --server-port=45454 --log-level=config
|
|
Starting a Geode Server in /Users/jblum/pivdev/lab/GfshServer...
|
|
...
|
|
Server in /Users/jblum/pivdev/lab/GfshServer on 10.99.199.24[45454] as GfshServer is currently online.
|
|
Process ID: 30295
|
|
Uptime: 2 seconds
|
|
Geode Version: 1.9.0
|
|
Java Version: 1.8.0_192
|
|
Log File: /Users/jblum/pivdev/lab/GfshServer/GfshServer.log
|
|
JVM Arguments: -Dgemfire.default.locators=10.99.199.24[11235],10.99.199.24[12345],10.99.199.24[10334] -Dgemfire.start-dev-rest-api=false -Dgemfire.use-cluster-configuration=true -Dgemfire.log-level=config -XX:OnOutOfMemoryError=kill -KILL %p -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
|
|
Class-Path: /Users/jblum/pivdev/apache-geode-1.9.0/lib/geode-core-1.9.0.jar:/Users/jblum/pivdev/apache-geode-1.9.0/lib/geode-dependencies.jar
|
|
|
|
gfsh>list members
|
|
Name | Id
|
|
---------------- | ------------------------------------------------------------------------
|
|
SpringLocatorOne | 10.99.199.24(SpringLocatorOne:30043:locator)<ec><v0>:41000 [Coordinator]
|
|
SpringLocatorTwo | 10.99.199.24(SpringLocatorTwo:30077:locator)<ec><v1>:41001
|
|
SpringServer | 10.99.199.24(SpringServer:30216)<v2>:41002
|
|
GfshLocator | 10.99.199.24(GfshLocator:30259:locator)<ec><v3>:41003
|
|
GfshServer | 10.99.199.24(GfshServer:30295)<v4>:41004
|
|
----
|
|
|
|
You must be careful to vary the ports and name your peer members appropriately. With Spring, and Spring Boot
|
|
for Apache Geode and Pivotal GemFire (SBDG) in particular, it really is that easy!
|
|
|
|
[[geode-manager-applications]]
|
|
=== Building Manager Applications
|
|
|
|
As discussed in the previous sections above, it is possible to enable a Spring Boot configured and bootstrapped
|
|
Apache Geode or Pivotal GemFire peer member node in the cluster to function as a _Manager_.
|
|
|
|
An Apache Geode or Pivotal GemFire _Manager_ is a peer member node in the cluster running the Management Service,
|
|
allowing the cluster to be managed and monitored using JMX based tools, like _Gfsh_, _JConsole_ or _JVisualVM_,
|
|
for instance. Any tool that uses the JMX API can connect to and manage the GemFire/Geode cluster for whatever purpose.
|
|
|
|
The cluster may have more than 1 _Manager_ for redundancy. Only server-side, peer member nodes in the cluster
|
|
may function as a _Manager_. Therefore, a `ClientCache` application cannot be a _Manager_.
|
|
|
|
To create a _Manager_, you use the SDG `@EnableManager` annotation.
|
|
|
|
The 3 primary uses of the `@EnableManager` annotation to create a _Manager_ is:
|
|
|
|
.1 - CacheServer Manager Application
|
|
[source,java]
|
|
----
|
|
@SpringBootApplication
|
|
@CacheServerApplication(name = "CacheServerManagerApplication")
|
|
@EnableManager(start = true)
|
|
class CacheServerManagerApplication {
|
|
// ...
|
|
}
|
|
----
|
|
|
|
.2 - Peer Cache Manager Application
|
|
[source,java]
|
|
----
|
|
@SpringBootApplication
|
|
@PeerCacheApplication(name = "PeerCacheManagerApplication")
|
|
@EnableManager(start = "true")
|
|
class SpringBootPeerCacheManagerApplication {
|
|
// ...
|
|
}
|
|
----
|
|
|
|
.3 - Locator Manager Application
|
|
[source,java]
|
|
----
|
|
@SpringBootApplication
|
|
@LocatorApplication(name = "LocatorManagerApplication")
|
|
@EnableManager(start = true)
|
|
class LocatorManagerApplication {
|
|
// ...
|
|
}
|
|
----
|
|
|
|
#1 creates a peer `Cache` instance with a `CacheServer` component accepting client connections along with
|
|
an embedded _Manager_ enabling JMX clients to connect.
|
|
|
|
#2 creates only a peer `Cache` instance along with an embedded _Manager_. As a peer `Cache` with NO `CacheServer`
|
|
component, clients are not able to connect to this node. It is merely a server managing data.
|
|
|
|
#3 creates a _Locator_ instance with an embedded _Manager_.
|
|
|
|
In all configuration arrangements, the _Manager_ was configured to start immediately.
|
|
|
|
TIP: See the `@EnableManager` annotation
|
|
{spring-data-geode-javadoc}/org/springframework/data/gemfire/config/annotation/EnableManager.html[Javadoc]
|
|
for additional configuration options.
|
|
|
|
As of Apache Geode 1.11.0, you must now include additional Geode dependencies on your Spring Boot application classpath
|
|
to make your application a proper Apache Geode/Pivotal GemFire _Manager_ in the cluster, particularly if you are also
|
|
enabling the embedded HTTP service in the _Manager_.
|
|
|
|
The required dependencies are:
|
|
|
|
.Additional Manager dependencies expressed in Gradle
|
|
[source,groovy]
|
|
----
|
|
runtime "org.apache.geode:geode-http-service"
|
|
runtime "org.apache.geode:geode-web"
|
|
runtime "org.springframework.boot:spring-boot-starter-jetty"
|
|
----
|
|
|
|
The embedded HTTP service (implemented with the Eclipse Jetty Servlet Container), runs the Management (Admin) REST API,
|
|
which is used by tooling, such as _Gfsh_, to connect to the cluster over HTTP. In addition, it also runs the
|
|
{apache-geode-docs}/tools_modules/pulse/pulse-overview.html[Pulse] Monitoring Tool.
|
|
|
|
Even if you do not start the embedded HTTP service (Jetty Servlet Container), a _Manager_ still requires
|
|
the `geode-http-service`, `geode-web` and `spring-boot-starter-jetty` dependencies.
|