{"record":{"id":"d337eff479278d29","repo":"geektutu/7days-golang","slug":"rpc-server-can-t-find-service-d337ef","errorCode":null,"errorMessage":"rpc server: can't find service ","messagePattern":"rpc server: can't find service ","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gee-rpc/day4-timeout/server.go","lineNumber":121,"sourceCode":"\tif err := cc.ReadHeader(&h); err != nil {\n\t\tif err != io.EOF && err != io.ErrUnexpectedEOF {\n\t\t\tlog.Println(\"rpc server: read header error:\", err)\n\t\t}\n\t\treturn nil, err\n\t}\n\treturn &h, nil\n}\n\nfunc (server *Server) findService(serviceMethod string) (svc *service, mtype *methodType, err error) {\n\tdot := strings.LastIndex(serviceMethod, \".\")\n\tif dot < 0 {\n\t\terr = errors.New(\"rpc server: service/method request ill-formed: \" + serviceMethod)\n\t\treturn\n\t}\n\tserviceName, methodName := serviceMethod[:dot], serviceMethod[dot+1:]\n\tsvci, ok := server.serviceMap.Load(serviceName)\n\tif !ok {\n\t\terr = errors.New(\"rpc server: can't find service \" + serviceName)\n\t\treturn\n\t}\n\tsvc = svci.(*service)\n\tmtype = svc.method[methodName]\n\tif mtype == nil {\n\t\terr = errors.New(\"rpc server: can't find method \" + methodName)\n\t}\n\treturn\n}\n\nfunc (server *Server) readRequest(cc codec.Codec) (*request, error) {\n\th, err := server.readRequestHeader(cc)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq := &request{h: h}\n\treq.svc, req.mtype, err = server.findService(h.ServiceMethod)\n\tif err != nil {","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/geektutu/7days-golang/blob/cf3644382101dc13e7fd92e8f5c66cabc51bcd3b/gee-rpc/day4-timeout/server.go#L103-L139","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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"],"exampleFix":"// before (server)\n// Foo never registered\nsrv.Serve(lis)\n\n// after (server)\nsrv.Register(new(Foo))\nsrv.Serve(lis)","handlingStrategy":"validation","validationCode":"// on the server: ensure services are registered before serving\nif err := srv.Register(new(Foo)); err != nil {\n\tlog.Fatalf(\"register Foo: %v\", err)\n}","typeGuard":null,"tryCatchPattern":"err := client.Call(ctx, \"Foo.Sum\", args, reply)\nif err != nil && strings.Contains(err.Error(), \"can't find service\") {\n\t// wrong server or missing registration; fail fast or redial to correct server\n}","preventionTips":["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"],"tags":["rpc","server","service-registry","go"],"backgroundTag":"service-not-registered","analyzedSha":"cf3644382101dc13e7fd92e8f5c66cabc51bcd3b","analyzedAt":"2026-09-03T18:31:24.087Z","contentChangedAt":"2026-09-03T18:31:24.087Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}