返回

Go-Micro+RabbitMQ微服务:创建简单备忘录(二)

后端

在上一篇文章中,我们介绍了如何使用Go-Micro和RabbitMQ建立微服务的基础架构。在本文中,我们将进一步探讨如何使用这些技术创建一个简单的备忘录应用程序。

架构概述

我们的备忘录应用程序将由以下组件组成:

  • API 网关: 处理传入的 HTTP 请求并将其路由到适当的微服务。
  • 备忘录服务: 负责管理备忘录的创建、读取、更新和删除。
  • 消息队列(RabbitMQ): 用于在服务之间传递消息,例如创建新备忘录时的通知。

实现备忘录服务

我们将使用Go-Micro框架来实现备忘录服务。在终端中运行以下命令来创建一个新的微服务项目:

go mod init micro-notes

接下来,安装必要的依赖项:

go get github.com/micro/go-micro
go get github.com/streadway/amqp

micro-notes 目录中,创建一个新的文件 notes.go,并添加以下代码:

package main

import (
    "context"
    "fmt"
    "time"

    "github.com/micro/go-micro"
    "github.com/micro/go-micro/server"
    "github.com/streadway/amqp"
)

type Note struct {
    ID        string    `json:"id"`
    Title     string    `json:"title"`
    Content   string    `json:"content"`
    CreatedAt time.Time `json:"created_at"`
    UpdatedAt time.Time `json:"updated_at"`
}

type NotesService struct {
}

func (n *NotesService) Create(ctx context.Context, req *Note, rsp *Note) error {
    // 实际的备忘录创建逻辑
    return nil
}

func main() {
    // 创建新的微服务实例
    service := micro.NewService(
        micro.Name("go.micro.srv.notes"),
        micro.Version("latest"),
    )
    
    // 监听来自消息队列的通知
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()
    
    ch, err := conn.Channel()
    if err != nil {
        log.Fatal(err)
    }
    defer ch.Close()
    
    q, err := ch.QueueDeclare(
        "notes", // 队列名称
        false,   // 是否持久化
        false,   // 是否自动删除
        false,   // 是否独占
        false,   // 是否阻塞
        nil,     // 其他参数
    )
    if err != nil {
        log.Fatal(err)
    }
    
    msgs, err := ch.Consume(
        q.Name, // 队列名称
        "",      // 消费者标签
        true,    // 是否自动确认
        false,   // 是否独占
        false,   // 是否公平分发
        false,   // 是否阻塞
        nil,     // 其他参数
    )
    if err != nil {
        log.Fatal(err)
    }
    
    go func() {
        for d := range msgs {
            fmt.Println("Received message:", string(d.Body))
        }
    }()
    
    // 注册备忘录服务处理程序
    micro.RegisterHandler(service.Server(), new(NotesService))

    // 启动微服务
    if err := service.Run(); err != nil {
        log.Fatal(err)
    }
}

SEO优化