golang rpc找不到服务

Posted

技术标签:

【中文标题】golang rpc找不到服务【英文标题】:golang rpc can't find service 【发布时间】:2020-01-21 15:13:08 【问题描述】:

我在这段代码中找不到错误。 当我运行它时,我得到Error in Broker.Connect: rpc: can't find service Broker.Connect。 我知道这条消息意味着当客户端尝试调用远程过程 Connect 时,他没有找到它。但我不明白为什么。我确定我发布的过程连接正确。

我给你看我的代码。 我认为缺少一些简单的东西,但我就是不明白是什么。

这是我要发布的服务器界面:

package Broker

import (
    "MyRand/Rand"
    "fmt"
    "math/rand"
    "strconv"
)

type ConsumerId struct 
    Name string
    Address string


type Broker int

func (b *Broker)Connect(s string, r *ConsumerId) error
    r.Name = Rand.String(10)
    CL.lock.Lock()
    exists := true
    for exists 
        e := CL.list.Front()
        for i := 0; i < CL.list.Len(); i++ 
            var v ConsumerId = e.Value.(ConsumerId)
            if s == v.Address 
                if v.Name != r.Name 
                    portNumber := rand.Intn(1000) + rand.Intn(9000)
                    s = strconv.Itoa(portNumber)
                    break
                 else 
                    continue
                
            
            if i == CL.list.Len() -1 
                exists = false
            
            e = e.Next()
        
    
    r.Address = s
    CL.list.PushBack(r)
    CL.lock.Unlock()

    fmt.Println("Host connected: " + s)
    return nil

这是发布方法的代码:

package Broker

import (
    "container/list"
    "fmt"
    "log"
    "net"
    "net/rpc"
    "sync"
)

type ConsumerList struct 
    lock sync.RWMutex
    list list.List


const ServerAddr = ":1234"

var CL *ConsumerList
var b *Broker
var l net.Listener
var e error

func initialization()
    CL = new(ConsumerList)
    b = new(Broker)
    server := rpc.NewServer()
    e = server.RegisterName("Broker", b)
    if e != nil 
        log.Fatal("Format of service Broker is not correct: ", e)
    
    // Listen for incoming tcp packets on specified port.
    l, e = net.Listen("tcp", ServerAddr)
    if e != nil 
        log.Fatal("Listen error:", e)
    


func FuncBroker() 
    initialization()
    for 
        fmt.Println("Broker.go42")
        rpc.Accept(l)
    

最后,这是调用过程并触发错误的代码:

package Consumer

import (
    "MyProject/Broker"
    "container/list"
    "fmt"
    "log"
    "math/rand"
    "net"
    "net/rpc"
    "os"
    "strconv"
)

var subscriptions *list.List
var id Broker.ConsumerId
var client *rpc.Client
var e error

func connect()
    client, e := rpc.Dial("tcp", "localhost" + Broker.ServerAddr)
    if e != nil 
        log.Fatal("Error in dialing: ", e)
    
    portN := 1000+rand.Intn(8999)
    portNString := strconv.Itoa(portN)
    e = client.Call("Broker.Connect", portNString, &id)
    if e != nil 
        log.Fatal("Error in Broker.Connect: ", e)
    



func FuncConsumer()
    connect()
    defer client.Close()
//  go exposeInterface()

    subscriptions = new(list.List)
//  userCommands()
    os.Exit(0)

很明显,当我运行代码时,我首先运行代理,然后运行消费者。

有人可以帮我吗?

【问题讨论】:

您注册了“Server”作为服务的名称,而不是“Broker”。 @BurakSerdar,我编辑是因为那是一个测试。即使与“经纪人”也不起作用。 【参考方案1】:

错误是使用rpc.Accept(l) 调用accept,我更正了server.Accept(l),其中server 是此处取值server := rpc.NewServer()

【讨论】:

以上是关于golang rpc找不到服务的主要内容,如果未能解决你的问题,请参考以下文章

Gmail API - Oauth2/google:找不到凭据(Golang)

RPC 调用找不到方法

dubbo启动消费者找不到服务端com.alibaba.dubbo.rpc.RpcException: No provider available from registry ip:2181 for

错误:从未调用过的方法上出现“找不到 RPC 方法”

IIS默认网站启动不了,iis提示:找不到指定的程序,错误127

Go语言 go get 找不到 google.golang.org/protobuf/encoding/prototext 解决办法