1
0
mirror of https://github.com/ebosas/microservices.git synced 2025-06-06 22:16:11 +02:00
2021-10-05 16:10:14 +03:00

78 lines
1.8 KiB
Go

package main
import (
"bufio"
"encoding/json"
"fmt"
"log"
"os"
"strings"
"time"
"github.com/ebosas/microservices/internal/config"
"github.com/ebosas/microservices/internal/models"
"github.com/ebosas/microservices/internal/rabbit"
"github.com/streadway/amqp"
)
var conf = config.New()
func main() {
fmt.Println("[Backend service]")
// Establish a Rabbit connection.
conn, err := rabbit.GetConn(conf.RabbitURL)
if err != nil {
log.Fatalf("rabbit connection: %s", err)
}
defer conn.Close()
err = conn.DeclareTopicExchange(conf.Exchange)
if err != nil {
log.Fatalf("declare exchange: %s", err)
}
// Start a Rabbit consumer with a handler for printing messages.
conn.StartConsumer(conf.Exchange, conf.QueueBack, conf.KeyBack, printMessages)
publishInput(conn)
}
// printMessages prints messages to stdout.
func printMessages(d amqp.Delivery) bool {
var message models.Message
err := json.Unmarshal(d.Body, &message)
if err != nil {
log.Fatalf("unmarshal message: %s", err)
}
fmt.Printf("> %s\n", string(message.Text))
return true
}
// publishInput reads user input, marshals to json, and publishes to
// a Rabbit exchange with the front-end and database routing keys.
func publishInput(c *rabbit.Conn) {
reader := bufio.NewReader(os.Stdin)
for {
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
if input == "" {
continue
}
inputTime := time.Now().UnixNano() / int64(1e6) // in miliseconds
inputMsg := models.Message{Text: input, Source: "back", Time: inputTime}
message, err := json.Marshal(inputMsg)
if err != nil {
log.Fatalf("marshal message: %s", err)
}
key := conf.KeyFront + "." + conf.KeyDB + "." + conf.KeyCache
err = c.Publish(conf.Exchange, key, message)
if err != nil {
log.Fatalf("publish message: %s", err)
}
}
}