goridge 高性能的 PHP-to-Golang RPC编解码器库

Golang 314 字

Goridge 是 SpiralsCout 开源的高性能的 PHP 到 Golang 编解码器库。该库可以帮助你在 PHP 调用 Go 的服务方法。

Goridge 入门

使用方法:

我们先来编写简单的 Go 程序,目的就是提供一个 rpc 接口给 PHP 进行访问。

GO111MODULE=on go get github.com/roadrunner-server/goridge/v3

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

Hi 函数用来接受一个 name 入参。

# 进入工程陌路
cd project
# 安装 spiral/goridge sdk
composer install spiral/goridge
# 编写 index.php
vim index.php

<?php

use Spiral\Goridge\RPC\RPC;
use Spiral\Goridge\SocketRelay;

include 'vendor/autoload.php';

$rpc1 = new RPC(new SocketRelay("127.0.0.1", 6001));
echo $rpc1->call("App.Hi", "Goridge RPC");

2023-03-08T12:31:55.png

PHP 访问 Go 原生 RPC 的方法

在 2019 年,我们的团队开始引入 Golang,原因是想通过 Golang 良好的并发性来提升我们的应用访问速度,但是正常情况下公司是不会给研发团队大片的时间去进行重构,这个时候我们就需要 PHP 和 Go 进行通讯。

不过那个时候我们并没有使用 Goridge,而是直接用 PHP 访问 Go RPC。现在我们来模拟一下当时的场景,还是用 Goridge 的那个例子,其实实现思路大体上是一致的,不过我们并没有写自己的编解码,而是利用了 jsonrpc。

package main

import (
    "fmt"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
)

type App struct{}

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

func main() {
    rpc := rpc.NewServer()
    app := new(App)
    rpc.Register(app)
    ln, err := net.Listen("tcp", ":6001")
    defer ln.Close()
    if err != nil {
        panic(err)
    }
    for {
        conn, err := ln.Accept()
        if err != nil {
            panic(err)
        }
        go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
    }
}

在 go 中我,我们使用 jsonrpc 作为解码器,这样一来就是可以通过 socket 传递 json 的方式进行访问 go 的 rpc 接口了。

2023-03-08T13:16:34.png

如果对 go rpc 不是特别了解的话,可以通过 https://colobu.com/2016/09/18/go-net-rpc-guide/ 这篇文章了解一下,该文的作者是 rpcx 的作者鸟窝,是 Golang 界的一位大牛。

maksim
Maksim(一笑,吡罗),PHPer,Goper
OωO
开启隐私评论,您的评论仅作者和评论双方可见