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

  1. Register the service on the server: err := server.Register(new(Foo)) before Serve
  2. Verify the registered service name (derived from the receiver's type name) matches the prefix used by the client
  3. 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

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


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