Compare commits
3 Commits
d698a6a0aa
...
018fd310cb
| Author | SHA1 | Date | |
|---|---|---|---|
| 018fd310cb | |||
| 304ce0678a | |||
| ff375ae3e8 |
@ -25,7 +25,7 @@ psql -v ON_ERROR_STOP=1 --username pero --password "pero.000" --dbname komponira
|
||||
INSERT INTO public.products (id, name, description, image) VALUES (5, 'Kava', 'Kielbasa landjaeger sausage capicola sirloin filet mignon doner t-bone. Swine corned beef turkey hamburger flank pork chop capicola prosciutto venison shoulder strip steak jowl. Tongue pork salami biltong doner chislic andouille ball tip strip steak prosciutto.', 'kava.jpeg');
|
||||
INSERT INTO public.products (id, name, description, image) VALUES (6, 'Kava s mlijekom', 'Shoulder bacon flank chuck jowl hamburger swine fatback shank shankle t-bone buffalo leberkas cow.', 'kava-s-mlijekom.jpeg');
|
||||
INSERT INTO public.products (id, name, description, image) VALUES (7, 'Kava bez šećera', 'Pork pig prosciutto shoulder, landjaeger drumstick andouille filet mignon pork chop tri-tip bresaola tail.', 'kava-bez-secera.jpeg');
|
||||
INSERT INTO public.products (id, name, description, image) VALUES (8, 'Cappucino', 'Fatback frankfurter jowl capicola. Buffalo short loin pancetta cow ball tip chicken. Pork loin biltong filet mignon rump t-bone kielbasa tail hamburger jowl pancetta andouille short loin.', 'cappucino.jpeg');
|
||||
INSERT INTO public.products (id, name, description, image) VALUES (8, 'Cappuccino', 'Fatback frankfurter jowl capicola. Buffalo short loin pancetta cow ball tip chicken. Pork loin biltong filet mignon rump t-bone kielbasa tail hamburger jowl pancetta andouille short loin.', 'cappucino.jpeg');
|
||||
INSERT INTO public.products (id, name, description, image) VALUES (9, 'Mocca', 'Capicola salami shoulder tri-tip chicken meatball. Tail meatball filet mignon, landjaeger meatloaf sirloin strip steak chicken capicola picanha cow andouille rump shoulder. Chuck buffalo doner short ribs bacon ground round pancetta flank picanha pork loin.', 'mocca.jpeg');
|
||||
INSERT INTO public.products (id, name, description, image) VALUES (10, 'Sendvič sa sirom', 'Ball tip beef ribs shank ground round t-bone, strip steak leberkas chuck beef pancetta burgdoggen biltong doner swine brisket. Pork chop tail cow filet mignon salami spare ribs pork belly boudin. ', 'sendvic-sa-sirom.jpeg');
|
||||
INSERT INTO public.products (id, name, description, image) VALUES (11, 'Sendvič sa šunkom', 'Alcatra meatball filet mignon bresaola landjaeger, ham tenderloin chicken t-bone cow ham hock sausage fatback. Ground round cow ball tip ham venison beef ribs pork loin shank.', 'sendvic-sa-sunkom.jpeg');
|
||||
|
||||
@ -13,7 +13,7 @@ services:
|
||||
interval: 1s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
machines-app:
|
||||
machines-service:
|
||||
build:
|
||||
context: ./machines
|
||||
dockerfile: Dockerfile
|
||||
@ -23,8 +23,32 @@ services:
|
||||
- DBNAME=komponiranje
|
||||
- DBUSER=pero
|
||||
- DBPASSWORD=pero.000
|
||||
ports:
|
||||
- 3000:3000
|
||||
# ports:
|
||||
# - 3000:3000
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
products-service:
|
||||
build:
|
||||
context: ./products
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- DBHOST=db
|
||||
- DBPORT=5432
|
||||
- DBNAME=komponiranje
|
||||
- DBUSER=pero
|
||||
- DBPASSWORD=pero.000
|
||||
# ports:
|
||||
# - 3000:3000
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
proxy:
|
||||
image: envoyproxy/envoy:v1.28-latest
|
||||
ports:
|
||||
- "10000:10000"
|
||||
volumes:
|
||||
- ./proxy/envoy.yaml:/etc/envoy/envoy.yaml
|
||||
depends_on:
|
||||
- machines-service
|
||||
- products-service
|
||||
|
||||
37
machines/app/api/helpers.go
Normal file
37
machines/app/api/helpers.go
Normal file
@ -0,0 +1,37 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func isError(c *gin.Context, err error) bool {
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"details": err.Error(),
|
||||
})
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func raiseError(c *gin.Context, errCode int, message string) {
|
||||
c.AbortWithStatusJSON(errCode, gin.H{
|
||||
"details": message,
|
||||
})
|
||||
}
|
||||
|
||||
func raiseBadRequestError(c *gin.Context, message string) {
|
||||
raiseError(c, http.StatusBadRequest, message)
|
||||
}
|
||||
|
||||
func raiseNotFoundError(c *gin.Context, message string) {
|
||||
raiseError(c, http.StatusNotFound, message)
|
||||
}
|
||||
|
||||
func raiseInternalError(c *gin.Context, message string) {
|
||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{
|
||||
"details": "Internal server error. We will we will fix it!",
|
||||
})
|
||||
}
|
||||
@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"machines/app/db"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
@ -24,24 +25,47 @@ func handlePing(c *gin.Context) {
|
||||
func handleGetMachines(dbConn *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
machines := db.GetMachines(dbConn)
|
||||
fmt.Printf("%+v\n", machines)
|
||||
|
||||
c.JSON(
|
||||
http.StatusOK,
|
||||
GetMachinesResponse{
|
||||
Machines: machines,
|
||||
Machines: *machines,
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetMachine(dbConn *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
machineId, err := strconv.Atoi(c.Param("machineId"))
|
||||
if err != nil {
|
||||
raiseBadRequestError(c, "Invalid machineId parameter")
|
||||
return
|
||||
}
|
||||
|
||||
machine, err := db.GetMachine(dbConn, machineId)
|
||||
if err != nil {
|
||||
raiseNotFoundError(c, "Machine not found")
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(
|
||||
http.StatusOK,
|
||||
machine,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func initRouter(dbConn *gorm.DB) *gin.Engine {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
router := gin.Default()
|
||||
|
||||
router.GET("/ping", handlePing)
|
||||
router.GET("/", handleGetMachines(dbConn))
|
||||
// routes.GET("/machines/:machineId", handleGetMachineDetails)
|
||||
routes := router.Group("/machines")
|
||||
{
|
||||
routes.GET("/ping", handlePing)
|
||||
routes.GET("", handleGetMachines(dbConn))
|
||||
routes.GET("/:machineId", handleGetMachine(dbConn))
|
||||
}
|
||||
|
||||
return router
|
||||
}
|
||||
|
||||
@ -2,10 +2,21 @@ package db
|
||||
|
||||
import "gorm.io/gorm"
|
||||
|
||||
func GetMachines(dbConn *gorm.DB) []Machine {
|
||||
func GetMachines(dbConn *gorm.DB) *[]Machine {
|
||||
var machines []Machine
|
||||
|
||||
dbConn.Order("name").Find(&machines)
|
||||
|
||||
return machines
|
||||
return &machines
|
||||
}
|
||||
|
||||
func GetMachine(dbConn *gorm.DB, id int) (*Machine, error) {
|
||||
var machine Machine
|
||||
|
||||
result := dbConn.Order("name").Where("id = ?", id).First(&machine)
|
||||
if result.Error != nil {
|
||||
return nil, result.Error
|
||||
}
|
||||
|
||||
return &machine, nil
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
37
products/.air.toml
Normal file
37
products/.air.toml
Normal file
@ -0,0 +1,37 @@
|
||||
root = "."
|
||||
testdata_dir = "testdata"
|
||||
tmp_dir = "tmp"
|
||||
|
||||
[build]
|
||||
args_bin = []
|
||||
bin = "./tmp/main"
|
||||
cmd = "go build -o ./tmp/main ./app/."
|
||||
delay = 1000
|
||||
exclude_dir = ["assets", "tmp", "vendor", "testdata", "build"]
|
||||
exclude_file = []
|
||||
exclude_regex = ["_test.go"]
|
||||
exclude_unchanged = false
|
||||
follow_symlink = false
|
||||
full_bin = ""
|
||||
include_dir = []
|
||||
include_ext = ["go", "tpl", "tmpl", "html"]
|
||||
kill_delay = "0s"
|
||||
log = "build-errors.log"
|
||||
send_interrupt = false
|
||||
stop_on_error = true
|
||||
|
||||
[color]
|
||||
app = ""
|
||||
build = "yellow"
|
||||
main = "magenta"
|
||||
runner = "green"
|
||||
watcher = "cyan"
|
||||
|
||||
[log]
|
||||
time = false
|
||||
|
||||
[misc]
|
||||
clean_on_exit = false
|
||||
|
||||
[screen]
|
||||
clear_on_rebuild = false
|
||||
3
products/.dockerignore
Normal file
3
products/.dockerignore
Normal file
@ -0,0 +1,3 @@
|
||||
**/build
|
||||
**/tmp
|
||||
**/.env*
|
||||
9
products/.gitignore
vendored
Normal file
9
products/.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
/.vscode
|
||||
/.idea
|
||||
|
||||
/build
|
||||
/tmp
|
||||
|
||||
/config.yaml
|
||||
/.env.production
|
||||
/main
|
||||
20
products/Dockerfile
Normal file
20
products/Dockerfile
Normal file
@ -0,0 +1,20 @@
|
||||
# stage 2: build golang backend
|
||||
FROM golang:1.21-alpine3.19 as go-builder
|
||||
|
||||
WORKDIR /go-builder
|
||||
COPY . .
|
||||
|
||||
RUN \
|
||||
go mod download && \
|
||||
go mod verify && \
|
||||
go build -v -ldflags "-s -w" -o products-app ./app/main.go
|
||||
|
||||
|
||||
# stage 2: build final container
|
||||
FROM alpine:3.19
|
||||
|
||||
USER $USER
|
||||
WORKDIR /app
|
||||
COPY --from=go-builder /go-builder/products-app /app
|
||||
|
||||
ENTRYPOINT ["/app/products-app"]
|
||||
39
products/Makefile
Normal file
39
products/Makefile
Normal file
@ -0,0 +1,39 @@
|
||||
EXEC=products-app
|
||||
CONTAINER_NAME=products-app
|
||||
IMAGE_NAME=komponiranje-products-app
|
||||
|
||||
|
||||
run:
|
||||
@air
|
||||
|
||||
|
||||
.PHONY: build
|
||||
build:
|
||||
@go build -ldflags "-s -w" -o ./build/${EXEC} ./app/.
|
||||
|
||||
|
||||
upgrade-packages:
|
||||
@go get -u ./...
|
||||
|
||||
|
||||
docker-build: clean
|
||||
@docker build \
|
||||
--progress=plain \
|
||||
--tag $(IMAGE_NAME) \
|
||||
.
|
||||
|
||||
|
||||
docker-run:
|
||||
@docker run \
|
||||
--name $(CONTAINER_NAME) \
|
||||
--publish 3000:3000 \
|
||||
--env CONTAINER_NAME="Awesome API server" \
|
||||
--env DBPORT=55432 \
|
||||
--detach \
|
||||
$(IMAGE_NAME)
|
||||
|
||||
|
||||
clean:
|
||||
- @docker stop $(CONTAINER_NAME)
|
||||
- @docker rm $(CONTAINER_NAME)
|
||||
- @docker rmi $(IMAGE_NAME)
|
||||
5
products/app/api/dto.go
Normal file
5
products/app/api/dto.go
Normal file
@ -0,0 +1,5 @@
|
||||
package api
|
||||
|
||||
type PingDto struct {
|
||||
Message string `json:"message"`
|
||||
}
|
||||
37
products/app/api/helpers.go
Normal file
37
products/app/api/helpers.go
Normal file
@ -0,0 +1,37 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func isError(c *gin.Context, err error) bool {
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"details": err.Error(),
|
||||
})
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func raiseError(c *gin.Context, errCode int, message string) {
|
||||
c.AbortWithStatusJSON(errCode, gin.H{
|
||||
"details": message,
|
||||
})
|
||||
}
|
||||
|
||||
func raiseBadRequestError(c *gin.Context, message string) {
|
||||
raiseError(c, http.StatusBadRequest, message)
|
||||
}
|
||||
|
||||
func raiseNotFoundError(c *gin.Context, message string) {
|
||||
raiseError(c, http.StatusNotFound, message)
|
||||
}
|
||||
|
||||
func raiseInternalError(c *gin.Context, message string) {
|
||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{
|
||||
"details": "Internal server error. We will we will fix it!",
|
||||
})
|
||||
}
|
||||
7
products/app/api/response.go
Normal file
7
products/app/api/response.go
Normal file
@ -0,0 +1,7 @@
|
||||
package api
|
||||
|
||||
import "products/app/db"
|
||||
|
||||
type GetProductsResponse struct {
|
||||
Products []db.Product `json:"products"`
|
||||
}
|
||||
78
products/app/api/router.go
Normal file
78
products/app/api/router.go
Normal file
@ -0,0 +1,78 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"products/app/db"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
const HOST = "0.0.0.0"
|
||||
const PORT = 3000
|
||||
|
||||
func handlePing(c *gin.Context) {
|
||||
c.JSON(
|
||||
http.StatusOK,
|
||||
PingDto{
|
||||
Message: "Pong!",
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func handleGetProducts(dbConn *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
products := db.GetProducts(dbConn)
|
||||
|
||||
c.JSON(
|
||||
http.StatusOK,
|
||||
GetProductsResponse{
|
||||
Products: *products,
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetProduct(dbConn *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
productId, err := strconv.Atoi(c.Param("productId"))
|
||||
if err != nil {
|
||||
raiseBadRequestError(c, "Invalid productId parameter")
|
||||
return
|
||||
}
|
||||
|
||||
product, err := db.GetProduct(dbConn, productId)
|
||||
if err != nil {
|
||||
raiseNotFoundError(c, "Product not found")
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(
|
||||
http.StatusOK,
|
||||
product,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func initRouter(dbConn *gorm.DB) *gin.Engine {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
router := gin.Default()
|
||||
|
||||
routes := router.Group("/products")
|
||||
{
|
||||
routes.GET("/ping", handlePing)
|
||||
routes.GET("", handleGetProducts(dbConn))
|
||||
routes.GET("/:productId", handleGetProduct(dbConn))
|
||||
}
|
||||
|
||||
return router
|
||||
}
|
||||
|
||||
func Serve(dbConn *gorm.DB) {
|
||||
serverAddr := fmt.Sprintf("%s:%d", HOST, PORT)
|
||||
|
||||
router := initRouter(dbConn)
|
||||
router.Run(serverAddr)
|
||||
}
|
||||
24
products/app/cfg/config.go
Normal file
24
products/app/cfg/config.go
Normal file
@ -0,0 +1,24 @@
|
||||
package cfg
|
||||
|
||||
import (
|
||||
"github.com/kelseyhightower/envconfig"
|
||||
)
|
||||
|
||||
type configStruct struct {
|
||||
DbHost string `default:"localhost"`
|
||||
DbPort int `default:"55432"`
|
||||
DbName string `default:"komponiranje"`
|
||||
DbUser string `default:"pero"`
|
||||
DbPassword string `default:"pero.000"`
|
||||
}
|
||||
|
||||
const ENV_PREFIX = ""
|
||||
|
||||
var Config configStruct
|
||||
|
||||
func init() {
|
||||
err := envconfig.Process(ENV_PREFIX, &Config)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
30
products/app/db/db.go
Normal file
30
products/app/db/db.go
Normal file
@ -0,0 +1,30 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"products/app/cfg"
|
||||
|
||||
"gorm.io/driver/postgres"
|
||||
"gorm.io/gorm"
|
||||
gormLogger "gorm.io/gorm/logger"
|
||||
)
|
||||
|
||||
func ConnectDb() *gorm.DB {
|
||||
var connectionString = fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=disable",
|
||||
cfg.Config.DbUser,
|
||||
cfg.Config.DbPassword,
|
||||
cfg.Config.DbHost,
|
||||
cfg.Config.DbPort,
|
||||
cfg.Config.DbName,
|
||||
)
|
||||
|
||||
var err error
|
||||
dbConn, err := gorm.Open(postgres.Open(connectionString), &gorm.Config{
|
||||
Logger: gormLogger.Default.LogMode(gormLogger.Info),
|
||||
})
|
||||
if err != nil {
|
||||
panic("Error connecting to database: " + err.Error())
|
||||
}
|
||||
|
||||
return dbConn
|
||||
}
|
||||
12
products/app/db/models.go
Normal file
12
products/app/db/models.go
Normal file
@ -0,0 +1,12 @@
|
||||
package db
|
||||
|
||||
type Product struct {
|
||||
Id int `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
Image string `json:"image"`
|
||||
}
|
||||
|
||||
func (m *Product) TableName() string {
|
||||
return "products"
|
||||
}
|
||||
22
products/app/db/repository.go
Normal file
22
products/app/db/repository.go
Normal file
@ -0,0 +1,22 @@
|
||||
package db
|
||||
|
||||
import "gorm.io/gorm"
|
||||
|
||||
func GetProducts(dbConn *gorm.DB) *[]Product {
|
||||
var products []Product
|
||||
|
||||
dbConn.Order("name").Find(&products)
|
||||
|
||||
return &products
|
||||
}
|
||||
|
||||
func GetProduct(dbConn *gorm.DB, id int) (*Product, error) {
|
||||
var product Product
|
||||
|
||||
result := dbConn.Order("name").Where("id = ?", id).First(&product)
|
||||
if result.Error != nil {
|
||||
return nil, result.Error
|
||||
}
|
||||
|
||||
return &product, nil
|
||||
}
|
||||
11
products/app/main.go
Normal file
11
products/app/main.go
Normal file
@ -0,0 +1,11 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"products/app/api"
|
||||
"products/app/db"
|
||||
)
|
||||
|
||||
func main() {
|
||||
dbConn := db.ConnectDb()
|
||||
api.Serve(dbConn)
|
||||
}
|
||||
46
products/go.mod
Normal file
46
products/go.mod
Normal file
@ -0,0 +1,46 @@
|
||||
module products
|
||||
|
||||
go 1.21.5
|
||||
|
||||
require (
|
||||
github.com/gin-gonic/gin v1.9.1
|
||||
gorm.io/driver/postgres v1.5.4
|
||||
gorm.io/gorm v1.25.5
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/bytedance/sonic v1.9.1 // indirect
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
|
||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||
github.com/go-playground/locales v0.14.1 // indirect
|
||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||
github.com/go-playground/validator/v10 v10.14.0 // indirect
|
||||
github.com/goccy/go-json v0.10.2 // indirect
|
||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect
|
||||
github.com/jackc/pgx/v5 v5.5.1 // indirect
|
||||
github.com/jackc/puddle/v2 v2.2.1 // indirect
|
||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||
github.com/jinzhu/now v1.1.5 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/kelseyhightower/envconfig v1.4.0 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
|
||||
github.com/kr/text v0.2.0 // indirect
|
||||
github.com/leodido/go-urn v1.2.4 // indirect
|
||||
github.com/mattn/go-isatty v0.0.19 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
|
||||
github.com/rogpeppe/go-internal v1.12.0 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
github.com/ugorji/go/codec v1.2.11 // indirect
|
||||
golang.org/x/arch v0.3.0 // indirect
|
||||
golang.org/x/crypto v0.18.0 // indirect
|
||||
golang.org/x/net v0.10.0 // indirect
|
||||
golang.org/x/sync v0.6.0 // indirect
|
||||
golang.org/x/sys v0.16.0 // indirect
|
||||
golang.org/x/text v0.14.0 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
114
products/go.sum
Normal file
114
products/go.sum
Normal file
@ -0,0 +1,114 @@
|
||||
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
|
||||
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
|
||||
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
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/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
|
||||
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
|
||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
|
||||
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
|
||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
||||
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||
github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
|
||||
github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
|
||||
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
||||
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
|
||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA=
|
||||
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
||||
github.com/jackc/pgx/v5 v5.5.1 h1:5I9etrGkLrN+2XPCsi6XLlV5DITbSL/xBZdmAxFcXPI=
|
||||
github.com/jackc/pgx/v5 v5.5.1/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
|
||||
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
|
||||
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
||||
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
|
||||
github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
|
||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
|
||||
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
|
||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
|
||||
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
|
||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
|
||||
github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
|
||||
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
|
||||
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
|
||||
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
|
||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
|
||||
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
|
||||
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gorm.io/driver/postgres v1.5.4 h1:Iyrp9Meh3GmbSuyIAGyjkN+n9K+GHX9b9MqsTL4EJCo=
|
||||
gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0=
|
||||
gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=
|
||||
gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
|
||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||
65
proxy/envoy.yaml
Normal file
65
proxy/envoy.yaml
Normal file
@ -0,0 +1,65 @@
|
||||
static_resources:
|
||||
listeners:
|
||||
- address:
|
||||
socket_address:
|
||||
address: 0.0.0.0
|
||||
port_value: 10000
|
||||
filter_chains:
|
||||
- filters:
|
||||
- name: envoy.filters.network.http_connection_manager
|
||||
typed_config:
|
||||
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
|
||||
codec_type: auto
|
||||
stat_prefix: ingress_http
|
||||
route_config:
|
||||
name: local_route
|
||||
virtual_hosts:
|
||||
- name: backend
|
||||
domains:
|
||||
- "*"
|
||||
routes:
|
||||
- match:
|
||||
prefix: "/machines"
|
||||
route:
|
||||
cluster: machines-app-service
|
||||
- match:
|
||||
prefix: "/products"
|
||||
route:
|
||||
cluster: products-app-service
|
||||
http_filters:
|
||||
- name: envoy.filters.http.router
|
||||
typed_config:
|
||||
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
|
||||
clusters:
|
||||
- name: machines-app-service
|
||||
connect_timeout: 0.25s
|
||||
type: strict_dns
|
||||
lb_policy: round_robin
|
||||
load_assignment:
|
||||
cluster_name: machines-app-service
|
||||
endpoints:
|
||||
- lb_endpoints:
|
||||
- endpoint:
|
||||
address:
|
||||
socket_address:
|
||||
address: machines-service
|
||||
port_value: 3000
|
||||
- name: products-app-service
|
||||
connect_timeout: 0.25s
|
||||
type: strict_dns
|
||||
lb_policy: round_robin
|
||||
load_assignment:
|
||||
cluster_name: products-app-service
|
||||
endpoints:
|
||||
- lb_endpoints:
|
||||
- endpoint:
|
||||
address:
|
||||
socket_address:
|
||||
address: products-service
|
||||
port_value: 3000
|
||||
admin:
|
||||
access_log_path: "/dev/null"
|
||||
address:
|
||||
socket_address:
|
||||
address: 0.0.0.0
|
||||
port_value: 800
|
||||
Reference in New Issue
Block a user