[{"data":1,"prerenderedAt":1082},["ShallowReactive",2],{"content:\u002F2026\u002F01\u002Fgrpc-metadata":3,"surround:\u002F2026\u002F01\u002Fgrpc-metadata":1071},{"id":4,"title":5,"body":6,"categories":1047,"date":1049,"description":1050,"draft":1051,"extension":1052,"image":1053,"meta":1054,"navigation":299,"path":1056,"permalink":1053,"published":1053,"readingTime":1057,"recommend":1053,"references":1053,"seo":1062,"sitemap":1063,"stem":1064,"tags":1065,"type":1068,"updated":1069,"__hash__":1070},"content\u002Fposts\u002F2026\u002F01\u002Fgrpc-metadata.md","gRPC Metadata 的传递与使用",{"type":7,"value":8,"toc":1030},"minimark",[9,13,33,36,79,85,88,93,172,185,189,196,245,249,252,348,351,607,611,614,806,816,819,986,1000,1003,1015,1018,1026],[10,11,12],"h2",{"id":12},"什么是metadata",[14,15,16],"blockquote",{},[17,18,19,20,24,25,28,29,32],"p",{},"metadata即为元信息，记录k、v键值对，类似于http请求当中的header，常用于RPC请求当中的鉴权、追溯和验签等场景，元数据可以包含",[21,22,23],"strong",{},"认证token","、",[21,26,27],{},"请求标识","和",[21,30,31],{},"监控标签","等",[17,34,35],{},"metadata的数据类型",[37,38,43],"pre",{"className":39,"code":40,"language":41,"meta":42,"style":42},"language-go shiki shiki-themes github-light github-dark","type MD map[string][]string\n","go","",[44,45,46],"code",{"__ignoreMap":42},[47,48,51,55,59,62,66,69,72,74,76],"span",{"class":49,"data-line":50,"line":50},"line",1,[47,52,54],{"class":53},"szBVR","type",[47,56,58],{"class":57},"sScJk"," MD",[47,60,61],{"class":53}," map",[47,63,65],{"class":64},"sSDpw","[",[47,67,68],{"class":53},"string",[47,70,71],{"class":64},"]",[47,73,65],{"class":64},[47,75,71],{"class":64},[47,77,78],{"class":53},"string\n",[17,80,81,82,84],{},"元数据可以像普通map一样读取。注意，这个 map 的值类型是",[47,83],{},"string，因此用户可以使用一个键附加多个值。",[10,86,87],{"id":87},"创建metadata",[89,90,92],"h3",{"id":91},"metadatapairs","metadata.Pairs",[37,94,96],{"className":39,"code":95,"language":41,"meta":42,"style":42},"md := metadata.Pairs(\n    \"x-token\", \"codepzj-authorization-key\",\n    \"X-TOKEN\", \"codepzj-authorization-key-2\",\n    \"req_id\", \"req_123456\",\n)\n",[44,97,98,116,136,151,166],{"__ignoreMap":42},[47,99,100,104,107,110,113],{"class":49,"data-line":50,"line":50},[47,101,103],{"class":102},"sVt8B","md ",[47,105,106],{"class":53},":=",[47,108,109],{"class":102}," metadata.",[47,111,112],{"class":57},"Pairs",[47,114,115],{"class":64},"(\n",[47,117,119,123,127,130,133],{"class":49,"data-line":118,"line":118},2,[47,120,122],{"class":121},"indent","    ",[47,124,126],{"class":125},"sZZnC","\"x-token\"",[47,128,129],{"class":102},", ",[47,131,132],{"class":125},"\"codepzj-authorization-key\"",[47,134,135],{"class":102},",\n",[47,137,139,141,144,146,149],{"class":49,"data-line":138,"line":138},3,[47,140,122],{"class":121},[47,142,143],{"class":125},"\"X-TOKEN\"",[47,145,129],{"class":102},[47,147,148],{"class":125},"\"codepzj-authorization-key-2\"",[47,150,135],{"class":102},[47,152,154,156,159,161,164],{"class":49,"data-line":153,"line":153},4,[47,155,122],{"class":121},[47,157,158],{"class":125},"\"req_id\"",[47,160,129],{"class":102},[47,162,163],{"class":125},"\"req_123456\"",[47,165,135],{"class":102},[47,167,169],{"class":49,"data-line":168,"line":168},5,[47,170,171],{"class":64},")\n",[17,173,174,175,28,178,181,182],{},"需要注意的是key是大小写不敏感的，",[44,176,177],{"code":177},"x-token",[44,179,180],{"code":180},"X-TOKEN","会被识别为同一个key，最终值为",[44,183,184],{"code":184},"[\"codepzj-authorization-key\", \"codepzj-authorization-key-2\"]",[89,186,188],{"id":187},"kv字符串","k、v字符串",[17,190,191,192,195],{},"在客户端发起调用的时候，以k、v字符串附加到",[44,193,194],{"code":194},"AppendToOutgoingContext","之后",[37,197,199],{"className":39,"code":198,"language":41,"meta":42,"style":42},"ctx := metadata.AppendToOutgoingContext(context.Background(), \"x-token\", \"codepzj-authorization-key\", \"req_id\", \"req_123456\")\n",[44,200,201],{"__ignoreMap":42},[47,202,203,206,208,210,212,215,218,221,224,227,229,231,233,235,237,239,241,243],{"class":49,"data-line":50,"line":50},[47,204,205],{"class":102},"ctx ",[47,207,106],{"class":53},[47,209,109],{"class":102},[47,211,194],{"class":57},[47,213,214],{"class":64},"(",[47,216,217],{"class":102},"context.",[47,219,220],{"class":57},"Background",[47,222,214],{"class":223},"sJX2D",[47,225,226],{"class":223},")",[47,228,129],{"class":102},[47,230,126],{"class":125},[47,232,129],{"class":102},[47,234,132],{"class":125},[47,236,129],{"class":102},[47,238,158],{"class":125},[47,240,129],{"class":102},[47,242,163],{"class":125},[47,244,171],{"class":64},[10,246,248],{"id":247},"客户端发送metadata服务端接收metadata","客户端发送metadata，服务端接收metadata",[89,250,251],{"id":251},"client",[37,253,255],{"className":39,"code":254,"language":41,"meta":42,"style":42},"ctx := metadata.AppendToOutgoingContext(context.Background(), \"x-token\", \"codepzj-authorization-key\", \"req_id\", \"req_123456\")\n\nresp, err := client.SayHello(ctx, &pb.HelloRequest{Name: *name})\n",[44,256,257,295,301],{"__ignoreMap":42},[47,258,259,261,263,265,267,269,271,273,275,277,279,281,283,285,287,289,291,293],{"class":49,"data-line":50,"line":50},[47,260,205],{"class":102},[47,262,106],{"class":53},[47,264,109],{"class":102},[47,266,194],{"class":57},[47,268,214],{"class":64},[47,270,217],{"class":102},[47,272,220],{"class":57},[47,274,214],{"class":223},[47,276,226],{"class":223},[47,278,129],{"class":102},[47,280,126],{"class":125},[47,282,129],{"class":102},[47,284,132],{"class":125},[47,286,129],{"class":102},[47,288,158],{"class":125},[47,290,129],{"class":102},[47,292,163],{"class":125},[47,294,171],{"class":64},[47,296,297],{"class":49,"data-line":118,"line":118},[47,298,300],{"emptyLinePlaceholder":299},true,"\n",[47,302,303,306,308,311,314,316,319,322,325,328,331,334,337,340,343,346],{"class":49,"data-line":138,"line":138},[47,304,305],{"class":102},"resp, err ",[47,307,106],{"class":53},[47,309,310],{"class":102}," client.",[47,312,313],{"class":57},"SayHello",[47,315,214],{"class":64},[47,317,318],{"class":102},"ctx, ",[47,320,321],{"class":53},"&",[47,323,324],{"class":57},"pb",[47,326,327],{"class":102},".",[47,329,330],{"class":57},"HelloRequest",[47,332,333],{"class":223},"{",[47,335,336],{"class":102},"Name: ",[47,338,339],{"class":53},"*",[47,341,342],{"class":102},"name",[47,344,345],{"class":223},"}",[47,347,171],{"class":64},[89,349,350],{"id":350},"server",[37,352,354],{"className":39,"code":353,"language":41,"meta":42,"style":42},"\u002F\u002F 1. 接受来自客户端的metadata\nmd, ok := metadata.FromIncomingContext(ctx)\nif !ok {\n    return nil, status.Error(codes.Unauthenticated, \"metadata missing\")\n}\n\nlog.Printf(\"md: %+v\\n\", md)\n\n\u002F\u002F 2. 解析metadata\nxToken, ok := md[\"x-token\"]\nif !ok {\n    return nil, status.Error(codes.Unauthenticated, \"x-token missing\")\n}\nif len(xToken) == 0 {\n    return nil, status.Error(codes.Unauthenticated, \"x-token missing\")\n}\n\nlog.Println(\"x-token\", xToken[0])\n",[44,355,356,362,381,395,422,427,432,457,462,468,486,497,519,524,552,573,578,583],{"__ignoreMap":42},[47,357,358],{"class":49,"data-line":50,"line":50},[47,359,361],{"class":360},"sJ8bj","\u002F\u002F 1. 接受来自客户端的metadata\n",[47,363,364,367,369,371,374,376,379],{"class":49,"data-line":118,"line":118},[47,365,366],{"class":102},"md, ok ",[47,368,106],{"class":53},[47,370,109],{"class":102},[47,372,373],{"class":57},"FromIncomingContext",[47,375,214],{"class":64},[47,377,378],{"class":102},"ctx",[47,380,171],{"class":64},[47,382,383,386,389,392],{"class":49,"data-line":138,"line":138},[47,384,385],{"class":53},"if",[47,387,388],{"class":53}," !",[47,390,391],{"class":102},"ok ",[47,393,394],{"class":64},"{\n",[47,396,397,399,402,406,409,412,414,417,420],{"class":49,"data-line":153,"line":153},[47,398,122],{"class":121},[47,400,401],{"class":53},"return",[47,403,405],{"class":404},"sj4cs"," nil",[47,407,408],{"class":102},", status.",[47,410,411],{"class":57},"Error",[47,413,214],{"class":223},[47,415,416],{"class":102},"codes.Unauthenticated, ",[47,418,419],{"class":125},"\"metadata missing\"",[47,421,171],{"class":223},[47,423,424],{"class":49,"data-line":168,"line":168},[47,425,426],{"class":64},"}\n",[47,428,430],{"class":49,"data-line":429,"line":429},6,[47,431,300],{"emptyLinePlaceholder":299},[47,433,435,438,441,443,446,449,452,455],{"class":49,"data-line":434,"line":434},7,[47,436,437],{"class":102},"log.",[47,439,440],{"class":57},"Printf",[47,442,214],{"class":64},[47,444,445],{"class":125},"\"md: ",[47,447,448],{"class":404},"%+v\\n",[47,450,451],{"class":125},"\"",[47,453,454],{"class":102},", md",[47,456,171],{"class":64},[47,458,460],{"class":49,"data-line":459,"line":459},8,[47,461,300],{"emptyLinePlaceholder":299},[47,463,465],{"class":49,"data-line":464,"line":464},9,[47,466,467],{"class":360},"\u002F\u002F 2. 解析metadata\n",[47,469,471,474,476,479,481,483],{"class":49,"data-line":470,"line":470},10,[47,472,473],{"class":102},"xToken, ok ",[47,475,106],{"class":53},[47,477,478],{"class":102}," md",[47,480,65],{"class":64},[47,482,126],{"class":125},[47,484,485],{"class":64},"]\n",[47,487,489,491,493,495],{"class":49,"data-line":488,"line":488},11,[47,490,385],{"class":53},[47,492,388],{"class":53},[47,494,391],{"class":102},[47,496,394],{"class":64},[47,498,500,502,504,506,508,510,512,514,517],{"class":49,"data-line":499,"line":499},12,[47,501,122],{"class":121},[47,503,401],{"class":53},[47,505,405],{"class":404},[47,507,408],{"class":102},[47,509,411],{"class":57},[47,511,214],{"class":223},[47,513,416],{"class":102},[47,515,516],{"class":125},"\"x-token missing\"",[47,518,171],{"class":223},[47,520,522],{"class":49,"data-line":521,"line":521},13,[47,523,426],{"class":64},[47,525,527,529,532,534,537,539,542,545,548,550],{"class":49,"data-line":526,"line":526},14,[47,528,385],{"class":53},[47,530,531],{"class":57}," len",[47,533,214],{"class":64},[47,535,536],{"class":102},"xToken",[47,538,226],{"class":64},[47,540,541],{"class":102}," ",[47,543,544],{"class":53},"==",[47,546,547],{"class":404}," 0",[47,549,541],{"class":102},[47,551,394],{"class":64},[47,553,555,557,559,561,563,565,567,569,571],{"class":49,"data-line":554,"line":554},15,[47,556,122],{"class":121},[47,558,401],{"class":53},[47,560,405],{"class":404},[47,562,408],{"class":102},[47,564,411],{"class":57},[47,566,214],{"class":223},[47,568,416],{"class":102},[47,570,516],{"class":125},[47,572,171],{"class":223},[47,574,576],{"class":49,"data-line":575,"line":575},16,[47,577,426],{"class":64},[47,579,581],{"class":49,"data-line":580,"line":580},17,[47,582,300],{"emptyLinePlaceholder":299},[47,584,586,588,591,593,595,598,600,603,605],{"class":49,"data-line":585,"line":585},18,[47,587,437],{"class":102},[47,589,590],{"class":57},"Println",[47,592,214],{"class":64},[47,594,126],{"class":125},[47,596,597],{"class":102},", xToken",[47,599,65],{"class":223},[47,601,602],{"class":404},"0",[47,604,71],{"class":223},[47,606,171],{"class":64},[10,608,610],{"id":609},"服务端发送metadata客户端接收metadata","服务端发送metadata，客户端接收metadata",[89,612,350],{"id":613},"server-1",[37,615,617],{"className":39,"code":616,"language":41,"meta":42,"style":42},"\u002F\u002F 3. 服务端设置metadata, 发送给客户端\nheader := metadata.Pairs(\"x-server\", \"ok\")\nif err := grpc.SendHeader(ctx, header); err != nil {\n    log.Println(\"Failed to set header from SayHello\")\n}\ndefer func() {\n    trailer := metadata.Pairs(\"x-trailer\", \"ok\")\n    if err := grpc.SetTrailer(ctx, trailer); err != nil {\n        log.Println(\"Failed to set trailer from SayHello\")\n    }\n}()\n",[44,618,619,624,647,681,696,700,716,740,772,790,798],{"__ignoreMap":42},[47,620,621],{"class":49,"data-line":50,"line":50},[47,622,623],{"class":360},"\u002F\u002F 3. 服务端设置metadata, 发送给客户端\n",[47,625,626,629,631,633,635,637,640,642,645],{"class":49,"data-line":118,"line":118},[47,627,628],{"class":102},"header ",[47,630,106],{"class":53},[47,632,109],{"class":102},[47,634,112],{"class":57},[47,636,214],{"class":64},[47,638,639],{"class":125},"\"x-server\"",[47,641,129],{"class":102},[47,643,644],{"class":125},"\"ok\"",[47,646,171],{"class":64},[47,648,649,651,654,656,659,662,664,667,669,672,675,677,679],{"class":49,"data-line":138,"line":138},[47,650,385],{"class":53},[47,652,653],{"class":102}," err ",[47,655,106],{"class":53},[47,657,658],{"class":102}," grpc.",[47,660,661],{"class":57},"SendHeader",[47,663,214],{"class":64},[47,665,666],{"class":102},"ctx, header",[47,668,226],{"class":64},[47,670,671],{"class":102},"; err ",[47,673,674],{"class":53},"!=",[47,676,405],{"class":404},[47,678,541],{"class":102},[47,680,394],{"class":64},[47,682,683,685,687,689,691,694],{"class":49,"data-line":153,"line":153},[47,684,122],{"class":121},[47,686,437],{"class":102},[47,688,590],{"class":57},[47,690,214],{"class":223},[47,692,693],{"class":125},"\"Failed to set header from SayHello\"",[47,695,171],{"class":223},[47,697,698],{"class":49,"data-line":168,"line":168},[47,699,426],{"class":64},[47,701,702,705,708,710,712,714],{"class":49,"data-line":429,"line":429},[47,703,704],{"class":53},"defer",[47,706,707],{"class":53}," func",[47,709,214],{"class":64},[47,711,226],{"class":64},[47,713,541],{"class":102},[47,715,394],{"class":64},[47,717,718,720,723,725,727,729,731,734,736,738],{"class":49,"data-line":434,"line":434},[47,719,122],{"class":121},[47,721,722],{"class":102},"trailer ",[47,724,106],{"class":53},[47,726,109],{"class":102},[47,728,112],{"class":57},[47,730,214],{"class":223},[47,732,733],{"class":125},"\"x-trailer\"",[47,735,129],{"class":102},[47,737,644],{"class":125},[47,739,171],{"class":223},[47,741,742,744,746,748,750,752,755,757,760,762,764,766,768,770],{"class":49,"data-line":459,"line":459},[47,743,122],{"class":121},[47,745,385],{"class":53},[47,747,653],{"class":102},[47,749,106],{"class":53},[47,751,658],{"class":102},[47,753,754],{"class":57},"SetTrailer",[47,756,214],{"class":223},[47,758,759],{"class":102},"ctx, trailer",[47,761,226],{"class":223},[47,763,671],{"class":102},[47,765,674],{"class":53},[47,767,405],{"class":404},[47,769,541],{"class":102},[47,771,394],{"class":223},[47,773,774,776,778,780,782,785,788],{"class":49,"data-line":464,"line":464},[47,775,122],{"class":121},[47,777,122],{"class":121},[47,779,437],{"class":102},[47,781,590],{"class":57},[47,783,214],{"class":784},"sqkie",[47,786,787],{"class":125},"\"Failed to set trailer from SayHello\"",[47,789,171],{"class":784},[47,791,792,794,796],{"class":49,"data-line":470,"line":470},[47,793,122],{"class":121},[47,795,42],{"class":102},[47,797,426],{"class":223},[47,799,800,802,804],{"class":49,"data-line":488,"line":488},[47,801,345],{"class":64},[47,803,214],{"class":64},[47,805,171],{"class":64},[17,807,808,809,812,813],{},"直接",[44,810,811],{"code":811},"grpc.SendHeader"," & ",[44,814,815],{"code":815},"grpc.SetTrailer",[89,817,251],{"id":818},"client-1",[37,820,822],{"className":39,"code":821,"language":41,"meta":42,"style":42},"var header, trailer metadata.MD\nresp, err := client.SayHello(ctx, &pb.HelloRequest{Name: *name}, grpc.Header(&header), grpc.Trailer(&trailer))\nif err != nil {\n    log.Fatalf(\"failed to call SayHello: %v\", err)\n}\nlog.Printf(\"Response: %s\", resp.Message)\nlog.Printf(\"Header: %s\", header)\n",[44,823,824,840,903,917,941,945,966],{"__ignoreMap":42},[47,825,826,829,832,835,837],{"class":49,"data-line":50,"line":50},[47,827,828],{"class":53},"var",[47,830,831],{"class":102}," header, trailer ",[47,833,834],{"class":57},"metadata",[47,836,327],{"class":102},[47,838,839],{"class":57},"MD\n",[47,841,842,844,846,848,850,852,854,856,858,860,862,864,866,868,870,872,875,878,880,882,885,887,889,892,894,896,899,901],{"class":49,"data-line":118,"line":118},[47,843,305],{"class":102},[47,845,106],{"class":53},[47,847,310],{"class":102},[47,849,313],{"class":57},[47,851,214],{"class":64},[47,853,318],{"class":102},[47,855,321],{"class":53},[47,857,324],{"class":57},[47,859,327],{"class":102},[47,861,330],{"class":57},[47,863,333],{"class":223},[47,865,336],{"class":102},[47,867,339],{"class":53},[47,869,342],{"class":102},[47,871,345],{"class":223},[47,873,874],{"class":102},", grpc.",[47,876,877],{"class":57},"Header",[47,879,214],{"class":223},[47,881,321],{"class":53},[47,883,884],{"class":102},"header",[47,886,226],{"class":223},[47,888,874],{"class":102},[47,890,891],{"class":57},"Trailer",[47,893,214],{"class":223},[47,895,321],{"class":53},[47,897,898],{"class":102},"trailer",[47,900,226],{"class":223},[47,902,171],{"class":64},[47,904,905,907,909,911,913,915],{"class":49,"data-line":138,"line":138},[47,906,385],{"class":53},[47,908,653],{"class":102},[47,910,674],{"class":53},[47,912,405],{"class":404},[47,914,541],{"class":102},[47,916,394],{"class":64},[47,918,919,921,923,926,928,931,934,936,939],{"class":49,"data-line":153,"line":153},[47,920,122],{"class":121},[47,922,437],{"class":102},[47,924,925],{"class":57},"Fatalf",[47,927,214],{"class":223},[47,929,930],{"class":125},"\"failed to call SayHello: ",[47,932,933],{"class":404},"%v",[47,935,451],{"class":125},[47,937,938],{"class":102},", err",[47,940,171],{"class":223},[47,942,943],{"class":49,"data-line":168,"line":168},[47,944,426],{"class":64},[47,946,947,949,951,953,956,959,961,964],{"class":49,"data-line":429,"line":429},[47,948,437],{"class":102},[47,950,440],{"class":57},[47,952,214],{"class":64},[47,954,955],{"class":125},"\"Response: ",[47,957,958],{"class":404},"%s",[47,960,451],{"class":125},[47,962,963],{"class":102},", resp.Message",[47,965,171],{"class":64},[47,967,968,970,972,974,977,979,981,984],{"class":49,"data-line":434,"line":434},[47,969,437],{"class":102},[47,971,440],{"class":57},[47,973,214],{"class":64},[47,975,976],{"class":125},"\"Header: ",[47,978,958],{"class":404},[47,980,451],{"class":125},[47,982,983],{"class":102},", header",[47,985,171],{"class":64},[17,987,988,989,991,992,994,995,991,997,999],{},"在发请求前绑定",[44,990,884],{"code":884}," OR ",[44,993,898],{"code":898},"，收到server响应就绑定到",[44,996,884],{"code":884},[44,998,898],{"code":898},"上了",[10,1001,1002],{"id":1002},"参考文章",[1004,1005,1006],"ul",{},[1007,1008,1009],"li",{},[1010,1011,1012],"a",{"href":1012,"rel":1013},"https:\u002F\u002Fliwenzhou.com\u002Fposts\u002FGo\u002FgRPC\u002F",[1014],"nofollow",[10,1016,1017],{"id":1017},"代码仓库",[1004,1019,1020],{},[1007,1021,1022],{},[1010,1023,1024],{"href":1024,"rel":1025},"https:\u002F\u002Fcnb.cool\u002Fcodepzj\u002Fgoplayground\u002F-\u002Ftree\u002Fmain\u002Frpc-learn\u002Fgrpc-metadata",[1014],[1027,1028,1029],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}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 .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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}",{"title":42,"searchDepth":153,"depth":153,"links":1031},[1032,1033,1037,1041,1045,1046],{"id":12,"depth":118,"text":12},{"id":87,"depth":118,"text":87,"children":1034},[1035,1036],{"id":91,"depth":138,"text":92},{"id":187,"depth":138,"text":188},{"id":247,"depth":118,"text":248,"children":1038},[1039,1040],{"id":251,"depth":138,"text":251},{"id":350,"depth":138,"text":350},{"id":609,"depth":118,"text":610,"children":1042},[1043,1044],{"id":613,"depth":138,"text":350},{"id":818,"depth":138,"text":251},{"id":1002,"depth":118,"text":1002},{"id":1017,"depth":118,"text":1017},[1048],"微服务","2026-01-05","介绍 gRPC Metadata 的创建、发送和读取方法，以及 Header、Trailer 在客户端与服务端之间的传递。",false,"md",null,{"slots":1055},{},"\u002F2026\u002F01\u002Fgrpc-metadata",{"text":1058,"minutes":1059,"time":1060,"words":1061},"2 min read",1.995,119700,399,{"title":5,"description":1050},{"loc":1056},"posts\u002F2026\u002F01\u002Fgrpc-metadata",[1066,1067],"gRPC","Metadata","tech","2026-01-07","pMhNX15-b-fK4cTcCzm92JsYBnY9uaMAaneJAtcDgG4",[1072,1077],{"title":1073,"path":1074,"stem":1075,"date":1076,"type":1068,"children":-1},"使用 Go 构建第一个 gRPC 服务","\u002F2026\u002F01\u002Fgrpc-hello-demo","posts\u002F2026\u002F01\u002Fgrpc-hello-demo","2026-01-01",{"title":1078,"path":1079,"stem":1080,"date":1081,"type":1068,"children":-1},"git-filter-repo 清理敏感信息","\u002F2026\u002F01\u002Fgit-filter-repo","posts\u002F2026\u002F01\u002Fgit-filter-repo","2026-01-21",1786555054481]