Skip to content

Small example for a microservice using golang, mongodb and gorilla

Notifications You must be signed in to change notification settings

aldenso/golang-mongodb-microservice-example

Repository files navigation

golang-mongodb-microservice-example

This is a small example for a restful service using golang, mongodb and gorilla.

My lab consist in only one app server and one mongodb server:

Mongodb container: alpine based with default port (27017).
APP container:     alpine based with go program executable using port 8080.

First let's create the mongodb docker image.

docker build -f Dockerfile_mongo.dockerfile . --tag aldenso:mongodb-alpine

Run one container.

docker run -d --name mongodb -p 27017:27017 -v /vols4docker/mongodb:/data/db \
    aldenso:mongodb-alpine

Now let's build the app docker image.

Build the binary.

CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-w' -o server .

Build the image.

docker build -f Dockerfile_goapi.dockerfile . --tag aldenso:goapi4mongo-alpine

export the mongodb connection info.

export MONGODB_IP="$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' mongodb)"

Create the app container.

docker run -d --name goapi4mongo1 -p 8080:8080 -e MONGODB_IP=$MONGODB_IP \
    --restart=on-failure aldenso:goapi4mongo-alpine

Get the IP of the app container.

export APPSERVER_IP="$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' goapi4mongo1)"

List todos:

curl -i http://$APPSERVER_IP:8080/api/todos

Show a single todo (replace {id} for the equivalent bson.ObjectIdHex):

curl -i http://$APPSERVER_IP:8080/api/todos/{id} # Replace the {id} with one created before.

Add todo:

curl -i -H "Content-Type: application/json" -X POST \
    -d '{"name": "Task_14", "completed": false}'  \
    http://$APPSERVER_IP:8080/api/todos

or

curl -i http://$APPSERVER_IP:8080/api/todos -X POST -d @add.json

where add.json file is something like:

{
    "name":   "Task_14",
    "completed":   false
}

Update todo (replace {id} for the equivalent bson.ObjectIdHex):

curl -i -H "Content-Type: application/json" -X PUT \
    -d '{"name": "update_task", "completed": false}' \
    http://$APPSERVER_IP:8080/api/todos/{id}

or

curl -i http://$APPSERVER_IP:8080/api/todos/{id} -X PUT -d @update.json

where update.json file is something like:

{
    "name":   "Task_X",
    "completed":   true
}

Delete todo:

curl -i http://$APPSERVER_IP:8080/api/todos/{id} -X DELETE

Search todo by name (replace {name} for the equivalent search pattern):

curl -i http://$APPSERVER_IP:8080/api/todos/search/byname/{name}

Search todo by status completed (replace {status} for true or false ):

curl -i http://$APPSERVER_IP:8080/api/todos/search/bystatus/{status}

Log samples:

2018/02/24 22:11:40 172.17.0.1:56552	GET	/api/todos	HTTP/1.1	200	4	1.621415ms
2018/02/24 22:11:53 172.17.0.1:56554	POST	/api/todos	HTTP/1.1	201	0	1.125878748s
2018/02/24 22:13:08 172.17.0.1:56562	GET	/api/todos/	HTTP/1.1	404	0	0
2018/02/24 22:13:10 172.17.0.1:56564	GET	/api/todos	HTTP/1.1	200	160	857.074µs
2018/02/24 22:13:44 172.17.0.1:56568	GET	/api/todos/5a91e328d7f8960001a99aeb	HTTP/1.1	200	132	1.702964ms
2018/02/24 22:14:40 172.17.0.1:56572	PUT	/api/todos/5a91e328d7f8960001a99aeb	HTTP/1.1	204	0	37.554697ms
2018/02/24 22:16:34 172.17.0.1:56580	GET	/api/todos	HTTP/1.1	200	159	898.811µs
2018/02/24 22:18:51 172.17.0.1:56592	GET	/api/todos/search/byname/Task	HTTP/1.1	200	159	901.338µs
2018/02/24 22:20:20 172.17.0.1:56600	GET	/api/todos/search/bystatus/false	HTTP/1.1	200	159	1.013693ms
2018/02/24 22:23:01 172.17.0.1:56618	POST	/api/todos	HTTP/1.1	201	0	907.716µs
2018/02/24 22:26:45 172.17.0.1:56634	GET	/api/todos	HTTP/1.1	200	314	992.902µs
2018/02/24 22:27:19 172.17.0.1:56640	DELETE	/api/todos/5a91e328d7f8960001a99aeb	HTTP/1.1	204	0	1.193428ms
2018/02/24 22:27:31 172.17.0.1:56642	DELETE	/api/todos/5a91e5c5d7f8960001a99aec	HTTP/1.1	204	0	3.093297ms

After playing with the api you can stop the containers.

docker stop goapi4mongo1 mongodb

Just for your information, check your new images and you'll confirm the small size of them.

docker images
REPOSITORY              TAG                  IMAGE ID            CREATED             SIZE
aldenso                 goapi4mongo-alpine   b9ba2da7dc62        About an hour ago   9.64MB
aldenso                 mongodb-alpine       0e53354d7bc1        About an hour ago   106MB

About

Small example for a microservice using golang, mongodb and gorilla

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published