<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Grpc-Gateway on </title>
    <link>https://note.lican.site/tags/grpc-gateway/</link>
    <description>Recent content in Grpc-Gateway on </description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© lican.asia All rights reserved</copyright>
    <lastBuildDate>Sat, 22 Jun 2019 12:00:00 +0000</lastBuildDate>
    <atom:link href="https://note.lican.site/tags/grpc-gateway/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>「连载四」gRPC&#43;gRPC Gateway 能不能不用证书？</title>
      <link>https://note.lican.site/posts/posts/go/grpc-gateway/2019-06-22-grpc-gateway-tls/</link>
      <pubDate>Sat, 22 Jun 2019 12:00:00 +0000</pubDate>
      <guid>https://note.lican.site/posts/posts/go/grpc-gateway/2019-06-22-grpc-gateway-tls/</guid>
      <description>&lt;p&gt;如果你以前有涉猎过 gRPC+gRPC Gateway 这两个组件，你肯定会遇到这个问题，就是 &lt;strong&gt;“为什么非得开 TLS，才能够实现同端口双流量，能不能不开？”&lt;/strong&gt; 又或是 &lt;strong&gt;“我不想用证书就实现这些功能，行不行？”&lt;/strong&gt;。我被无数的人问过无数次这些问题，也说服过很多人，但说服归说服，不代表放弃。前年不行，不代表今年不行，在今天我希望分享来龙去脉和具体的实现方式给你。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://s2.ax1x.com/2020/02/27/3dLBAx.png&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;过去&#34;&gt;过去&lt;/h2&gt;&#xA;&lt;h3 id=&#34;为什么-h2-不行&#34;&gt;为什么 h2 不行&lt;/h3&gt;&#xA;&lt;p&gt;因为 &lt;code&gt;net/http2&lt;/code&gt; 仅支持 &amp;ldquo;h2&amp;rdquo; 标识，而 &amp;ldquo;h2&amp;rdquo; 标识 HTTP/2 必须使用传输层安全性（TLS）的协议，此标识符用于 TLS 应用层协议协商字段以及识别 HTTP/2 over TLS。&lt;/p&gt;&#xA;&lt;p&gt;简单来讲，也就 &lt;code&gt;net/http2&lt;/code&gt; 必须使用 TLS 来交互。通俗来讲就要用证书，那么理所当然，也就无法支持非 TLS 的情况了。&lt;/p&gt;&#xA;&lt;h3 id=&#34;寻找-h2c&#34;&gt;寻找 h2c&lt;/h3&gt;&#xA;&lt;p&gt;那这条路不行，我们再想想别的路？那就是 HTTP/2 规范中的 &amp;ldquo;h2c&amp;rdquo; 标识了，&amp;ldquo;h2c&amp;rdquo; 标识允许通过明文 TCP 运行 HTTP/2 的协议，此标识符用于 HTTP/1.1 升级标头字段以及标识 HTTP/2 over TCP。&lt;/p&gt;&#xA;&lt;p&gt;但是这条路，早在 2015 年就已经有在 &lt;a href=&#34;https://github.com/golang/go/issues/13128#issuecomment-153193762&#34;&gt;issue&lt;/a&gt; 中进行讨论，当时 @bradfitz 明确表示 “不打算支持 h2c，对仅支持 TLS 的情况非常满意，一年后再问我一次”，原文回复如下：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We do not plan to support h2c. I don&amp;rsquo;t want to receive bug reports from users who get bitten by transparent proxies messing with h2c. Also, until there&amp;rsquo;s widespread browser support, it&amp;rsquo;s not interesting. I am also not interested in being the chicken or the egg to get browser support going. I&amp;rsquo;m very happy with the TLS-only situation, and things like &lt;a href=&#34;https://LetsEncrypt.org/&#34;&gt;https://LetsEncrypt.org/&lt;/a&gt; will make TLS much easier (and automatic) soon.&lt;/p&gt;</description>
    </item>
    <item>
      <title>「连载三」Swagger了解一下</title>
      <link>https://note.lican.site/posts/posts/go/grpc-gateway/2018-03-04-swagger/</link>
      <pubDate>Sun, 04 Mar 2018 12:00:00 +0000</pubDate>
      <guid>https://note.lican.site/posts/posts/go/grpc-gateway/2018-03-04-swagger/</guid>
      <description>&lt;p&gt;在&lt;a href=&#34;https://segmentfault.com/a/1190000013408485&#34;&gt;上一节&lt;/a&gt;，我们完成了一个服务端同时支持&lt;code&gt;Rpc&lt;/code&gt;和&lt;code&gt;RESTful Api&lt;/code&gt;后，你以为自己大功告成了，结果突然发现要写&lt;code&gt;Api&lt;/code&gt;文档和前端同事对接= = 。。。&lt;/p&gt;&#xA;&lt;p&gt;你寻思有没有什么组件能够自动化生成&lt;code&gt;Api&lt;/code&gt;文档来解决这个问题，就在这时你发现了&lt;code&gt;Swagger&lt;/code&gt;，一起了解一下吧！&lt;/p&gt;&#xA;&lt;h2 id=&#34;介绍&#34;&gt;介绍&lt;/h2&gt;&#xA;&lt;h3 id=&#34;swagger&#34;&gt;Swagger&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;Swagger&lt;/code&gt;是全球最大的&lt;code&gt;OpenAPI&lt;/code&gt;规范（OAS）API开发工具框架，支持从设计和文档到测试和部署的整个API生命周期的开发&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Swagger&lt;/code&gt;是目前最受欢迎的&lt;code&gt;RESTful Api&lt;/code&gt;文档生成工具之一，主要的原因如下&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;跨平台、跨语言的支持&lt;/li&gt;&#xA;&lt;li&gt;强大的社区&lt;/li&gt;&#xA;&lt;li&gt;生态圈 Swagger Tools（&lt;a href=&#34;https://github.com/swagger-api/swagger-editor&#34;&gt;Swagger Editor&lt;/a&gt;、&lt;a href=&#34;https://github.com/swagger-api/swagger-codegen&#34;&gt;Swagger Codegen&lt;/a&gt;、&lt;a href=&#34;https://github.com/swagger-api/swagger-ui&#34;&gt;Swagger UI&lt;/a&gt; &amp;hellip;）&lt;/li&gt;&#xA;&lt;li&gt;强大的控制台&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;同时&lt;code&gt;grpc-gateway&lt;/code&gt;也支持&lt;code&gt;Swagger&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;[image]&lt;/p&gt;&#xA;&lt;h3 id=&#34;openapi规范&#34;&gt;&lt;code&gt;OpenAPI&lt;/code&gt;规范&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;OpenAPI&lt;/code&gt;规范是&lt;code&gt;Linux&lt;/code&gt;基金会的一个项目，试图通过定义一种用来描述API格式或API定义的语言，来规范&lt;code&gt;RESTful&lt;/code&gt;服务开发过程。&lt;code&gt;OpenAPI&lt;/code&gt;规范帮助我们描述一个API的基本信息，比如：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;有关该API的一般性描述&lt;/li&gt;&#xA;&lt;li&gt;可用路径（/资源）&lt;/li&gt;&#xA;&lt;li&gt;在每个路径上的可用操作（获取/提交&amp;hellip;）&lt;/li&gt;&#xA;&lt;li&gt;每个操作的输入/输出格式&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;目前V2.0版本的&lt;a href=&#34;https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md&#34;&gt;OpenAPI规范&lt;/a&gt;（也就是SwaggerV2.0规范）已经发布并开源在github上。该文档写的非常好，结构清晰，方便随时查阅。&lt;/p&gt;&#xA;&lt;p&gt;注：&lt;code&gt;OpenAPI&lt;/code&gt;规范的介绍引用自&lt;a href=&#34;https://huangwenchao.gitbooks.io/swagger/content/&#34;&gt;原文&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;使用&#34;&gt;使用&lt;/h2&gt;&#xA;&lt;h3 id=&#34;生成swagger的说明文件&#34;&gt;生成&lt;code&gt;Swagger&lt;/code&gt;的说明文件&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;第一&lt;/strong&gt;，我们需要检查$GOBIN下是否包含&lt;code&gt;protoc-gen-swagger&lt;/code&gt;可执行文件&lt;/p&gt;&#xA;&lt;p&gt;若不存在则需要执行：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;等待执行完毕后，可在&lt;code&gt;$GOPATH/bin&lt;/code&gt;下发现该执行文件，将其移动到&lt;code&gt;$GOBIN&lt;/code&gt;下即可&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第二&lt;/strong&gt;，回到&lt;code&gt;$GOPATH/src/grpc-hello-world/proto&lt;/code&gt;下，执行命令&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;protoc -I/usr/local/include -I. -I$GOPATH/src/grpc-hello-world/proto/google/api --swagger_out=logtostderr=true:. ./hello.proto&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;成功后执行&lt;code&gt;ls&lt;/code&gt;即可看到&lt;code&gt;hello.swagger.json&lt;/code&gt;文件&lt;/p&gt;&#xA;&lt;h3 id=&#34;下载swagger-ui文件&#34;&gt;下载&lt;code&gt;Swagger UI&lt;/code&gt;文件&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;Swagger&lt;/code&gt;提供可视化的&lt;code&gt;API&lt;/code&gt;管理平台，就是&lt;a href=&#34;https://github.com/swagger-api/swagger-ui&#34;&gt;Swagger UI&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;我们将其源码下载下来，并将其&lt;code&gt;dist&lt;/code&gt;目录下的所有文件拷贝到我们项目中的&lt;code&gt;$GOPATH/src/grpc-hello-world/third_party/swagger-ui&lt;/code&gt;去&lt;/p&gt;&#xA;&lt;h3 id=&#34;将swagger-ui转换为go源代码&#34;&gt;将&lt;code&gt;Swagger UI&lt;/code&gt;转换为&lt;code&gt;Go&lt;/code&gt;源代码&lt;/h3&gt;&#xA;&lt;p&gt;在这里我们使用的转换工具是&lt;a href=&#34;https://github.com/jteeuwen/go-bindata&#34;&gt;go-bindata&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;它支持将任何文件转换为可管理的&lt;code&gt;Go&lt;/code&gt;源代码。用于将二进制数据嵌入到&lt;code&gt;Go&lt;/code&gt;程序中。并且在将文件数据转换为原始字节片之前，可以选择压缩文件数据&lt;/p&gt;&#xA;&lt;h4 id=&#34;安装&#34;&gt;安装&lt;/h4&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;go get -u github.com/jteeuwen/go-bindata/...&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;完成后，将&lt;code&gt;$GOPATH/bin&lt;/code&gt;下的&lt;code&gt;go-bindata&lt;/code&gt;移动到&lt;code&gt;$GOBIN&lt;/code&gt;下&lt;/p&gt;&#xA;&lt;h4 id=&#34;转换&#34;&gt;转换&lt;/h4&gt;&#xA;&lt;p&gt;在项目下新建&lt;code&gt;pkg/ui/data/swagger&lt;/code&gt;目录，回到&lt;code&gt;$GOPATH/src/grpc-hello-world/third_party/swagger-ui&lt;/code&gt;下，执行命令&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;go-bindata --nocompress -pkg swagger -o pkg/ui/data/swagger/datafile.go third_party/swagger-ui/...&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;检查&#34;&gt;检查&lt;/h4&gt;&#xA;&lt;p&gt;回到&lt;code&gt;pkg/ui/data/swagger&lt;/code&gt;目录，检查是否存在&lt;code&gt;datafile.go&lt;/code&gt;文件&lt;/p&gt;&#xA;&lt;h3 id=&#34;swagger-ui文件服务器对外提供服务&#34;&gt;&lt;code&gt;Swagger UI&lt;/code&gt;文件服务器（对外提供服务）&lt;/h3&gt;&#xA;&lt;p&gt;在这一步，我们需要使用与其配套的&lt;a href=&#34;https://github.com/elazarl/go-bindata-assetfs/&#34;&gt;go-bindata-assetfs&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>「连载二」Hello World</title>
      <link>https://note.lican.site/posts/posts/go/grpc-gateway/2018-02-27-hello-world/</link>
      <pubDate>Tue, 27 Feb 2018 12:00:00 +0000</pubDate>
      <guid>https://note.lican.site/posts/posts/go/grpc-gateway/2018-02-27-hello-world/</guid>
      <description>&lt;p&gt;这节将开始编写一个复杂的Hello World，涉及到许多的知识，建议大家认真思考其中的概念&lt;/p&gt;&#xA;&lt;h2 id=&#34;需求&#34;&gt;需求&lt;/h2&gt;&#xA;&lt;p&gt;由于本实践偏向&lt;code&gt;Grpc&lt;/code&gt;+&lt;code&gt;Grpc Gateway&lt;/code&gt;的方面，我们的需求是&lt;strong&gt;同一个服务端支持&lt;code&gt;Rpc&lt;/code&gt;和&lt;code&gt;Restful Api&lt;/code&gt;&lt;/strong&gt;，那么就意味着&lt;code&gt;http2&lt;/code&gt;、&lt;code&gt;TLS&lt;/code&gt;等等的应用，功能方面就是一个服务端能够接受来自&lt;code&gt;grpc&lt;/code&gt;和&lt;code&gt;Restful Api&lt;/code&gt;的请求并响应&lt;/p&gt;&#xA;&lt;h2 id=&#34;一初始化目录&#34;&gt;一、初始化目录&lt;/h2&gt;&#xA;&lt;p&gt;我们先在$GOPATH中新建&lt;code&gt;grpc-hello-world&lt;/code&gt;文件夹，我们项目的初始目录目录如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;grpc-hello-world/&#xA;├── certs&#xA;├── client&#xA;├── cmd&#xA;├── pkg&#xA;├── proto&#xA;│   ├── google&#xA;│   │   └── api&#xA;└── server&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;certs&lt;/code&gt;：证书凭证&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;client&lt;/code&gt;：客户端&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;cmd&lt;/code&gt;：命令行&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;pkg&lt;/code&gt;：第三方公共模块&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;proto&lt;/code&gt;：&lt;code&gt;protobuf&lt;/code&gt;的一些相关文件（含&lt;code&gt;.proto&lt;/code&gt;、&lt;code&gt;pb.go&lt;/code&gt;、&lt;code&gt;.pb.gw.go&lt;/code&gt;)，&lt;code&gt;google/api&lt;/code&gt;中用于存放&lt;code&gt;annotations.proto&lt;/code&gt;、&lt;code&gt;http.proto&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;server&lt;/code&gt;：服务端&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;二制作证书&#34;&gt;二、制作证书&lt;/h2&gt;&#xA;&lt;p&gt;在服务端支持&lt;code&gt;Rpc&lt;/code&gt;和&lt;code&gt;Restful Api&lt;/code&gt;，需要用到&lt;code&gt;TLS&lt;/code&gt;，因此我们要先制作证书&lt;/p&gt;&#xA;&lt;p&gt;进入&lt;code&gt;certs&lt;/code&gt;目录，生成&lt;code&gt;TLS&lt;/code&gt;所需的公钥密钥文件&lt;/p&gt;&#xA;&lt;h3 id=&#34;私钥&#34;&gt;私钥&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;openssl genrsa -out server.key 2048&#xA;&#xA;openssl ecparam -genkey -name secp384r1 -out server.key&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;openssl genrsa&lt;/code&gt;：生成&lt;code&gt;RSA&lt;/code&gt;私钥，命令的最后一个参数，将指定生成密钥的位数，如果没有指定，默认512&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;openssl ecparam&lt;/code&gt;：生成&lt;code&gt;ECC&lt;/code&gt;私钥，命令为椭圆曲线密钥参数生成及操作，本文中&lt;code&gt;ECC&lt;/code&gt;曲线选择的是&lt;code&gt;secp384r1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;自签名公钥&#34;&gt;自签名公钥&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;openssl req -new -x509 -sha256 -key server.key -out server.pem -days 3650&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;openssl req&lt;/code&gt;：生成自签名证书，&lt;code&gt;-new&lt;/code&gt;指生成证书请求、&lt;code&gt;-sha256&lt;/code&gt;指使用&lt;code&gt;sha256&lt;/code&gt;加密、&lt;code&gt;-key&lt;/code&gt;指定私钥文件、&lt;code&gt;-x509&lt;/code&gt;指输出证书、&lt;code&gt;-days 3650&lt;/code&gt;为有效期，此后则输入证书拥有者信息&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;填写信息&#34;&gt;填写信息&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Country Name (2 letter code) [XX]:&#xA;State or Province Name (full name) []:&#xA;Locality Name (eg, city) [Default City]:&#xA;Organization Name (eg, company) [Default Company Ltd]:&#xA;Organizational Unit Name (eg, section) []:&#xA;Common Name (eg, your name or your server&amp;#39;s hostname) []:grpc server name&#xA;Email Address []:&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;三proto&#34;&gt;三、&lt;code&gt;proto&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;编写&#34;&gt;编写&lt;/h3&gt;&#xA;&lt;p&gt;1、 &lt;code&gt;google.api&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>「连载一」gRPC介绍与环境安装</title>
      <link>https://note.lican.site/posts/posts/go/grpc-gateway/2018-02-23-install/</link>
      <pubDate>Fri, 23 Feb 2018 12:00:00 +0000</pubDate>
      <guid>https://note.lican.site/posts/posts/go/grpc-gateway/2018-02-23-install/</guid>
      <description>&lt;p&gt;假定我们有一个项目需求，希望用&lt;code&gt;Rpc&lt;/code&gt;作为内部&lt;code&gt;API&lt;/code&gt;的通讯，同时也想对外提供&lt;code&gt;Restful Api&lt;/code&gt;，写两套又太繁琐不符合&lt;/p&gt;&#xA;&lt;p&gt;于是我们想到了&lt;code&gt;Grpc&lt;/code&gt;以及&lt;code&gt;Grpc Gateway&lt;/code&gt;，这就是我们所需要的&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://camo.githubusercontent.com/e75a8b46b078a3c1df0ed9966a16c24add9ccb83/68747470733a2f2f646f63732e676f6f676c652e636f6d2f64726177696e67732f642f3132687034435071724e5046686174744c5f63496f4a707446766c41716d35774c513067677149356d6b43672f7075623f773d37343926683d333730&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;准备环节&#34;&gt;准备环节&lt;/h2&gt;&#xA;&lt;p&gt;在正式开始我们的&lt;code&gt;Grpc&lt;/code&gt;+&lt;code&gt;Grpc Gateway&lt;/code&gt;实践前，我们需要先配置好我们的开发环境&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Grpc&lt;/li&gt;&#xA;&lt;li&gt;Protoc Plugin&lt;/li&gt;&#xA;&lt;li&gt;Protocol Buffers&lt;/li&gt;&#xA;&lt;li&gt;Grpc-gateway&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;grpc&#34;&gt;Grpc&lt;/h2&gt;&#xA;&lt;h3 id=&#34;是什么&#34;&gt;是什么&lt;/h3&gt;&#xA;&lt;p&gt;Google对&lt;code&gt;Grpc&lt;/code&gt;的定义：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A high performance, open-source universal RPC framework&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;也就是&lt;code&gt;Grpc&lt;/code&gt;是一个高性能、开源的通用RPC框架，具有以下特性：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;强大的&lt;code&gt;IDL&lt;/code&gt;，使用&lt;code&gt;Protocol Buffers&lt;/code&gt;作为数据交换的格式，支持&lt;code&gt;v2&lt;/code&gt;、&lt;code&gt;v3&lt;/code&gt;（推荐&lt;code&gt;v3&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;li&gt;跨语言、跨平台，也就是&lt;code&gt;Grpc&lt;/code&gt;支持多种平台和语言&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;支持HTTP2&lt;/strong&gt;，双向传输、多路复用、认证等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;安装&#34;&gt;安装&lt;/h3&gt;&#xA;&lt;p&gt;1、官方推荐（需科学上网）&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;go get -u google.golang.org/grpc&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;2、通过&lt;code&gt;github.com&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;进入到第一个$GOPATH目录（因为&lt;code&gt;go get&lt;/code&gt; 会默认安装在第一个下）下，新建&lt;code&gt;google.golang.org&lt;/code&gt;目录，拉取&lt;code&gt;golang&lt;/code&gt;在&lt;code&gt;github&lt;/code&gt;上的镜像库：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd /usr/local/go/path/src   &#xA;&#xA;mkdir google.golang.org&#xA;&#xA;cd google.golang.org/&#xA;&#xA;git clone https://github.com/grpc/grpc-go&#xA;&#xA;mv grpc-go/ grpc/&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;目录结构：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;google.golang.org/&#xA;└── grpc&#xA;    ...&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;而在&lt;code&gt;grpc&lt;/code&gt;下有许多常用的包，例如：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gowalker.org/google.golang.org/grpc/metadata&#34;&gt;metadata&lt;/a&gt;：定义了&lt;code&gt;grpc&lt;/code&gt;所支持的元数据结构，包中方法可以对&lt;code&gt;MD&lt;/code&gt;进行获取和处理&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gowalker.org/google.golang.org/grpc/credentials&#34;&gt;credentials&lt;/a&gt;：实现了&lt;code&gt;grpc&lt;/code&gt;所支持的各种认证凭据，封装了客户端对服务端进行身份验证所需要的所有状态，并做出各种断言&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gowalker.org/google.golang.org/grpc/codes&#34;&gt;codes&lt;/a&gt;：定义了&lt;code&gt;grpc&lt;/code&gt;使用的标准错误码，可通用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;protoc-plugin&#34;&gt;Protoc Plugin&lt;/h2&gt;&#xA;&lt;h3 id=&#34;是什么-1&#34;&gt;是什么&lt;/h3&gt;&#xA;&lt;p&gt;编译器插件&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装-1&#34;&gt;安装&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;go get -u github.com/golang/protobuf/protoc-gen-go&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;将&lt;code&gt;Protoc Plugin&lt;/code&gt;的可执行文件从$GOPATH中移动到$GOBIN下&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mv /usr/local/go/path/bin/protoc-gen-go /usr/local/go/bin/&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;protocol-buffers-v3&#34;&gt;Protocol Buffers v3&lt;/h2&gt;&#xA;&lt;h3 id=&#34;是什么-2&#34;&gt;是什么&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages. You can even update your data structure without breaking deployed programs that are compiled against the &amp;ldquo;old&amp;rdquo; format.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
