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
- Ensure server.Register(rcvr) was called successfully on the same Server instance handling the request and check its error
- Match the service name exactly as Go derives it (type name, case-sensitive), e.g. register a *Foo and call "Foo.Bar"
- Check that the server log shows the service was registered at startup
- 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
- Register every service at server startup and check Register's error
- Use the exact Go type name (case-sensitive) as the service name
- Keep a shared constants file of service names for client and server
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
- rpc client: call failed:
- number of options is more than 1
- rpc server: service/method request ill-formed:
- rpc server: can't find service
- rpc server: can't find method
AI-assisted analysis of geektutu/7days-golang@cf36443821 (2026-09-03).
Data as JSON: /api/errors/551b628e87127b8d.
Report an issue: GitHub.