Skip to main content

Quickstart

This guide takes you through your first steps with Restate.

We will run a simple Restate Greeter service that listens on port 9080 and responds with You said hi to <name>! to a greet request.

Quickstart

SDK:

Build tool:

Framework:

Prerequisites
1
Install Restate Server & CLI

Restate is a single self-contained binary. No external dependencies needed.

Install Restate Server and CLI via:

brew install restatedev/tap/restate-server restatedev/tap/restate

Then run the Restate Server with:

restate-server

You can find the Restate UI running on port 9070 (http://localhost:9070) after starting the Restate Server.

2
Get the Greeter service template

restate example java-hello-world-maven-spring-boot &&
cd java-hello-world-maven-spring-boot

3
Run the Greeter service

You are all set to start developing your service. Open the project in an IDE, run your service and let it listen on port 9080 for requests:

mvn compile spring-boot:run

4
Register the service

Tell Restate where the service is running, so Restate can discover and register the services and handlers behind this endpoint. You can do this via the UI (http://localhost:9070) or via:

restate deployments register http://localhost:9080

If you run Restate with Docker, use http://host.docker.internal:9080 instead of http://localhost:9080.

5
Send a request to the Greeter service

Invoke the service via the Restate UI playground: go to http://localhost:9070, click on your service and then on playground.

Restate UI Playground

Or invoke via curl:

curl localhost:8080/Greeter/greet --json '{"name": "Sarah"}'

🎉
Congratulations, you just ran Durable Execution!

The invocation you just sent used Durable Execution to make sure the request ran till completion. For each request, it sent a notification, slept for a second, and then sent a reminder.

GitHub
@RestateService
public class Greeter {
@Value("${greetingPrefix}")
private String greetingPrefix;
record Greeting(String name) {}
record GreetingResponse(String message) {}
@Handler
public GreetingResponse greet(Context ctx, Greeting req) {
// Durably execute a set of steps; resilient against failures
String greetingId = ctx.random().nextUUID().toString();
ctx.run("Notification", () -> sendNotification(greetingId, req.name));
ctx.sleep(Duration.ofSeconds(1));
ctx.run("Reminder", () -> sendReminder(greetingId, req.name));
// Respond to caller
return new GreetingResponse("You said " + greetingPrefix + " to " + req.name + "!");
}
}

Send a request for Alice to see how the service behaves when it occasionally fails to send the reminder and notification:

curl localhost:8080/Greeter/greet --json '{"name":"Alice"}'

You can see in the service logs and in the Restate UI how the request gets retried. On a retry, it skipped the steps that already succeeded.

Restate UI Durable Execution

Even the sleep is durable and tracked by Restate. If you kill/restart the service halfway through, the sleep will only last for what remained.

Durable Execution

Restate persists the progress of the handler. Letting you write code that is resilient to failures out of the box. Have a look at the Durable Execution page to learn more.

Next steps