Serving
The Restate SDK is served as a HTTP handler. You can choose to run this in a standalone HTTP2 server, or connect the handler into a FaaS system like Lambda.
Creating a HTTP2 server
- Create the Restate Server
- Bind one or multiple services to it.
- Listen on the specified port for connections and requests.
if err := server.NewRestate().Bind(restate.Reflect(MyService{})).Bind(restate.Reflect(MyVirtualObject{})).Start(context.Background(), ":9080"); err != nil {log.Fatal(err)}
Customizing the HTTP2 server
If you need to customize the HTTP2 server, or serve over HTTP1.1
you can call .Handler()
instead of Start()
, and then use the
handler as normal. To discover services over HTTP1.1 you must
provide the --use-http1.1
CLI flag.
handler, err := server.NewRestate().Bind(restate.Reflect(MyService{})).Bind(restate.Reflect(MyVirtualObject{})).Handler()if err != nil {log.Fatal(err)}
By default, this handler will advertise itself as working bidirectionally; the SDK will try to get completions from the runtime during execution.
However, you can use the method .Bidirectional(false)
on the endpoint
builder to change this on platforms that do not support bidirectional
communication, such as Lambda. If you don't do this your handler may get
stuck.
Creating a Lambda handler
To register your service as a Lambda function change the endpoint into a Lambda handler,
setting .Bidirectional(false)
as Lambda does not support bidirectional streaming
of request data.
handler, err := server.NewRestate().Bind(restate.Reflect(MyService{})).Bind(restate.Reflect(MyVirtualObject{})).Bidirectional(false).Handler()if err != nil {log.Fatal(err)}lambda.Start(httpadapter.New(handler).ProxyWithContext)
Have a look at the deployment section for guidance on how to deploy your services on AWS Lambda.
The implementation of your services and handlers remains the same for both deployment options.
Validating request identity
SDKs can validate that incoming requests come from a particular Restate instance. You can find out more about request identity in the Security docs
if err := server.NewRestate().Bind(restate.Reflect(MyService{})).// withClass highlight-lineWithIdentityV1("publickeyv1_w7YHemBctH5Ck2nQRQ47iBBqhNHy4FV7t2Usbye2A6f").Start(context.Background(), ":9080"); err != nil {log.Fatal(err)}