用golang实现jsonrpc服务供php调用

项目做大了,免不了要用到微服务,并且是跨语言的。下面用go自带的 Jsonrpc 实现微服务供php调用。

服务端:jsonRpcService.go

package main

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


type RpcService struct {
}

//请求数据结构体
type RequestData struct {
	type  int
	data  string
}

// 响应数据结构体
type ResponseData struct {
	Status int // 状态
	Data interface{} //数据
	Msg string //说明
}

// 方法(必须是公有方法,且必须是两个参数)
func (this *RpcService  ) Order(request RequestData , res *ResponseData ) error {
	m := map[string]string{"type":"10","msg":"hello."}
	//mjson,_ :=json.Marshal(m)
	//mString :=string(mjson)
	res.Status = req.type
	res.Data = m
	res.Msg = "success"
	return nil
}


func main() {
	_ = rpc.Register(new(RpcService )) // 注册rpc服务
	lis, err := net.Listen("tcp", "127.0.0.1:5050") //监听端口,如果监听所有客户端则去掉ip
	if err != nil {
		log.Fatalln("fatal error: ", err)
	}

	_, _ = fmt.Fprintf(os.Stdout, "%s", "jsonrpc is started\n")

	for {
		conn, err := lis.Accept() // 接收客户端连接请求
		if err != nil {
			continue
		}
		go func(conn net.Conn) { // 并发处理客户端请求
			_, _ = fmt.Fprintf(os.Stdout, "%s", "new client connect\n")
			jsonrpc.ServeConn(conn)
		}(conn)
	}
}

PHP客户端调用

		$host = '127.0.0.1';
		$port = '5050';
        $conn = fsockopen($host, $port, $errno, $errstr, 3);
        if (!$conn) {
            var_dump('链接失败');
            exit;
        }

        $method = 'RpcService .Order';
        $params = ['type'=>4,'data'=>'数据'];
        $err = fwrite($conn, json_encode(array(
                'method' => $method,
                'params' => [$params],
                'id'     => 0,
            ))."\n");
        if ($err === false){
            var_dump('写入数据失败');
            exit;
        }

        stream_set_timeout($conn, 0, 30000);
        $line = fgets($conn);
        if ($line === false) {
            var_dump('获取响应数据失败');
            exit;
        }
        var_dump(json_decode($line,true));
        exit;

启动服务端后,运行php脚本就可以与go的rpc通信了。注意超时时间设置!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值