项目做大了,免不了要用到微服务,并且是跨语言的。下面用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通信了。注意超时时间设置!