[{"data":1,"prerenderedAt":1400},["ShallowReactive",2],{"content:\u002F2026\u002F01\u002Fgrpc-hello-demo":3,"surround:\u002F2026\u002F01\u002Fgrpc-hello-demo":1389},{"id":4,"title":5,"body":6,"categories":1367,"date":1369,"description":1370,"draft":1371,"extension":1372,"image":1373,"meta":1374,"navigation":74,"path":1376,"permalink":1373,"published":1373,"readingTime":1377,"recommend":1373,"references":1373,"seo":1382,"sitemap":1383,"stem":1384,"tags":1385,"type":1387,"updated":1369,"__hash__":1388},"content\u002Fposts\u002F2026\u002F01\u002Fgrpc-hello-demo.md","使用 Go 构建第一个 gRPC 服务",{"type":7,"value":8,"toc":1358},"minimark",[9,29,33,40,258,261,282,285,288,311,315,877,880,883,898,901,1354],[10,11,12,13,17,18,21,22,21,25,28],"p",{},"新建一个文件夹",[14,15,16],"code",{"code":16},"hello","，分别创建",[14,19,20],{"code":20},"pb",",",[14,23,24],{"code":24},"server",[14,26,27],{"code":27},"client","三个文件夹",[30,31,32],"h2",{"id":32},"编写proto",[10,34,35,36,39],{},"新建",[14,37,38],{"code":38},"hello.proto",", 简单打个招呼吧",[41,42,47],"pre",{"className":43,"code":44,"language":45,"meta":46,"style":46},"language-proto shiki shiki-themes github-light github-dark","syntax = \"proto3\";\n\noption go_package = \"hello\u002Fpb;pb\";\n\npackage pb;\n\nmessage HelloRequest {\n  string name = 1;\n}\n\nmessage HelloResponse {\n  string message = 1;\n}\n\nservice HelloService {\n  rpc SayHello (HelloRequest) returns (HelloResponse);\n}\n","proto","",[14,48,49,69,76,93,98,109,114,131,152,158,163,175,191,196,201,214,253],{"__ignoreMap":46},[50,51,54,58,61,65],"span",{"class":52,"data-line":53,"line":53},"line",1,[50,55,57],{"class":56},"szBVR","syntax",[50,59,60],{"class":56}," =",[50,62,64],{"class":63},"sZZnC"," \"proto3\"",[50,66,68],{"class":67},"sVt8B",";\n",[50,70,72],{"class":52,"data-line":71,"line":71},2,[50,73,75],{"emptyLinePlaceholder":74},true,"\n",[50,77,79,82,86,88,91],{"class":52,"data-line":78,"line":78},3,[50,80,81],{"class":56},"option",[50,83,85],{"class":84},"sj4cs"," go_package",[50,87,60],{"class":56},[50,89,90],{"class":63}," \"hello\u002Fpb;pb\"",[50,92,68],{"class":67},[50,94,96],{"class":52,"data-line":95,"line":95},4,[50,97,75],{"emptyLinePlaceholder":74},[50,99,101,104,107],{"class":52,"data-line":100,"line":100},5,[50,102,103],{"class":56},"package",[50,105,106],{"class":63}," pb",[50,108,68],{"class":67},[50,110,112],{"class":52,"data-line":111,"line":111},6,[50,113,75],{"emptyLinePlaceholder":74},[50,115,117,120,124,127],{"class":52,"data-line":116,"line":116},7,[50,118,119],{"class":56},"message",[50,121,123],{"class":122},"sScJk"," HelloRequest",[50,125,126],{"class":67}," ",[50,128,130],{"class":129},"sSDpw","{\n",[50,132,134,138,141,144,147,150],{"class":52,"data-line":133,"line":133},8,[50,135,137],{"class":136},"indent","  ",[50,139,140],{"class":56},"string",[50,142,143],{"class":67}," name ",[50,145,146],{"class":56},"=",[50,148,149],{"class":84}," 1",[50,151,68],{"class":67},[50,153,155],{"class":52,"data-line":154,"line":154},9,[50,156,157],{"class":129},"}\n",[50,159,161],{"class":52,"data-line":160,"line":160},10,[50,162,75],{"emptyLinePlaceholder":74},[50,164,166,168,171,173],{"class":52,"data-line":165,"line":165},11,[50,167,119],{"class":56},[50,169,170],{"class":122}," HelloResponse",[50,172,126],{"class":67},[50,174,130],{"class":129},[50,176,178,180,182,185,187,189],{"class":52,"data-line":177,"line":177},12,[50,179,137],{"class":136},[50,181,140],{"class":56},[50,183,184],{"class":67}," message ",[50,186,146],{"class":56},[50,188,149],{"class":84},[50,190,68],{"class":67},[50,192,194],{"class":52,"data-line":193,"line":193},13,[50,195,157],{"class":129},[50,197,199],{"class":52,"data-line":198,"line":198},14,[50,200,75],{"emptyLinePlaceholder":74},[50,202,204,207,210,212],{"class":52,"data-line":203,"line":203},15,[50,205,206],{"class":56},"service",[50,208,209],{"class":122}," HelloService",[50,211,126],{"class":67},[50,213,130],{"class":129},[50,215,217,219,222,225,227,231,234,237,239,242,244,246,249,251],{"class":52,"data-line":216,"line":216},16,[50,218,137],{"class":136},[50,220,221],{"class":56},"rpc",[50,223,224],{"class":122}," SayHello",[50,226,126],{"class":67},[50,228,230],{"class":229},"sJX2D","(",[50,232,233],{"class":122},"HelloRequest",[50,235,236],{"class":229},")",[50,238,126],{"class":67},[50,240,241],{"class":56},"returns",[50,243,126],{"class":67},[50,245,230],{"class":229},[50,247,248],{"class":122},"HelloResponse",[50,250,236],{"class":229},[50,252,68],{"class":67},[50,254,256],{"class":52,"data-line":255,"line":255},17,[50,257,157],{"class":129},[10,259,260],{},"执行protoc命令行生成go代码",[41,262,266],{"className":263,"code":264,"language":265,"meta":46,"style":46},"language-bash shiki shiki-themes github-light github-dark","protoc --go_out=. --go-grpc_out=. hello\u002Fpb\u002Fhello.proto\n","bash",[14,267,268],{"__ignoreMap":46},[50,269,270,273,276,279],{"class":52,"data-line":53,"line":53},[50,271,272],{"class":122},"protoc",[50,274,275],{"class":84}," --go_out=.",[50,277,278],{"class":84}," --go-grpc_out=.",[50,280,281],{"class":63}," hello\u002Fpb\u002Fhello.proto\n",[30,283,284],{"id":284},"编写server端代码",[10,286,287],{},"分为四步:",[289,290,291,299,305,308],"ol",{},[292,293,294,295,298],"li",{},"创建",[14,296,297],{"code":297},"tcp","连接",[292,300,294,301,304],{},[14,302,303],{"code":303},"grpc","服务",[292,306,307],{},"注册服务",[292,309,310],{},"启动服务",[312,313,314],"h3",{"id":314},"代码",[41,316,320],{"className":317,"code":318,"language":319,"meta":46,"style":46},"language-go shiki shiki-themes github-light github-dark","package main\n\nimport (\n\t\"context\"\n\t\"goplayground\u002Frpc-learn\u002Fproto-learn\u002Fhello\u002Fpb\"\n\t\"log\"\n\t\"net\"\n\n\t\"google.golang.org\u002Fgrpc\"\n)\n\ntype HelloServer struct {\n\tpb.UnimplementedHelloServiceServer\n}\n\nfunc (s *HelloServer) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {\n\tname := req.GetName()\n\treturn &pb.HelloResponse{Message: \"hello \" + name}, nil\n}\n\nfunc main() {\n\tl, err := net.Listen(\"tcp\", \"127.0.0.1:8082\")\n\tif err != nil {\n\t\tlog.Fatalf(\"fail to start tcp connection, err:%v\", err)\n\t}\n\n\t\u002F\u002F 1. 创建grpc服务\n\ts := grpc.NewServer()\n\n\t\u002F\u002F 2. 注册服务\n\tpb.RegisterHelloServiceServer(s, &HelloServer{})\n\n\t\u002F\u002F 3. 启动服务\n\tlog.Println(\"gRPC server listening on 127.0.0.1:8082\")\n\tif err := s.Serve(l); err != nil {\n\t\tlog.Fatalf(\"failed to serve: %v\", err)\n\t}\n}\n","go",[14,321,322,329,333,343,357,368,379,390,394,405,410,414,429,441,445,449,528,548,588,593,598,614,642,663,692,701,706,715,734,739,747,774,779,787,804,839,863,872],{"__ignoreMap":46},[50,323,324,326],{"class":52,"data-line":53,"line":53},[50,325,103],{"class":56},[50,327,328],{"class":122}," main\n",[50,330,331],{"class":52,"data-line":71,"line":71},[50,332,75],{"emptyLinePlaceholder":74},[50,334,335,338,340],{"class":52,"data-line":78,"line":78},[50,336,337],{"class":56},"import",[50,339,126],{"class":67},[50,341,342],{"class":129},"(\n",[50,344,345,348,351,354],{"class":52,"data-line":95,"line":95},[50,346,347],{"class":136},"\t",[50,349,350],{"class":63},"\"",[50,352,353],{"class":122},"context",[50,355,356],{"class":63},"\"\n",[50,358,359,361,363,366],{"class":52,"data-line":100,"line":100},[50,360,347],{"class":136},[50,362,350],{"class":63},[50,364,365],{"class":122},"goplayground\u002Frpc-learn\u002Fproto-learn\u002Fhello\u002Fpb",[50,367,356],{"class":63},[50,369,370,372,374,377],{"class":52,"data-line":111,"line":111},[50,371,347],{"class":136},[50,373,350],{"class":63},[50,375,376],{"class":122},"log",[50,378,356],{"class":63},[50,380,381,383,385,388],{"class":52,"data-line":116,"line":116},[50,382,347],{"class":136},[50,384,350],{"class":63},[50,386,387],{"class":122},"net",[50,389,356],{"class":63},[50,391,392],{"class":52,"data-line":133,"line":133},[50,393,75],{"emptyLinePlaceholder":74},[50,395,396,398,400,403],{"class":52,"data-line":154,"line":154},[50,397,347],{"class":136},[50,399,350],{"class":63},[50,401,402],{"class":122},"google.golang.org\u002Fgrpc",[50,404,356],{"class":63},[50,406,407],{"class":52,"data-line":160,"line":160},[50,408,409],{"class":129},")\n",[50,411,412],{"class":52,"data-line":165,"line":165},[50,413,75],{"emptyLinePlaceholder":74},[50,415,416,419,422,425,427],{"class":52,"data-line":177,"line":177},[50,417,418],{"class":56},"type",[50,420,421],{"class":122}," HelloServer",[50,423,424],{"class":56}," struct",[50,426,126],{"class":67},[50,428,130],{"class":129},[50,430,431,433,435,438],{"class":52,"data-line":193,"line":193},[50,432,347],{"class":136},[50,434,20],{"class":122},[50,436,437],{"class":67},".",[50,439,440],{"class":122},"UnimplementedHelloServiceServer\n",[50,442,443],{"class":52,"data-line":198,"line":198},[50,444,157],{"class":129},[50,446,447],{"class":52,"data-line":203,"line":203},[50,448,75],{"emptyLinePlaceholder":74},[50,450,451,454,456,458,462,465,468,470,472,475,477,480,483,485,488,491,494,497,499,501,503,505,507,509,511,513,515,517,519,522,524,526],{"class":52,"data-line":216,"line":216},[50,452,453],{"class":56},"func",[50,455,126],{"class":67},[50,457,230],{"class":129},[50,459,461],{"class":460},"s4XuR","s ",[50,463,464],{"class":56},"*",[50,466,467],{"class":122},"HelloServer",[50,469,236],{"class":129},[50,471,126],{"class":67},[50,473,474],{"class":122},"SayHello",[50,476,230],{"class":129},[50,478,479],{"class":460},"ctx",[50,481,482],{"class":122}," context",[50,484,437],{"class":67},[50,486,487],{"class":122},"Context",[50,489,490],{"class":67},", ",[50,492,493],{"class":460},"req",[50,495,496],{"class":56}," *",[50,498,20],{"class":122},[50,500,437],{"class":67},[50,502,233],{"class":122},[50,504,236],{"class":129},[50,506,126],{"class":67},[50,508,230],{"class":129},[50,510,464],{"class":56},[50,512,20],{"class":122},[50,514,437],{"class":67},[50,516,248],{"class":122},[50,518,490],{"class":67},[50,520,521],{"class":56},"error",[50,523,236],{"class":129},[50,525,126],{"class":67},[50,527,130],{"class":129},[50,529,530,532,535,538,541,544,546],{"class":52,"data-line":255,"line":255},[50,531,347],{"class":136},[50,533,534],{"class":67},"name ",[50,536,537],{"class":56},":=",[50,539,540],{"class":67}," req.",[50,542,543],{"class":122},"GetName",[50,545,230],{"class":229},[50,547,409],{"class":229},[50,549,551,553,556,559,561,563,565,568,571,574,577,580,583,585],{"class":52,"data-line":550,"line":550},18,[50,552,347],{"class":136},[50,554,555],{"class":56},"return",[50,557,558],{"class":56}," &",[50,560,20],{"class":122},[50,562,437],{"class":67},[50,564,248],{"class":122},[50,566,567],{"class":229},"{",[50,569,570],{"class":67},"Message: ",[50,572,573],{"class":63},"\"hello \"",[50,575,576],{"class":56}," +",[50,578,579],{"class":67}," name",[50,581,582],{"class":229},"}",[50,584,490],{"class":67},[50,586,587],{"class":84},"nil\n",[50,589,591],{"class":52,"data-line":590,"line":590},19,[50,592,157],{"class":129},[50,594,596],{"class":52,"data-line":595,"line":595},20,[50,597,75],{"emptyLinePlaceholder":74},[50,599,601,603,606,608,610,612],{"class":52,"data-line":600,"line":600},21,[50,602,453],{"class":56},[50,604,605],{"class":122}," main",[50,607,230],{"class":129},[50,609,236],{"class":129},[50,611,126],{"class":67},[50,613,130],{"class":129},[50,615,617,619,622,624,627,630,632,635,637,640],{"class":52,"data-line":616,"line":616},22,[50,618,347],{"class":136},[50,620,621],{"class":67},"l, err ",[50,623,537],{"class":56},[50,625,626],{"class":67}," net.",[50,628,629],{"class":122},"Listen",[50,631,230],{"class":229},[50,633,634],{"class":63},"\"tcp\"",[50,636,490],{"class":67},[50,638,639],{"class":63},"\"127.0.0.1:8082\"",[50,641,409],{"class":229},[50,643,645,647,650,653,656,659,661],{"class":52,"data-line":644,"line":644},23,[50,646,347],{"class":136},[50,648,649],{"class":56},"if",[50,651,652],{"class":67}," err ",[50,654,655],{"class":56},"!=",[50,657,658],{"class":84}," nil",[50,660,126],{"class":67},[50,662,130],{"class":229},[50,664,666,668,670,673,676,679,682,685,687,690],{"class":52,"data-line":665,"line":665},24,[50,667,347],{"class":136},[50,669,347],{"class":136},[50,671,672],{"class":67},"log.",[50,674,675],{"class":122},"Fatalf",[50,677,230],{"class":678},"sqkie",[50,680,681],{"class":63},"\"fail to start tcp connection, err:",[50,683,684],{"class":84},"%v",[50,686,350],{"class":63},[50,688,689],{"class":67},", err",[50,691,409],{"class":678},[50,693,695,697,699],{"class":52,"data-line":694,"line":694},25,[50,696,347],{"class":136},[50,698,46],{"class":67},[50,700,157],{"class":229},[50,702,704],{"class":52,"data-line":703,"line":703},26,[50,705,75],{"emptyLinePlaceholder":74},[50,707,709,711],{"class":52,"data-line":708,"line":708},27,[50,710,347],{"class":136},[50,712,714],{"class":713},"sJ8bj","\u002F\u002F 1. 创建grpc服务\n",[50,716,718,720,722,724,727,730,732],{"class":52,"data-line":717,"line":717},28,[50,719,347],{"class":136},[50,721,461],{"class":67},[50,723,537],{"class":56},[50,725,726],{"class":67}," grpc.",[50,728,729],{"class":122},"NewServer",[50,731,230],{"class":229},[50,733,409],{"class":229},[50,735,737],{"class":52,"data-line":736,"line":736},29,[50,738,75],{"emptyLinePlaceholder":74},[50,740,742,744],{"class":52,"data-line":741,"line":741},30,[50,743,347],{"class":136},[50,745,746],{"class":713},"\u002F\u002F 2. 注册服务\n",[50,748,750,752,755,758,760,763,766,768,770,772],{"class":52,"data-line":749,"line":749},31,[50,751,347],{"class":136},[50,753,754],{"class":67},"pb.",[50,756,757],{"class":122},"RegisterHelloServiceServer",[50,759,230],{"class":229},[50,761,762],{"class":67},"s, ",[50,764,765],{"class":56},"&",[50,767,467],{"class":122},[50,769,567],{"class":678},[50,771,582],{"class":678},[50,773,409],{"class":229},[50,775,777],{"class":52,"data-line":776,"line":776},32,[50,778,75],{"emptyLinePlaceholder":74},[50,780,782,784],{"class":52,"data-line":781,"line":781},33,[50,783,347],{"class":136},[50,785,786],{"class":713},"\u002F\u002F 3. 启动服务\n",[50,788,790,792,794,797,799,802],{"class":52,"data-line":789,"line":789},34,[50,791,347],{"class":136},[50,793,672],{"class":67},[50,795,796],{"class":122},"Println",[50,798,230],{"class":229},[50,800,801],{"class":63},"\"gRPC server listening on 127.0.0.1:8082\"",[50,803,409],{"class":229},[50,805,807,809,811,813,815,818,821,823,826,828,831,833,835,837],{"class":52,"data-line":806,"line":806},35,[50,808,347],{"class":136},[50,810,649],{"class":56},[50,812,652],{"class":67},[50,814,537],{"class":56},[50,816,817],{"class":67}," s.",[50,819,820],{"class":122},"Serve",[50,822,230],{"class":229},[50,824,825],{"class":67},"l",[50,827,236],{"class":229},[50,829,830],{"class":67},"; err ",[50,832,655],{"class":56},[50,834,658],{"class":84},[50,836,126],{"class":67},[50,838,130],{"class":229},[50,840,842,844,846,848,850,852,855,857,859,861],{"class":52,"data-line":841,"line":841},36,[50,843,347],{"class":136},[50,845,347],{"class":136},[50,847,672],{"class":67},[50,849,675],{"class":122},[50,851,230],{"class":678},[50,853,854],{"class":63},"\"failed to serve: ",[50,856,684],{"class":84},[50,858,350],{"class":63},[50,860,689],{"class":67},[50,862,409],{"class":678},[50,864,866,868,870],{"class":52,"data-line":865,"line":865},37,[50,867,347],{"class":136},[50,869,46],{"class":67},[50,871,157],{"class":229},[50,873,875],{"class":52,"data-line":874,"line":874},38,[50,876,157],{"class":129},[30,878,879],{"id":879},"编写client端代码",[10,881,882],{},"分为三步:",[289,884,885,890,895],{},[292,886,294,887,889],{},[14,888,303],{"code":303},"连接，与server端连接",[292,891,294,892,894],{},[14,893,27],{"code":27},"客户端对象",[292,896,897],{},"在本地直接调用服务端方法",[312,899,314],{"id":900},"代码-1",[41,902,904],{"className":317,"code":903,"language":319,"meta":46,"style":46},"package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"goplayground\u002Frpc-learn\u002Fproto-learn\u002Fhello\u002Fpb\"\n\t\"log\"\n\n\t\"google.golang.org\u002Fgrpc\"\n\t\"google.golang.org\u002Fgrpc\u002Fcredentials\u002Finsecure\"\n)\n\nvar (\n\tname = flag.String(\"name\", \"codepzj\", \"eg: -name=pzj\")\n)\n\nfunc main() {\n\tflag.Parse()\n\t\u002F\u002F 1. 创建连接 无需TLS认证\n\tconn, err := grpc.Dial(\"127.0.0.1:8082\", grpc.WithTransportCredentials(insecure.NewCredentials()))\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to dial: %v\", err)\n\t}\n\tdefer conn.Close()\n\n\t\u002F\u002F 2. 创建client对象\n\tclient := pb.NewHelloServiceClient(conn)\n\n\t\u002F\u002F 3. 调用方法\n\tresp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: *name})\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to call SayHello: %v\", err)\n\t}\n\tlog.Printf(\"Response: %s\", resp.Message)\n}\n",[14,905,906,912,916,924,934,945,955,965,969,979,990,994,998,1007,1038,1042,1046,1060,1074,1081,1121,1137,1160,1168,1185,1189,1196,1218,1222,1229,1279,1295,1318,1326,1350],{"__ignoreMap":46},[50,907,908,910],{"class":52,"data-line":53,"line":53},[50,909,103],{"class":56},[50,911,328],{"class":122},[50,913,914],{"class":52,"data-line":71,"line":71},[50,915,75],{"emptyLinePlaceholder":74},[50,917,918,920,922],{"class":52,"data-line":78,"line":78},[50,919,337],{"class":56},[50,921,126],{"class":67},[50,923,342],{"class":129},[50,925,926,928,930,932],{"class":52,"data-line":95,"line":95},[50,927,347],{"class":136},[50,929,350],{"class":63},[50,931,353],{"class":122},[50,933,356],{"class":63},[50,935,936,938,940,943],{"class":52,"data-line":100,"line":100},[50,937,347],{"class":136},[50,939,350],{"class":63},[50,941,942],{"class":122},"flag",[50,944,356],{"class":63},[50,946,947,949,951,953],{"class":52,"data-line":111,"line":111},[50,948,347],{"class":136},[50,950,350],{"class":63},[50,952,365],{"class":122},[50,954,356],{"class":63},[50,956,957,959,961,963],{"class":52,"data-line":116,"line":116},[50,958,347],{"class":136},[50,960,350],{"class":63},[50,962,376],{"class":122},[50,964,356],{"class":63},[50,966,967],{"class":52,"data-line":133,"line":133},[50,968,75],{"emptyLinePlaceholder":74},[50,970,971,973,975,977],{"class":52,"data-line":154,"line":154},[50,972,347],{"class":136},[50,974,350],{"class":63},[50,976,402],{"class":122},[50,978,356],{"class":63},[50,980,981,983,985,988],{"class":52,"data-line":160,"line":160},[50,982,347],{"class":136},[50,984,350],{"class":63},[50,986,987],{"class":122},"google.golang.org\u002Fgrpc\u002Fcredentials\u002Finsecure",[50,989,356],{"class":63},[50,991,992],{"class":52,"data-line":165,"line":165},[50,993,409],{"class":129},[50,995,996],{"class":52,"data-line":177,"line":177},[50,997,75],{"emptyLinePlaceholder":74},[50,999,1000,1003,1005],{"class":52,"data-line":193,"line":193},[50,1001,1002],{"class":56},"var",[50,1004,126],{"class":67},[50,1006,342],{"class":129},[50,1008,1009,1011,1013,1015,1018,1021,1023,1026,1028,1031,1033,1036],{"class":52,"data-line":198,"line":198},[50,1010,347],{"class":136},[50,1012,534],{"class":67},[50,1014,146],{"class":56},[50,1016,1017],{"class":67}," flag.",[50,1019,1020],{"class":122},"String",[50,1022,230],{"class":229},[50,1024,1025],{"class":63},"\"name\"",[50,1027,490],{"class":67},[50,1029,1030],{"class":63},"\"codepzj\"",[50,1032,490],{"class":67},[50,1034,1035],{"class":63},"\"eg: -name=pzj\"",[50,1037,409],{"class":229},[50,1039,1040],{"class":52,"data-line":203,"line":203},[50,1041,409],{"class":129},[50,1043,1044],{"class":52,"data-line":216,"line":216},[50,1045,75],{"emptyLinePlaceholder":74},[50,1047,1048,1050,1052,1054,1056,1058],{"class":52,"data-line":255,"line":255},[50,1049,453],{"class":56},[50,1051,605],{"class":122},[50,1053,230],{"class":129},[50,1055,236],{"class":129},[50,1057,126],{"class":67},[50,1059,130],{"class":129},[50,1061,1062,1064,1067,1070,1072],{"class":52,"data-line":550,"line":550},[50,1063,347],{"class":136},[50,1065,1066],{"class":67},"flag.",[50,1068,1069],{"class":122},"Parse",[50,1071,230],{"class":229},[50,1073,409],{"class":229},[50,1075,1076,1078],{"class":52,"data-line":590,"line":590},[50,1077,347],{"class":136},[50,1079,1080],{"class":713},"\u002F\u002F 1. 创建连接 无需TLS认证\n",[50,1082,1083,1085,1088,1090,1092,1095,1097,1099,1102,1105,1107,1110,1113,1115,1117,1119],{"class":52,"data-line":595,"line":595},[50,1084,347],{"class":136},[50,1086,1087],{"class":67},"conn, err ",[50,1089,537],{"class":56},[50,1091,726],{"class":67},[50,1093,1094],{"class":122},"Dial",[50,1096,230],{"class":229},[50,1098,639],{"class":63},[50,1100,1101],{"class":67},", grpc.",[50,1103,1104],{"class":122},"WithTransportCredentials",[50,1106,230],{"class":678},[50,1108,1109],{"class":67},"insecure.",[50,1111,1112],{"class":122},"NewCredentials",[50,1114,230],{"class":129},[50,1116,236],{"class":129},[50,1118,236],{"class":678},[50,1120,409],{"class":229},[50,1122,1123,1125,1127,1129,1131,1133,1135],{"class":52,"data-line":600,"line":600},[50,1124,347],{"class":136},[50,1126,649],{"class":56},[50,1128,652],{"class":67},[50,1130,655],{"class":56},[50,1132,658],{"class":84},[50,1134,126],{"class":67},[50,1136,130],{"class":229},[50,1138,1139,1141,1143,1145,1147,1149,1152,1154,1156,1158],{"class":52,"data-line":616,"line":616},[50,1140,347],{"class":136},[50,1142,347],{"class":136},[50,1144,672],{"class":67},[50,1146,675],{"class":122},[50,1148,230],{"class":678},[50,1150,1151],{"class":63},"\"failed to dial: ",[50,1153,684],{"class":84},[50,1155,350],{"class":63},[50,1157,689],{"class":67},[50,1159,409],{"class":678},[50,1161,1162,1164,1166],{"class":52,"data-line":644,"line":644},[50,1163,347],{"class":136},[50,1165,46],{"class":67},[50,1167,157],{"class":229},[50,1169,1170,1172,1175,1178,1181,1183],{"class":52,"data-line":665,"line":665},[50,1171,347],{"class":136},[50,1173,1174],{"class":56},"defer",[50,1176,1177],{"class":67}," conn.",[50,1179,1180],{"class":122},"Close",[50,1182,230],{"class":229},[50,1184,409],{"class":229},[50,1186,1187],{"class":52,"data-line":694,"line":694},[50,1188,75],{"emptyLinePlaceholder":74},[50,1190,1191,1193],{"class":52,"data-line":703,"line":703},[50,1192,347],{"class":136},[50,1194,1195],{"class":713},"\u002F\u002F 2. 创建client对象\n",[50,1197,1198,1200,1203,1205,1208,1211,1213,1216],{"class":52,"data-line":708,"line":708},[50,1199,347],{"class":136},[50,1201,1202],{"class":67},"client ",[50,1204,537],{"class":56},[50,1206,1207],{"class":67}," pb.",[50,1209,1210],{"class":122},"NewHelloServiceClient",[50,1212,230],{"class":229},[50,1214,1215],{"class":67},"conn",[50,1217,409],{"class":229},[50,1219,1220],{"class":52,"data-line":717,"line":717},[50,1221,75],{"emptyLinePlaceholder":74},[50,1223,1224,1226],{"class":52,"data-line":736,"line":736},[50,1225,347],{"class":136},[50,1227,1228],{"class":713},"\u002F\u002F 3. 调用方法\n",[50,1230,1231,1233,1236,1238,1241,1243,1245,1248,1251,1253,1255,1257,1259,1261,1263,1265,1267,1270,1272,1275,1277],{"class":52,"data-line":741,"line":741},[50,1232,347],{"class":136},[50,1234,1235],{"class":67},"resp, err ",[50,1237,537],{"class":56},[50,1239,1240],{"class":67}," client.",[50,1242,474],{"class":122},[50,1244,230],{"class":229},[50,1246,1247],{"class":67},"context.",[50,1249,1250],{"class":122},"Background",[50,1252,230],{"class":678},[50,1254,236],{"class":678},[50,1256,490],{"class":67},[50,1258,765],{"class":56},[50,1260,20],{"class":122},[50,1262,437],{"class":67},[50,1264,233],{"class":122},[50,1266,567],{"class":678},[50,1268,1269],{"class":67},"Name: ",[50,1271,464],{"class":56},[50,1273,1274],{"class":67},"name",[50,1276,582],{"class":678},[50,1278,409],{"class":229},[50,1280,1281,1283,1285,1287,1289,1291,1293],{"class":52,"data-line":749,"line":749},[50,1282,347],{"class":136},[50,1284,649],{"class":56},[50,1286,652],{"class":67},[50,1288,655],{"class":56},[50,1290,658],{"class":84},[50,1292,126],{"class":67},[50,1294,130],{"class":229},[50,1296,1297,1299,1301,1303,1305,1307,1310,1312,1314,1316],{"class":52,"data-line":776,"line":776},[50,1298,347],{"class":136},[50,1300,347],{"class":136},[50,1302,672],{"class":67},[50,1304,675],{"class":122},[50,1306,230],{"class":678},[50,1308,1309],{"class":63},"\"failed to call SayHello: ",[50,1311,684],{"class":84},[50,1313,350],{"class":63},[50,1315,689],{"class":67},[50,1317,409],{"class":678},[50,1319,1320,1322,1324],{"class":52,"data-line":781,"line":781},[50,1321,347],{"class":136},[50,1323,46],{"class":67},[50,1325,157],{"class":229},[50,1327,1328,1330,1332,1335,1337,1340,1343,1345,1348],{"class":52,"data-line":789,"line":789},[50,1329,347],{"class":136},[50,1331,672],{"class":67},[50,1333,1334],{"class":122},"Printf",[50,1336,230],{"class":229},[50,1338,1339],{"class":63},"\"Response: ",[50,1341,1342],{"class":84},"%s",[50,1344,350],{"class":63},[50,1346,1347],{"class":67},", resp.Message",[50,1349,409],{"class":229},[50,1351,1352],{"class":52,"data-line":806,"line":806},[50,1353,157],{"class":129},[1355,1356,1357],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":46,"searchDepth":95,"depth":95,"links":1359},[1360,1361,1364],{"id":32,"depth":71,"text":32},{"id":284,"depth":71,"text":284,"children":1362},[1363],{"id":314,"depth":78,"text":314},{"id":879,"depth":71,"text":879,"children":1365},[1366],{"id":900,"depth":78,"text":314},[1368],"微服务","2026-01-01","通过 Protocol Buffers 定义服务，生成 Go 代码并实现客户端与服务端，完成首个 gRPC 示例。",false,"md",null,{"slots":1375},{},"\u002F2026\u002F01\u002Fgrpc-hello-demo",{"text":1378,"minutes":1379,"time":1380,"words":1381},"2 min read",1.69,101400,338,{"title":5,"description":1370},{"loc":1376},"posts\u002F2026\u002F01\u002Fgrpc-hello-demo",[1386,1368],"gRPC","tech","7fhmPyUjm0x7zAXXnkC6dSXFW-abS1mej22UXVwVcYQ",[1390,1395],{"title":1391,"path":1392,"stem":1393,"date":1394,"type":1387,"children":-1},"MCP Server 基础概念与入门实践","\u002F2025\u002F12\u002Fmcp-server-intro","posts\u002F2025\u002F12\u002Fmcp-server-intro","2025-12-28",{"title":1396,"path":1397,"stem":1398,"date":1399,"type":1387,"children":-1},"gRPC Metadata 的传递与使用","\u002F2026\u002F01\u002Fgrpc-metadata","posts\u002F2026\u002F01\u002Fgrpc-metadata","2026-01-05",1786555054490]