GithubHelp home page GithubHelp logo

loachfish / consul-client Goto Github PK

View Code? Open in Web Editor NEW

This project forked from rickfast/consul-client

0.0 2.0 0.0 1002 KB

Java Client for Consul HTTP API

License: Other

Shell 0.33% Java 99.67%

consul-client's Introduction

Build Status Maven Central

Consul Client for Java

Simple client for the Consul HTTP API. For more information about the Consul HTTP API, go here.

Installation

In 0.13.x, both shaded and non-shaded JARs are provided. The shaded JAR has a shaded classifier, while the non-shaded JAR has no classifier. Note that this is a change from 0.12 and 0.11.

In 0.11.X and 0.12.x, the Consul JAR is a shaded JAR, with most dependencies included. This was done because a number of issues being files were related to dependency conflicts. The JAR is a bit bigger, but the HTTP + JSON libraries are now internal to the JAR. Only Guava is still a transitive dependency.

Gradle:

dependencies {
    compile 'com.orbitz.consul:consul-client:1.3.6'
}

Maven:

<dependencies>
    <dependency>
        <groupId>com.orbitz.consul</groupId>
        <artifactId>consul-client</artifactId>
        <version>1.3.6</version>
    </dependency>
</dependencies>

Basic Usage

Example 1: Connect to Consul.

Consul client = Consul.builder().build(); // connect on localhost

Example 2: Register and check your service in with Consul.

AgentClient agentClient = client.agentClient();

String serviceId = "1";
Registration service = ImmutableRegistration.builder()
        .id(serviceId)
        .name("myService")
        .port(8080)
        .check(Registration.RegCheck.ttl(3L)) // registers with a TTL of 3 seconds
        .tags(Collections.singletonList("tag1"))
        .meta(Collections.singletonMap("version", "1.0"))
        .build();

agentClient.register(service);

// Check in with Consul (serviceId required only).
// Client will prepend "service:" for service level checks.
// Note that you need to continually check in before the TTL expires, otherwise your service's state will be marked as "critical".
agentClient.pass(serviceId);

Example 3: Find available (healthy) services.

HealthClient healthClient = client.healthClient();

// Discover only "passing" nodes
List<ServiceHealth> nodes = healthClient.getHealthyServiceInstances("DataService").getResponse();

Example 4: Store key/values.

KeyValueClient kvClient = client.keyValueClient();

kvClient.putValue("foo", "bar");
String value = kvClient.getValueAsString("foo").get(); // bar

Example 5: Subscribe to value change.

You can use the ConsulCache implementations to easily subscribe to Key-Value changes.

final KeyValueClient kvClient = client.keyValueClient();

kvClient.putValue("foo", "bar");

KVCache cache = KVCache.newCache(kvClient, "foo");
cache.addListener(newValues -> {
    // Cache notifies all paths with "foo" the root path
    // If you want to watch only "foo" value, you must filter other paths
    Optional<Value> newValue = newValues.values().stream()
            .filter(value -> value.getKey().equals("foo"))
            .findAny();

    newValue.ifPresent(value -> {
        // Values are encoded in key/value store, decode it if needed
        Optional<String> decodedValue = newValue.get().getValueAsString();
        decodedValue.ifPresent(v -> System.out.println(String.format("Value is: %s", v))); //prints "bar"
    });
});
cache.start();
// ...
cache.stop();

Example 6: Subscribe to healthy services

You can also use the ConsulCache implementations to easily subscribe to healthy service changes.

HealthClient healthClient = client.healthClient();
String serviceName = "my-service";

ServiceHealthCache svHealth = ServiceHealthCache.newCache(healthClient, serviceName);
svHealth.addListener((Map<ServiceHealthKey, ServiceHealth> newValues) -> {
    // do something with updated server map
});
svHealth.start();
// ...
svHealth.stop();

Example 7: Find Raft peers.

StatusClient statusClient = client.statusClient();
statusClient.getPeers().forEach(System.out::println);

Example 8: Find Raft leader.

StatusClient statusClient = client.statusClient();
System.out.println(statusClient.getLeader()); // 127.0.0.1:8300

Development Notes

consul-client makes use of immutables to generate code for many of the value classes. This provides a lot of functionality and benefit for little code, but it does require some additional development setup.

Official instructions are here, although you may want to change the target directories to the more gradle-like "generated/source/apt/main" and "generated/source/apt/test" targets.

Integration Tests

Integrations Tests rely on the assumption that a Consul server is running on localhost's default port 8500 and another one with enabled ACLs on port 8501.

A shell skript that sets up the integration test environment is available, to execute all tests run:

./do test

you can clean up any leftover Docker containers with

./do clean-environment

for local development setup you can use

./do setup-environment

to start the needed docker containers.

Eclipse-specific notes

Their instructions for eclipse a bit difficult to grok, but I was able to get eclipse to compile by following the second part of the instructions. Essentially, enable annotation processing, then extend the M2_REPO variable to include the immutables annotation processor. One thing is that documentation is out of date in that it tells you the wrong jar to include - it should be org/immutables/value/2.0.16/value-2.0.16.jar.

extending M2_REPO

IntelliJ-specific notes

One caveat found using IntelliJ is that you must mark your source directory as a "Generated sources root" for IntelliJ to add the contents to your classpath. For example, if you setup your target directory as "generated/source/apt/main", right-click on the 'main' subfolde and click "Mark Directory as -> Generated sources root".

Another issue is that upon changes to the build.gradle file or reimporting the gradle project, the "sources root" designation may be cleared, and it will need to be re-marked.

consul-client's People

Contributors

rickfast avatar yfouquet avatar alesharik avatar cschroedl-gov avatar adericbourg avatar jplock avatar yannrobert avatar weberr13 avatar odiszapc avatar maqdev avatar lburgazzoli avatar vascokk avatar robinmeiss avatar hrmohr avatar alugowski avatar isuftin avatar thongsav-usgs avatar heanssgen-troy avatar jeinwag avatar robbert229 avatar killerwhile avatar art4noir avatar shuraa avatar elleflorio avatar matthurne avatar pszymczyk avatar rehevkor5 avatar shawngardner avatar shays10 avatar suvitruf avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.