Skip to content

Aristat/golang-example-app

Folders and files

NameName
Last commit message
Last commit date

Latest commit

f7be6c3 · May 2, 2022

History

89 Commits
Apr 30, 2022
May 2, 2022
May 2, 2022
Apr 30, 2022
Aug 22, 2021
May 2, 2022
May 26, 2021
May 25, 2021
Aug 22, 2021
May 2, 2022
Oct 18, 2019
Jun 1, 2021
May 2, 2022
May 2, 2022
Oct 25, 2019
Aug 21, 2020
Sep 2, 2019
Aug 22, 2021

Repository files navigation

golang logo

Golang Example Application

Table of Contents

Overview

This is an example golang application. Commands list:

  1. Daemon - main service
  2. Product service - service that returns Product, an example of gRPC client/server interaction
  3. Health check service - this service is needed to show how convenient to understand on which of the services an error occurred in jaeger
  4. Migrate - commands for migration
  5. JWT - commands for generate JWT token

Package list

Packages which use in this example project

  1. sql-migrate - SQL migrations
  2. wire - dependency Injection
  3. viper - environment configuration
  4. cobra - create commands
  5. cast - easy casting from one type to another
  6. gorm - database ORM
  7. zap - logger
  8. mux - http router
  9. nats-streaming - NATS Streaming System
  10. gqlgen - graphql server library
  11. protobuf - Google's data interchange format
  12. grpc - RPC framework
  13. opentelemetry - OpenTelemetry
  14. jaeger - Jaeger Bindings for Go OpenTelemetry API
  15. casbin - Supports access control
  16. dataloaden - DataLoader for graphql
  17. nats - Golang client for NATS, the cloud native messaging system

Installing

Install the Golang and GO environment

https://golang.org/doc/install

Install Postgresql (if you want to run locally)

Clone repository

git clone git@github.com:Aristat/golang-example-app.git (go get)

Local environment

Install Golang packages without modules

make install

Install database

make createdb

Sql migrations

sql-migrate up

Install Golang dependencies

make dependencies

Generate artifacts(binary files and configs)

make build

Packages for proto generator

https://grpc.io/docs/languages/go/quickstart/#prerequisites

Set APP_WD if you start to use html templates or path to ssh keys or run make test

export APP_WD=go_path to project_path/resources or project_path/artifacts

Docker environment

Generate docker image

DOCKER_IMAGE=golang-example-app TAG=development make docker-image

Run services

Start in local machine

Up jaeger in docker-compose or disable Jaeger(and rebuild binary file) in resources/configs/*.yaml

docker-compose up jaeger

Start daemon (main service)

make start

or

./artifacts/bin daemon -c ./artifacts/configs/development.yaml -d

Start product service

./artifacts/bin product-service -c ./artifacts/configs/development.yaml -d

Start health-check service

./artifacts/bin health-check -c ./artifacts/configs/development.yaml -d

Start in docker

Run this commands

docker-compose rm # Remove previous containers
REMOVE_CONTAINERS=on DOCKER_IMAGE=golang-example-app TAG=development make docker-image # Generate new docker image
docker-compose up

or run script

./scripts/docker-compose-start.sh

Getting Started

Jaeger

http://localhost:16686

Http example with gRPC

http://localhost:9096/products_grpc

Http example with Nats Streaming

http://localhost:9096/products_nats

Http example with graceful shutdown(long request, you can check the server shutdown)

http://localhost:9096/products_slowly

Graphql example with gRPC

Graphql client for testing. End-point http://localhost:9096/query.

Generate JWT for Graphql authorization

./artifacts/bin jwt token --key='./artifacts/keys/local/private_key.pem' --fields='{"sub": "owner", "iss": "test-service"}'

Set JWT token in headers

{
  "Authorization": "bearer token"
}

Example query

query oneUser {
  users {
    one(email: "test@gmail.com") {
      email
      id
    }
  }
}

Example query with data loader

query allProducts {
  products {
    list {
      products {
        id
        productItems {
          id
          name
        }
      }
    }
  }
}

Example mutation

mutation createUser {
  users {
    createUser(email: "test1@gmail.com", password: "123456789") {
      id
      email
    }
  }
}

Testing

➜  make test