{"id":1490,"date":"2024-10-08T21:11:01","date_gmt":"2024-10-08T13:11:01","guid":{"rendered":"https:\/\/www.madbull.site\/?p=1490"},"modified":"2024-11-13T16:02:37","modified_gmt":"2024-11-13T08:02:37","slug":"grpc%e8%af%81%e4%b9%a6%e5%8f%8c%e5%90%91%e8%ae%a4%e8%af%81%ef%bc%8c%e5%9f%ba%e4%ba%8egolang","status":"publish","type":"post","link":"https:\/\/www.madbull.site\/?p=1490","title":{"rendered":"grpc-go\u8bc1\u4e66\u53cc\u5411\u8ba4\u8bc1"},"content":{"rendered":"\n<p>grpc-go\u5728\u4f7f\u7528\u4e2d\uff0c\u53ef\u80fd\u4f1a\u9047\u5230\u4e00\u4e9b\u7f3a\u5c11\u5de5\u5177\u7684\u95ee\u9898\uff0c\u5177\u4f53\u53c2\u770b\u5f80\u671f\u6587\u7ae0\uff1a<a href=\"https:\/\/www.madbull.site\/?p=1453\">https:\/\/www.madbull.site\/?p=1453<\/a><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-x-large-font-size\"><strong>\u5b98\u65b9\u793a\u4f8b<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u5728grpc-go\u4ee3\u7801\u4e2d\uff0c\u6709\u4e00\u4e2a\u793a\u4f8b\uff0c\u7ed9\u51fa\u4e86\u670d\u52a1\u7aef\u548c\u5ba2\u6237\u7aef\u8bc1\u4e66\u53cc\u5411\u8ba4\u8bc1\u7684\u5b9e\u73b0\u3002\u53ef\u4ee5\u5728\u8fd9\u91cc <a href=\"https:\/\/github.com\/grpc\/grpc-go\">https:\/\/github.com\/grpc\/grpc-go<\/a> \u62c9\u53d6\u4ee3\u7801\uff0c\u793a\u4f8b\u5728 examples\/features\/encryption\/mTLS \u76ee\u5f55\u4e2d\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u672c\u6587\u57fa\u4e8e\u5b98\u65b9\u7ed9\u7684 mTLS \u793a\u4f8b\uff0c\u5bf9 helloworld\u793a\u4f8b\uff08\u4e5f\u662f\u5b98\u65b9\u7684\u793a\u4f8b\uff0c\u5177\u4f53\u53c2\u770b\u5b98\u7f51\u6587\u7ae0\uff1a<a href=\"https:\/\/grpc.io\/docs\/languages\/go\/quickstart\/\">https:\/\/grpc.io\/docs\/languages\/go\/quickstart\/<\/a>\uff09\u8fdb\u884c\u4fee\u6539\uff0c\u5b9e\u73b0\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u53cc\u5411\u8ba4\u8bc1\uff0c\u5e76\u505a\u4e86\u4e00\u4e9b\u6ce8\u91ca\u4ee5\u4f5c\u5907\u5fd8\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-x-large-font-size\"><strong>\u7b2c\u4e00\u6b65\uff1a\u51c6\u5907\u8bc1\u4e66<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>1.1\u3001\u8bc1\u4e66\u521b\u5efa<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u53cc\u5411\u8ba4\u8bc1\u9700\u89814\u4e2a\u8bc1\u4e66\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u670d\u52a1\u7aefCA\u8bc1\u4e66\uff1a\u7528\u6765\u7ed9\u670d\u52a1\u7aef\u9881\u53d1\u8bc1\u4e66\u7684\u8bc1\u4e66\uff0c\u6b64\u8bc1\u4e66\u5ba2\u6237\u7aef\u5fc5\u987b\u4fe1\u4efb\uff0c\u56e0\u4e3a\u5ba2\u6237\u7aef\u9700\u8981\u7528\u6b64\u8bc1\u4e66\u6765\u9a8c\u8bc1\u670d\u52a1\u7aef\u8bc1\u4e66\u7684\u5408\u6cd5\u6027\u3002<\/li>\n\n\n\n<li>\u670d\u52a1\u7aef\u8bc1\u4e66\uff1a\u7531\u670d\u52a1\u7aefCA\u8bc1\u4e66\u9881\u53d1\uff0c\u5ba2\u6237\u7aef\u8fde\u63a5\u65f6\uff0c\u670d\u52a1\u7aef\u628a\u6b64\u8bc1\u4e66\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\uff0c\u7531\u5ba2\u6237\u7aef\u6765\u9a8c\u8bc1\u5408\u6cd5\u6027\u3002<\/li>\n\n\n\n<li>\u5ba2\u6237\u7aefCA\u8bc1\u4e66\uff1a\u7528\u6765\u7ed9\u5ba2\u6237\u7aef\u9881\u53d1\u8bc1\u4e66\u7684\u8bc1\u4e66\uff0c\u6b64\u8bc1\u4e66\u670d\u52a1\u7aef\u5fc5\u987b\u4fe1\u4efb\uff0c\u56e0\u4e3a\u670d\u52a1\u7aef\u9700\u8981\u7528\u6b64\u8bc1\u4e66\u6765\u9a8c\u8bc1\u5ba2\u6237\u7aef\u8bc1\u4e66\u7684\u5408\u6cd5\u6027\u3002<\/li>\n\n\n\n<li>\u5ba2\u6237\u7aef\u8bc1\u4e66\uff1a\u7531\u5ba2\u6237\u7aefCA\u8bc1\u4e66\u9881\u53d1\uff0c\u5ba2\u6237\u7aef\u8fde\u63a5\u65f6\uff0c\u5ba2\u6237\u7aef\u628a\u6b64\u8bc1\u4e66\u53d1\u9001\u7ed9\u670d\u52a1\u7aef\uff0c\u7531\u670d\u52a1\u7aef\u6765\u9a8c\u8bc1\u5408\u6cd5\u6027\u3002<\/li>\n<\/ul>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u4ee5\u4e0a4\u4e2a\u8bc1\u4e66\uff0c\u5176\u4e2d<strong>\u670d\u52a1\u7aefCA\u8bc1\u4e66<\/strong>\u548c<strong>\u5ba2\u6237\u7aefCA\u8bc1\u4e66<\/strong>\u53ef\u4ee5\u7528\u540c\u4e00\u4e2a\uff0c\u6240\u4ee5\uff0c\u81f3\u5c11\u9700\u89813\u4e2a\u8bc1\u4e66\u4e5f\u53ef\u4ee5\u3002\u672c\u6587\u7ae0\u793a\u4f8b\u5c31\u662f\u7528\u76843\u4e2a\u8bc1\u4e66\u505a\u7684\u793a\u8303\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u5173\u4e8e\u8bc1\u4e66\u9881\u53d1\uff0c\u53c2\u770b\u5f80\u671f\u6587\u7ae0\uff1a<a href=\"https:\/\/www.madbull.site\/?p=1111\">https:\/\/www.madbull.site\/?p=1111<\/a>\u3002\u9881\u53d1\u5ba2\u6237\u7aef\u8bc1\u4e66\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u9881\u53d1<strong>\u670d\u52a1\u7aef\u8bc1\u4e66<\/strong>\u5bf9DNS\u914d\u7f6e\u548cIP\u914d\u7f6e\u6709\u4e00\u4e9b\u8981\u6c42\u3002\u914d\u7f6e\u6587\u4ef6\u8be6\u7ec6\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;req]\ndefault_bits = 2048\nprompt = no\ndefault_md = sha256\ndistinguished_name = req_distinguished_name\nreq_extensions = v3_req\n\n&#91;req_distinguished_name]\ncountryName = CN\nstateOrProvinceName = Shandong\nlocalityName = Qingdao\norganizationName = madbull\norganizationalUnitName = IT Department\ncommonName = node9\nemailAddress = xxx@xxx.com\n\n&#91;v3_req]\nsubjectAltName = @alt_names\n\n&#91;alt_names]\nDNS.1 = node9\nDNS.2 = localhost\nIP.1 = 127.0.0.1\nIP.2 = 192.168.1.57<\/code><\/pre>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>1.2\u3001\u8bc1\u4e66\u5b58\u653e\u4f4d\u7f6e\uff1a<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"365\" height=\"161\" src=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-4.png\" alt=\"\" class=\"wp-image-1495\" srcset=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-4.png 365w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-4-300x132.png 300w\" sizes=\"auto, (max-width: 365px) 100vw, 365px\" \/><\/figure>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u7531\u4e8e\u672c\u6b21\u793a\u4f8b\u5728\u672c\u5730\u4e3b\u673a\u505a\u7684\u6d4b\u8bd5\uff0c\u6240\u4ee5\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u7684\u5bc6\u94a5\u5bf9\u653e\u5728\u4e00\u8d77\u6765\u4e86\uff0c\u5bf9\u4e8e\u8de8\u4e3b\u673a\u7684\u64cd\u4f5c\uff0c\u76ee\u5f55\u5e94\u8be5\u662f\u4e0b\u9762\u8fd9\u4e2a\u6837\u5b50\u7684\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u670d\u52a1\u7aef\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"235\" height=\"164\" src=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-5.png\" alt=\"\" class=\"wp-image-1496\"\/><\/figure>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u5ba2\u6237\u7aef\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"223\" height=\"161\" src=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-6.png\" alt=\"\" class=\"wp-image-1497\"\/><\/figure>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-x-large-font-size\"><strong>\u7b2c\u4e8c\u6b65\uff1a\u4ee3\u7801<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>2.1\u3001\u76ee\u5f55\u7ed3\u6784<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"332\" height=\"200\" src=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247.png\" alt=\"\" class=\"wp-image-1491\" srcset=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247.png 332w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-300x181.png 300w\" sizes=\"auto, (max-width: 332px) 100vw, 332px\" \/><\/figure>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>2.2\u3001\u63a5\u53e3\u6587\u4ef6<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>helloworld\/helloworld.proto\u6587\u4ef6\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>syntax = \"proto3\";\n\noption go_package = \"google.golang.org\/grpc\/project\/helloworld\";\noption java_multiple_files = true;\noption java_package = \"io.grpc.project\";\noption java_outer_classname = \"HelloWorldProto\";\n\npackage helloworld;\n\n\/\/ The greeting service definition.\nservice Greeter {\n  \/\/ Sends a greeting\n  rpc SayHello (HelloRequest) returns (HelloReply) {}\n\n  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}\n\n}\n\n\/\/ The request message containing the user's name.\nmessage HelloRequest {\n  string name = 1;\n}\n\n\/\/ The response message containing the greetings\nmessage HelloReply {\n  string message = 1;\n}<\/code><\/pre>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>2.3\u3001\u670d\u52a1\u7aef\u4ee3\u7801<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>server\/main.go\u6587\u4ef6\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Package main implements a server for Greeter service.\npackage main\n\nimport (\n    \"context\"\n    \"flag\"\n    \"fmt\"\n    \"log\"\n    \"net\"\n    \"crypto\/tls\"\n    \"crypto\/x509\"\n    \"os\"\n\n    \"google.golang.org\/grpc\"\n    \"google.golang.org\/grpc\/credentials\"\n    pb \"google.golang.org\/grpc\/project\/helloworld\"\n)\n\nvar (\n    port = flag.Int(\"port\", 50051, \"The server port\")\n)\n\n\/\/ server is used to implement helloworld.GreeterServer.\ntype server struct {\n    pb.UnimplementedGreeterServer\n}\n\n\/\/ SayHello implements helloworld.GreeterServer\nfunc (s *server) SayHello(_ context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {\n    log.Printf(\"Received: %v\", in.GetName())\n    return &amp;pb.HelloReply{Message: \"Hello \" + in.GetName()}, nil\n}\n\nfunc (s * server) SayHelloAgain( ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {\n    return &amp;pb.HelloReply{Message: \"Hello again \" + in.GetName() }, nil\n}\n\n\/\/ \u751f\u6210\u670d\u52a1\u7aef tls \u914d\u7f6e\nfunc GetServTlsConfig() *tls.Config {\n    <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\"><strong>\/\/ 1\u3001\u52a0\u8f7d\u670d\u52a1\u7684\u8bc1\u4e66\u548c\u79c1\u94a5\u5bf9<\/strong><\/mark>\n    certs, err := tls.LoadX509KeyPair(\"\/opt\/certs\/public.crt\", \"\/opt\/certs\/private.key\")\n    if err != nil {\n        log.Fatalf(\"failed to load key pair: %q\", err)\n    }\n\n    <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\"><strong>\/\/ 2\u3001\u52a0\u8f7d\u4fe1\u4efb\u7684\u6839\u8bc1\u4e66<\/strong><\/mark>\n    \/\/ 2.1\u3001\u5b9a\u4e49\u4e00\u4e2a\u8bc1\u4e66\u6c60\n    ca :=  x509.NewCertPool()\n    caFilePath := \"\/opt\/certs\/CAs\/myCA.crt\" \n    \/\/ 2.2\u3001\u8bfb\u53d6\u8bc1\u4e66\u5185\u5bb9\n    caBytes, err := os.ReadFile(caFilePath)\n    if err != nil {\n        log.Fatalf(\"failed to read ca cert %q, %v\", caFilePath, err)\n    }\n    \/\/ 2.3\u3001\u628a\u8bc1\u4e66\u6dfb\u52a0\u5230\u8bc1\u4e66\u6c60\n    if ok := ca.AppendCertsFromPEM(caBytes); !ok {\n        log.Fatalf(\"failed to parse %q\", caFilePath)\n    }\n\n    <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\"><strong>\/\/ 3\u3001tls\u914d\u7f6e\u8bbe\u7f6e<\/strong><\/mark>\n    tlsConfig := &amp;tls.Config{\n        ClientAuth: tls.RequireAndVerifyClientCert,     \/\/ \u9a8c\u8bc1\u7b56\u7565\uff1a\u8981\u6c42\u9a8c\u8bc1\u5ba2\u6237\u7aef\u8bc1\u4e66\u3002\n        Certificates: &#91;]tls.Certificate {certs},        \/\/ \u670d\u52a1\u7684\u8bc1\u4e66\u548c\u79c1\u94a5\u5bf9\n        ClientCAs: ca,                                  \/\/ \u7528\u4e8e\u9a8c\u8bc1\u5ba2\u6237\u7aef\u8bc1\u4e66\u7684\u4fe1\u4efb\u7684\u6839\u8bc1\u4e66\n    }\n    return tlsConfig\n}\n\n\nfunc main() {\n    flag.Parse()\n\n    tlsConfig := GetServTlsConfig() \n\n    <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\"><strong>\/\/ 4\u3001\u751f\u6210grpc\u670d\u52a1<\/strong><\/mark>\n    \/\/ 4.1\u3001\u6839\u636e\u914d\u7f6e\u751f\u6210\u8bc1\u4e66\u8ba4\u8bc1\u6a21\u5757\n    creds := credentials.NewTLS(tlsConfig) ;\n    serv := grpc.NewServer(grpc.Creds(creds))\n    \/\/ 4.2\u3001\u7528\u751f\u6210\u7684 grpc \u670d\u52a1 serv \u6765 \u6ce8\u518cGreeter\u670d\u52a1\n    pb.RegisterGreeterServer(serv, &amp;server{})\n\n    <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\">\/\/ 5\u3001\u8bbe\u7f6etcp\u76d1\u542c<\/mark><\/strong>\n    lis, err := net.Listen(\"tcp\", fmt.Sprintf(\":%d\", *port))\n    if err != nil {\n        log.Fatalf(\"failed to listen: %v\", err)\n    }\n    \/\/ 5.1\u3001\u670d\u52a1\u7ed1\u5b9a\u76d1\u542c\n    if err := serv.Serve(lis); err != nil {\n        log.Fatalf(\"failed to serve: %v\", err)\n    }\n}<\/code><\/pre>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>2.4\u3001\u5ba2\u6237\u7aef\u4ee3\u7801<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>client\/main.go\u6587\u4ef6\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Package main implements a client for Greeter service.\npackage main\n\nimport (\n    \"flag\"\n    \"log\"\n    \"os\"\n    \"time\"\n    \"context\"\n    \"crypto\/tls\"\n    \"crypto\/x509\"\n\n    \"google.golang.org\/grpc\"\n    \"google.golang.org\/grpc\/credentials\"\n    pb \"google.golang.org\/grpc\/project\/helloworld\"\n)\n\n\/\/ \u5168\u5c40\u53d8\u91cf\uff0c\u9ed8\u8ba4\u503c\nconst (\n    defaultName = \"world\"\n)\n\n\/\/ \u8bbe\u7f6e\u53c2\u6570\nvar (\n    addr = flag.String(\"addr\", \"localhost:50051\", \"the address to connect to\")\n    name = flag.String(\"name\", defaultName, \"Name to greet\")\n)\n\n\/\/ \u751f\u6210\u5ba2\u6237\u7aef tls \u914d\u7f6e\nfunc GetCliTlsConfig() *tls.Config {\n\n    <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\"><strong>\/\/ 1\u3001\u52a0\u8f7d\u5ba2\u6237\u7aef\u8bc1\u4e66\u548c\u79c1\u94a5\u5bf9<\/strong><\/mark>\n    certs, err :=  tls.LoadX509KeyPair(\"\/opt\/certs\/clnt.crt\", \"\/opt\/certs\/clnt.key\")\n    if err != nil {\n        log.Fatalf(\"failed to load client cert: %v\", err)\n    }\n\n    <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\">\/\/ 2\u3001\u52a0\u8f7d\u4fe1\u4efb\u7684\u6839\u8bc1\u4e66<\/mark><\/strong>\n    \/\/ 2.1\u3001\u5b9a\u4e49\u4e00\u4e2a\u8bc1\u4e66\u6c60\n    ca :=  x509.NewCertPool()\n    caFilePath := \"\/opt\/certs\/CAs\/myCA.crt\" \n    \/\/ 2.2\u3001\u8bfb\u53d6\u8bc1\u4e66\u5185\u5bb9\n    caBytes, err := os.ReadFile(caFilePath)\n    if err != nil {\n        log.Fatalf(\"failed to read ca cert %q, %v\", caFilePath, err)\n    }\n    \/\/ 2.3\u3001\u628a\u8bc1\u4e66\u6dfb\u52a0\u5230\u8bc1\u4e66\u6c60\n    if ok := ca.AppendCertsFromPEM(caBytes); !ok {\n        log.Fatalf(\"failed to parse %q\", caFilePath)\n    }\n\n    <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\"><strong>\/\/ 3\u3001tls\u914d\u7f6e\u8bbe\u7f6e<\/strong><\/mark>\n    tlsConfig := &amp;tls.Config{\n        ServerName: \"node9\",                            \/\/ \u670d\u52a1\u7aef\u8bc1\u4e66\u7684DNS\u540d\u79f0\n        Certificates: &#91;]tls.Certificate {certs},        \/\/ \u670d\u52a1\u7684\u8bc1\u4e66\u548c\u79c1\u94a5\u5bf9\n        RootCAs: ca,                                    \/\/ \u7528\u4e8e\u9a8c\u8bc1\u670d\u52a1\u7aef\u7684\u4fe1\u4efb\u7684\u6839\u8bc1\u4e66\n    }\n    return tlsConfig ;\n}\n\nfunc main() {\n    flag.Parse()\n\n    tlsConfig := GetCliTlsConfig()\n\n    <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\">\/\/ 4\u3001\u8fde\u63a5 rpc \u8fdc\u7aef\u670d\u52a1<\/mark><\/strong>\n    \/\/ 4\u3001tcp\u8fde\u63a5 \u548c \u8ba4\u8bc1\n    creds := credentials.NewTLS(tlsConfig) ;\n    conn, err := grpc.NewClient(*addr, grpc.WithTransportCredentials(creds))\n    if err != nil {\n        log.Fatalf(\"did not connect: %v\", err)\n    }\n    defer conn.Close()\n    \/\/ 4.2\u3001\u521b\u5efa Greeter \u670d\u52a1\u7684\u5ba2\u6237\u7aef\n    cli := pb.NewGreeterClient(conn)\n\n    <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\">\/\/ 5\u3001\u8fdc\u7a0b\u8c03\u7528<\/mark><\/strong>\n    \/\/ 5.1\u3001\u521b\u5efa\u4e0a\u4e0b\u6587\uff0c\u8bbe\u7f6e10\u79d2\u8d85\u65f6\n    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)\n    defer cancel()\n\n    \/\/ 5.2\u3001\u8fdc\u7a0b\u8c03\u7528 Greeter \u670d\u52a1\u7684\u51fd\u6570\uff1a SayHello \u548c SayHelloAgain\n    resp, err := cli.SayHello(ctx, &amp;pb.HelloRequest{Name: *name})\n    if err != nil {\n        log.Fatalf(\"could not greet: %v\", err)\n    }\n    log.Printf(\"Greeting: %s\", resp.GetMessage())\n\n    resp, err = cli.SayHelloAgain(ctx, &amp;pb.HelloRequest{Name: *name})\n    if err != nil {\n        log.Fatalf(\"could not greet: %v\", err)\n    }\n    log.Printf(\"Greeting: %s\", resp.GetMessage())\n}<\/code><\/pre>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-x-large-font-size\"><strong>\u7b2c\u4e09\u6b65\uff1a\u8fd0\u884c\u548c\u6d4b\u8bd5<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>3.1\u3001\u751f\u6210go\u63a5\u53e3\u6587\u4ef6<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u5728 project \u76ee\u5f55\u4e0b\uff0c\u6267\u884c\u6307\u4ee4\uff1a<code>protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld\/helloworld.proto<\/code><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"124\" src=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-1-1024x124.png\" alt=\"\" class=\"wp-image-1492\" srcset=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-1-1024x124.png 1024w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-1-300x36.png 300w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-1-768x93.png 768w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-1.png 1260w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u751f\u6210 golang \u7684 \u63a5\u53e3\u6587\u4ef6\uff0chelloworld.pb.go \u548c helloworld_grpc.pb.go<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>3.2\u3001\u8fd0\u884c\u670d\u52a1\u7aef<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"449\" height=\"47\" src=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-2.png\" alt=\"\" class=\"wp-image-1493\" srcset=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-2.png 449w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-2-300x31.png 300w\" sizes=\"auto, (max-width: 449px) 100vw, 449px\" \/><\/figure>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>3.3\u3001\u8fd0\u884c\u5ba2\u6237\u7aef<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"553\" height=\"150\" src=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-3.png\" alt=\"\" class=\"wp-image-1494\" srcset=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-3.png 553w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-3-300x81.png 300w\" sizes=\"auto, (max-width: 553px) 100vw, 553px\" \/><\/figure>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u7b2c\u4e00\u6b65\uff1a\u51c6\u5907\u8bc1\u4e66<br \/>\n1.1\u3001\u8bc1\u4e66\u521b\u5efa<br \/>\n\u53cc\u5411\u8ba4\u8bc1\u9700\u89814\u4e2a\u8bc1\u4e66\uff1a<br \/>\n\u670d\u52a1\u7aefCA\u8bc1\u4e66\uff1a\u7528\u6765\u7ed9\u670d\u52a1\u7aef\u9881\u53d1\u8bc1\u4e66\u7684\u8bc1\u4e66\uff0c\u6b64\u8bc1\u4e66\u5ba2\u6237\u7aef\u5fc5\u987b\u4fe1\u4efb\uff0c\u56e0\u4e3a\u5ba2\u6237\u7aef\u9700\u8981\u7528\u6b64\u8bc1\u4e66\u6765\u9a8c\u8bc1\u670d\u52a1\u7aef\u8bc1\u4e66\u7684\u5408\u6cd5\u6027\u3002<br \/>\n\u670d\u52a1\u7aef\u8bc1\u4e66\uff1a\u7531\u670d\u52a1\u7aefCA\u8bc1\u4e66\u9881\u53d1\uff0c\u5ba2\u6237\u7aef\u8fde\u63a5\u65f6\uff0c\u670d\u52a1\u7aef\u628a\u6b64\u8bc1\u4e66\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\uff0c\u7531\u5ba2\u6237\u7aef\u6765\u9a8c\u8bc1\u5408\u6cd5\u6027\u3002<br \/>\n\u5ba2\u6237\u7aefCA\u8bc1\u4e66\uff1a\u7528\u6765\u7ed9\u5ba2\u6237\u7aef\u9881\u53d1\u8bc1\u4e66\u7684\u8bc1\u4e66\uff0c\u6b64\u8bc1\u4e66\u670d\u52a1\u7aef\u5fc5\u987b\u4fe1\u4efb\uff0c\u56e0\u4e3a\u670d\u52a1\u7aef\u9700\u8981\u7528\u6b64\u8bc1\u4e66\u6765\u9a8c\u8bc1\u5ba2\u6237\u7aef\u8bc1\u4e66\u7684\u5408\u6cd5\u6027\u3002<br \/>\n\u5ba2\u6237\u7aef\u8bc1\u4e66\uff1a\u7531\u5ba2\u6237\u7aefCA\u8bc1\u4e66\u9881\u53d1\uff0c\u5ba2\u6237\u7aef\u8fde\u63a5\u65f6\uff0c\u5ba2\u6237\u7aef\u628a\u6b64\u8bc1\u4e66\u53d1\u9001\u7ed9\u670d\u52a1\u7aef\uff0c\u7531\u670d\u52a1\u7aef\u6765\u9a8c\u8bc1\u5408\u6cd5\u6027\u3002<\/p>\n","protected":false},"author":1,"featured_media":1675,"comment_status":"open","ping_status":"open","sticky":false,"template":"single-with-sidebar","format":"standard","meta":{"footnotes":""},"categories":[286,154],"tags":[287,493,491,494,442],"class_list":["post-1490","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-go","category-154","tag-golang","tag-gprc","tag-tls","tag-494","tag-442"],"_links":{"self":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1490","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1490"}],"version-history":[{"count":10,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1490\/revisions"}],"predecessor-version":[{"id":1713,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1490\/revisions\/1713"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/media\/1675"}],"wp:attachment":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1490"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1490"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}