From 1f50e3551c1bf16336d788985f675e0340f5e44c Mon Sep 17 00:00:00 2001 From: Tim Holm Date: Thu, 5 Sep 2024 12:13:06 +1000 Subject: [PATCH 1/3] Add polyglot mono repo example. --- v1/multi-language/README.md | 40 +++++++++++++++++++ v1/multi-language/architecture.png | Bin 0 -> 82104 bytes v1/multi-language/go/.gitignore | 17 ++++++++ v1/multi-language/go/README.md | 34 ++++++++++++++++ v1/multi-language/go/go.mod | 19 +++++++++ v1/multi-language/go/go.sum | 42 ++++++++++++++++++++ v1/multi-language/go/golang.dockerfile | 26 ++++++++++++ v1/multi-language/go/services/hello/main.go | 41 +++++++++++++++++++ v1/multi-language/nitric.yaml | 13 ++++++ v1/multi-language/ts/.gitignore | 4 ++ v1/multi-language/ts/package.json | 19 +++++++++ v1/multi-language/ts/services/hello.ts | 16 ++++++++ v1/multi-language/ts/tsconfig.json | 7 ++++ 13 files changed, 278 insertions(+) create mode 100644 v1/multi-language/README.md create mode 100644 v1/multi-language/architecture.png create mode 100644 v1/multi-language/go/.gitignore create mode 100644 v1/multi-language/go/README.md create mode 100644 v1/multi-language/go/go.mod create mode 100644 v1/multi-language/go/go.sum create mode 100644 v1/multi-language/go/golang.dockerfile create mode 100644 v1/multi-language/go/services/hello/main.go create mode 100644 v1/multi-language/nitric.yaml create mode 100644 v1/multi-language/ts/.gitignore create mode 100644 v1/multi-language/ts/package.json create mode 100644 v1/multi-language/ts/services/hello.ts create mode 100644 v1/multi-language/ts/tsconfig.json diff --git a/v1/multi-language/README.md b/v1/multi-language/README.md new file mode 100644 index 0000000..848403f --- /dev/null +++ b/v1/multi-language/README.md @@ -0,0 +1,40 @@ +

+ +## Nitric Multi-Language Example + +An example of a polyglot nitric mono repo written in Typescript and Golang, that demonstrates interservice communication via Topics. + +![Architecture Diagram](architecture.png) + +## Running this project + +To run this project you'll need the [Nitric CLI](https://nitric.io/docs/installation) installed, then you can use the CLI commands to run, build or deploy the project. + +You'll also want to make sure the project's required dependencies have been installed for the golang and typescript projects. + +```bash +# install node dependencies +cd ts +npm install +``` + +```bash +# install go dependencies +cd go +go mod tidy +``` + +```bash +# run locally (from project root) +nitric start +``` + +## Learn more about Nitric + +Nitric provides detailed and intuitive [documentation](https://nitric.io/docs) and [guides](https://nitric.io/docs/getting-started) to help you get started quickly. + +If you'd rather chat with the maintainers or community, come and join our [Discord](https://nitric.io/chat) server, [GitHub Discussions](https://github.com/nitrictech/nitric/discussions) or find us on [Twitter](https://twitter.com/nitric_io). + + + + diff --git a/v1/multi-language/architecture.png b/v1/multi-language/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..918132d9384e7c346cb5a67af64f5e06e92e47ea GIT binary patch literal 82104 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 H{|o;EZ!2jv literal 0 HcmV?d00001 diff --git a/v1/multi-language/go/.gitignore b/v1/multi-language/go/.gitignore new file mode 100644 index 0000000..380c102 --- /dev/null +++ b/v1/multi-language/go/.gitignore @@ -0,0 +1,17 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# 'nitric run' log directory +.nitric/ + +git.store \ No newline at end of file diff --git a/v1/multi-language/go/README.md b/v1/multi-language/go/README.md new file mode 100644 index 0000000..6ef7abb --- /dev/null +++ b/v1/multi-language/go/README.md @@ -0,0 +1,34 @@ +

+ +## About Nitric + +This is a [Nitric](https://nitric.io) Golang project, but Nitric is a framework for rapid development of cloud-native and serverless applications in many languages. + +Using Nitric you define your apps in terms of the resources they need, then write the code for serverless function based APIs, event subscribers and scheduled jobs. + +Apps built with Nitric can be deployed to AWS, Azure or Google Cloud all from the same code base so you can focus on your products, not your cloud provider. + +Nitric makes it easy to: + +- Create smart [serverless functions and APIs](https://nitric.io/docs/apis) +- Build reliable distributed apps that use [events](https://nitric.io/docs/messaging/topics) and/or [queues](https://nitric.io/docs/messaging/queues) +- Securely store, retrieve and rotate [secrets](https://nitric.io/docs/secrets) +- Read and write files from [buckets](https://nitric.io/docs/storage) + +## Learning Nitric + +Nitric provides detailed and intuitive [documentation](https://nitric.io/docs) and [guides](https://nitric.io/docs/getting-started) to help you get started quickly. + +If you'd rather chat with the maintainers or community, come and join our [Discord](https://nitric.io/chat) server, [GitHub Discussions](https://github.com/nitrictech/nitric/discussions) or find us on [Twitter](https://twitter.com/nitric_io). + +## Running this project + +To run this project you'll need the [Nitric CLI](https://nitric.io/docs/installation) installed, then you can use the CLI commands to run, build or deploy the project. + +```bash +# install dependencies +go mod tidy + +# run locally +nitric start +``` diff --git a/v1/multi-language/go/go.mod b/v1/multi-language/go/go.mod new file mode 100644 index 0000000..90eee69 --- /dev/null +++ b/v1/multi-language/go/go.mod @@ -0,0 +1,19 @@ +module github.com/nitrictech/templates/go-starter + +go 1.21 + +toolchain go1.21.4 + +require github.com/nitrictech/go-sdk v1.0.7 + +require ( + github.com/missionMeteora/toolkit v0.0.0-20170713173850-88364e3ef8cc // indirect + github.com/nitrictech/nitric/core v0.0.0-20240614052744-71e6e05bc47e // indirect + github.com/nitrictech/protoutils v0.0.0-20220321044654-02667a814cdf // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d // indirect + google.golang.org/grpc v1.64.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect +) diff --git a/v1/multi-language/go/go.sum b/v1/multi-language/go/go.sum new file mode 100644 index 0000000..aa6f4a5 --- /dev/null +++ b/v1/multi-language/go/go.sum @@ -0,0 +1,42 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/missionMeteora/toolkit v0.0.0-20170713173850-88364e3ef8cc h1:/oFlKiuu6L1sIvZ7A363qMhNM+DUQL5WsVe1xIRQnFU= +github.com/missionMeteora/toolkit v0.0.0-20170713173850-88364e3ef8cc/go.mod h1:AtX+JBtXbQ+taj82QFzCSgN5EzM4Bi0YRyS+TVbjENs= +github.com/nitrictech/go-sdk v1.0.7 h1:SQsy522EhKCIc6NIHUMqDA4fDzD3gW0MHqABg1F840c= +github.com/nitrictech/go-sdk v1.0.7/go.mod h1:QmLPatYHvbQ+8ajVDxHplgQIyWWP9SzMXDL+PI/gL2E= +github.com/nitrictech/nitric/core v0.0.0-20240614052744-71e6e05bc47e h1:WV7BHlv3V25mKQuyPJ97W4aWCJL8h7MGSa4imTFqZcA= +github.com/nitrictech/nitric/core v0.0.0-20240614052744-71e6e05bc47e/go.mod h1:atiPRiYDBs4Wx3flZ45KnQenUD6eAdpL0lOLZT91yyM= +github.com/nitrictech/protoutils v0.0.0-20220321044654-02667a814cdf h1:8MB8W8ylM8sCM2COGfiO39/tB6BTdiawLszaUGCNL5w= +github.com/nitrictech/protoutils v0.0.0-20220321044654-02667a814cdf/go.mod h1:b2lzk2a4o1bvSrSCE6yvTldHuXCJymuDVhdMJGOSslw= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.28.1 h1:MijcGUbfYuznzK/5R4CPNoUP/9Xvuo20sXfEm6XxoTA= +github.com/onsi/gomega v1.28.1/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d h1:k3zyW3BYYR30e8v3x0bTDdE9vpYFjZHK+HcyqkrppWk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/v1/multi-language/go/golang.dockerfile b/v1/multi-language/go/golang.dockerfile new file mode 100644 index 0000000..49a9f38 --- /dev/null +++ b/v1/multi-language/go/golang.dockerfile @@ -0,0 +1,26 @@ + +FROM golang:alpine as build + +ARG HANDLER + +WORKDIR /app/ + +COPY go.mod *.sum ./ + +RUN go mod download + +COPY . . + +# Build the Go App from the provided HANDLER (this will be based on matches in your nitric.yaml fle) +RUN go build -o /bin/main ./${HANDLER}/... + +FROM alpine + +COPY --from=build /bin/main /bin/main + +RUN chmod +x-rw /bin/main +RUN apk update && \ + apk add --no-cache tzdata ca-certificates && \ + update-ca-certificates + +ENTRYPOINT ["/bin/main"] \ No newline at end of file diff --git a/v1/multi-language/go/services/hello/main.go b/v1/multi-language/go/services/hello/main.go new file mode 100644 index 0000000..bc5e109 --- /dev/null +++ b/v1/multi-language/go/services/hello/main.go @@ -0,0 +1,41 @@ +package main + +import ( + "context" + "fmt" + + "github.com/nitrictech/go-sdk/handler" + "github.com/nitrictech/go-sdk/nitric" +) + +func main() { + helloTypescriptTopic, _ := nitric.NewTopic("hello-typescript").Allow(nitric.TopicPublish) + helloGolangTopic := nitric.NewTopic("hello-golang") + api, err := nitric.NewApi("main") + + if err != nil { + fmt.Println(err) + return + } + + helloGolangTopic.Subscribe(func(ctx *handler.MessageContext, next handler.MessageHandler) (*handler.MessageContext, error) { + fmt.Println("Received message from Typescript") + return next(ctx) + }) + + api.Get("/hello-typescript", func(ctx *handler.HttpContext, next handler.HttpHandler) (*handler.HttpContext, error) { + ctx.Response.Body = []byte("Saying hello to typescript from Golang") + + helloTypescriptTopic.Publish(context.TODO(), map[string]interface{}{ + "message": "Hello from Golang", + }) + + return next(ctx) + }) + + if err := nitric.Run(); err != nil { + fmt.Println(err) + } + + fmt.Println("Service has started") +} diff --git a/v1/multi-language/nitric.yaml b/v1/multi-language/nitric.yaml new file mode 100644 index 0000000..3731fe7 --- /dev/null +++ b/v1/multi-language/nitric.yaml @@ -0,0 +1,13 @@ +name: multi-language +services: + - basedir: ./ts + match: services/*.ts + start: npm run dev:services $SERVICE_PATH + - basedir: ./go + match: services/* + runtime: go + start: go run ./$SERVICE_PATH/... +runtimes: + go: + dockerfile: ./go/golang.dockerfile + args: {} diff --git a/v1/multi-language/ts/.gitignore b/v1/multi-language/ts/.gitignore new file mode 100644 index 0000000..930f792 --- /dev/null +++ b/v1/multi-language/ts/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.nitric/ +.npmrc +git.store \ No newline at end of file diff --git a/v1/multi-language/ts/package.json b/v1/multi-language/ts/package.json new file mode 100644 index 0000000..3498710 --- /dev/null +++ b/v1/multi-language/ts/package.json @@ -0,0 +1,19 @@ +{ + "name": "typescript-starter", + "version": "1.0.0", + "description": "nitric typescript starter template", + "private": true, + "dependencies": { + "@nitric/sdk": "^1.2.2" + }, + "devDependencies": { + "@types/node": "^22.1.0", + "dotenv": "^16.4.5", + "nodemon": "^3.1.4", + "ts-node": "^10.9.2", + "typescript": "^5.5.4" + }, + "scripts": { + "dev:services": "nodemon -r dotenv/config" + } +} diff --git a/v1/multi-language/ts/services/hello.ts b/v1/multi-language/ts/services/hello.ts new file mode 100644 index 0000000..32be0cc --- /dev/null +++ b/v1/multi-language/ts/services/hello.ts @@ -0,0 +1,16 @@ +import * as nitric from "@nitric/sdk"; + +const api = nitric.api("main"); +const helloTypescriptTopic = nitric.topic("hello-typescript"); +const helloGolangTopic = nitric.topic("hello-golang").allow("publish"); + +api.get("/hello-golang", async (ctx) => { + // Publish a message to the Golang topic + await helloGolangTopic.publish({message: "Hello from Typescript"}); + + ctx.res.body = "Saying hello to Golang from Typescript"; +}) + +helloTypescriptTopic.subscribe(async () => { + console.log("Received a message from Golang"); +}); diff --git a/v1/multi-language/ts/tsconfig.json b/v1/multi-language/ts/tsconfig.json new file mode 100644 index 0000000..71ef296 --- /dev/null +++ b/v1/multi-language/ts/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "target": "ESNext", + "moduleResolution": "node" + } + } From d9b1a74ace68603e4709b5011737402eda214e98 Mon Sep 17 00:00:00 2001 From: Ryan Cartwright Date: Thu, 5 Sep 2024 13:34:58 +1000 Subject: [PATCH 2/3] fix formatting --- v1/multi-language/go/services/hello/main.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/v1/multi-language/go/services/hello/main.go b/v1/multi-language/go/services/hello/main.go index bc5e109..c072145 100644 --- a/v1/multi-language/go/services/hello/main.go +++ b/v1/multi-language/go/services/hello/main.go @@ -9,10 +9,15 @@ import ( ) func main() { - helloTypescriptTopic, _ := nitric.NewTopic("hello-typescript").Allow(nitric.TopicPublish) + helloTypescriptTopic, err := nitric.NewTopic("hello-typescript").Allow(nitric.TopicPublish) + if err != nil { + fmt.Println(err) + return + } + helloGolangTopic := nitric.NewTopic("hello-golang") - api, err := nitric.NewApi("main") + api, err := nitric.NewApi("main") if err != nil { fmt.Println(err) return From ff32d17f79ca1ef3dd7a21108dcc8084010a4ad1 Mon Sep 17 00:00:00 2001 From: Tim Holm Date: Thu, 5 Sep 2024 15:08:38 +1000 Subject: [PATCH 3/3] add note on CLI compatibility. --- v1/multi-language/go/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/v1/multi-language/go/README.md b/v1/multi-language/go/README.md index 6ef7abb..b274c2c 100644 --- a/v1/multi-language/go/README.md +++ b/v1/multi-language/go/README.md @@ -2,6 +2,8 @@ ## About Nitric +> ⚠️ Note: This repo contains features that require a minimum nitric CLI version of [1.52.0](https://github.com/nitrictech/cli/releases/tag/v1.52.0) + This is a [Nitric](https://nitric.io) Golang project, but Nitric is a framework for rapid development of cloud-native and serverless applications in many languages. Using Nitric you define your apps in terms of the resources they need, then write the code for serverless function based APIs, event subscribers and scheduled jobs.