マイクロサービス アーキテクチャの人気に伴い、マイクロサービス間の通信がますます重要になっています。これまで一般的に使用されていた REST API 通信方式には、マイクロサービスが相互に呼び出す場合に次のような欠点がありました。
したがって、メッセージ キュー (Message Queue) に基づいてマイクロサービス間の非同期通信を実装することが良い選択になりました。メッセージ キューはメッセージ サーバーにメッセージを送信し、受信者はメッセージを非同期に受信して処理できるため、時間のかかるサービス間の通信が節約され、システム パフォーマンスが向上し、通信の信頼性が確保されます。
しかし、アーキテクチャ実装の観点から見ると、強力で拡張性の高いメッセージ通信ソリューションを迅速に実装するにはどうすればよいでしょうか?今日は、go-zero をベースにしたマイクロサービス メッセージ通信ソリューションについて説明します。
マイクロサービス通信を実装するには、サーバー上のメッセージ キューを処理するツールが必要です。現在人気のあるものには、RabbitMQ、Kafka、RocketMQ などが含まれます。この記事では、RabbitMQ メッセージ キューの使用方法を紹介します。したがって、最初に RabbitMQ をインストールして設定する必要があります。
関連するインストール パッケージとインストール方法は、[RabbitMQ 公式 Web サイト](https://www.rabbitmq.com/download.html) で参照できます。ここでは詳細な説明は行いません。
インストールが完了したら、RabbitMQ Web 管理コンソールで必要な仮想ホストとユーザーを作成します。ここでは、vhost を myhost、ユーザー名とパスワードを admin/admin として設定します。
go-zero は、スケーラブルで保守可能なマイクロサービスを構築するためのツールキットです。必要なすべてのツールをモノリシック アプリケーションに統合し、マイクロサービス、RPC、API ゲートウェイなどの最も一般的に使用されるツールを提供します。 go-zero 開発環境をローカルにインストールする必要があります。
go-zero はマイクロサービス アーキテクチャに基づいており、マイクロサービス、RPC、API ゲートウェイなどの共通の開発ツールを提供します。 go-zero を使用して RabbitMQ メッセージ キューをサポートするマイクロサービス アーキテクチャを実装するのは非常に簡単です。
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 はサービスの設定ファイルを表します。
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 を使用する際に必要な情報を指定します。
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 部分 アプリケーション ロジックのコードを処理するために、特定のビジネス ニーズに応じて特定のコード実装を作成できます。
message.api ファイルと同じディレクトリを入力し、次のコードを実行します。
goctl rpc proto -src message.api -dir .このコマンドは、
message.api# を自動的に生成します。 . ##関連する gRPC プロトコル ファイルを作成し、現在のディレクトリに配置します。 5. 登録サービス
に追加します: <pre class='brush:go;toolbar:false;'>// 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)
}
}()</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 サイトの他の関連記事を参照してください。