This simple project aims to create a decomposed Key-Value store by implementing two services, Rest API and RPC, which communicate over gRPC.
The solution is written in golang and provides a solution using the grpc-gateway
package in order to setup handlers to validate the JSON requests via API and convert them to proto messages in the RPC.
The Key-Value store service can:
- Store a value at a given key
- Retrieve the value for a given key
- Delete a given key
The application is setup using docker-compose
which uses a single docker file and creates the specific application based on command line arguments passed into the built application.
The solution should work based on using the following command and expect and output where both services print that they are initialized:
$ docker-compose up --build
...
kv-rest | Key-Value REST Service Initializing...
kv-rpc | Key-Value RPC Service Initializing...
The application takes JSON requests on a local endpoint exposed over localhost:8080
. The Makefile
provides a way to quickly test out the three methods by using the make test
command:
$ make test
curl -X POST localhost:8080/v1/kv -d '{"key": "nice", "value": "gotem" }' && echo
{"key":"nice", "value":"gotem"}
curl -X GET localhost:8080/v1/kv/nice && echo
{"key":"nice", "value":"gotem"}
curl -X DELETE localhost:8080/v1/kv/nice && echo
{}
# I should expect an error here...
curl -X GET localhost:8080/v1/kv/nice && echo
{"code":5, "message":"Key-Value pair could not be found at key nice", "details":[]}
# I should expect an error here...
curl -X DELETE localhost:8080/v1/kv/nice && echo
{"code":5, "message":"Key-Value pair could not be found at key nice", "details":[]}
Additional curl
requests may also be used to add key/value pairs under new keys and the proto validation should be able to eliminate invalid data types when hitting the various endpoints.