{"id":43646,"date":"2023-09-16T21:32:01","date_gmt":"2023-07-30T21:37:28","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/"},"modified":"2025-07-30T03:16:15","modified_gmt":"2025-07-29T19:16:15","slug":"grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/","title":{"rendered":"gRPC\u7684\u6b63\u5e38\u5173\u95ed"},"content":{"rendered":"<h2>\u9996\u5148<\/h2>\n<p>\u8fd9\u7bc7\u6587\u7ae0\u662fGo 3 Advent Calendar 2020\u7684\u7b2c21\u5929\u3002<\/p>\n<p>\u4f7f\u7528Prometheus\u6765\u83b7\u53d6gRPC\u7684\u6307\u6807\u65f6\uff0c\u4e0b\u9762\u662f\u4e00\u4e2aGraceful Shutdown\u7684\u793a\u4f8b\u3002<br \/>\n\u6211\u4eec\u60f3\u8981\u5b9e\u73b0\u7684\u76ee\u6807\u662f\uff0c\u5728\u51fa\u73b0\u9519\u8bef\u6216\u7279\u5b9a\u4fe1\u53f7\u65f6\uff0c\u5728\u4efb\u4f55\u4e00\u4e2a\u670d\u52a1\u5668\u4e0a\u5b89\u5168\u5730\u505c\u6b62\u6240\u6709\u670d\u52a1\u5668\u3002<\/p>\n<h2>\u8bf7\u6ce8\u610f<\/h2>\n<p>\u6211\u4eec\u7684\u76ee\u6807\u662f\u5728\u4f7f\u7528Go\u6784\u5efa\u7684gRPC\u670d\u52a1\u5668\u4e2d\u83b7\u53d6\u6307\u6807\u3002<\/p>\n<h2>\u6982\u62ec\u8d77\u6765\u3002<\/h2>\n<p>\u8fd9\u6b21\u6211\u4eec\u5c06\u4f7f\u7528run\u6765\u521b\u5efaGraceful Shutdown\u3002<br \/>\n\u8fd8\u6709\u4e00\u4e2a\u5f88\u65b9\u4fbf\u7684\u5305\u53eb\u505aerrgroup\u3002<\/p>\n<h2>\u5927\u81f4\u7684\u80cc\u666f<\/h2>\n<p>\u5728\u5c1d\u8bd5\u83b7\u53d6gRPC\u7684\u6307\u6807\u65f6\uff0c\u6211\u8ba4\u4e3a\u53ef\u4ee5\u6309\u7167go-grpc-prometheus\u7684\u65b9\u5f0f\u6765\u521b\u5efa\u4e24\u4e2a\u670d\u52a1\u5668\uff0c\u4e00\u4e2a\u7528\u4e8egRPC\u7684HTTP2\u670d\u52a1\u5668\uff0c\u53e6\u4e00\u4e2a\u7528\u4e8ePrometheus\u7684HTTP\u670d\u52a1\u5668\u3002\u4ee5\u4e0a\u6458\u5f55\u81ea\u6b64\u5904\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"c\">\/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u7528\u306e\u30b5\u30fc\u30d0\u3092\u5225\u306egoroutine\u3067\u8d77\u52d5<\/span>\r\n    <span class=\"k\">go<\/span> <span class=\"k\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">httpServer<\/span><span class=\"o\">.<\/span><span class=\"n\">ListenAndServe<\/span><span class=\"p\">();<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Fatal<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Unable to start a http server.\"<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}()<\/span>\r\n    <span class=\"c\">\/\/ gRPC\u7528\u306e\u30b5\u30fc\u30d0\u3092\u8d77\u52d5<\/span>\r\n    <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Fatal<\/span><span class=\"p\">(<\/span><span class=\"n\">grpcServer<\/span><span class=\"o\">.<\/span><span class=\"n\">Serve<\/span><span class=\"p\">(<\/span><span class=\"n\">lis<\/span><span class=\"p\">))<\/span>\r\n<\/code><\/pre>\n<p>\u53ea\u662f\u5728\u4e0a\u8ff0\u7684\u4f8b\u5b50\u4e2d\uff0c\u6709\u4e00\u4e2a\u7c7b\u4f3c\u7684\u5907\u6ce8\uff1a\u201c\u7531\u4e8e\u6ca1\u6709\u5b9e\u65bdGraceful Shutdown\uff0c\u8bf7\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u4e0d\u8981\u4f7f\u7528\u3002\u201d<br \/>\n\u867d\u7136\u6709\u8bb8\u591a\u5173\u4e8e\u5728\u5355\u4e2a\u670d\u52a1\u5668\u4e0a\u5b9e\u73b0Graceful Shutdown\u7684\u793a\u4f8b\u53ef\u4ee5\u53c2\u8003\uff0c\u4f46\u662f\u6211\u5bf9\u5982\u4f55\u5728\u4e24\u4e2a\u670d\u52a1\u5668\u4e0a\u5b9e\u73b0Graceful Shutdown\u7684\u65b9\u6cd5\u4e0d\u592a\u4e86\u89e3\uff0c\u4e3a\u4e86\u4e0d\u5fd8\u8bb0\u5728\u516c\u53f8\u5185\u542c\u5230\u7684\u4fe1\u606f\uff0c\u6211\u6253\u7b97\u5199\u4e00\u7bc7\u6587\u7ae0\u3002<\/p>\n<h2>\u512a\u96c5\u95dc\u6a5f\u7684\u56de\u9867<\/h2>\n<p>\u5982\u679c\u6536\u5230\u7279\u5b9a\u7684\u4fe1\u53f7\uff0c\u670d\u52a1\u5668\u5c06\u8c03\u7528\u4ee5\u4e0b\u65b9\u6cd5\u6b63\u5e38\u5173\u95ed\uff1a<br \/>\n&#8211; \u5bf9\u4e8enet\/http\uff1a<br \/>\nServer.Shutdown<br \/>\n&#8211; \u5bf9\u4e8egrpc\uff1a<br \/>\nServer.GracefulStop<\/p>\n<h2>\u4f7f\u7528run\u6765\u5b9e\u73b0\u4f18\u96c5\u7684\u5173\u673a\u3002<\/h2>\n<p>\u4e0eerrgroup\u7c7b\u4f3c\uff0c\u4f46\u901a\u8fc7Group.Add()\u5c06\u6267\u884c\u51fd\u6570\u548c\u4e2d\u65ad\u51fd\u6570\u6dfb\u52a0\u5230Group\u4e2d\uff0c\u901a\u8fc7Group.Run()\u7531\u534f\u7a0b\u6267\u884c\u6267\u884c\u51fd\u6570\uff0c<br \/>\n\u5f53\u6267\u884c\u51fd\u6570\u5b8c\u6210\u65f6\u8c03\u7528\u6240\u6709\u4e2d\u65ad\u51fd\u6570\u3002<br \/>\n\u6211\u4e2a\u4eba\u8ba4\u4e3a\uff0c\u7531\u4e8e\u53ef\u4ee5\u5355\u72ec\u7ba1\u7406\u6267\u884c\u548c\u4e2d\u65ad\uff0c\u8fd9\u975e\u5e38\u65b9\u4fbf\u3002<br \/>\n\u8bf7\u8be6\u9605README\u4ee5\u4e86\u89e3\u66f4\u591a\u4fe1\u606f\u3002<br \/>\n\u5728\u672c\u4f8b\u4e2d\uff0c\u6211\u8ba4\u4e3a\u4f1a\u6709\u4ee5\u4e0b\u7ed3\u679c\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"k\">var<\/span> <span class=\"n\">g<\/span> <span class=\"n\">run<\/span><span class=\"o\">.<\/span><span class=\"n\">Group<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"n\">c<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">make<\/span><span class=\"p\">(<\/span><span class=\"k\">chan<\/span> <span class=\"n\">os<\/span><span class=\"o\">.<\/span><span class=\"n\">Signal<\/span><span class=\"p\">,<\/span> <span class=\"m\">1<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">signal<\/span><span class=\"o\">.<\/span><span class=\"n\">Notify<\/span><span class=\"p\">(<\/span><span class=\"n\">c<\/span><span class=\"p\">,<\/span> <span class=\"n\">syscall<\/span><span class=\"o\">.<\/span><span class=\"n\">SIGTERM<\/span><span class=\"p\">,<\/span> <span class=\"n\">os<\/span><span class=\"o\">.<\/span><span class=\"n\">Interrupt<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">cancel<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">make<\/span><span class=\"p\">(<\/span><span class=\"k\">chan<\/span> <span class=\"k\">struct<\/span><span class=\"p\">{})<\/span>\r\n        <span class=\"n\">g<\/span><span class=\"o\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span>\r\n            <span class=\"k\">func<\/span><span class=\"p\">()<\/span> <span class=\"kt\">error<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"k\">select<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"k\">case<\/span> <span class=\"o\">&lt;-<\/span><span class=\"n\">c<\/span><span class=\"o\">:<\/span>\r\n                    <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Received signal, exiting gracefully...\"<\/span><span class=\"p\">)<\/span>\r\n                <span class=\"k\">case<\/span> <span class=\"o\">&lt;-<\/span><span class=\"n\">cancel<\/span><span class=\"o\">:<\/span>\r\n                <span class=\"p\">}<\/span>\r\n                <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span>\r\n            <span class=\"p\">},<\/span>\r\n            <span class=\"k\">func<\/span><span class=\"p\">(<\/span><span class=\"n\">err<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"nb\">close<\/span><span class=\"p\">(<\/span><span class=\"n\">cancel<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"p\">},<\/span>\r\n        <span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"n\">g<\/span><span class=\"o\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span>\r\n            <span class=\"k\">func<\/span><span class=\"p\">()<\/span> <span class=\"kt\">error<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">httpServer<\/span><span class=\"o\">.<\/span><span class=\"n\">ListenAndServe<\/span><span class=\"p\">();<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">ErrServerClosed<\/span> <span class=\"p\">{<\/span>\r\n                    <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Failed to serve http server: %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\r\n                    <span class=\"k\">return<\/span> <span class=\"n\">err<\/span>\r\n                <span class=\"p\">}<\/span>\r\n                <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span>\r\n            <span class=\"p\">},<\/span>\r\n            <span class=\"k\">func<\/span><span class=\"p\">(<\/span><span class=\"n\">err<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"n\">cancel<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"n\">WithTimeout<\/span><span class=\"p\">(<\/span><span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"n\">Background<\/span><span class=\"p\">(),<\/span> <span class=\"m\">10<\/span><span class=\"o\">*<\/span><span class=\"n\">time<\/span><span class=\"o\">.<\/span><span class=\"n\">Second<\/span><span class=\"p\">)<\/span>\r\n                <span class=\"k\">defer<\/span> <span class=\"n\">cancel<\/span><span class=\"p\">()<\/span>\r\n                <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">httpServer<\/span><span class=\"o\">.<\/span><span class=\"n\">Shutdown<\/span><span class=\"p\">(<\/span><span class=\"n\">ctx<\/span><span class=\"p\">);<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\r\n                    <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Failed to shutdown http server: %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\r\n                <span class=\"p\">}<\/span>\r\n            <span class=\"p\">},<\/span>\r\n        <span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"n\">g<\/span><span class=\"o\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span>\r\n            <span class=\"k\">func<\/span><span class=\"p\">()<\/span> <span class=\"kt\">error<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">listener<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">net<\/span><span class=\"o\">.<\/span><span class=\"n\">Listen<\/span><span class=\"p\">(<\/span><span class=\"s\">\"tcp\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\":9093\"<\/span><span class=\"p\">)<\/span>\r\n                <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\r\n                    <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Failed to listen grpc server: %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\r\n                    <span class=\"k\">return<\/span> <span class=\"n\">err<\/span>\r\n                <span class=\"p\">}<\/span>\r\n                <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">server<\/span><span class=\"o\">.<\/span><span class=\"n\">Serve<\/span><span class=\"p\">(<\/span><span class=\"n\">listener<\/span><span class=\"p\">);<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\r\n                    <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Failed to serve grpc server: %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\r\n                    <span class=\"k\">return<\/span> <span class=\"n\">err<\/span>\r\n                <span class=\"p\">}<\/span>\r\n                <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span>\r\n            <span class=\"p\">},<\/span>\r\n            <span class=\"k\">func<\/span><span class=\"p\">(<\/span><span class=\"n\">err<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">server<\/span><span class=\"o\">.<\/span><span class=\"n\">GracefulStop<\/span><span class=\"p\">()<\/span>\r\n            <span class=\"p\">},<\/span>\r\n        <span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">g<\/span><span class=\"o\">.<\/span><span class=\"n\">Run<\/span><span class=\"p\">();<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Fatalf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"error: %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662f\u4e09\u4e2a\u6a21\u5757\uff1a\u63a5\u6536 Signal\u3001\u542f\u52a8 HTTP \u670d\u52a1\u5668\u548c\u542f\u52a8 gRPC \u670d\u52a1\u5668\u3002\u53ef\u4ee5\u53c2\u8003 Prometheus \u4e2d\u7684 run \u51fd\u6570\u7684\u4f7f\u7528\u65b9\u6cd5\u3002<\/p>\n<h2>\u4f7f\u7528errgroup\u5b9e\u73b0\u4f18\u96c5\u5173\u95ed<\/h2>\n<p>\u6682\u5b9a\u5f85\u5546\u8bae&#8230;<\/p>\n<h2>\u603b\u7ed3<\/h2>\n<p>\u5e0c\u671b\u901a\u8fc7\u4f7f\u7528errgroup\u548crun\u6765\u8f7b\u677e\u5b9e\u73b0\u591a\u4e2a\u670d\u52a1\u5668\u7684\u4f18\u96c5\u5173\u95ed\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u8fd9\u7bc7\u6587\u7ae0\u662fGo 3 Advent Calendar 2020\u7684\u7b2c21\u5929\u3002 \u4f7f\u7528Prometheus\u6765\u83b7\u53d6 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[37,119,120,112,115,45,110,44,43,116,46,121,117,114,113,118,111],"class_list":["post-43646","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-api","tag-clean-shutdown","tag-connection-management","tag-context-management","tag-errgroup","tag-go","tag-go-programming","tag-graceful-shutdown","tag-grpc","tag-http-server","tag-microservices","tag-production-deployment","tag-prometheus-metrics","tag-run-package","tag-server-termination","tag-service-reliability","tag-signal-handling"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>gRPC Graceful Shutdown: Complete Guide to Proper Service Termination - Tutorial<\/title>\n<meta name=\"description\" content=\"Learn how to implement graceful shutdown in gRPC services using Go. This comprehensive guide covers signal handling, context management, and proper termination techniques for both HTTP and gRPC servers. Discover practical examples with the &#039;run&#039; package and errgroup to ensure clean service shutdown without data loss or connection issues.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/grpc\u7684\u6b63\u5e38\u5173\u95ed\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"gRPC\u7684\u6b63\u5e38\u5173\u95ed\" \/>\n<meta property=\"og:description\" content=\"Learn how to implement graceful shutdown in gRPC services using Go. This comprehensive guide covers signal handling, context management, and proper termination techniques for both HTTP and gRPC servers. Discover practical examples with the &#039;run&#039; package and errgroup to ensure clean service shutdown without data loss or connection issues.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/grpc\u7684\u6b63\u5e38\u5173\u95ed\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-30T21:37:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-29T19:16:15+00:00\" \/>\n<meta name=\"author\" content=\"\u97f5, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u97f5, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/\",\"name\":\"gRPC Graceful Shutdown: Complete Guide to Proper Service Termination - Tutorial\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-07-30T21:37:28+00:00\",\"dateModified\":\"2025-07-29T19:16:15+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e\"},\"description\":\"Learn how to implement graceful shutdown in gRPC services using Go. This comprehensive guide covers signal handling, context management, and proper termination techniques for both HTTP and gRPC servers. Discover practical examples with the 'run' package and errgroup to ensure clean service shutdown without data loss or connection issues.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"gRPC\u7684\u6b63\u5e38\u5173\u95ed\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e\",\"name\":\"\u97f5, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g\",\"caption\":\"\u97f5, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunke\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"gRPC Graceful Shutdown: Complete Guide to Proper Service Termination - Tutorial","description":"Learn how to implement graceful shutdown in gRPC services using Go. This comprehensive guide covers signal handling, context management, and proper termination techniques for both HTTP and gRPC servers. Discover practical examples with the 'run' package and errgroup to ensure clean service shutdown without data loss or connection issues.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/grpc\u7684\u6b63\u5e38\u5173\u95ed\/","og_locale":"zh_CN","og_type":"article","og_title":"gRPC\u7684\u6b63\u5e38\u5173\u95ed","og_description":"Learn how to implement graceful shutdown in gRPC services using Go. This comprehensive guide covers signal handling, context management, and proper termination techniques for both HTTP and gRPC servers. Discover practical examples with the 'run' package and errgroup to ensure clean service shutdown without data loss or connection issues.","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/grpc\u7684\u6b63\u5e38\u5173\u95ed\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-07-30T21:37:28+00:00","article_modified_time":"2025-07-29T19:16:15+00:00","author":"\u97f5, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u97f5, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"1 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/","name":"gRPC Graceful Shutdown: Complete Guide to Proper Service Termination - Tutorial","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-07-30T21:37:28+00:00","dateModified":"2025-07-29T19:16:15+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e"},"description":"Learn how to implement graceful shutdown in gRPC services using Go. This comprehensive guide covers signal handling, context management, and proper termination techniques for both HTTP and gRPC servers. Discover practical examples with the 'run' package and errgroup to ensure clean service shutdown without data loss or connection issues.","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"gRPC\u7684\u6b63\u5e38\u5173\u95ed"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e","name":"\u97f5, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g","caption":"\u97f5, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunke\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/grpc%e7%9a%84%e6%ad%a3%e5%b8%b8%e5%85%b3%e9%97%ad\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/43646","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=43646"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/43646\/revisions"}],"predecessor-version":[{"id":94908,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/43646\/revisions\/94908"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=43646"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=43646"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=43646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}