Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/bruce-mig/simple-bank

a bank service in Go
https://github.com/bruce-mig/simple-bank

asynq backend docker gin go golang grpc grpc-go http-server kubernetes message-queue redis

Last synced: 2 days ago
JSON representation

a bank service in Go

Awesome Lists containing this project

README

        

# Simple bank service

The service provides APIs for the frontend to do following things:

1. Create and manage bank accounts, which are composed of owner’s name, balance, and currency.
2. Record all balance changes to each of the account. So every time some money is added to or subtracted from the account, an account entry record will be created.
3. Perform a money transfer between 2 accounts. This should happen within a transaction, so that either both accounts’ balance are updated successfully or none of them are.

## Setup local development

### Install tools

- [Docker desktop](https://www.docker.com/products/docker-desktop)
- [TablePlus](https://tableplus.com/)
- [Golang](https://golang.org/)
- [Homebrew](https://brew.sh/)
- [Migrate](https://github.com/golang-migrate/migrate/tree/master/cmd/migrate)

```bash
brew install golang-migrate
```

- [DB Docs](https://dbdocs.io/docs)

```bash
npm install -g dbdocs
dbdocs login
```

- [DBML CLI](https://www.dbml.org/cli/#installation)

```bash
npm install -g @dbml/cli
dbml2sql --version
```

- [Sqlc](https://github.com/kyleconroy/sqlc#installation)

```bash
brew install sqlc
```

- [Gomock](https://github.com/golang/mock)

``` bash
go install github.com/golang/mock/[email protected]
```

### Setup infrastructure

- Create the bank-network

``` bash
make network
```

- Start postgres container:

```bash
make postgres
```

- Create simple_bank database:

```bash
make createdb
```

- Run db migration up all versions:

```bash
make migrateup
```

- Run db migration up 1 version:

```bash
make migrateup1
```

- Run db migration down all versions:

```bash
make migratedown
```

- Run db migration down 1 version:

```bash
make migratedown1
```

### Documentation

- Generate DB documentation:

```bash
make db_docs
```

- Access the DB documentation at [this address](https://dbdocs.io/bmigeri/simple_bank). Password: `secret`

### How to generate code

- Generate schema SQL file with DBML:

```bash
make db_schema
```

- Generate SQL CRUD with sqlc:

```bash
make sqlc
```

- Generate DB mock with gomock:

```bash
make mock
```

- Create a new db migration:

```bash
make new_migration name=
```

### How to run

- Run server:

```bash
make server
```

- Run test:

```bash
make test
```

## Deploy to minikube kubernetes cluster

- Start minikube:

Minikube and kubectl must be installed as prerequisites.
Then start minikube

```bash
minikube start
```
To view minikube dashboard, use the command `minikube dashboard` or use k9s with the command `k9s`.

- Pod deployments:

Use the command `kubectl apply -f .yml`

- Running Postgres and Redis on the host machine:

To spin up database on local machine, run the following command

```bash
docker-compose -f database.yml up -d
```

To connect to database from minikube, change the host from localhost to `host.minikube.internal` in the deployment.yaml file.

- [Install nginx ingress controller](https://kubernetes.github.io/ingress-nginx/deploy/#minikube):

Enable ingress add-ons
```bash
minikube addons enable ingress
minikube addons enable ingress-dns
```
Apply ingress
```bash
kubectl apply -f k8s/ingress-nginx.yaml
kubectl apply -f k8s/ingress-http.yaml
kubectl apply -f k8s/ingress-grpc.yaml
kubectl get ingress
```

- Configure ingress:

Add ingress host to /etc/hosts as follows

```bash
sudo vi /etc/hosts
```
Append to the file
```bash
127.0.0.1 api.simplebank.test
127.0.0.1 gapi.simplebank.test
```

Create a minikube tunnel

```bash
minikube tunnel
```

The app is now available at `http://api.simplebank.test` in the browser.

Test ingress by running

```bash
nslookup simplebank.test
```

- [Install cert-manager](https://cert-manager.io/docs/installation/kubernetes/):

```bash
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.4.0/cert-manager.yaml
```

## Deploy to kubernetes cluster

- [Install nginx ingress controller](https://kubernetes.github.io/ingress-nginx/deploy/#aws):

```bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.48.1/deploy/static/provider/aws/deploy.yaml
```

- [Install cert-manager](https://cert-manager.io/docs/installation/kubernetes/):

```bash
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.4.0/cert-manager.yaml
```

### Setup gRPC

- Generate files

NOTE: You should add the `protoc-gen-go-grpc` to your PATH

```bash
PATH="${PATH}:${HOME}/go/bin"
```

```bash
make proto
```