ホームページ  >  記事  >  バックエンド開発  >  go-zero を使用して分散型言語間 RPC 呼び出しを実装する

go-zero を使用して分散型言語間 RPC 呼び出しを実装する

王林
王林オリジナル
2023-06-22 09:25:402092ブラウズ

ビジネス規模の拡大に伴い、単一のアプリケーションだけではシステムのニーズを満たせなくなり、分散アーキテクチャが徐々に主流になってきました。分散システムでは、RPC は不可欠な要素となっており、サービスをリモートで呼び出すための便利、効率的、信頼性の高い方法を提供し、さまざまなサービス間の高速かつ安定したデータ対話と呼び出しを可能にします。

クロス言語 RPC 呼び出しの場合、通信プロトコルとシリアル化プロトコルの両方が複数のプログラミング言語と互換性がある必要があるため、実装は比較的困難です。この記事では、読者に実用的なソリューションを提供することを目的として、go-zero フレームワークを使用して言語を超えた分散 RPC 呼び出しを実装する方法を紹介します。

  1. go-zero フレームワークの概要

go-zero は、go 言語のネイティブ net/http モジュールを使用し、一連の A を提供する軽量の Web フレームワークです。 HTTP サービスとマイクロサービスを簡単に組み合わせることができる、シンプルで使いやすく、高性能な API 開発手法。 go-zero は、分散型の同時実行性の高いサーバー アプリケーションを迅速に構築するのに役立ちます。コードとドキュメントは GitHub で無料で入手できます。

  1. 言語間の RPC 呼び出しを実現する

2.1 サービスを定義する

go-zero でサービスを定義するときは、最初にプロト ファイルを記述する必要があります。サーバーとクライアント間の通信インターフェイスを定義します。 Example という名前のサービスを定義するとします。これには 2 つのメソッドが含まれています:

syntax = "proto3";

package rpc;

service Example {
    rpc SayHello (Request) returns (Response);
    rpc GetUser (UserRequest) returns (UserResponse);
}

message Request {
    string name = 1;
}

message Response {
    string message = 1;
}

message UserRequest {
    string id = 1;
}

message UserResponse {
    string name = 1;
    string email = 2;
}

proto ファイルを定義した後、protobuf コンパイラーを使用してそれを go 言語ソース ファイルにコンパイルし、次のコマンドを実行する必要があります:

protoc --go_out=. --go-grpc_out=. rpc.proto

これにより、rpc.pb.go と rpc_grpc.pb.go という 2 つのファイルが生成されます。

2.2 サーバーの実装

go-zero フレームワークでは、go-grpc モジュールを使用して grpc サービスを実装できます。サーバーを実装するときは、proto ファイルで定義されたインターフェイスを実装し、go-zero によって提供される server.NewServer を使用して、AddService メソッドを呼び出してサービスを追加し、Init メソッドで grpc サービスを開始する必要があります。

package server

import (
    "context"
    "rpc"

    "github.com/tal-tech/go-zero/core/logx"
    "github.com/tal-tech/go-zero/core/stores/sqlx"
    "github.com/tal-tech/go-zero/core/syncx"
    "github.com/tal-tech/go-zero/zrpc"
    "google.golang.org/grpc"
)

type ExampleContext struct {
    Logx      logx.Logger
    SqlConn   sqlx.SqlConn
    CacheConn syncx.SharedCalls
}

type ExampleServer struct {
    Example rpc.ExampleServer
}

func NewExampleServer(ctx ExampleContext) *ExampleServer {
    return &ExampleServer{
        Example: &exampleService{
            ctx: ctx,
        },
    }
}

func (s *ExampleServer) Init() {
    server := zrpc.MustNewServer(zrpc.RpcServerConf{
        BindAddress: "localhost:7777",
    })
    rpc.RegisterExampleServer(server, s.Example)
    server.Start()
}

type exampleService struct {
    ctx ExampleContext
}

func (s *exampleService) SayHello(ctx context.Context, req *rpc.Request) (*rpc.Response, error) {
    return &rpc.Response{
        Message: "Hello, " + req.Name,
    }, nil
}

func (s *exampleService) GetUser(ctx context.Context, req *rpc.UserRequest) (*rpc.UserResponse, error) {
    // 查询数据库
    return &rpc.UserResponse{
        Name:  "name",
        Email: "email",
    }, nil
}

サーバー上では、Init メソッドを使用して RPC サーバーを起動し、MustNewServer を使用して RPC サーバーを作成できます。バインドするアドレスを含む RpcServerConf 構造体を渡す必要があります。

2.3 クライアントの実装

go-zero フレームワークでは、zrpc モジュールを使用して grpc クライアントを実装できます。 zrpc.Dial を使用して接続を作成し、rpc クライアントをインスタンス化します。

package client

import (
    "context"
    "rpc"

    "google.golang.org/grpc"
)

type ExampleClient struct {
    client rpc.ExampleClient
}

func NewExampleClient(conn *grpc.ClientConn) *ExampleClient {
    return &ExampleClient{
        client: rpc.NewExampleClient(conn),
    }
}

func (c *ExampleClient) SayHello(name string) (string, error) {
    resp, err := c.client.SayHello(context.Background(), &rpc.Request{
        Name: name,
    })
    if err != nil {
        return "", err
    }
    return resp.Message, nil
}

func (c *ExampleClient) GetUser(id string) (*rpc.UserResponse, error) {
    return c.client.GetUser(context.Background(), &rpc.UserRequest{
        Id: id,
    })
}

クライアントでは、NewExampleClient 関数を使用して RPC クライアントを作成するだけです。 SayHello メソッドの機能は、サーバーから応答を取得して返すことです。 GetUser メソッドは、サーバーからユーザー情報の応答を取得し、UserResponse の形式で返します。

2.4 テスト

サーバーとクライアントのコードを実装したので、次のコードを使用してテストできます。

package main

import (
    "fmt"
    "log"
    "rpc_example/client"
    "rpc_example/server"

    "google.golang.org/grpc"
)

func main() {
    ctx := server.ExampleContext{}
    conn, err := grpc.Dial("localhost:7777", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("grpc.Dial err :%v", err)
    }

    defer conn.Close()

    client := client.NewExampleClient(conn)
    resp, err := client.SayHello("Alice")
    if err != nil {
        log.Fatalf("client.SayHello err : %v", err)
    }

    fmt.Println(resp)

    user, err := client.GetUser("123")
    if err != nil {
        log.Fatalf("client.GetUser err : %v", err)
    }

    fmt.Println(user)
}

上記のコードでは、Open a grpc 接続し、SayHello メソッドと GetUser メソッドを呼び出して RPC サービスをテストします。正しいデータで正常に応答でき、RPC サービスが正常に動作していることを確認できます。

  1. 概要

この記事では、go-zero フレームワークを使用して、go-zero の Def モジュールを含む分散型言語間 RPC 呼び出しを実装する方法を紹介しました。 grpc、protobuf、zrpc およびその他のテクノロジー。 RPC サービスを実装するときは、まず RPC インターフェイスを定義し、次にそのインターフェイスに基づいてサーバーとクライアントのコードを作成します。最後に、RPC サービスを開始する Init メソッドを追加します。軽量で使いやすい分散システム フレームワークをお探しの場合は、go-zero が間違いなく良い選択です。

以上がgo-zero を使用して分散型言語間 RPC 呼び出しを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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