geektutu/7days-golang · error
rpc server: can't find service
Error message
rpc server: can't find service
What it means
After splitting the method name on the last dot, findService looks the service name up in the server's serviceMap (populated by Register). If no service with that name has been registered, the server rejects the request with this error naming the missing service. It protects against dispatching to nonexistent receivers.
Source
Thrown at gee-rpc/day4-timeout/server.go:121
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: err := server.Register(new(Foo)) before Serve
- Verify the registered service name (derived from the receiver's type name) matches the prefix used by the client
- Confirm the client is connected to the intended server instance/port
Example fix
// before (server) // Foo never registered srv.Serve(lis) // after (server) srv.Register(new(Foo)) srv.Serve(lis)
Defensive patterns
Strategy: validation
Validate before calling
// on the server: ensure services are registered before serving
if err := srv.Register(new(Foo)); err != nil {
log.Fatalf("register Foo: %v", err)
} Try / catch
err := client.Call(ctx, "Foo.Sum", args, reply)
if err != nil && strings.Contains(err.Error(), "can't find service") {
// wrong server or missing registration; fail fast or redial to correct server
} Prevention
- Register every service immediately after opening the listener, before Serve
- Keep client method-name constants derived from the same package that registers services
- Smoke-test each service/method pair at startup
- Verify client points at the correct server address/environment
When it happens
Trigger: Client calls e.g. "Foo.Sum" but the server never registered a type whose service name is "Foo" (missing Register call, wrong receiver type name, or connecting to the wrong server).
Common situations: Forgetting server.Register(new(Foo)) on the server side; service name derived from reflect type differs from what the client hardcodes; deploying a server build that no longer includes the service; pointing the client at a different server/port that hosts other services.
Related errors
- rpc server: service/method request ill-formed:
- rpc server: can't find method
- rpc: service already defined:
- rpc client: call failed:
- number of options is more than 1
AI-assisted analysis of geektutu/7days-golang@cf36443821 (2026-09-03).
Data as JSON: /api/errors/d337eff479278d29.
Report an issue: GitHub.