mirror of
https://github.com/ebosas/microservices.git
synced 2025-06-06 22:16:11 +02:00
78 lines
1.8 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|