io.scalecube.services.examples.helloworld.Example2 Maven / Gradle / Ivy
package io.scalecube.services.examples.helloworld;
import io.scalecube.services.Address;
import io.scalecube.services.Microservices;
import io.scalecube.services.Microservices.Context;
import io.scalecube.services.ServiceCall;
import io.scalecube.services.api.ServiceMessage;
import io.scalecube.services.discovery.ScalecubeServiceDiscovery;
import io.scalecube.services.examples.helloworld.service.GreetingServiceImpl;
import io.scalecube.services.examples.helloworld.service.api.Greeting;
import io.scalecube.services.transport.rsocket.RSocketServiceTransport;
import io.scalecube.transport.netty.websocket.WebsocketTransportFactory;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Mono;
/**
* The Hello World project is a time-honored tradition in computer programming. It is a simple
* exercise that gets you started when learning something new. Let’s get started with ScaleCube!
*
* The example starts 2 cluster member nodes. 1. seed is a member node and holds no services of
* its own. 2. The microservices variable is a member that joins seed member and
* provision GreetingService instance. This Code demonstrates executing a ScaleCube
* service using a ServiceMessage rather than an explicit Service interface thus
* eliminating Service interface dependency.
*/
public class Example2 {
static final String SERVICE_QUALIFIER = "/io.scalecube.Greetings/sayHello";
/**
* Start the example.
*
* @param args ignored
*/
public static void main(String[] args) {
// ScaleCube Node node with no members
Microservices seed =
Microservices.start(
new Context()
.discovery(
serviceEndpoint ->
new ScalecubeServiceDiscovery()
.transport(cfg -> cfg.transportFactory(new WebsocketTransportFactory()))
.options(opts -> opts.metadata(serviceEndpoint)))
.transport(RSocketServiceTransport::new));
// Construct a ScaleCube node which joins the cluster hosting the Greeting Service
final Address seedAddress = seed.discoveryAddress();
Microservices ms =
Microservices.start(
new Context()
.discovery(
endpoint ->
new ScalecubeServiceDiscovery()
.transport(cfg -> cfg.transportFactory(new WebsocketTransportFactory()))
.options(opts -> opts.metadata(endpoint))
.membership(cfg -> cfg.seedMembers(seedAddress.toString())))
.transport(RSocketServiceTransport::new)
.services(new GreetingServiceImpl()));
// Create a proxy to the seed service node
ServiceCall service = seed.call();
// Create a ServiceMessage request with service qualifier and data
ServiceMessage request =
ServiceMessage.builder().qualifier(SERVICE_QUALIFIER).data("joe").build();
// Execute the Greeting Service to emit a single Greeting response
Publisher publisher = service.requestOne(request, Greeting.class);
// Convert the Publisher using the Mono API which ensures it will emit 0 or 1 item.
Mono.from(publisher)
.subscribe(
consumer -> {
// handle service response
Greeting greeting = consumer.data();
System.out.println(greeting.message());
});
seed.close();
ms.close();
}
}