From 22aeb66cff0ca7a03d13f4a392fb32b7f7ac84f1 Mon Sep 17 00:00:00 2001 From: Matheus Fidelis Date: Thu, 8 Sep 2022 17:27:40 -0300 Subject: [PATCH] NATS Implementation --- .github/images/workflow.drawio | 1 + .github/images/workflow.png | Bin 26566 -> 46195 bytes .github/workflows/database-store-service.yml | 82 +++++++++++++++++++ .gitignore | 2 + database-store-service/Dockerfile | 21 +++++ database-store-service/Dockerfile.dev | 12 +++ database-store-service/configs/.gitkeep | 0 database-store-service/go.mod | 16 ++++ database-store-service/go.sum | 63 ++++++++++++++ database-store-service/main.go | 57 +++++++++++++ database-store-service/pkg/logger/main.go | 13 +++ docker-compose.yml | 50 +++++++++++ health-api/controllers/calculator/main.go | 65 ++++++++++++++- health-api/go.mod | 3 +- health-api/go.sum | 12 +++ nats/nats-server-1.conf | 14 ++++ nats/nats-server-2.conf | 14 ++++ 17 files changed, 422 insertions(+), 3 deletions(-) create mode 100644 .github/images/workflow.drawio create mode 100644 .github/workflows/database-store-service.yml create mode 100644 database-store-service/Dockerfile create mode 100644 database-store-service/Dockerfile.dev create mode 100644 database-store-service/configs/.gitkeep create mode 100644 database-store-service/go.mod create mode 100644 database-store-service/go.sum create mode 100644 database-store-service/main.go create mode 100644 database-store-service/pkg/logger/main.go create mode 100644 nats/nats-server-1.conf create mode 100644 nats/nats-server-2.conf diff --git a/.github/images/workflow.drawio b/.github/images/workflow.drawio new file mode 100644 index 0000000..5dae626 --- /dev/null +++ b/.github/images/workflow.drawio @@ -0,0 +1 @@ +7Vpdc9o4FP01PJKxZWzgMYRkdzvZ3U7pTNt92ZHta1utbHkkOUB//UpYBoyAZGdMnCZ5wjr6Pufq3isNA+8mX/3GcZn9yWKgA+TEq4E3HyDkjlCgfjSyrpGJ49dAyklsGu2ABfkJBnQMWpEYRKuhZIxKUrbBiBUFRLKFYc7Zst0sYbQ9a4lTsIBFhKmNfiGxzAzqBtNdxe9A0sxMPUHjuiLHTWOzE5HhmC33IO924N1wxmT9la9ugGryGl7qfncnarcL41DIp3T4MFysq08f1cqInA+X/8w+Z9OhEUPIdbNhiNX+TZFxmbGUFZje7tAZZ1URgx7VUaVdm3vGSgW6CvwOUq6NmLiSTEGZzKmpVQvm66+m/6bwTReu/KY4X+1XztemVK9VL/AkBQYSrOIRnNl3Y0qYpyDPtENboZSFA8tBrUf140CxJA/tdWBjaum23U4N9WEE+R/iBO/inBVn1Kc443dxzorj9SmO28vR6YFl1++V5nrcB0wrM1MGmMpsiEtiCdCmd5kRCYsSb1hYqtyhTWVCKL1hlPFNXy9JEhRFCheSsx+wVxMHYeAHW/IfgEtYnaffZst08KYmHJpcBY1MkF/uRf4mnGf7Qd+5EMHIIjjM+TDlZTQUwB+IYq9LmmMMk+QozUE0gTDphmb/gGYX9U3z9I36cu+JXmbSq5NB7+qcjwFOr/KM3uU5L0+vmZBnRRAOEctzKGI1OyvEa4smXtB3NBlZlJM8em00958bTSyaS84kkF/fpCfeS+O6eY3bIzvCau8EXh3Z/fsP1/bZSyzhl8/7D5keTXpn2reY/gtLMVwojoFbFIsMl/qT5JtH45lmg6hzcI9DoB+ZIDqgqvqQScly1YDqihmOfqQbdRpeY0hwReXeCNeUpLqn1OnPDIuyfspOyEorOttMeN2gToOo70xK/RB+rXlAdzEWWcgwj69EgcuI40ReEaYq1NLg3xxiglUBl2XziRzN952jLO6u0DsnESuGkV7nVVmk3eg+arxHo/uREzY9Ivv0YrKP7dBRhZSIzJJc7Vq2jw42UkVq98pGbA1zEsd1kguC/MThZiitWclIITd78WcDf67HUnmtqFNc1zp9BSvg4KgaSIU5bExt6nSkkX/gBY+czeCIRt7FNOrlTj7o8AXP5Ccv/AkP9XK77oPnUyfgma7JdrqqLmA4xAKGQjIOFwns4MY+jI8F9mkw9nBH76aHdwPf7zuwIztfFVUoIk5Cm+AX6eO7kMV9PN8aP6dPb7awp8rJHCtaU6LMnnuP23xYH5D7cAtsM66/K6mG2XJvZPA7ymeDNr+B+7SYeTmrty8OfxTKrcg3Y/LjA08UHPFE/rOafC9/sOgwvKLRU9OYXrMY+83tpGfBkdRW95hX6cAa0YEDRkescXTEGoOLWWNg0fTpdvH5zbgHNHlckI5uOaq4+2vXpm7vD3Le7X8= \ No newline at end of file diff --git a/.github/images/workflow.png b/.github/images/workflow.png index 4ebce45253001e84961515ab9a38ba648ab9b50d..1f86db730094a12b3848793328c507ce33829725 100644 GIT binary patch literal 46195 zcmeFZcTiN#wkSSCMFb=x2&g2H9EY44;s7#a5rhGTA?F-L0m%ZAlcJ!4AfN&gl_W!w zjDmo`5F{fxz8=5t+w z5K$DC03Sl){9=+~W`DJ}LfN|f4N#0<5CFIVw?d*_yj(r)IYgAey@rdItrPeLkHM!d z0(_W&e<49jAu&rRH@H-Eb91sawzbwm0~}ytB2a!2aq#$tmbw94n?qO`Tsxs1ZNZnC zEz;2y*G1Xh!_^r)fe8tU@(c2d2?+`F3kl-zM_Aced7%Fpj;@|QxRn$H?Lh$
  • v1THa3~6)&@NVdLVv-6 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 literal 26566 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 MH4QW#9k&bpA8_{AZ2$lO diff --git a/.github/workflows/database-store-service.yml b/.github/workflows/database-store-service.yml new file mode 100644 index 0000000..b006661 --- /dev/null +++ b/.github/workflows/database-store-service.yml @@ -0,0 +1,82 @@ +name: 'database-store-service ci' +on: + push: + pull_request: + types: [ opened, reopened ] +jobs: + unit-test: + strategy: + matrix: + go-version: [1.17.x] + platform: [ubuntu-latest] + runs-on: ${{ matrix.platform }} + steps: + + - uses: actions/setup-go@v1 + with: + go-version: ${{ matrix.go-version }} + + - name: setup GOPATH into PATH + run: | + echo "::set-env name=GOPATH::$(go env GOPATH)" + echo "::add-path::$(go env GOPATH)/bin" + shell: bash + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true + + - uses: actions/checkout@v2 + + - name: Run's Golint + working-directory: database-store-service + run: | + export PATH=$PATH:$(go env GOPATH)/bin + go get -u golang.org/x/lint/golint + # golint -set_exit_status ./... + + - name: Install dependencies + working-directory: database-store-service + run: go get -u + + - name: Test + working-directory: database-store-service + run: go test -v + + build-docker-artifacts: + needs: [ unit-test ] + runs-on: ubuntu-latest + if: contains(github.ref, 'main') + steps: + - uses: actions/setup-go@v1 + with: + go-version: '1.17.x' + + - uses: actions/checkout@v1 + + - name: Docker Build + working-directory: database-store-service + run: docker build -t database-store-service:latest . + + - name: Docker Tag Latest + working-directory: database-store-service + run: docker tag database-store-service:latest fidelissauro/database-store-service:latest + + - name: Docker Tag Release + run: | + TAG=$(git describe --tags --abbrev=0) + docker tag database-store-service:latest fidelissauro/database-store-service:$TAG + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD}} + + - name: Docker Push Latest + working-directory: database-store-service + run: docker push fidelissauro/database-store-service:latest + + - name: Docker Push Release Tag + working-directory: database-store-service + run: | + TAG=$(git describe --tags --abbrev=0) + docker push fidelissauro/database-store-service:$TAG + \ No newline at end of file diff --git a/.gitignore b/.gitignore index 21300a0..81a9709 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ tmp/* tmp # Dependency directories (remove the comment below to include it) # vendor/ +.tmp/* +.tmp \ No newline at end of file diff --git a/database-store-service/Dockerfile b/database-store-service/Dockerfile new file mode 100644 index 0000000..5dae279 --- /dev/null +++ b/database-store-service/Dockerfile @@ -0,0 +1,21 @@ +FROM golang:1.17 AS builder + +WORKDIR $GOPATH/src/database-store-service + +COPY . ./ + +RUN go get -u github.com/swaggo/swag/cmd/swag@v1.6.7 +RUN swag init + +RUN go get -u +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main . + + +FROM alpine:3.12.3 + +COPY --from=builder /go/src/database-store-service/main ./ +COPY --from=builder /go/src/database-store-service/configs ./configs + +EXPOSE 8080 + +ENTRYPOINT ["./main"] diff --git a/database-store-service/Dockerfile.dev b/database-store-service/Dockerfile.dev new file mode 100644 index 0000000..f41d4c3 --- /dev/null +++ b/database-store-service/Dockerfile.dev @@ -0,0 +1,12 @@ +FROM golang:1.17 AS builder + +WORKDIR $GOPATH/src/database-store-service + +COPY . ./ + +RUN pwd; ls -lha + +# Install Air +RUN go get -u github.com/cosmtrek/air@v1.28 + +CMD ["air"] diff --git a/database-store-service/configs/.gitkeep b/database-store-service/configs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/database-store-service/go.mod b/database-store-service/go.mod new file mode 100644 index 0000000..ccefabb --- /dev/null +++ b/database-store-service/go.mod @@ -0,0 +1,16 @@ +module database-store-service + +go 1.17 + +require ( + github.com/gogo/protobuf v1.3.2 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/nats-io/nats.go v1.16.0 // indirect + github.com/nats-io/nkeys v0.3.0 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + github.com/nats-io/stan.go v0.10.3 // indirect + github.com/rs/zerolog v1.28.0 // indirect + golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect + golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 // indirect +) diff --git a/database-store-service/go.sum b/database-store-service/go.sum new file mode 100644 index 0000000..85a2845 --- /dev/null +++ b/database-store-service/go.sum @@ -0,0 +1,63 @@ +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/nats-io/nats.go v1.16.0 h1:zvLE7fGBQYW6MWaFaRdsgm9qT39PJDQoju+DS8KsO1g= +github.com/nats-io/nats.go v1.16.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nats-io/stan.go v0.10.3 h1:8DOyQJ0+nza3zSVJZ19/cpikkrWA4rSKB3YvckIGOTI= +github.com/nats-io/stan.go v0.10.3/go.mod h1:Cgf5zk6kKpOCqqUIJeuBz6ZDz9osT791VhS6m28sSQQ= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= +github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b h1:wSOdpTq0/eI46Ez/LkDwIsAKA71YP2SRKBODiRWM0as= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/database-store-service/main.go b/database-store-service/main.go new file mode 100644 index 0000000..9cf378a --- /dev/null +++ b/database-store-service/main.go @@ -0,0 +1,57 @@ +package main + +import ( + "database-store-service/pkg/logger" + "fmt" + "sync" + + "github.com/nats-io/nats.go" +) + +func main() { + log := logger.Instance() + log.Info().Msg("Hello World") + + wg := sync.WaitGroup{} + wg.Add(10) + + // Nats Client + nc, err := nats.Connect("nats://nats-1:4222,nats://nats-2:4222") + defer nc.Close() + + if err != nil { + log.Error(). + Str("Error", err.Error()). + Msg("Error to connect to Nats") + } + + // Create JetStream Context + js, err := nc.JetStream() + + _, err = js.AddStream(&nats.StreamConfig{ + Name: "orders", + Subjects: []string{"ORDERS.*"}, + }) + + if err != nil { + log.Error(). + Str("Error", err.Error()). + Msg("Failed to add Stream") + } + + if err != nil { + log.Error(). + Str("Error", err.Error()). + Msg("Failed to add a durable consumer") + } + + js.QueueSubscribe("ORDERS.*", "store", func(m *nats.Msg) { + log.Info(). + Msg(fmt.Sprintf("Received a person: %+v\n", string(m.Data))) + m.Ack() + }, nats.ManualAck()) + + // Wait for a message to come in + wg.Wait() + +} diff --git a/database-store-service/pkg/logger/main.go b/database-store-service/pkg/logger/main.go new file mode 100644 index 0000000..729b948 --- /dev/null +++ b/database-store-service/pkg/logger/main.go @@ -0,0 +1,13 @@ +package logger + +import ( + "os" + + "github.com/rs/zerolog" +) + +func Instance() zerolog.Logger { + zerolog.TimeFieldFormat = zerolog.TimeFormatUnix + logger := zerolog.New(os.Stderr).With().Timestamp().Logger() + return logger +} diff --git a/docker-compose.yml b/docker-compose.yml index 8a8d174..425a799 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,6 +8,29 @@ services: - "14268:14268" networks: - health + + nats-1: + image: nats:alpine + volumes: + - ./nats/nats-server-1.conf:/etc/nats/nats-server.conf + - .tmp/nats/data/jetstream/1:/data/jetstream + ports: + - "4223:4222" + - "8223:8222" + networks: + - health + + nats-2: + image: nats:alpine + volumes: + - ./nats/nats-server-2.conf:/etc/nats/nats-server.conf + - .tmp/nats/data/jetstream/2:/data/jetstream + ports: + - "4224:4222" + - "8224:8222" + networks: + - health + health-api: build: context: ./health-api @@ -18,12 +41,17 @@ services: - IMC_SERVICE_ENDPOINT=imc-grpc:30000 - RECOMMENDATIONS_SERVICE_ENDPOINT=recommendations-grpc:30000 - JAEGER_COLLECTOR_ENDPOINT=http://jaeger:14268/api/traces + - NATS_URI=nats://nats-1:4222,nats://nats-2:4222 ports: - 8080:8080 volumes: - ./health-api:/go/src/health-api networks: - health + depends_on: + - nats-1 + - nats-2 + bmr-grpc: build: context: ./bmr-grpc-service @@ -50,6 +78,7 @@ services: - ./imc-grpc-service:/go/src/imc-grpc-service networks: - health + recommendations-grpc: build: context: ./recommendations-grpc-service @@ -66,6 +95,7 @@ services: - ./recommendations-grpc-service:/go/src/recommendations-grpc-service networks: - health + proteins-grpc: build: context: ./proteins-grpc-service @@ -79,6 +109,7 @@ services: - ./proteins-grpc-service:/go/src/proteins-grpc-service networks: - health + water-grpc: build: context: ./water-grpc-service @@ -92,6 +123,7 @@ services: - ./water-grpc-service:/go/src/water-grpc-service networks: - health + calories-grpc: build: context: ./calories-grpc-service @@ -105,5 +137,23 @@ services: - ./calories-grpc-service:/go/src/calories-grpc-service networks: - health + + database-store-service: + build: + context: ./database-store-service + dockerfile: Dockerfile.dev + environment: + - ENVIRONMENT=dev + - JAEGER_COLLECTOR_ENDPOINT=http://jaeger:14268/api/traces + - NATS_URI=nats://nats-1:4222,nats://nats-2:4222 + volumes: + - ./database-store-service:/go/src/database-store-service + networks: + - health + depends_on: + - health-api + - nats-1 + - nats-2 + networks: health: \ No newline at end of file diff --git a/health-api/controllers/calculator/main.go b/health-api/controllers/calculator/main.go index 92c967f..841dbca 100644 --- a/health-api/controllers/calculator/main.go +++ b/health-api/controllers/calculator/main.go @@ -1,6 +1,7 @@ package calculator import ( + "encoding/json" "net/http" "github.com/gin-gonic/gin" @@ -11,7 +12,10 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" + guuid "github.com/google/uuid" "go.opentelemetry.io/otel/attribute" + + "github.com/nats-io/nats.go" ) type Request struct { @@ -23,7 +27,8 @@ type Request struct { } type Response struct { - Status int `json:"status" binding:"required"` + Id string `json:"id" binding:"required"` + Status int `json:"status" binding:"required"` Imc struct { Result float64 `json:"result"` Class string `json:"class"` @@ -106,6 +111,10 @@ func Post(c *gin.Context) { ctxBMR, spanBMR := tr.Start(c.Request.Context(), "BMR Service Call") defer spanBMR.End() + log.Info(). + Str("Service", "bmr"). + Msg("Creating remote connection with gRPC Endpoint for BMR Service") + spanBMR.SetAttributes( attribute.String("Service", "BMR"), ) @@ -162,6 +171,10 @@ func Post(c *gin.Context) { ctxRecommendations, spanRecommendations := tr.Start(c.Request.Context(), "Recommendations Service Call") defer spanRecommendations.End() + log.Info(). + Str("Service", "recommendations"). + Msg("Creating remote connection with gRPC Endpoint for IMC Service") + resRecommendations, err := recommendations.Call(ctxRecommendations, request.Weight, request.Height, resBMR.Necessity, tr) if err != nil { @@ -189,6 +202,14 @@ func Post(c *gin.Context) { ) _, spanResponse := tr.Start(c.Request.Context(), "HTTP Response") + defer spanResponse.End() + + log.Info(). + Str("Service", "health-api"). + Msg("Creating response payload") + + // UUID + response.Id = guuid.New().String() // BMR Response response.Basal.BMR.Value = resBMR.Bmr @@ -246,6 +267,46 @@ func Post(c *gin.Context) { attribute.String("http.response.Recomendations.Calories.Loss.Unit", response.Basal.Necessity.Unit), ) + _, spanNatsPublich := tr.Start(c.Request.Context(), "NATS Publish") + defer spanNatsPublich.End() + + log.Info(). + Str("Service", "nats"). + Str("Queue", "nutrition"). + Msg("Sending message to NATS Server") + + // Publish on Nats to Save Data + nc, err := nats.Connect("nats://nats-1:4222,nats-2://nats-2:4222") + defer nc.Close() + if err != nil { + log.Error(). + Str("Error", err.Error()). + Msg("Error to connect to Nats") + } + + // Create JetStream Context + js, err := nc.JetStream() + + if err != nil { + log.Error(). + Str("Error", err.Error()). + Msg("Error to create jetstream to Nats") + } + + if err != nil { + log.Error(). + Str("Error", err.Error()). + Msg("Error to convert response to json") + } + + b, err := json.Marshal(response) + _, err = js.Publish("ORDERS.scratch", b) + + if err != nil { + log.Error(). + Str("Error", err.Error()). + Msg("Error to publish message on jetstream") + } + c.JSON(http.StatusOK, response) - defer spanResponse.End() } diff --git a/health-api/go.mod b/health-api/go.mod index e2da764..50039f7 100644 --- a/health-api/go.mod +++ b/health-api/go.mod @@ -7,7 +7,9 @@ require ( github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 github.com/gin-gonic/gin v1.7.7 github.com/go-openapi/spec v0.20.0 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/msfidelis/gin-chaos-monkey v0.0.5 + github.com/nats-io/nats.go v1.16.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible github.com/rs/zerolog v1.22.0 github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14 @@ -22,7 +24,6 @@ require ( go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.6.3 go.opentelemetry.io/otel/sdk v1.6.3 go.opentelemetry.io/otel/trace v1.6.3 // indirect - golang.org/x/net v0.0.0-20201224014010-6772e930b67b // indirect google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect google.golang.org/grpc v1.45.0 google.golang.org/protobuf v1.26.0 diff --git a/health-api/go.sum b/health-api/go.sum index c023e17..2410464 100644 --- a/health-api/go.sum +++ b/health-api/go.sum @@ -134,6 +134,8 @@ github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= @@ -180,6 +182,12 @@ github.com/msfidelis/gin-chaos-monkey v0.0.5 h1:G4R70dvEM5nG+jyyWPXmnOA2CYUA62WW github.com/msfidelis/gin-chaos-monkey v0.0.5/go.mod h1:Gl1jwZ8jcJEH7SCQR2oogFT5Stwjvs3taWykF6fJzUw= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/nats.go v1.16.0 h1:zvLE7fGBQYW6MWaFaRdsgm9qT39PJDQoju+DS8KsO1g= +github.com/nats-io/nats.go v1.16.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= @@ -279,6 +287,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b h1:wSOdpTq0/eI46Ez/LkDwIsAKA71YP2SRKBODiRWM0as= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -305,6 +315,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/nats/nats-server-1.conf b/nats/nats-server-1.conf new file mode 100644 index 0000000..7cb7093 --- /dev/null +++ b/nats/nats-server-1.conf @@ -0,0 +1,14 @@ +server_name=nats-1 +listen=4222 + +jetstream { + store_dir=/data/jetstream +} + +cluster { + name: C1 + listen: 0.0.0.0:6222 + routes: [ + nats-route://nats-2:6222 + ] +} \ No newline at end of file diff --git a/nats/nats-server-2.conf b/nats/nats-server-2.conf new file mode 100644 index 0000000..4d34abc --- /dev/null +++ b/nats/nats-server-2.conf @@ -0,0 +1,14 @@ +server_name=nats-2 +listen=4222 + +jetstream { + store_dir=/data/jetstream +} + +cluster { + name: C1 + listen: 0.0.0.0:6222 + routes: [ + nats-route://nats-1:6222 + ] +} \ No newline at end of file