在 PHP 中调用 Go RPC 套接字方法

Call Go RPC socket methods in PHP

我开始寻找 RPC 框架并找到了 gRPC,但我的问题是它使用了 Protocol-Buffer,我担心如果我想在我当前的单体 PHP 应用程序中使用它一团糟。所以,我开始实现一个 Go 基本 RPC 服务,但目前我不知道在 PHP 中使用什么以及如何使用它。

所以基本上我有一个数据库管理器包,其中有这些结构和方法:

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 因为大多数时候它会处理大量数据。

Golang 中的客户端如下所示:

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))
}

它运行良好,我可以使用它,但曾提到我有一个旧的单体PHP,我也想在那里使用这些方法。

我在网上找到了this,就是实现了我想要的一样,但是这个问题我尝试根据需要重写它,但是它不起作用。基本上我只是将 callRPC 参数更改如下:

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

我不知道,我遵循的是好的方法吗?或不?也许有人可以告诉我更好的解决方案。

Go rpc 默认实现 net/rpc 使用特定于 Go 结构的特定编码,称为 Gob。据我所知,PHP 没有 encoding/deconding Gob 的实现,因此您将无法从 PHP.
调用 rpc golang 服务器 替代方案是:使用 grpc(是的,它使用 proto buffer 但并不难,因为 proto buffer 3 有新类型的对象)或使用消息代理,例如 ZeroMQ or RabbitMQ(如果你是初学者,我建议RabbitMQ 因为它更容易学习)。