dongyou2714 2018-12-03 07:46 采纳率: 0%
浏览 140

PHP客户端和Golang服务器中的Apache Thrift错误

when i use Apache Thrift PHP client and PHP server is OK, but When I use Golang as Server, is not OK, I find nothing in the internet that about Golang thrift use Http mode,The document only show the usage about socket mode in Golang,so i need help.

php server code(use laravel5.2, thrift 0.11.0):

    try{

       header('Content-Type', 'application/x-thrift');

        $dokuHandler = new DokuService();

        $multiplexedProcessor = new TMultiplexedProcessor();

        // 创建多个服务Processor
        $dokuProcessor = new DokuServiceProcessor($dokuHandler);

        // 将服务注册到TMultiplexedProcessor中
        $multiplexedProcessor->registerProcessor("doku", $dokuProcessor);

        // 初始化数据传输方式transport
        $transport = new TBufferedTransport(new TPhpStream(TPhpStream::MODE_R | TPhpStream::MODE_W));
        // 利用该传输方式初始化数据传输格式protocol
        $protocol = new TBinaryProtocol($transport, true, true);

        // 开始服务
        $transport->open();
        $multiplexedProcessor->process($protocol, $protocol);
    } catch (\TException $exception) {
        Log::error("DokuService handleRequest", [
            'request' => $request,
            'exMsg' => $exception->getMessage(),
            'exStack' => $exception->getTraceAsString(),
        ]);
    } finally {
        if ($transport) {
            $transport->close();
        }
    }

php client code:

public function __construct()
{
    $this->transport = null;
    try {
        $uri = '/rpc/outgo/server';
        $serviceName = 'outgo';

        $host = self::getHost();
        $port = self::getPort();

        $socket = new THttpClient($host, $port, $uri);
        $this->transport = new TBufferedTransport($socket, 1024, 1024);
        $protocol = new TBinaryProtocol($this->transport);
        $this->multiplexedProtocol = new TMultiplexedProtocol($protocol, $serviceName);
        parent::__construct($this->multiplexedProtocol);
    } catch (\Exception $e) {
        Log::error('construct OutgoRpcClient error', [
            'host' => $host,
            'port' => $port,
            'serviceName' => $serviceName,
            'ex_msg' => $e->getMessage(),
            'ex_trace' => $e->getTraceAsString(),
        ]);
    }
}

golang server code(go1.10.3, gin framework,):

func RpcReceive(c *gin.Context) {
//defer func() {
//  if err := recover(); err != nil {
//      config.LogRecord.WithFields(logrus.Fields{"error": 
err}).Error("rpc worker error")
//  }
//}()

var transport thrift.TTransport

newTransport, err := 
thrift.NewTBufferedTransportFactory(10).GetTransport(transport)
if err != nil {
    panic("new transport error")
}

protocol := 
thrift.NewTBinaryProtocolFactoryDefault().GetProtocol(newTransport)

orderProcessor := 
orderservice.NewOrderServiceProcessor(new(orderService))

OrderServiceName := "outgo"
multiProcessor := thrift.NewTMultiplexedProcessor()
multiProcessor.RegisterProcessor(OrderServiceName, orderProcessor)

newTransport.Open()
multiProcessor.Process(c, protocol, protocol)
//newTransport.Close()

}

golang err:

   runtime error: invalid memory address or nil pointer dereference
/usr/local/opt/go/libexec/src/runtime/panic.go:502 (0x102ad08)
        gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))
/usr/local/opt/go/libexec/src/runtime/panic.go:63 (0x1029d7d)
        panicmem: panic(memoryError)
/usr/local/opt/go/libexec/src/runtime/signal_unix.go:388 (0x1040279)
        sigpanic: panicmem()
/usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/git.apache.org/thrift.git/lib/go/thrift/buffered_transport.go:58 (0x18c180a)
        (*TBufferedTransport).Open: return p.tp.Open()
/usr/local/var/www/go/src/github.com/rule-engine/rule-engine/app/http/controller/rpc/receiveBusiness.go:86 (0x18ce4cf)
        RpcReceive: newTransport.Open()
/usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin/context.go:104 (0x1537b42)
        (*Context).Next: c.handlers[c.index](c)
/usr/local/var/www/go/src/github.com/rule-engine/rule-engine/app/http/middleware/catchPanic.go:41 (0x16b2e20)
        RecoveryWithWriter.func1: c.Next()
/usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin/context.go:104 (0x1537b42)
        (*Context).Next: c.handlers[c.index](c)
/usr/local/var/www/go/src/github.com/rule-engine/rule-engine/app/http/middleware/commonMw.go:16 (0x16b40a4)
        Logger.func1: c.Next()
/usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin/context.go:104 (0x1537b42)
        (*Context).Next: c.handlers[c.index](c)
/usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin/gin.go:332 (0x153ebe4)
        (*Engine).handleHTTPRequest: context.Next()
/usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin/gin.go:296 (0x153e432)
        (*Engine).ServeHTTP: engine.handleHTTPRequest(c)
/usr/local/opt/go/libexec/src/net/http/server.go:2694 (0x128093b)
        serverHandler.ServeHTTP: handler.ServeHTTP(rw, req)
/usr/local/opt/go/libexec/src/net/http/server.go:1830 (0x127caf0)
        (*conn).serve: serverHandler{c.server}.ServeHTTP(w, w.req)
/usr/local/opt/go/libexec/src/runtime/asm_amd64.s:2361 (0x1057030)
        goexit: BYTE    $0x90   // NOP
] <nil>}
goroutine 33 [running]:
net/http.(*conn).serve.func1(0xc4202da000)
        /usr/local/opt/go/libexec/src/net/http/server.go:1726 +0xd0
panic(0x1b06940, 0xc42033e5a0)
        /usr/local/opt/go/libexec/src/runtime/panic.go:502 +0x229
github.com/rule-engine/rule-engine/vendor/github.com/sirupsen/logrus.Entry.log(0xc4200d52c0, 0xc4202f4630, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/sirupsen/logrus/entry.go:126 +0x2d2
github.com/rule-engine/rule-engine/vendor/github.com/sirupsen/logrus.(*Entry).Panic(0xc42033e410, 0xc42056b640, 0x1, 0x1)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/sirupsen/logrus/entry.go:194 +0xaa
github.com/rule-engine/rule-engine/vendor/github.com/sirupsen/logrus.(*Logger).Panic(0xc4200d52c0, 0xc42056b640, 0x1, 0x1)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/sirupsen/logrus/logger.go:244 +0x6d
github.com/rule-engine/rule-engine/app/http/middleware.RecoveryWithWriter.func1.1(0xc42037e580)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/app/http/middleware/catchPanic.go:35 +0x46b
panic(0x19db200, 0x21320b0)
        /usr/local/opt/go/libexec/src/runtime/panic.go:502 +0x229
github.com/rule-engine/rule-engine/vendor/git.apache.org/thrift.git/lib/go/thrift.(*TBufferedTransport).Open(0xc420248080, 0xc4202f4510, 0x1b241cf)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/git.apache.org/thrift.git/lib/go/thrift/buffered_transport.go:58 +0x2a
github.com/rule-engine/rule-engine/app/http/controller/rpc.RpcReceive(0xc42037e580)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/app/http/controller/rpc/receiveBusiness.go:86 +0x370
github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin.(*Context).Next(0xc42037e580)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin/context.go:104 +0x43
github.com/rule-engine/rule-engine/app/http/middleware.RecoveryWithWriter.func1(0xc42037e580)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/app/http/middleware/catchPanic.go:41 +0x51
github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin.(*Context).Next(0xc42037e580)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin/context.go:104 +0x43
github.com/rule-engine/rule-engine/app/http/middleware.Logger.func1(0xc42037e580)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/app/http/middleware/commonMw.go:16 +0x85
github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin.(*Context).Next(0xc42037e580)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin/context.go:104 +0x43
github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc4200dc6c0, 0xc42037e580)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin/gin.go:332 +0x585
github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc4200dc6c0, 0x1c29ae0, 0xc42038c000, 0xc42015a000)
        /usr/local/var/www/go/src/github.com/rule-engine/rule-engine/vendor/github.com/gin-gonic/gin/gin.go:296 +0x153
net/http.serverHandler.ServeHTTP(0xc4200dc7e0, 0x1c29ae0, 0xc42038c000, 0xc42015a000)
        /usr/local/opt/go/libexec/src/net/http/server.go:2694 +0xbc
net/http.(*conn).serve(0xc4202da000, 0x1c2a860, 0xc4201da4c0)
        /usr/local/opt/go/libexec/src/net/http/server.go:1830 +0x651
created by net/http.(*Server).Serve
        /usr/local/opt/go/libexec/src/net/http/server.go:2795 +0x27b

I refer php server to write golang server code.

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 安卓adb backup备份应用数据失败
    • ¥15 eclipse运行项目时遇到的问题
    • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
    • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集
    • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
    • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
    • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)