Browse Source

使用select调整rpc超时请求

master
xyiege 4 months ago
parent
commit
fbca9d6acd
  1. 53
      aufs/core/sysmonitor.go

53
aufs/core/sysmonitor.go

@ -6,6 +6,7 @@ import (
"log" "log"
"net/http" "net/http"
"net/rpc/jsonrpc" "net/rpc/jsonrpc"
"time"
) )
// 返回json数据 // 返回json数据
@ -38,31 +39,43 @@ func SysMonitor(w http.ResponseWriter, r *http.Request) {
// todo 待优化 // todo 待优化
for _, sc := range scslist { for _, sc := range scslist {
// 利用channel控制超时
errch := make(chan error, 1)
// 利用jsonrpc 请求结果 // 利用jsonrpc 请求结果
// 构建访问的链接 // 构建访问的链接
ser := sc.Addr + ":" + sc.Port ser := sc.Addr + ":" + sc.Port
// 链接服务 go func() {
client, err := jsonrpc.Dial("tcp", ser) // 链接服务
if err != nil { client, err := jsonrpc.Dial("tcp", ser)
log.Fatalf("Dial SysMonitor failed: %v", err) // 发生错误,执行下一个
// 跳过 if err != nil {
continue log.Fatalf("Dial SysMonitor failed: %v\n", err)
} errch <- err
}
//
defer client.Close()
// 返回的是pb字符串
var resp string
// 调用远程方法 SysmonitorService.GetSysInfo
client.Call("SysmonitorService.GetSysInfo", nil, &resp)
// 构建json结构的字符串
sinfo := SysInfo{
Addr: sc.Addr,
Port: sc.Port,
Resp: resp,
}
// 添加到rsdata
rsdata.Slist = append(rsdata.Slist, sinfo)
}()
// //
defer client.Close() select {
// 返回的是pb字符串 case err := <-errch:
var resp string log.Printf("SysMonitor failed: %v\n", err)
// 调用远程方法 SysmonitorService.GetSysInfo case <-time.After(5 * time.Second):
client.Call("SysmonitorService.GetSysInfo", nil, &resp) log.Printf("SysMonitor timeout: %v\n", ser)
// 构建json结构的字符串
sinfo := SysInfo{
Addr: sc.Addr,
Port: sc.Port,
Resp: resp,
} }
// 添加到rsdata
rsdata.Slist = append(rsdata.Slist, sinfo)
} }
// 生成json数据 // 生成json数据
sysresp := SysResp{ sysresp := SysResp{

Loading…
Cancel
Save