You are contracted to refactor Professor Farnsworth's legacy client/server code, and you decide to spice weasel (BAM!) things up with K8s, gRPC, and GraphQL. The professor wants to run a gateway service at the Planet Express headquarters that can communicate with Planet Express ship via gRPC. Furthermore, he wants a nice React UI to show data about the ship, deliveries, crew members, etc that will communicate with the gateway service via GraphQL.
In this architecture the ship is a backend service, the headquarters is a api gateway, and the frontend is a React SPA.
When you are done shopping for lightspeed briefs you decide to setup the new project. You realize that some of it is already set up for you. The ./headquarters
directory contains the gateway/client code and the
./ship
directory contains the server code.
- Create a gitlab repo called
planet-express
- Setup Your Dev Environment
- Install go (https://golang.org/doc/install)
- Install protoc (https://grpc.io/docs/protoc-installation/)
- Follow the getting started guide to install the protoc go plugin (https://grpc.io/docs/languages/go/quickstart/)
go get google.golang.org/grpc
go get github.com/golang/protobuf
- Copy the files in this repo over to your new repo
- Run
go mod init gitlab.com/<gitlab-username>/planet-express
- Your go mod should look something like the included
_go.mod
file (delete this file when done) - Fix the import statements in
./ship/main.go
and./headquarters/main.go
(the lines commented like so// pb "gitlab.com/<gitlab-username>/planet-express/ship/pkg/planetexpress"
) - Validate that you can build and genarate go code by running
make
- Validate you have the executables
./ship/ship
and./headquarters/headquarters
- Run the server
./ship/ship
and the client./headquarters/headquarters
in separate terminal windows and confirm the output.
The protoc compiler with the go plugin will autogenerate client and server grpc stubs for you. Make sure this runs successfully with make
You should try changing the protobuf files in ./proto
and re-run make
. The generated files are put in ./ship/pkg/planetexpress
and ./headquarters/pkg/planetexpress
A makefile has been provided for you that will generate go code with the protoc compiler and build the executables. Run make
and validate that you have executables at ./ship/ship
and ./headquarters/headquarters
Time Estimate: 3 hours
The basic client and server code has been provided for you. Your job is to do the following:
- Implement
crew.proto
anddelivery.proto
and the functions listed inplanet_express_service.proto
- You should experiment with different protobuf types for the crew and delivery resources. Each resource should demonstrate an understanding of protobuf.
- Refactor
ship.proto
to use thecrew
anddelivery
resources. - Implement the rpc functions (defined in
planet_express_service.proto
) in both the client (./headquarters
) and server (./ship
), following theGetShip
example. You do not need to add a database. Experiment with using data contained in the gRPC request. - Output data about the planet express ship, deliveries, and crew members to a json file called
planet_express.json
. Feel free to get creative with your data and protobuf resources. - Add a dockerfile to
./ship
so that we can run the server with docker.
Time Estimate: 4 hours
- Provide a basic helm template for the
./ship
server. This should contain a kubernetes deployment and service. We should be able to port-forward your service to call the./ship
rpc functions. - Add additional protobuf resources like
ShipEngine
. You can get creative with this. - Add graphql support to the api gateway (headquarters). A good library for this is https://github.com/graph-gophers/graphql-go. Map a graphql endpoint/resource to a gRPC call, like for GetShip. A GraphQL client should be able to query data from the headquarters which in turn resolves the query by getting data from the ship backend via gRPC.
Time Estimate: 4 hours
- Add a simple React SPA that displays data about the ship using GraphQL to communicate with the gateway (headquarters service). You can put this in the
./dashboard
directory. - Add some go unit tests to the ship server.
** These would really impress us here at Planet Express! **
Make your repository public and share the repo url with Divvy's recruiter.
- https://grpc.io/docs/languages/go/quickstart/
- https://grpc.io/docs/languages/go/basics/
- https://cloud.google.com/apis/design
- https://github.com/graph-gophers/graphql-go
- https://reactjs.org/docs/create-a-new-react-app.html
If you find errors or otherwise need clarification on anything in the excercise, please reach out to Justin Sharp justin.sharp@divvypay.com.