>  기사  >  백엔드 개발  >  Go-Zero 기반의 마이크로서비스 메시지 통신 솔루션

Go-Zero 기반의 마이크로서비스 메시지 통신 솔루션

王林
王林원래의
2023-06-22 17:19:371766검색

마이크로서비스 아키텍처의 인기로 인해 마이크로서비스 간의 통신이 점점 더 중요해지고 있습니다. 과거에 일반적으로 사용된 REST API 통신 방법은 마이크로서비스가 서로 호출할 때 다음과 같은 단점이 있었습니다.

  • 잦은 네트워크 요청으로 인해 지연 및 성능 병목 현상이 발생합니다.
  • 빈도가 높은 요청의 경우 짧은 시간 내에 많은 수가 발생합니다.
  • 대량의 데이터 전송이 포함된 시나리오의 경우 HTTP 프로토콜 기반 전송 방법도 비효율적일 수 있습니다.

따라서 메시지 큐(Message Queue)를 기반으로 마이크로서비스 간 비동기 통신을 구현하는 것이 좋은 선택이 되었습니다. 메시지 대기열은 메시지 서버에 메시지를 보낼 수 있으며 수신자는 메시지를 비동기적으로 수신하고 처리할 수 있으므로 서비스 간 통신에 소요되는 시간을 절약하고 시스템 성능을 향상시키며 통신 안정성을 보장합니다.

그러나 아키텍처 구현 측면에서 강력하고 확장성이 뛰어난 메시징 통신 솔루션을 신속하게 구현하는 방법은 무엇입니까? 오늘은 Go-Zero 기반의 마이크로서비스 메시지 통신 솔루션에 대해 이야기해보겠습니다.

환경 구성

마이크로서비스 통신을 구현하려면 서버의 메시지 대기열을 처리하는 도구가 필요합니다. 현재 인기 있는 것으로는 RabbitMQ, Kafka, RocketMQ 등이 있습니다. 이 기사에서는 RabbitMQ 메시지 큐의 사용을 소개합니다. 따라서 먼저 RabbitMQ를 설치하고 구성해야 합니다.

RabbitMQ 설치

관련 설치 패키지 및 설치 방법은 [RabbitMQ 공식 홈페이지](https://www.rabbitmq.com/download.html)에서 확인하실 수 있습니다. 여기에는 자세한 설명이 나와 있지 않습니다.

설치가 완료된 후 RabbitMQ의 웹 관리 콘솔에서 필요한 가상 호스트와 사용자를 생성하세요. 여기서는 가상호스트를 myhost로, 사용자 이름과 비밀번호를 admin/admin으로 설정했습니다.

go-zero 설치

go-zero는 확장 가능하고 유지 관리가 가능한 마이크로서비스를 구축하기 위한 툴킷입니다. 모놀리식 애플리케이션에 필요한 모든 도구를 통합하고 마이크로서비스, RPC 및 API 게이트웨이와 같이 가장 일반적으로 사용되는 도구를 제공합니다. Go-Zero 개발 환경을 로컬에 설치해야 합니다.

go-zero 인프라

go-zero는 마이크로서비스 아키텍처를 기반으로 하며 마이크로서비스, RPC, API 게이트웨이와 같은 일반적인 개발 도구를 제공합니다. Go-Zero를 사용하여 RabbitMQ 메시지 대기열을 지원하는 마이크로서비스 아키텍처를 구현하는 것은 매우 간단합니다.

1. 서비스 생성

goctl 도구(go-zero의 명령줄 도구)를 사용하여 서비스를 빠르게 생성합니다. 먼저 go-zero 명령줄에 서비스가 생성된 디렉터리를 입력한 후 다음 명령을 실행합니다.

goctl api new message

작업 결과는 다음과 같습니다.

- api
    - etc
        - message-api.yaml
    - internal
        - config
            - config.go
        - handler
            - message_handler.go
        - service
            - message_service.go
    - message.api
- Dockerfile
- go.mod
- go.sum
- main.go

goctl api를 통해 생성된 서비스 new 명령에는 필요한 기본 디렉터리와 기본 구현이 제공됩니다. 그 중 -api는 서비스의 이름을 나타내고, -etc/message-api.yaml은 서비스의 구성 파일을 나타냅니다. goctl api new命令创建的服务中包含了我们所需的基础目录和默认实现。其中- api表示服务的名称,- etc/message-api.yaml表示服务的配置文件。

2. 配置文件

打开etc/message-api.yaml,配置我们的RabbitMQ信息:

Name: message-api
Host: 0.0.0.0
Port: 8080
JwtSecret: # 在API网关中使用

MessageQueue:
  Host: 127.0.0.1
  Port: 5672 # RabbitMQ端口
  User: admin # RabbitMQ用户名
  Password: admin # RabbitMQ密码
  VirtualHost: myhost # RabbitMQ vhost

其中MessageQueue部分指定了使用RabbitMQ时必需的信息。

3. handler和service实现

我们需要添加handler和service实现来处理RabbitMQ消息队列中的消息。在handler目录下添加message_handler.go文件,并添加如下代码:

package handler

import (
    "context"

    "github.com/tal-tech/go-zero/core/logx"
    "github.com/tal-tech/go-zero/rest/httpx"
    "github.com/tal-tech/go-zero/zmq"
)

type MessageHandler struct {
    messageService *zmq.Service
}

func NewMessageHandler(ctx context.Context) *MessageHandler {
    return &MessageHandler{
        messageService: zmq.NewService("my-exchange", "my-key", false), // 确定队列信息
    }
}

func (h *MessageHandler) SendMessage(ctx context.Context, req *MessageRequest) (*MessageResponse, error) {
    logx.Infof("handler receive message %v", req.Message)

    err := h.messageService.SendMessage(zmq.NewMessage(req.Message)) // 发送消息到队列

    if err != nil {
        logx.Error(err)
        return nil, httpx.NewDefaultError(httpx.InternalServerErrorStatus)
    }

    return &MessageResponse{}, nil
}

其中,我们使用了go-zero提供的zmq工具来实现与RabbitMQ消息队列的交互(详见[go-zero官方文档](https://go-zero.dev/cn/tools/zmq))。

service目录中添加message_service.go文件,并添加如下代码:

package service

import (
    "context"

    "message/internal/biz"
)

type MessageApi struct {
    bc *biz.BizClient
}

func NewMessageApi(bc *biz.BizClient) *MessageApi {
    return &MessageApi{
        bc: bc,
    }
}

func (s *MessageApi) SendMessage(ctx context.Context, req *MessageRequest) (*MessageResponse, error) {
    _, err := s.bc.SendMessage(ctx, req.Message)

    if err != nil {
        return nil, err
    }

    return &MessageResponse{}, nil
}

其中,biz部分为处理应用逻辑的代码,具体代码实现可以根据具体业务需求进行编写。

4. 代码生成

创建好handler和service之后,需要使用go-zero的命令行工具来为我们自动生成RPC代码。我们在命令行中,进入到与message.api文件相同的目录下,运行如下代码:

goctl rpc proto -src message.api -dir .

此命令将为我们自动生成与message.api文件相关的gRPC协议文件,并将其放到当前目录下。

5. 注册服务

internal/config/config.go中增加如下代码:

// register MessageApi
group := server.Group("/")
messageSvc := service.NewMessageApi(biz.NewBizClient())
server.POST(group+"/send-message", httpx.NewHandler(messageSvc.SendMessage))

go func() {
    err = zmq.NewSubscriber("my-exchange", "my-key", false).Subscribe(func(msg zmq.Message) {
        logx.Infof("[RabbitMQ Subscriber] receive message %s", string(msg.Body))
    }) // 订阅队列

    if err != nil {
        panic(err)
    }
}()

其中,我们对应用中的MessageApi服务进行了注册,在zmq.NewSubscriber调用中进行了订阅。在订阅到消息后,我们通过logx.Infof来直接处理RabbitMQ队列中的消息。

最后,在main.go中的Run

2. 구성 파일

etc/message-api.yaml을 열고 RabbitMQ 정보를 구성합니다.

s := &http.Server{
    Handler: server,
    Addr:    ":"+cfg.Port,
}

MessageQueue 부분은 RabbitMQ 정보를 사용할 때 필요한 정보를 지정합니다. .

3. 핸들러 및 서비스 구현🎜🎜RabbitMQ 메시지 대기열의 메시지를 처리하려면 핸들러 및 서비스 구현을 추가해야 합니다. handler 디렉터리에 message_handler.go 파일을 추가하고 다음 코드를 추가합니다. 🎜rrreee🎜그 중 go-zero에서 제공하는 zmq 도구를 사용하여 메시지를 구현합니다. RabbitMQ 상호 작용을 사용하여 대기열에 추가하세요(자세한 내용은 [go-zero 공식 문서](https://go-zero.dev/cn/tools/zmq) 참조). 🎜🎜service 디렉터리에 message_service.go 파일을 추가하고, 다음 코드를 추가하세요. 🎜rrreee🎜그 중 biz 부분은 애플리케이션 로직 코드 처리를 위해 특정 비즈니스 요구에 따라 특정 코드 구현을 작성할 수 있습니다. 🎜🎜4. 코드 생성🎜🎜핸들러와 서비스를 생성한 후 go-zero 명령줄 도구를 사용하여 자동으로 RPC 코드를 생성해야 합니다. 명령줄에서 message.api 파일과 동일한 디렉터리를 입력하고 다음 코드를 실행합니다. 🎜rrreee🎜이 명령은 message.api를 자동으로 생성합니다. 관련 gRPC 프로토콜 파일을 파일로 만들고 현재 디렉터리에 배치합니다. 🎜🎜5. 서비스 등록🎜🎜internal/config/config.go에 다음 코드를 추가합니다. 🎜rrreee🎜그 중 우리는 애플리케이션에 MessageApi 서비스를 등록했습니다. zmq.NewSubscriber 호출을 구독했습니다. 메시지를 구독한 후 logx.Infof를 통해 RabbitMQ 대기열의 메시지를 직접 처리합니다. 🎜🎜마지막으로 main.goRun 메서드에 다음 코드를 추가합니다. 🎜rrreee🎜위 코드는 서비스를 실행 가능한 HTTP 서버로 구성하고 이를 on에 바인딩합니다. 지정된 포트. 마지막으로 서비스가 정상적인지 테스트할 수 있습니다. 🎜🎜Summary🎜🎜 이번 글에서는 go-zero 기반의 마이크로서비스 메시지 통신 솔루션을 소개하고, 샘플 코드를 통해 RabbitMQ를 지원하는 마이크로서비스 아키텍처를 구현했습니다. RabbitMQ는 메시징 통신 기술에 널리 사용되고, 여러 프로그래밍 언어를 지원하며, 오픈 소스라는 장점을 가지고 있으며 대부분의 기업 수준 애플리케이션 시나리오에 적합합니다. 실제 적용에서는 비즈니스 시나리오와 수요 특성에 따라 유연하게 사용해야 합니다. 🎜

위 내용은 Go-Zero 기반의 마이크로서비스 메시지 통신 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.