{"id":553853,"date":"2022-02-03T07:39:21","date_gmt":"2022-02-02T23:39:21","guid":{"rendered":"http:\/\/4563.org\/?p=553853"},"modified":"2022-02-03T07:39:21","modified_gmt":"2022-02-02T23:39:21","slug":"golang-grpc-%e4%b8%ba%e4%bd%95%e4%bc%9a%e9%80%a0%e6%88%90%e5%86%85%e5%ad%98%e6%b3%84%e9%9c%b2-3","status":"publish","type":"post","link":"http:\/\/4563.org\/?p=553853","title":{"rendered":"golang grpc \u4e3a\u4f55\u4f1a\u9020\u6210\u5185\u5b58\u6cc4\u9732?"},"content":{"rendered":"<div>\n<div>\n<div>\n<h1> golang grpc \u4e3a\u4f55\u4f1a\u9020\u6210\u5185\u5b58\u6cc4\u9732? <\/h1>\n<p> <\/p>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : perror <\/span>  <span><i><\/i> 37<\/span> <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div isfirst=\"1\"> <\/p>\n<p>\u4e00\u4e2a\u5f88\u7b80\u5355\u7684 grpc \u7a0b\u5e8f, \u4f7f\u7528 go-zero \u751f\u6210\u7684\u4ee3\u7801, \u4e3b\u8981\u7528\u6765\u4ee3\u66ff\u5ba2\u6237\u7aef\u53d1\u9001 http \u8bf7\u6c42, \u5e76\u4e14\u8fd4\u56de response body\/response headers, \u4ec5\u6b64\u800c\u5df2, \u538b\u529b\u6d4b\u8bd5\u65f6\u53d1\u73b0\u5185\u5b58\u4e0d\u65ad\u7684\u4e0a\u5347!\u6ca1\u6709\u505c\u6b62\u6216\u8005\u4e0b\u964d, \u76f4\u5230\u5230\u64cd\u4f5c\u7cfb\u7edf kill, \u4ee5\u4e0b\u662f\u4e3b\u8981\u4ee3\u7801:<\/p>\n<pre><code> type Request struct { }  var httpClientPool = sync.Pool{New: func() interface{}{  return &amp;http.Client{   Transport: &amp;http.Transport{    TLSClientConfig: &amp;tls.Config{     InsecureSkipVerify: true,    },   },  } }}   var bufPool = sync.Pool{  New: func() interface{} {   return bytes.NewBuffer([]byte{})  }, }   func (l *RequestLogic) Request(in *cache.RequestMsg) (*cache.ResponseMsg, error) {  var result = new(cache.ResponseMsg)   req, err := http.NewRequest(in.Method, string(in.Url), bytes.NewReader(in.Body))  if err != nil {   result.ErrorMsg = err.Error()   return result, errors.Wrap(err, \"build request error\")  }  for k, v := range in.Headers {   req.Header.Add(k, v)  }    client := httpClientPool.Get().(*http.Client)  defer httpClientPool.Put(client)  client.Timeout = request_timeout  if in.ProxyUrl != \"\" {   u, _ := url.Parse(in.ProxyUrl)   if u != nil {    client.Transport.(*http.Transport).Proxy = http.ProxyURL(u)   }  }   resp, err := client.Do(req)  if err != nil {   return result, errors.Wrap(err, \"request error\")  }  defer  resp.Body.Close()   result.Url = []byte(resp.Request.URL.String())  result.StatusCode = int32(resp.StatusCode)   var w = bufPool.Get().(*bytes.Buffer)  defer bufPool.Put(w)  if err := gz.Compress(resp.Body, w); err != nil {   return result, errors.Wrap(err, \"gz compress error\")  }   result.IsCompressor = true  result.Body = w.Bytes()   result.Headers = make(map[string]string)  for k, values := range resp.Header {   for _, v := range values {    result.Headers[k] = v   }  }   return result, nil } <\/code><\/pre>\n<p>\u4e5f\u901a\u8fc7 pprof \u67e5\u770b\u4e86, \u90fd\u662f bytes \u5206\u914d\u5bfc\u81f4, \u4f46\u662f\u8c8c\u4f3c\u4e0d\u662f\u6211\u5199\u7684\u7a0b\u5e8f\u95ee\u9898?<\/p>\n<pre><code>Showing nodes accounting for 930.40MB, 99.07% of 939.12MB total Dropped 42 nodes (cum &lt;= 4.70MB) Showing top 10 nodes out of 38       flat  flat%   sum%        cum   cum%   760.34MB 80.96% 80.96%   760.34MB 80.96%  google.golang.org\/protobuf\/proto.MarshalOptions.marshal   151.13MB 16.09% 97.06%   151.13MB 16.09%  bytes.makeSlice    12.23MB  1.30% 98.36%    12.23MB  1.30%  google.golang.org\/grpc\/internal\/transport.newBufWriter (inline)     6.19MB  0.66% 99.02%     6.19MB  0.66%  bufio.NewReaderSize (inline)     0.50MB 0.053% 99.07%    18.92MB  2.01%  google.golang.org\/grpc\/internal\/transport.NewServerTransport          0     0% 99.07%   150.62MB 16.04%  bytes.(*Buffer).Write          0     0% 99.07%   151.13MB 16.09%  bytes.(*Buffer).grow          0     0% 99.07%   150.62MB 16.04%  compress\/flate.(*Writer).Write          0     0% 99.07%   150.62MB 16.04%  compress\/flate.(*compressor).deflate          0     0% 99.07%   150.62MB 16.04%  compress\/flate.(*compressor).write <\/code><\/pre>\n<p>\u8fd9\u548b\u4f18\u5316\u5440?\u8fd8\u662f\u76f4\u63a5\u653e\u5f03\u6389 rpc, \u6784\u5efa\u4e00\u4e2a http \u4ee3\u7406\u670d\u52a1\u5668?<\/p>\n<\/p><\/div>\n<div> <b>\u5927\u4f6c\u6709\u8a71\u8aaa<\/b> (<span>3<\/span>) <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<ul>\n<li data-pid=\"7109500\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : Mohanson <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>  <\/span> <\/div>\n<\/p><\/div>\n<div> \u76f2\u731c\u4e0d\u505c\u7684\u4ece\u6c60\u4e2d\u53d6 buffer -&gt; append \u6570\u636e -&gt; \u653e\u56de\u6c60\u5b50 -&gt; \u7ee7\u7eed\u53d6 buffer -&gt; \u7ee7\u7eed append \u6570\u636e.<br \/>&gt; \u4f46\u662f\u8c8c\u4f3c\u4e0d\u662f\u6211\u5199\u7684\u7a0b\u5e8f\u95ee\u9898?<br \/>\u80af\u5b9a\u662f\u4f60\u5199\u7684\u7a0b\u5e8f\u95ee\u9898, \u4e0d\u7136\u54a7? \u4f60\u662f\u89c9\u5f97\u4f60\u53d1\u73b0\u4e86\u6807\u51c6\u5e93, \u7f16\u8bd1\u5668, \u64cd\u4f5c\u7cfb\u7edf, \u8fd8\u662f CPU \u7684 BUG? <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"7109501\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : Nitroethane <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>  <\/span> <\/div>\n<\/p><\/div>\n<div> bufPool.Put() \u65b9\u6cd5\u4e4b\u524d\u5e94\u8be5\u628a bytes.Buffer reset \u4e00\u4e0b\u3002\u8fd8\u6709\u538b\u7f29\u6570\u636e\u90a3\u5757\u4e0d\u77e5\u9053\u4f60\u600e\u4e48\u5199\u7684\uff0c\u53ef\u80fd\u4e5f\u5b58\u5728\u95ee\u9898 <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"7109502\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : vvhhaaattt <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>  <\/span> <\/div>\n<\/p><\/div>\n<div> http.Client \u5185\u90e8\u6709\u5b9e\u73b0\u8fde\u63a5\u6c60\uff0c\u4e00\u822c\u662f\u521d\u59cb\u5316\u4e00\u4e2a\u5168\u5c40\u53d8\u91cf\u6765\u7528\u7684\u5427\u3002<br \/>\u4e0d\u8fc7\u5bf9\u4e3b\u8fd9\u4e2a\u95ee\u9898\uff0c\u5f71\u54cd\u5e94\u8be5\u4e0d\u662f\u5f88\u5927\u611f\u89c9\u3002 <\/div>\n<\/p><\/div>\n<\/li>\n<li>\n","protected":false},"excerpt":{"rendered":"<p>golang grpc \u4e3a\u4f55\u4f1a\u9020\u6210&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/553853"}],"collection":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=553853"}],"version-history":[{"count":0,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/553853\/revisions"}],"wp:attachment":[{"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=553853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=553853"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=553853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}