geektutu/7days-golang · error

rpc server: can't find service

Error message

rpc server: can't find service 

What it means

The request string was parsed as "Service.Method" but the service part is not registered on this server's serviceMap. The server returns this error so the client knows the requested service does not exist on this endpoint.

Source

Thrown at gee-rpc/day5-http-debug/server.go:122

	if err := cc.ReadHeader(&h); err != nil {
		if err != io.EOF && err != io.ErrUnexpectedEOF {
			log.Println("rpc server: read header error:", err)
		}
		return nil, err
	}
	return &h, nil
}

func (server *Server) findService(serviceMethod string) (svc *service, mtype *methodType, err error) {
	dot := strings.LastIndex(serviceMethod, ".")
	if dot < 0 {
		err = errors.New("rpc server: service/method request ill-formed: " + serviceMethod)
		return
	}
	serviceName, methodName := serviceMethod[:dot], serviceMethod[dot+1:]
	svci, ok := server.serviceMap.Load(serviceName)
	if !ok {
		err = errors.New("rpc server: can't find service " + serviceName)
		return
	}
	svc = svci.(*service)
	mtype = svc.method[methodName]
	if mtype == nil {
		err = errors.New("rpc server: can't find method " + methodName)
	}
	return
}

func (server *Server) readRequest(cc codec.Codec) (*request, error) {
	h, err := server.readRequestHeader(cc)
	if err != nil {
		return nil, err
	}
	req := &request{h: h}
	req.svc, req.mtype, err = server.findService(h.ServiceMethod)
	if err != nil {

View on GitHub (pinned to cf36443821)

Solutions

  1. Register the service on the server: Register(new(Foo)) or DefaultServer.Register(new(Foo))
  2. Confirm the exact registered service name (Register uses the exported receiver type name) matches the client string
  3. Ensure the client targets the server instance that actually hosts the service

Example fix

// before
client.Call("DemoService.Div", args, reply) // DemoService never registered
// after
srv := geeprpc.NewServer()
srv.Register(new(DemoService)) // server side
client.Call("DemoService.Div", args, reply)
Defensive patterns

Strategy: validation

Validate before calling

func (c *Client) MustCall(service, method string, args, reply interface{}) error {
    if !serviceRegistered[service] { // populated from server registration list
        return fmt.Errorf("service %q is not registered on this server", service)
    }
    return c.Call(service+"."+method, args, reply)
}

Try / catch

err := client.Call("DemoService.Div", args, reply)
if err != nil && strings.Contains(err.Error(), "can't find service") {
    return fmt.Errorf("server at %s does not host this service; check Register calls: %w", addr, err)
}

Prevention

When it happens

Trigger: Call("Foo.Bar") when Register was never called with a receiver named Foo, the service was registered on a different Server instance, or the service name casing differs from the derived name.

Common situations: Forgetting to call Register/DefaultServer.Register on the server side, deploying a service that was removed or renamed, or pointing a client at the wrong server/port that hosts different services.

Related errors


AI-assisted analysis of geektutu/7days-golang@cf36443821 (2026-09-03). Data as JSON: /api/errors/32462165e76ab08d. Report an issue: GitHub.