shopping-cart-java-akka-serverless
This project is an Akka Serverless service that demonstrates a simple shopping cart implemented as an Akka Serverless service. The project contains two shopping cart implementations. One implementation has a shopping cart component as a value entity. The second shopping cart implementation has a shopping cart component as an event sourced entity. Both shopping cart implementation have a functionally equivalent API.
Designing
While designing your service it is useful to read designing services
Developing
This project has a bare-bones skeleton service ready to go, but in order to adapt and extend it it may be useful to read up on developing services and in particular the Java section
Building
You can use Maven to build your project, which will also take care of generating code based on the .proto
definitions:
mvn compile
Running Locally
In order to run your application locally, you must run the Akka Serverless proxy. The included docker-compose
file contains the configuration required to run the proxy for a locally running application. It also contains the configuration to start a local Google Pub/Sub emulator that the Akka Serverless proxy will connect to. To start the proxy, run the following command from this directory:
docker-compose up
On Linux this requires Docker 20.10 or later (https://github.com/moby/moby/pull/40007), or for a
USER_FUNCTION_HOST
environment variable to be set manually.
docker-compose -f docker-compose.yml -f docker-compose.linux.yml up
To start the application locally, the exec-maven-plugin
is used. Use the following command:
mvn compile exec:exec
With both the proxy and your application running, any defined endpoints should be available at http://localhost:9000
. In addition to the defined gRPC interface, each method has a corresponding HTTP endpoint. Unless configured otherwise (see Transcoding HTTP), this endpoint accepts POST requests at the path /[package].[entity name]/[method]
. For example, using curl
:
> curl -XPOST -H "Content-Type: application/json" localhost:9000/io.example.CounterService/GetCurrentCounter -d '{"counterId": "foo"}'
The command handler for `GetCurrentCounter` is not implemented, yet
For example, using grpcurl
:
> grpcurl -plaintext -d '{"counterId": "foo"}' localhost:9000 io.example.CounterService/GetCurrentCounter
ERROR:
Code: Unknown
Message: The command handler for `GetCurrentCounter` is not implemented, yet
Note: The failure is to be expected if you have not yet provided an implementation of
GetCurrentCounter
in your entity.
Deploying
To deploy your service, install the akkasls
CLI as documented in Setting up a local development environment and configure a Docker Registry to upload your docker image to.
You will need to update the dockerImage
property in the pom.xml
and refer to Configuring registries for more information on how to make your docker image available to Akka Serverless.
Finally you can or use the Akka Serverless Console to create a project and then deploy your service into the project either by using mvn deploy
, through the akkasls
CLI or via the web interface. When using mvn deploy
, Maven will also conveniently package and publish your docker image prior to deployment.