2017-02-14 5 views
3

私はRPCフレームワークを探し始めましたが、私はgRPCを見つけましたが、私の問題はプロトコルバッファを使用していました。現在のモノリシックPHPアプリケーションで使用したいのですが大きな混乱になる。だから、私はGo基本RPCサービスを実装し始めましたが、現在、私はPHPで何をどのように使用するかについては何も考えていません。呼び出すRPCのRPCソケットメソッド

だから、基本的に私はこれらの構造体とメソッドを持っているのDatabaseManagerパッケージがあります。

type DatabaseManager struct { 
    Database *gorm.DB 
    Log  logging.Logger 
} 

func (db *DatabaseManager) Last(args *string, reply *string) error { 

    db.Log[logging.INFO].Printf("%v", *args) 
    reply = args 
    db.Log[logging.INFO].Printf("%v", *reply) 
    return nil 
} 

を私はリスニング用のサーバーを起動するコマンドを使用しています:

func registerDatabaseManager(server *rpc.Server, dbManager *databasemanager.DatabaseManager) { 
    server.RegisterName("DatabaseManager", dbManager) 
} 

func RunRPC(path string) error { 
    db, _, log := dependencyInjection(path) 
    dbManager := &databasemanager.DatabaseManager{ 
     Database: db, 
     Log:  log, 
    } 
    server := rpc.NewServer() 
    registerDatabaseManager(server, dbManager) 
    listen, err := net.Listen("tcp", ":50051") 
    if err != nil { 
     log[logging.ERROR].Print(err) 
    } 
    log[logging.INFO].Print("Server started - listening on :50051") 
    server.Accept(listen) 
    return nil 
} 

だから、基本的に非常に基本的なアプローチを採用しています。大量のデータを処理するため、リクエストと応答の形式はJSONになります。

type DBManager struct { 
    client *rpc.Client 
} 

func (t *DBManager) Last(args *string) string { 
    *args = "awesome test" 
    var reply string 
    err := t.client.Call("DatabaseManager.Last", args, &reply) 
    if err != nil { 
     log.Fatal("arith error:", err) 
    } 
    return reply 
} 

func main() { 
    conn, err := net.Dial("tcp", "localhost:50051") 
    if err != nil {log.Fatal("Connectiong:", err)} 
    dbManager := &DBManager{client: rpc.NewClient(conn)} 
    asd := "asdasqwesaf" 
    fmt.Println(dbManager.Last(&asd)) 
} 

それがうまく働いていると私はそれを使用することができますが、私は、私はあまりにもそこにメソッドを使用する古いmonolitic PHPを持って言及していた:Golangで

クライアントさは次のようになります。

私はインターネット上でthisを見つけました。これは私が望むものと同じものを実装していますが、私のニーズに合わせて書き直そうとしたが問題はありません。基本的に私はcallRPCパラメータを次のように変更しました:

$result = callRPC(
    "tcp://127.0.0.1:50051", 
    [ 
     '{"method":"DatabaseManager.Last","params":["asd"],"id":0}', 
    ], 
    1, 
    8 
); 

私は良いアプローチに従っていますか?か否か?誰かが私にもっと良い解決策を示すかもしれない。

答えて

2

Go rpcのデフォルトの実装net/rpcは、GobというGo構造体に固有の特定のエンコーディングを使用します。私が知っている限り、PHP用のGobをエンコード/デコンディングする実装はないので、PHPからrpc golangサーバを呼び出すことはできません。
代わりに使用grpc(はい、それはprotoバッファを使用しますが、難しいことはありませんし、プロトタイプのバッファ3オブジェクトの新しいタイプから)ZeroMQまたはRabbitMQのようなメッセージブローカーを使用してください(私は両方の初心者ですRabbitMQは学習がより簡単であるため)。

+0

はい、私たちはRabbitMQを使用していますが、今はRPCサポートを持っていますが、このパフォーマンスは良いですか? – PumpkinSeed

+0

RabbitMQはメッセージブローカーですが、チャネルを作成し、それをリッスンし、何らかの形式でエンコードされたメッセージを送信することでRPCとして使用できます(どちらの言語でも最も簡単です) – Tinwor

関連する問題