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