{"record":{"id":"60925eb77e3167d5","repo":"geektutu/7days-golang","slug":"rpc-server-can-t-find-service-60925e","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/day6-load-balance/server.go","lineNumber":122,"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":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/geektutu/7days-golang/blob/cf3644382101dc13e7fd92e8f5c66cabc51bcd3b/gee-rpc/day6-load-balance/server.go#L104-L140","documentation":"The service part of the \"Service.Method\" request was syntactically valid, but no service with that name is registered in the server's serviceMap. findService fails the Load on serviceMap, meaning the receiver was never published via Register on this server instance.","triggerScenarios":"Client calls \"Foo.Bar\" while the server never executed Register(&Foo{}), registered Foo under a different name, or the request reached the wrong server instance (e.g. behind a load balancer where only some instances registered the service).","commonSituations":"Forgot to call geeRPC.Register in the server main, service struct name differs between packages (Go uses the reflected type name, so an unexported or renamed type registers under a different string), or multiple registry nodes where one has the service and others do not.","solutions":["Register the receiver on the server: geeRPC.Register(new(Foo)) before serving.","Verify the registered name matches: GeeRegistry uses the Go type name, so &pkg.Foo{} registers as \"Foo\".","If using a registry/load balancer, ensure every reachable server instance registers the requested service."],"exampleFix":"// before (server main)\n// (nothing registered)\n// after\nsrv := geeRPC.NewServer()\n_ = srv.Register(new(Foo))\nlog.Fatal(srv.Accept(lis))","handlingStrategy":"validation","validationCode":"// server side, before Accept\nif err := srv.Register(new(Foo)); err != nil { log.Fatalf(\"register Foo: %v\", err) }\n// client side, sanity check the name matches the registered Go type\nconst svc = \"Foo\" // must equal reflect.TypeOf(Foo{}).Name()","typeGuard":null,"tryCatchPattern":"if err := client.Call(ctx, \"Foo.Sum\", args, reply); err != nil && strings.Contains(err.Error(), \"can't find service\") { log.Fatalf(\"service not registered on this server: %v\", err) }","preventionTips":["Register every service during server startup and log the registration result.","Keep service type names identical between client and server packages.","When using registries/load balancers, verify all instances register the same services."],"tags":["rpc","registration","service-not-found"],"backgroundTag":"rpc-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"}