2017-02-14 12 views
3

Я начал искать RPC-фреймворки, и я нашел gRPC, но моя проблема связана с использованием протокола-буфера, и я боюсь, если я захочу использовать его в своем текущем монолитном PHP-приложении, он будет быть большой беспорядок. Итак, я начал внедрять базовую RPC-систему Go, но в настоящее время я не знаю, что и как ее использовать в PHP.Вызов метода RPC сокетов в PHP

Так в основном у меня есть пакет 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, потому что большую часть времени он обрабатывает большие объемы данных.

Клиент в 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 Params как:

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

Я не знаю, я после хорошего подхода? Или нет? Может быть, кто-то может показать мне лучшее решение.

ответ

2

Реализация по умолчанию для Rpc net/rpc использует конкретную кодировку для структуры Go, называемую Gob. Насколько я знаю, не существует реализации кодирования/декодирования Gob для PHP, и по этой причине вы не сможете вызывать сервер rpc golang из PHP.
Альтернативы: использовать grpc (да, он использует протобуфер, но не сложно, а поскольку протобуфер 3 - новый тип объекта) или использовать брокер сообщений, такой как ZeroMQ или RabbitMQ (если вы новичок на обоих, я предлагаю RabbitMQ, так как его легче освоить).

+0

Да, мы используем RabbitMQ, но я просто получил его сейчас, когда он поддерживает RPC, это хорошее исполнение? – PumpkinSeed

+0

RabbitMQ - это только брокер сообщений, но вы можете использовать его как RPC, создавая канал, прослушивая его и отправляя сообщения, закодированные в некотором формате (наиболее простым на обоих языках является json) – Tinwor

 Смежные вопросы

  • Нет связанных вопросов^_^