Вызов зарегистрированного метода RPC на том же сервере в Golang

У меня есть несколько методов, зарегистрированных для типа в серверной программе для RPC в Golang. Я хочу использовать эти методы от клиентов, а также от самого сервера. например У меня есть дополнительный метод, зарегистрированный как метод RPC, который я хочу вызывать у клиентов. Но я хочу вызвать тот же метод в той же серверной программе и для какой-то другой функции. Есть ли способ сделать это?


person user3545351    schedule 11.04.2015    source источник
comment
Готовы ли вы терпеть накладные расходы RPC даже при вызове с самого сервера? Если да, то вы можете просто открыть локальное соединение с localhost и использовать его как клиент.   -  person Benjamin Gruenbaum    schedule 12.04.2015
comment
В качестве альтернативы, если эти общие методы одинаковы, поместите их вместе в пакет, и пусть ваш RPC-сервер и ваше другое приложение установят/используют этот пакет.   -  person Momer    schedule 12.04.2015


Ответы (2)


Трудно ответить, если мы не знаем, как вы строите свой код на каком-то примере, это будет проще.

Два варианта. Создайте клиент с горутиной, установите соединение с сервером и вызовите метод. Этот метод плохой, wtf.

Второй :

type CalcServ struct {
  LastAnswer
}

type CalcReq struct {
   X int
   Y int
}

type CalcResp struct {
   Z int
}

func (serv *CalcServ) Add(req *CalcReq, resp *CalcResp) error {
  serv.LastAnswer = req.X + req.Y
  serv.Show(req, resp)
  return nil
}

func (serv *CalcServ) Show(req *CalcReq, resp *CalcResp) error {
  resp.Z = serv.LastAnswer
  return nil
}

Мой пример не является хорошей реализацией, но я просто хочу показать вам идею. Существует два метода RPC, Add и Show, и Add вызов Show.

person Manawasp    schedule 13.04.2015

Я должен был сделать это сам. Это надуманный пример, показывающий, что я сделал в моем случае:

Это функция RPC...

func (server *Server) RemoteGoroutineCount(request GoroutineCountsRequest, response *GoroutineCountsResponse) error {
    response.Count = runtime.NumGoroutine()
    return nil
}

Теперь, если я хочу вызвать это локально, я могу просто сделать

req := GoroutineCountsRequest{}
res := &GorouteCountsResponse{}
s := &Server{}
err := s.RemoteGoroutineCount(req, res)
// handle error
// Now res has your filled in response
res.NumGoroutines
person sberry    schedule 17.04.2015