用golang實現jsonrpc服務供php呼叫

2021-10-25 01:57:45 字數 1440 閱讀 7763

專案做大了,免不了要用到微服務,並且是跨語言的。下面用go自帶的 jsonrpc 實現微服務供php呼叫。

服務端:jsonrpcservice.go

package main

import (

"fmt"

"log"

"net"

"net/rpc"

"net/rpc/jsonrpc"

"os"

)type rpcservice struct

//請求資料結構體

type requestdata struct

// 響應資料結構體

type responsedata struct //資料

msg string //說明

}// 方法(必須是公有方法,且必須是兩個引數)

func (this *rpcservice ) order(request requestdata , res *responsedata ) error

//mjson,_ :=json.marshal(m)

//mstring :=string(mjson)

res.status = req.type

res.data = m

res.msg = "success"

return nil

}func main()

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

for

go func(conn net.conn) (conn)

}}

php客戶端呼叫

$host = '127.0.0.1';

$port = '5050';

$conn = fsockopen($host, $port, $errno, $errstr, 3);

if (!$conn)

$method = 'rpcservice .order';

$params = ['type'=>4,'data'=>'資料'];

$err = fwrite($conn, json_encode(array(

'method' => $method,

'params' => [$params],

'id' => 0,

))."\n");

if ($err === false)

stream_set_timeout($conn, 0, 30000);

$line = fgets($conn);

if ($line === false)

var_dump(json_decode($line,true));

exit;

啟動服務端後,執行php指令碼就可以與go的rpc通訊了。注意超時時間設定!

golang 函式用例

golang函式是不支援巢狀 但是可以使用匿名函式實現巢狀 預設引數 過載,但支援 以下是一些基本用法示例 一般用法,無返回值 func funcname1 input1 type1 多引數,乙個返回值 func funcname2 input1 type1,input2 type2 output1...

Golang實現單鏈表

package main import fmt 定義結構體 注意點 go不支援型別別名,type與c語言中的typedef並不一樣 var a int a 3 type int int var b int b 3 fmt.println a b 報錯 invalid operation a b mi...

golang之路 bitmap 實現

介紹一下bitmap的思想 情景1 有些時候我們為了判斷乙個某個元素是否存在乙個集合中,普通的方式是map int x儲存。資料量小的時候還可以 待資料量龐大的時候,比如我們判斷某人的momoid是否在某個momoid切片中,儲存就悲劇了。算一下 乙個int 4byte 倘若儲存500w個資料 4 ...