{"id":184,"date":"2021-05-29T15:54:04","date_gmt":"2021-05-29T07:54:04","guid":{"rendered":"https:\/\/blog.king011.com\/?p=184"},"modified":"2021-05-29T15:54:07","modified_gmt":"2021-05-29T07:54:07","slug":"%e5%bf%ab%e9%80%9f%e5%89%b5%e5%bb%ba%e4%b8%80%e5%80%8b-rpc-%e9%a0%85%e7%9b%aegrpc-restful","status":"publish","type":"post","link":"https:\/\/blog.king011.com\/?p=184","title":{"rendered":"\u5feb\u901f\u5275\u5efa\u4e00\u500b rpc \u9805\u76ee(grpc restful)"},"content":{"rendered":"\n<p>\u76ee\u524d\u672c\u55b5\u6700\u770b\u597d\u7684rpc\u6846\u67b6\u662f grpc\uff0c\u540c\u6642\u501f\u52a9 grpc-gateway \u548c net.Pipe \u53ef\u4ee5\u5e7e\u4e4e\u7121\u526f\u4f5c\u7528\u7684\u5c07 grpc unary \u63a5\u53e3\u958b\u653e\u7232 http1.1 \u517c\u5bb9\u63a5\u53e3\u3002\u4e26\u4e14\u4f60\u4e0d\u9700\u8981\u984d\u5916\u7684\u7de8\u78bc\u5de5\u4f5c\uff0c\u4f60\u53ea\u9700\u8981\u5beb\u597d grpc \u4ee3\u78bc\u5373\u53ef\u3002\u4e26\u4e14 grpc-gateway \u63d0\u4f9b\u4e86\u5de5\u5177\uff0c\u9023 http \u63a5\u53e3\u6587\u6a94\u90fd\u81ea\u52d5\u7531 proto \u6a94\u6848\u5e6b\u4f60\u751f\u6210\uff0c\u7de8\u5beb\u670d\u52d9\u5668\u7a0b\u5f0f\u4e00\u4e0b\u5b50\u8b8a\u5f97\u7570\u5e38\u7c21\u55ae\u3002<\/p>\n\n\n\n<p>\u96d6\u7136\u5982\u6b64\u4f46\u6bcf\u6b21\u5275\u5efa\u65b0\u9805\u76ee\u6642\u4f9d\u7136\u8981\u5beb\u4e00\u5806\u985e\u4f3c\u7684\u521d\u59cb\u5316\u4ee3\u78bc\uff0c\u7232\u6b64\u672c\u55b5\u7684\u89e3\u6c7a\u65b9\u6848\u662f\u5275\u5efa\u4e00\u500b\u9805\u76ee\u6a21\u677f\uff0c\u7531\u5de5\u5177\u4f9d\u64da\u6b64\u6a21\u677f\u7232\u65b0\u9805\u76ee\u5275\u5efa\u9019\u4e9b\u985e\u4f3c\u7684\u521d\u59cb\u5316\u4ee3\u78bc\u3002<\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/powerpuffpenguin\/jsgenerate_grpc-gateway\" target=\"_blank\">github.com\/powerpuffpenguin\/jsgenerate_grpc-gateway<\/a> \u4fbf\u662f\u672c\u55b5\u5be6\u73fe\u7684\u9805\u76ee\u6a21\u677f\uff0c\u672c\u6587\u4e3b\u8981\u5728\u65bc\u4ecb\u7d39 jsgenerate_grpc-gateway \u7684\u7279\u6027\u548c\u4f7f\u7528\u65b9\u5f0f<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7279\u6027<\/h2>\n\n\n\n<p>jsgenerate_grpc-gateway \u5275\u5efa\u4e86\u9805\u76ee\u521d\u59cb\u5316\u4ee3\u78bc\uff0c\u9019\u4e9b\u9810\u5275\u5efa\u7684\u4ee3\u78bc\u7232\u9805\u76ee\u63d0\u4f9b\u4e86\u4e00\u4e9b\u6709\u8da3\u7684\u7279\u6027<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>\u9805\u76ee\u878d\u5408\u4e86 grpc grpc-gateway gin\uff0c\u4f60\u53ef\u4ee5\u53ea\u5beb grpc \u4ee3\u78bc\uff0cgrpc-gateway \u6703\u81ea\u52d5\u7232 unary \u63a5\u53e3\u63d0\u4f9b\u4e00\u500bhttp1.1 \u7684\u517c\u5bb9\u63a5\u53e3\u7121\u9700\u984d\u5916\u7de8\u78bc\uff0c\u540c\u6642 grpc \u548c gin \u53ef\u4ee5\u5354\u540c\u5de5\u4f5c\u4f60\u9084\u53ef\u4ee5\u4f7f\u7528 gin \u7232 http \u5b9a\u7fa9\u984d\u5916\u7684\u63a5\u53e3\u3002<\/li><li>\u56e0\u7232 grpc grpc-gateway gin \u5176\u5be6\u90fd\u662f http \u5354\u8b70\uff0c\u6545\u9019\u4e09\u8005\u5171\u7528\u540c\u4e00\u500b\u7aef\u53e3\uff0c\u7121\u8ad6\u662f grpc \u9084\u662f grpc-gateway \u4ee5\u53ca gin \u63d0\u4f9b\u7684\u670d\u52d9\uff0c\u5916\u90e8\u90fd\u53ea\u9700\u8981\u8a2a\u554f\u670d\u52d9\u63d0\u4f9b\u7684\u552f\u4e00\u4e00\u500b\u5c0d\u5916\u958b\u653e\u7684\u63a5\u53e3\u5373\u53ef\uff0c\u9019\u7c21\u5316\u7684\u670d\u52d9\u914d\u7f6e\u4ee5\u53ca\u591a\u5ba2\u6236\u7aef\u7684\u914d\u7f6e\u3002<\/li><li>\u501f\u52a9 golang \u826f\u597d\u7684\u63a5\u53e3\u7279\u6027\u548c net.Pipe\uff0cgrpc-gateway \u5728\u8f49\u767c grpc \u670d\u52d9\u6642\u53ef\u4ee5\u76f4\u63a5\u5728\u5167\u5b58 \u901a\u4fe1\uff0c\u4e0d\u9700\u8981\u4f7f\u7528 socket \u7d93\u904e\u7db2\u5361\u8f49\u767c\uff0c\u9019\u7121\u7591\u589e\u52a0\u4e86\u8f49\u767c\u6548\u7387\u3002<\/li><li>\u5275\u5efa\u4e86\u4e00\u4e9b\u9805\u76ee\u5e38\u7528\u6a21\u584a<ul><li>db -> \u6578\u64da\u5eab\u5c64<\/li><li>logger -> \u5206\u584a\u65e5\u8a8c<\/li><li>sessions -> \u7528\u6236 session<\/li><li>signal -> \u6a21\u584a\u5354\u4f5c\u7684\u63d2\u69fd\u4fe1\u865f<\/li><li>script -> \u9805\u76ee\u7de8\u8b6f\u7b49\u81ea\u52d5\u5316\u8173\u672c<\/li><\/ul><\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u74b0\u5883\u914d\u7f6e<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>\u5b89\u88dd\u597d nodejs \u548c npm <\/li><li>\u5b89\u88dd jsgenerate\uff0c\u672c\u55b5\u4f7f\u7528 nodejs \u5be6\u73fe\u7684\u4e00\u500b\u4ee3\u78bc\u751f\u6210\u5de5\u5177  <ul><li>npm install -g @king011\/jsgenerate<\/li><\/ul><\/li><li>\u5b89\u88dd jsgenerate_grpc-gateway \u6a21\u677f<ul><li>git clone https:\/\/github.com\/powerpuffpenguin\/jsgenerate_grpc-gateway.git ~\/.jsgenerate\/init\/jsgenerate_grpc-gateway<\/li><\/ul><\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u5275\u5efa\u9805\u76ee<\/h2>\n\n\n\n<p>\u914d\u7f6e\u597d\u74b0\u5883\u5f8c\u5c31\u53ef\u4ee5\u4f7f\u7528 jsgenerate \u6307\u4ee4\u65b0\u5efa\u9805\u76ee\uff0c\u6bd4\u5982\u6211\u5011\u8981\u5728srv\u6a94\u6848\u593e\u4e0b\u5275\u5efa\u4e00\u500b\u5305\u540d\u7232 powerpuffpenguin\/example \u7684\u9805\u76ee \u53ef\u4ee5\u8f38\u5165\u5982\u4e0b\u6307\u4ee4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir srv &amp;&amp; cd srv &amp;&amp; \\\n     jsgenerate init jsgenerate_grpc-gateway -t init-supplement -p powerpuffpenguin\/example<\/code><\/pre>\n\n\n\n<p>-p \u53c3\u6578\u6307\u5b9a\u5305\u540d\uff0c-t \u53c3\u6578\u7232\u6a21\u677f\u63d0\u4f9b\u5275\u5efa\u610f\u898b\uff0c\u652f\u6301\u591a\u7a2e\u9078\u9805\u6bd4\u5982 -t view \u6703\u5275\u5efa\u4e00\u500b\u9ed8\u8a8d\u7684\u524d\u7aef\u4ee3\u78bc\u5230 view \u6a94\u6848\u593e\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir srv &amp;&amp; cd srv &amp;&amp; \\\n     jsgenerate init jsgenerate_grpc-gateway -t init-supplement  -t view -p powerpuffpenguin\/example<\/code><\/pre>\n\n\n\n<p>\u8f38\u5165 -h \u6307\u4ee4\u53ef\u4ee5\u67e5\u770b\u8a73\u7d30\u4f7f\u7528\u8aaa\u660e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ jsgenerate init jsgenerate_grpc-gateway -h\nUsage: jsgenerate init jsgenerate_grpc-gateway &#91;options]\n\ngoogle grpc frame template\n\nOptions:\n  -n, --name &#91;]        project name\n  -p, --package &#91;]     package name\n  -t, --tag &#91;tags...]  code generate tag\n  --list-tag           list supported tag\n  -h, --help           display help for command<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u9805\u76ee\u7d50\u69cb\u6e05\u55ae<\/h2>\n\n\n\n<p>\u5275\u5efa\u597d\u7684\u9805\u76ee\u901a\u5e38\u5305\u542b\u5982\u4e0b\u5167\u5bb9<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>bin -> \u7de8\u8b6f\u8f38\u51fa\u7684\u53ef\u57f7\u884c\u6a94\u6848\uff0c\u65e5\u8a8c\uff0c\u914d\u7f6e\u6a94\u6848<\/li><li>cmd -> \u547d\u4ee4\u884c\u89e3\u6790\uff0c\u7a0b\u5f0f\u5165\u53e3<\/li><li>main.go -> \u8abf\u7528 cmd.Execute() \u57f7\u884c\u547d\u4ee4\u884c\u89e3\u6790<\/li><li>configure -> \u53ef\u57f7\u884c\u6a94\u6848\u7684\u914d\u7f6e\u5b9a\u7fa9<\/li><li>db -> \u6578\u64da\u5eab\u5c64<\/li><li>docker -> \u901a\u5e38\u53ef\u5728\u6b64\u5b9a\u7fa9\u9805\u76ee\u7684docker\u93e1\u50cf<\/li><li>logger -> \u65e5\u8a8c\u5be6\u73fe<\/li><li>m -> \u6a21\u584a\u8a3b\u518a\u8207\u5be6\u73fe\uff0c\u901a\u5e38\u4f60\u53ea\u9700\u8981\u4fee\u6539\u9019\u88cf\u7684go\u4ee3\u78bc\u5be6\u73fe\u81ea\u5df1\u7684\u6a21\u584a\u529f\u80fd<\/li><li>pb -> grpc \u7684 \u5b9a\u7fa9\u6a94\u6848 (*.proto)<\/li><li>protocol -> grpc \u5de5\u5177\u751f\u6210\u7684 grpc \u4ee3\u78bc<\/li><li>script -> \u4e00\u4e9b\u7232\u9805\u76ee\u63d0\u4f9b\u5e6b\u52a9\u7684\u81ea\u52d5\u5316 bash \u8173\u672c<\/li><li>build.sh -> \u6253\u5305\u4e86 script \u63d0\u4f9b\u7684\u529f\u80fd\u5230\u6b64\u8173\u672c\u65b9\u4fbf\u57f7\u884c<\/li><li>sessions -> \u7528\u6236 session<\/li><li>signal -> \u529f\u80fd\u6a21\u584a\u61c9\u8a72\u5b8c\u5168\u9694\u96e2\u4e92\u4e0d\u77e5\u9053\u5f7c\u6b64\uff0c\u5728\u6b64\u8655\u4f7f\u7528\u63d2\u69fd\u4fe1\u865f\u65b9\u5f0f\u8b93\u6a21\u584a\u901a\u4fe1<\/li><li>static -> \u4e00\u4e9b\u5d4c\u5165\u7684\u975c\u614b\u6a94\u6848<\/li><li>assets -> \u975c\u614b\u6a94\u6848\u751f\u6210\u7684\u5d4c\u5165\u4ee3\u78bc<\/li><li>third_party -> googleapis \u7684 *.proto<\/li><li>utils -> \u9805\u76ee\u5de5\u5177\u51fd\u6578<\/li><li>version -> \u9805\u76ee\u7248\u672c\u5b9a\u7fa9<\/li><li>view -> \u4f7f\u7528 -t view \u6703\u5275\u5efa\u7684\u4e00\u500b angular \u5be6\u73fe\u7684\u9ed8\u8a8d\u524d\u7aef<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u7de8\u8b6f\u9805\u76ee<\/h2>\n\n\n\n<p>\u7232\u4e86\u7de8\u8b6f\u9805\u76ee\u4f60\u53ef\u80fd\u9700\u8981\u81ea\u884c\u914d\u7f6e\u597d\u4ee5\u4e0b\u74b0\u5883\uff0c\u8acb\u53c3\u8003\u5404\u81ea\u5b98\u7db2\u7684\u8aaa\u660e<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" href=\"https:\/\/developers.google.com\/protocol-buffers\" target=\"_blank\">protocol buffer<\/a> -> \u751f\u6210 grpc \u4ee3\u78bc<\/li><li><a href=\"https:\/\/grpc.io\/docs\/languages\/go\/quickstart\/\">golang grpc \u63d2\u4ef6<\/a>  -> \u751f\u6210 grpc \u4ee3\u78bc<\/li><li><a href=\"https:\/\/grpc-ecosystem.github.io\/grpc-gateway\/\">grpc-gateway<\/a> -> \u751f\u6210 gateway \u4ee3\u78bc \u548c http api \u63a5\u53e3\u6587\u6a94<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/rakyll\/statik\" target=\"_blank\">github.com\/rakyll\/statik<\/a> -> \u7528\u65bc\u5c07\u975c\u614b\u8cc7\u6e90\u5d4c\u5165\u9805\u76ee(api \u63a5\u53e3\u6587\u6a94 \u524d\u7aefview)<\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/angular.io\/\" target=\"_blank\">angular<\/a> -> \u5982\u679c\u8981\u5d4c\u5165\u9ed8\u8a8d\u524d\u7aef\u5be6\u73fe(\u9ed8\u8a8d\u524d\u7aef\u4f7f\u7528 angular)<\/li><\/ul>\n\n\n\n<p>\u914d\u7f6e\u597d\u4e0a\u8ff0\u74b0\u5883\u5f8c\u5c31\u53ef\u4ee5\u4f7f\u7528\u9805\u76ee\u751f\u6210\u7684 build.sh \u4f86\u7de8\u8b6f\u9805\u76ee<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. \u751f\u6210 grpc \u4ee3\u78bc\n.\/build.sh grpc\n\n# 2. \u7232 api \u6587\u6a94\u751f\u6210\u5d4c\u5165\u4ee3\u78bc\n.\/build.sh document\n\n# 3. \u5982\u679c\u4f7f\u7528\u7684\u9ed8\u8a8d\u524d\u7aef\uff0c\u7de8\u8b6f\u524d\u7aef\u4e26\u751f\u6210\u5d4c\u5165\u4ee3\u78bc\n.\/build.sh view # \u7de8\u8b6f\u524d\u7aef\n.\/build.sh view -s # -s \u53c3\u6578\u751f\u6210\u5d4c\u5165\u4ee3\u78bc\n\n# 4. \u7de8\u8b6f go \u4ee3\u78bc\n.\/build.sh go<\/code><\/pre>\n\n\n\n<p>\u4f7f\u7528 -h \u53c3\u6578\u53ef\u4ee5\u67e5\u770b build.sh \u4f7f\u7528\u8aaa\u660e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ .\/build.sh -h\nbuild script\n\nUsage:\n  .\/build.sh &#91;flags]\n  .\/build.sh &#91;command]\n\nAvailable Commands:\n  help              help for .\/build.sh\n  clear             clear output\n  document          static build document\n  go                go build helper\n  view              view build helper\n  grpc              grpc protoc helper\n  pack              pack release\n  run               run project\n  docker            docker build helper\n\nFlags:\n  -h, --help          help for .\/build.sh<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>$ .\/build.sh go -h\ngo build helper\n\nUsage:\n  .\/build.sh go &#91;flags]\n\nFlags:\n  -c, --clear         clear output\n  -d, --debug         build debug mode\n  -l, --list          list all supported platforms\n  -p, --pack          pack to compressed package &#91;7z gz bz2 xz zip]\n  -P, --platform      build platform (default \"linux\/amd64\")\n  -u, --upx           use upx to compress executable programs\n  -h, --help          help for .\/build.sh go\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">script\/conf.sh<\/h2>\n\n\n\n<p>script\/conf.sh \u7528\u65bc\u7232\u81ea\u52d5\u8173\u672c\u63d0\u4f9b\u6307\u5c0e\u5b9a\u7fa9<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Target=\"example\"\nDocker=\"powerpuffpenguin\/example\"\nDir=$(cd \"$(dirname $BASH_SOURCE)\/..\" &amp;&amp; pwd)\nVersion=\"v0.0.1\"\nView=1\nPlatforms=(\n    darwin\/amd64\n    windows\/amd64\n    linux\/arm\n    linux\/amd64\n)\nUUID=\"b1300070-c028-11eb-b0aa-27a5fad41b4d\"\nProtos=(\n    system\/system.proto\n    session\/session.proto\n    user\/user.proto\n    logger\/logger.proto\n)<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Target -> \u7de8\u8b6f\u8f38\u51fa\u7684\u53ef\u57f7\u884c\u6a94\u6848\u540d\u7a31<\/li><li>Docker -> docker \u93e1\u50cf\u540d\u7a31<\/li><li>Dir -> \u9805\u76ee\u6839\u76ee\u9304\uff0c\u8acb\u4e0d\u8981\u4fee\u6539<\/li><li>Version -> \u5b9a\u7fa9\u9805\u76ee\u7248\u672c\uff0cbuild.sh go \u6642\u6703\u81ea\u52d5\u4fee\u6539\u6e90\u78bc\u4e2d\u7684\u7248\u672c\u5b9a\u7fa9<\/li><li>Platforms -> build.sh pack \u6642\u8981\u7de8\u8b6f\u6253\u5305\u7684\u5e73\u81fa<\/li><li>UUID -> proto uuid\uff0c\u8acb\u52ff\u4fee\u6539\uff0c\u7528\u65bc\u89e3\u6c7a <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/golang\/protobuf\/issues\/1122\" target=\"_blank\">https:\/\/github.com\/golang\/protobuf\/issues\/1122<\/a> \u8a0e\u8ad6\u7684\u554f\u984c<\/li><li>Protos -> \u53c3\u8207\u751f\u6210\u7684 grpc \u5b9a\u7fa9\uff0c\u5728\u6dfb\u52a0\u4e86\u81ea\u5b9a\u7fa9 grpc \u5b9a\u7fa9\u6642\u5c07\u65b0\u7684 *.proto \u6a94\u6848\u6dfb\u52a0\u5230\u6b64\u5217\u8868\u4e2d<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u6dfb\u52a0 grpc \u6a21\u584a<\/h2>\n\n\n\n<p>\u6709\u4e86\u4e0a\u8ff0\u57fa\u790e\u5f8c\uff0c\u5269\u4e0b\u7684\u5275\u5efa\u65b0 grpc \u6a21\u584a\u5c31\u5f88\u7c21\u55ae\u4e86\uff0c\u6a21\u677f\u5df2\u7d93\u63d0\u4f9b\u4e86\u9ed8\u8a8d\u7684\u5e7e\u500b\u6a21\u584a\u4f60\u53ef\u4ee5\u53c3\u8003\uff0c\u61c9\u8a72\u6309\u7167\u4e0b\u8ff0\u6b65\u9a5f\u5be6\u73fe\u6a21\u584a<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>\u5728 pb \u6a94\u6848\u593e\u4e0b \u5275\u5efa *.proto \u5b9a\u7fa9 grpc \u548c gateway \u63d0\u4f9b\u7684\u63a5\u53e3\u7d30\u7bc0<\/li><li>\u5728 script\/conf.sh \u6a94\u6848\u4e2d \u5c07\u5275\u5efa\u7684 *.proto \u6dfb\u52a0\u5230 Protos \u5217\u8868\u4e2d<\/li><li>\u5728 m\/server \u5275\u5efa\u4ee5\u5305 \u5be6\u73fe grpc \u5b9a\u7fa9 \u548c \u63d0\u4f9b\u4e00\u500b \u5be6\u73fe\u4e86 m.register.Module \u63a5\u53e3\u7684\u985e\u578b<\/li><li>\u5728 m\/register\/grpc.go \u4e2d\u5c07\u5be6\u73fe\u7684 m.register.Module \u8a3b\u518a\u5230\u9805\u76ee\u4e2d<\/li><\/ol>\n\n\n\n<p>\u7de8\u8b6f\u9805\u76ee\u5f8c\u4fbf\u53ef\u5728\u4f7f\u7528 grpc \u6216 http \u8a2a\u554f\u6a21\u584a<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">document<\/h2>\n\n\n\n<p>\u5d4c\u5165\u7684 http api \u6587\u6a94\uff0c\u8a3b\u518a\u7684url \u7232 \/document\/ \uff0c\u4f60\u53ef\u4ee5\u8a2a\u554f\u6b64\u8def\u5f91\u67e5\u770b\uff0c\u4e26\u5728\u6b64\u8a2a\u554f http \u63a5\u53e3\u4ee5\u4fbf\u6e2c\u8a66<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u524d\u672c\u55b5\u6700\u770b\u597d\u7684rpc\u6846\u67b6\u662f grpc\uff0c\u540c\u6642\u501f\u52a9 grpc-gateway \u548c net.Pipe \u53ef\u4ee5\u5e7e\u4e4e\u7121\u526f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[11,30,22,2],"tags":[12,31,32,34,35,33],"class_list":["post-184","post","type-post","status-publish","format-standard","hentry","category-golang","category-grpc","category-elegant-code","category-code","tag-golang","tag-grpc","tag-grpc-gateway","tag-project-template","tag-restful","tag-rpc"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts\/184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=184"}],"version-history":[{"count":6,"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts\/184\/revisions"}],"predecessor-version":[{"id":190,"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts\/184\/revisions\/190"}],"wp:attachment":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}