ホームページ >バックエンド開発 >Golang >go-zero をベースとしたマイクロサービス メッセージ通信ソリューション

go-zero をベースとしたマイクロサービス メッセージ通信ソリューション

王林
王林オリジナル
2023-06-22 17:19:371864ブラウズ

マイクロサービス アーキテクチャの人気に伴い、マイクロサービス間の通信がますます重要になっています。これまで一般的に使用されていた REST API 通信方式には、マイクロサービスが相互に呼び出す場合に次のような欠点がありました。

  • 頻繁なネットワーク リクエストは遅延とパフォーマンスのボトルネックをもたらします;
  • 高頻度のリクエストの場合また、短期間に大量のリクエストが発生すると、サービスがクラッシュする可能性があります。
  • 大量のデータ送信が行われるシナリオでは、HTTP プロトコルに基づく送信方法も非効率になりがちです。

したがって、メッセージ キュー (Message Queue) に基づいてマイクロサービス間の非同期通信を実装することが良い選択になりました。メッセージ キューはメッセージ サーバーにメッセージを送信し、受信者はメッセージを非同期に受信して処理できるため、時間のかかるサービス間の通信が節約され、システム パフォーマンスが向上し、通信の信頼性が確保されます。

しかし、アーキテクチャ実装の観点から見ると、強力で拡張性の高いメッセージ通信ソリューションを迅速に実装するにはどうすればよいでしょうか?今日は、go-zero をベースにしたマイクロサービス メッセージ通信ソリューションについて説明します。

環境構成

マイクロサービス通信を実装するには、サーバー上のメッセージ キューを処理するツールが必要です。現在人気のあるものには、RabbitMQ、Kafka、RocketMQ などが含まれます。この記事では、RabbitMQ メッセージ キューの使用方法を紹介します。したがって、最初に RabbitMQ をインストールして設定する必要があります。

RabbitMQ のインストール

関連するインストール パッケージとインストール方法は、[RabbitMQ 公式 Web サイト](https://www.rabbitmq.com/download.html) で参照できます。ここでは詳細な説明は行いません。

インストールが完了したら、RabbitMQ Web 管理コンソールで必要な仮想ホストとユーザーを作成します。ここでは、vhost を 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

Through 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. ハンドラーとサービスの実装

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. コード生成

ハンドラーとサービスを作成した後、go-zero コマンド ライン ツールを使用して RPC コードを自動的に生成する必要があります。コマンド ラインで、

message.api ファイルと同じディレクトリを入力し、次のコードを実行します。

goctl rpc proto -src message.api -dir .

このコマンドは、

message.api# を自動的に生成します。 . ##関連する gRPC プロトコル ファイルを作成し、現在のディレクトリに配置します。 5. 登録サービス

次のコードを

internal/config/config.go

に追加します: <pre class='brush:go;toolbar:false;'>// register MessageApi group := server.Group(&quot;/&quot;) messageSvc := service.NewMessageApi(biz.NewBizClient()) server.POST(group+&quot;/send-message&quot;, httpx.NewHandler(messageSvc.SendMessage)) go func() { err = zmq.NewSubscriber(&quot;my-exchange&quot;, &quot;my-key&quot;, false).Subscribe(func(msg zmq.Message) { logx.Infof(&quot;[RabbitMQ Subscriber] receive message %s&quot;, string(msg.Body)) }) // 订阅队列 if err != nil { panic(err) } }()</pre>その中に # があります。 application ##MessageApi

サービスは、

zmq.NewSubscriber 呼び出しで登録およびサブスクライブされます。メッセージをサブスクライブした後、logx.Infof を通じて RabbitMQ キュー内のメッセージを直接処理します。 最後に、main.go

Run メソッドに次のコードを追加します。

s := &http.Server{
    Handler: server,
    Addr:    ":"+cfg.Port,
}
上記のコードは、サービスが HTTP で実行可能になるように構成します。サーバーに接続し、指定されたポートにバインドします。最後に、サービスが正常かどうかをテストできます。

概要

この記事では、go-zero に基づくマイクロサービス メッセージ通信ソリューションを紹介し、サンプル コードを通じて RabbitMQ をサポートするマイクロサービス アーキテクチャを実装しました。 RabbitMQ には、メッセージング通信テクノロジで広く使用されている、複数のプログラミング言語をサポートしている、オープン ソースであるという利点があり、ほとんどのエンタープライズ レベルのアプリケーション シナリオに適しています。実用化にあたっては、ビジネスシーンや需要特性に応じて柔軟に活用する必要があります。

以上がgo-zero をベースとしたマイクロサービス メッセージ通信ソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。