Browse Source

使用select调整rpc超时请求

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

53
aufs/core/sysmonitor.go

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

Loading…
Cancel
Save