Я начал искать 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
);
Я не знаю, я после хорошего подхода? Или нет? Может быть, кто-то может показать мне лучшее решение.
Да, мы используем RabbitMQ, но я просто получил его сейчас, когда он поддерживает RPC, это хорошее исполнение? – PumpkinSeed
RabbitMQ - это только брокер сообщений, но вы можете использовать его как RPC, создавая канал, прослушивая его и отправляя сообщения, закодированные в некотором формате (наиболее простым на обоих языках является json) – Tinwor