Задать вопрос
des1roer
@des1roer
ученье - свет, а неученье - приятный полумрак

Roadrunner-php/goridge как вызвать golang код из php?

Использую https://github.com/roadrunner-php/goridge и https://github.com/roadrunner-server/goridge

В .rr.dev.yaml

version: "2.7"

    server:
        command: "php bin/road-runner-console baldinof:roadrunner:worker"
        env:
            - APP_RUNTIME: Baldinof\RoadRunnerBundle\Runtime\Runtime

    ## Go воркер
    go_worker:
        command: "go run main.go"
        env:
            - GOOS: linux
            - GOARCH: amd64


main.go

package main

    import (
            "fmt"
            "net"
            "net/rpc"

            goridgeRpc "github.com/roadrunner-server/goridge/v3/pkg/rpc"
    )

    type App struct{}

    func (s *App) Hi(name string, r *string) error {
            *r = fmt.Sprintf("Hello, %s!", name)
            return nil
    }

    func main() {
        fmt.Println("Привет, мир!")

            ln, err := net.Listen("tcp", ":6001")
            if err != nil {
                    panic(err)
            }

            _ = rpc.Register(new(App))

            for {
                    conn, err := ln.Accept()
                    if err != nil {
                            continue
                    }
                    _ = conn
                    go rpc.ServeCodec(goridgeRpc.NewCodec(conn))
            }
    }


в консольной команде

$tcpRPC = new Goridge\RPC\RPC(Goridge\Relay::create('tcp://127.0.0.1:6001'));

    $r = $tcpRPC->call("App.Hi",  "Antony");

    var_dump(
        $r
    ); echo __METHOD__.':'.__LINE__;die();


запускаю так сервер
bin/rr-server serve .rr.dev.yaml -d

вывод

{"level":"debug","ts":1729072653.5290942,"logger":"rpc","msg":"plugin was started","address":"tcp://127.0.0.1:6001","list of the plugins with RPC methods:":["informer","resetter","app"]}
[INFO] RoadRunner server started; version: 2.12.3, buildtime: 2023-02-16T13:08:41+0000


при запуске консольной команды php

"exception" => Spiral\Goridge\RPC\Exception\ServiceException^ {
    #message: "Error 'rpc: can't find service App.Hi' on tcp://127.0.0.1:6001"


Все это в докер. Может нужно порты как то пробросить. Но в целом запуск сервера и команду я выполняю внутри контейнера, но в разных консолях.
  • Вопрос задан
  • 143 просмотра
Подписаться 1 Сложный 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
RusPOPsy
@RusPOPsy
Говорила мама, учи математику ...
Я запутался кто тут кого вызывает ...
"server" вызывает "go_worker" ?
Консольная команда - она где вызывается, на "server" ??

В общем так ...
Если один сервис вызывает другой (когда "server" вызывает "go_worker") порты не нужно пробрасывать.

надо поправить в консольной команде адрес
$tcpRPC = new Goridge\RPC\RPC(Goridge\Relay::create('tcp://go_worker:6001'));

наверное будет достаточно.

для случая когда надо вызвать сервис (например "go_worker") из "внешнего мира" надо пробрасывать порты
к сожалению тут я не подскажу т.к. ".rr.dev.yaml" - не стандартный docker-compose file, надо в смотреть как пробрасывать тут где то https://github.com/roadrunner-php/goridge
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы