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
- Register the service on the server: Register(new(Foo)) or DefaultServer.Register(new(Foo))
- Confirm the exact registered service name (Register uses the exported receiver type name) matches the client string
- 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
- Assert in server startup code that every expected service registration returned nil error
- Share the list of registered service names between server and client (config or generated code)
- Integration-test each Service.Method string against a running server before release
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
- rpc: service already defined:
- rpc: service already defined:
- rpc server: can't find service
- rpc: service already defined:
- rpc server: can't find service
AI-assisted analysis of geektutu/7days-golang@cf36443821 (2026-09-03).
Data as JSON: /api/errors/32462165e76ab08d.
Report an issue: GitHub.