Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
Add it in your build.sbt at the end of resolvers:
resolvers += "jitpack" at "https://jitpack.io"
Add it in your project.clj at the end of repositories:
:repositories [["jitpack" "https://jitpack.io"]]
Step 2. Add the dependency
dependencies {
implementation 'com.github.kinguinltdhk:leadership-consul:0.3.1'
}
<dependency>
<groupId>com.github.kinguinltdhk</groupId>
<artifactId>leadership-consul</artifactId>
<version>0.3.1</version>
</dependency>
libraryDependencies += "com.github.kinguinltdhk" % "leadership-consul" % "0.3.1"
:dependencies [[com.github.kinguinltdhk/leadership-consul "0.3.1"]]
Look into releases section and pick version.
Put into Your gradle.build
repositories {
// ...
maven { url "https://jitpack.io" }
}
dependencies {
// ...
compile "com.github.kinguinltdhk:leadership-consul:0.2.0"
}
Use SimpleClusterFactory
to build()
Your Gambler
instance.
Every Gambler
implementation provides asObservable()
which facilitate access to events by subscribers.
This code will create ActiveGambler
and subscribe to it with simple console output printer and print Gambler
events.
You should see in the output:
elected // after 5 sconds
elected.first // after 5 sconds
elected // every 10 seconds
Notice: Execution of this code require Consul to be available on localhost:8500.
new SimpleClusterFactory()
.mode(SimpleClusterFactory.MODE_MULTI)
.debug(true)
.build()
.asObservable()
.subscribe(n -> System.out.println(n));
@Profile("multiinstance")
@Configuration
@ConditionalOnConsulEnabled
@EnableConfigurationProperties(value = {ClusterProperties.class, ConsulProperties.class})
public class MultiInstance {
@Autowired
private ClusterProperties clusterProperties;
@Autowired
private ConsulProperties consulProperties;
@Bean
public SessionConsulClient sessionConsulClient() {
return new SessionConsulClient(consulProperties.getHost(), consulProperties.getPort());
}
@Bean
public KeyValueConsulClient keyValueConsulClient() {
return new KeyValueConsulClient(consulProperties.getHost(), consulProperties.getPort());
}
@Bean
@Primary
public Gambler multiinstance(SessionConsulClient sessionConsulClient, KeyValueConsulClient keyValueConsulClient) {
return new SimpleClusterFactory(sessionConsulClient, keyValueConsulClient)
.mode(SimpleClusterFactory.MODE_MULTI)
.configure(clusterProperties.getLeader())
.build();
}
}
Note: Above configuration only works when Consul is enabled cause of @ConditionalOnConsulEnabled
. You can remove this annotation.
@ConfigurationProperties(prefix = "cluster")
public class ClusterProperties {
private ClusterConfiguration leader;
public ClusterConfiguration getLeader() {
return leader;
}
public void setLeader(ClusterConfiguration leader) {
this.leader = leader;
}
}
In application.yml
put section:
cluster:
leader:
serviceName: cluster
serviceId: node-1
consul:
host: localhost
port: 8500
session:
ttl: 15
refresh: 7
election:
envelopeTemplate: services/%s/leader