<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>SDK生成 - tag - 沐木</title><link>https://oldletter.cn/tags/sdk%E7%94%9F%E6%88%90/</link><description>SDK生成 - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 25 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/sdk%E7%94%9F%E6%88%90/" rel="self" type="application/rss+xml"/><item><title>数据开放平台架构设计（六）：落地实践与运维</title><link>https://oldletter.cn/posts/dp-06-practice-and-ops/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/dp-06-practice-and-ops/</guid><description><![CDATA[<blockquote>
<p><strong>上一篇：</strong> <a href="/posts/dp-05-monitor-and-governance/" rel="">数据开放平台（五）：监控与治理</a></p></blockquote>
<p>前面五篇聊了架构、引擎、鉴权、转换、监控，都是&quot;怎么设计&quot;。这一篇聊&quot;怎么落地&quot;，接入流程怎么走、SDK 和文档怎么生成、上线怎么灰度、出了问题怎么兜底。</p>
<p>我自己的经验是，数据开放平台成不成，末尾不只看代码写得多漂亮，更看流程有没有闭环：申请、审批、联调、发布、监控、回滚、下线，每一步都要有人负责、有记录可查。</p>
<hr>
<h2 id="一接入流程">一、接入流程</h2>
<p>一个新调用方从注册到正式使用，标准流程分四步：</p>
<p>接入流程要把审批、联调、发布、观察放进同一条链路，避免接口上线后没人认领：</p>
<div class="mermaid" id="id-4" data-mermaid-definition="Zmxvd2NoYXJ0IExSCiAgICAgICAgICAgICAgICAgICAgQVsi5bqU55So55Sz6K&#43;3Il0gLS0&#43;IEJbIuadg&#43;mZkOWuoeaJuSJdCiAgICAgICAgICAgICAgICAgICAgQiAtLT4gQ1siQUsvU0sg5Y&#43;R5pS&#43;Il0KICAgICAgICAgICAgICAgICAgICBDIC0tPiBEWyJTYW5kYm94IOiBlOiwgyJdCiAgICAgICAgICAgICAgICAgICAgRCAtLT4gRVsiQVBJIOmFjee9ruivhOWuoSJdCiAgICAgICAgICAgICAgICAgICAgRSAtLT4gRlsi54Gw5bqm5Y&#43;R5biDIl0KICAgICAgICAgICAgICAgICAgICBGIC0tPiBHWyLnm5Hmjqfop4Llr58iXQogICAgICAgICAgICAgICAgICAgIEcgLS0&#43;IEh7IuaMh&#43;agh&#43;i&#43;vuaghyJ9CiAgICAgICAgICAgICAgICAgICAgSCAtLSAi5pivIiAtLT4gSVsi5YWo6YeP5Y&#43;R5biDIl0KICAgICAgICAgICAgICAgICAgICBIIC0tICLlkKYiIC0tPiBKWyLlm57mu5oiXQogICAgICAgICAgICAgICAgICAgIEkgLS0&#43;IEtbIuWumuacn&#43;WkjeebmCJdCiAgICAgICAgICAgICAgICAgICAgSiAtLT4gSw==">flowchart LR
                    A[&#34;应用申请&#34;] --&gt; B[&#34;权限审批&#34;]
                    B --&gt; C[&#34;AK/SK 发放&#34;]
                    C --&gt; D[&#34;Sandbox 联调&#34;]
                    D --&gt; E[&#34;API 配置评审&#34;]
                    E --&gt; F[&#34;灰度发布&#34;]
                    F --&gt; G[&#34;监控观察&#34;]
                    G --&gt; H{&#34;指标达标&#34;}
                    H -- &#34;是&#34; --&gt; I[&#34;全量发布&#34;]
                    H -- &#34;否&#34; --&gt; J[&#34;回滚&#34;]
                    I --&gt; K[&#34;定期复盘&#34;]
                    J --&gt; K</div><h3 id="第一步申请接入">第一步：申请接入</h3>
<p>调用方在管理后台提交接入申请，填写：应用名称、负责人、使用场景、预期 QPS、需要访问的数据范围。审批通过后，系统自动生成 AK/SK 并分配配额。</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-java">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="nd">@Service</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">AppRegistrationService</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nd">@Transactional</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="n">AppInfo</span><span class="w"> </span><span class="nf">register</span><span class="p">(</span><span class="n">AppRegistrationRequest</span><span class="w"> </span><span class="n">request</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 1. 生成 AK/SK</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">String</span><span class="w"> </span><span class="n">accessKey</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;ak_&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">UUID</span><span class="p">.</span><span class="na">randomUUID</span><span class="p">().</span><span class="na">toString</span><span class="p">().</span><span class="na">replace</span><span class="p">(</span><span class="s">&#34;-&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">String</span><span class="w"> </span><span class="n">secretKey</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;sk_&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">UUID</span><span class="p">.</span><span class="na">randomUUID</span><span class="p">().</span><span class="na">toString</span><span class="p">().</span><span class="na">replace</span><span class="p">(</span><span class="s">&#34;-&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 2. 保存应用信息</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">AppInfo</span><span class="w"> </span><span class="n">app</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">AppInfo</span><span class="p">.</span><span class="na">builder</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">.</span><span class="na">appName</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="na">getAppName</span><span class="p">())</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">.</span><span class="na">accessKey</span><span class="p">(</span><span class="n">accessKey</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">.</span><span class="na">secretKey</span><span class="p">(</span><span class="n">encrypt</span><span class="p">(</span><span class="n">secretKey</span><span class="p">))</span><span class="w"> </span><span class="c1">// SK 加密存储</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">.</span><span class="na">owner</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="na">getOwner</span><span class="p">())</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">.</span><span class="na">status</span><span class="p">(</span><span class="n">AppStatus</span><span class="p">.</span><span class="na">PENDING</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">.</span><span class="na">dailyQuota</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="na">getDailyQuota</span><span class="p">()</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="n">request</span><span class="p">.</span><span class="na">getDailyQuota</span><span class="p">()</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">10000</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">.</span><span class="na">qpsLimit</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="na">getQpsLimit</span><span class="p">()</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="n">request</span><span class="p">.</span><span class="na">getQpsLimit</span><span class="p">()</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">100</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">.</span><span class="na">build</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">appMapper</span><span class="p">.</span><span class="na">insert</span><span class="p">(</span><span class="n">app</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 3. 发送审批通知</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">notifyAdmin</span><span class="p">(</span><span class="s">&#34;新接入申请: &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">request</span><span class="p">.</span><span class="na">getAppName</span><span class="p">(),</span><span class="w"> </span><span class="n">app</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="n">app</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span></span></span></code></pre></div></div>
<p>SK 只在创建时展示一次，后续后台只能重置不能查看。这个规则一定要写进产品交互里，否则密钥加密存储就只做了一半。</p>]]></description></item></channel></rss>