私は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
);
私は良いアプローチに従っていますか?か否か?誰かが私にもっと良い解決策を示すかもしれない。
はい、私たちはRabbitMQを使用していますが、今はRPCサポートを持っていますが、このパフォーマンスは良いですか? – PumpkinSeed
RabbitMQはメッセージブローカーですが、チャネルを作成し、それをリッスンし、何らかの形式でエンコードされたメッセージを送信することでRPCとして使用できます(どちらの言語でも最も簡単です) – Tinwor