geektutu/7days-golang · error

rpc server: can't find service

Error message

rpc server: can't find service 

What it means

Registry lookup failure in findService: the service name parsed from "Service.Method" (before the dot) is absent from the server's serviceMap, meaning no such service was Register()ed on this server. It fires for requests targeting unregistered or misspelled services.

Source

Thrown at gee-rpc/day7-registry/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. Ensure server.Register(rcvr) was called successfully on the same Server instance handling the request and check its error
  2. Match the service name exactly as Go derives it (type name, case-sensitive), e.g. register a *Foo and call "Foo.Bar"
  3. Check that the server log shows the service was registered at startup
  4. Verify client and server point at the same deployment/port

Example fix

// before
// server never registered
// after
var _ = new(Foo)
srv.Register(new(Foo)) // then call "Foo.Bar"
Defensive patterns

Strategy: validation

Validate before calling

// keep a client-side registry of known services matching server registrations
var knownServices = map[string]bool{"Foo": true, "Foo2": true}
func serviceRegistered(sm string) bool {
    svc := strings.SplitN(sm, ".", 2)[0]
    return knownServices[svc]
}

Try / catch

err := client.Call("Foo.Sum", args, &reply)
if err != nil && strings.Contains(err.Error(), "can't find service") {
    log.Printf("service %q not registered on server: %v", serviceName, err)
    // refresh registry / fail fast
}

Prevention

When it happens

Trigger: Calling "Foo.Bar" when no object was Register'ed with name "Foo" on that server instance — wrong service name in the client call, service registered on a different Server/DefaultServer instance, or the server never called Register due to an earlier startup error.

Common situations: Typos or case mismatch between the registered type name and the string used by the client; the server binary was updated and the service renamed; multiple servers where only one registers the service.

Related errors


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