<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Protobuf on </title>
    <link>https://note.lican.site/tags/protobuf/</link>
    <description>Recent content in Protobuf on </description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© lican.asia All rights reserved</copyright>
    <lastBuildDate>Sat, 23 May 2020 15:07:37 +0800</lastBuildDate>
    <atom:link href="https://note.lican.site/tags/protobuf/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Proto 代码到底放哪里？</title>
      <link>https://note.lican.site/posts/posts/where-is-proto/</link>
      <pubDate>Sat, 23 May 2020 15:07:37 +0800</pubDate>
      <guid>https://note.lican.site/posts/posts/where-is-proto/</guid>
      <description>&lt;p&gt;虽然公司已经从大单体切换为微服务化有一定的年头了，但一些细节方面的处理总会有不同的人有不同的看法，这其中一个讨论点，就是 Proto 这个 IDL 的代码到底放在哪里？&lt;/p&gt;&#xA;&lt;p&gt;目前来看，一共有如下方案， 我们一起来探讨一下 Proto 的存储方式和对应带来的优缺点。&lt;/p&gt;&#xA;&lt;h2 id=&#34;方案一存放在代码仓库&#34;&gt;方案一：存放在代码仓库&lt;/h2&gt;&#xA;&lt;p&gt;直接将项目所依赖到的所有 Proto 文件都存放在 &lt;code&gt;proto/&lt;/code&gt; 目录下，不经过开发工具的自动拉取和发布：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.eddycjy.com/7e95a76d548197cf73e7238ee5df27e6.jpg&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;缺点&#34;&gt;缺点&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;项目所有依赖的 Proto 都存储在代码仓库下，因此所有依赖 Proto 都需要人工的向其它业务组 “要” 来，再放到 &lt;code&gt;proto/&lt;/code&gt; 目录下，人工介入极度麻烦。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Proto 升级和变更，经常要重复第一步，沟通成本高。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;优点&#34;&gt;优点&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;项目所有依赖的 Proto 都存储在代码仓库下，因此不涉及个人开仓库权限的问题。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;多 Proto 的切换开销减少，因为都在代码仓库下，不需要看这看那。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;方案二独立仓库&#34;&gt;方案二：独立仓库&lt;/h2&gt;&#xA;&lt;p&gt;独立仓库存储是我们最早采取的方式，也就是每个服务对应配套一个 Proto 仓库：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.eddycjy.com/a7575628ff1ae9179f022d477aba9df1.png&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个方案的好处就是可以独立管理所有 Proto 仓库，并且权限划分清晰。但最大的优点也是最大的缺点，因为一个服务会依赖多个 Proto 仓库，并且存在跨业务组调用的情况：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.eddycjy.com/31c5a5b5652f44750124c15e1c0ef397.jpg&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;如上图所示，svc-user 服务分别依赖了三块 Proto 仓库，分别是自己组的、业务组 A、业务组 B 总共的 6 个 Proto 仓库。&lt;/p&gt;&#xA;&lt;h3 id=&#34;缺点-1&#34;&gt;缺点&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;假设你是一个新入职的开发人员，那么你就需要找不同的业务组申请不同的仓库权限，非常麻烦。如果没有批量赋权工具，也没有管理者权限，那么就需要一个个赋权，非常麻烦。&lt;/li&gt;&#xA;&lt;li&gt;在运行服务的时候，你需要将所有相关联的 Proto 仓库拉取下来，如果没有工具做半自动化的支持，麻烦程度无法忍受。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;优点-1&#34;&gt;优点&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;使得安全性较高（但 IDL 本身没有太多的秘密）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;按需拉取，不需要关注其余的服务 Proto。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;方案三集中仓库&#34;&gt;方案三：集中仓库&lt;/h2&gt;&#xA;&lt;p&gt;集中仓库也是一些公司考虑的方式之一，是按公司或大事业部的维度进行 Proto 代码的存储，这样子只需要拉取一个仓库，就可以获取到所有所需的 IDL：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
