<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>信创 - tag - 沐木</title><link>https://oldletter.cn/tags/%E4%BF%A1%E5%88%9B/</link><description>信创 - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 20 Aug 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/%E4%BF%A1%E5%88%9B/" rel="self" type="application/rss+xml"/><item><title>信创实战：Nacos 在申威 3231 上的 RocksDB JNI 适配</title><link>https://oldletter.cn/posts/xinchuang-01-nacos/</link><pubDate>Sun, 01 Dec 2024 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/xinchuang-01-nacos/</guid><description><![CDATA[<blockquote>
<p>系列：信创国产化适配 | 作者：lin | 更新：2026-07-18</p></blockquote>
<hr>
<h2 id="先把适配对象和结果讲清楚">先把适配对象和结果讲清楚</h2>
<p>本文详细记录的源码修改、汇编适配、JNI 编译和 JAR 改造，全部发生在申威 3231 的 SW64 环境。下文的工具链、汇编和构建命令均以 SW64 为目标，不包含龙芯 LoongArch 的编译过程。</p>
<p><code>rocksdbjni 8.8.1</code> 适配完成后，申威 3231 和 HX8000 均已正常运行。</p>
<table>
  <thead>
      <tr>
          <th>平台</th>
          <th>原始情况</th>
          <th>最终结果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>龙芯 LoongArch</td>
          <td>当前已有可用支持</td>
          <td>只作现状对照，不套用申威编译过程</td>
      </tr>
      <tr>
          <td>申威 3231</td>
          <td>官方 8.8.1 JAR 缺少 SW64 原生库</td>
          <td>完成 SW64 汇编、编译和 JAR 改造后运行通过</td>
      </tr>
      <tr>
          <td>HX8000</td>
          <td>按现场环境单独验证</td>
          <td>运行通过</td>
      </tr>
  </tbody>
</table>
<p>原始故障仍要从 Nacos 的实际依赖看起。Nacos 经 JRaft 引入 <code>rocksdbjni 8.8.1</code>，官方通用 JAR 没有携带 SW64 原生库。申威 3231 的适配同时处理了 SWJDK、SW64 ABI、汇编实现、编译器、系统动态库和 Java 资源命名。</p>
<p>截至 2026-07-15，几个常见 Nacos 版本的依赖关系如下：</p>]]></description></item><item><title>信创实战：Dockerfile 信创基础镜像构建</title><link>https://oldletter.cn/posts/xinchuang-02-dockerfile/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/xinchuang-02-dockerfile/</guid><description><![CDATA[<blockquote>
<p>系列：信创国产化适配 | 作者：lin | 日期：2026-05-15</p></blockquote>
<hr>
<h2 id="一背景与问题">一、背景与问题</h2>
<h3 id="11-为什么信创环境需要自定义-docker-镜像">1.1 为什么信创环境需要自定义 Docker 镜像</h3>
<p>在信创国产化落地过程中，Docker 容器化部署是标配。但直接使用官方镜像会遇到以下问题：</p>
<ol>
<li><strong>架构不匹配</strong>：官方 Docker Hub 上的 OpenJDK 镜像主要提供 <code>amd64</code> 和 <code>aarch64</code>，缺少申威 <code>sw64</code>、龙芯 <code>loongarch64</code> 等国产架构</li>
<li><strong>OS 不兼容</strong>：信创环境通常要求使用国产操作系统（麒麟、统信），而官方镜像基于 Debian/Ubuntu</li>
<li><strong>安全合规</strong>：信创项目通常要求使用经过安全审计的基础镜像，不能直接拉取公网镜像</li>
<li><strong>定制需求</strong>：需要预装特定工具、配置国内镜像源、设置时区和 Locale 等</li>
</ol>
<h3 id="12-基础镜像选型对比">1.2 基础镜像选型对比</h3>
<table>
  <thead>
      <tr>
          <th>镜像</th>
          <th>体积</th>
          <th>包管理</th>
          <th>国产 CPU 支持</th>
          <th>适用场景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Alpine 3.20</strong></td>
          <td>~5MB</td>
          <td>apk</td>
          <td>仅 x86/arm64（申威/龙芯需基于国产OS）</td>
          <td>追求极致精简</td>
      </tr>
      <tr>
          <td><strong>Ubuntu 22.04</strong></td>
          <td>~77MB</td>
          <td>apt</td>
          <td>较好</td>
          <td>需要 glibc 环境</td>
      </tr>
      <tr>
          <td><strong>麒麟 V10</strong></td>
          <td>~200MB</td>
          <td>yum/dnf</td>
          <td>原生支持</td>
          <td>信创验收要求</td>
      </tr>
      <tr>
          <td><strong>统信 UOS</strong></td>
          <td>~200MB</td>
          <td>apt</td>
          <td>原生支持</td>
          <td>信创验收要求</td>
      </tr>
      <tr>
          <td><strong>Amazon Corretto</strong></td>
          <td>基于 Alpine</td>
          <td>apk</td>
          <td>官方多架构</td>
          <td>生产推荐</td>
      </tr>
  </tbody>
</table>
<div class="details admonition tip open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-lightbulb" aria-hidden="true"></i>镜像选型建议<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><strong>鲲鹏 ARM64</strong>：直接使用 Amazon Corretto 官方多架构镜像。<strong>申威 SW64 / 龙芯 LoongArch</strong>：Alpine 官方不支持这两种架构，必须基于国产 OS（龙芯开源系统、统信 UOS、麒麟 V10 等）自行构建基础镜像。<strong>信创验收场景</strong>：基于麒麟/统信构建，满足安全审查要求。所有国产 CPU 环境都建议提前规划内部镜像仓库。</div>
    </div>
</div>
<hr>
<h2 id="二amazon-corretto-8-jdk-镜像构建alpine-320">二、Amazon Corretto 8 JDK 镜像构建（Alpine 3.20）</h2>
<h3 id="21-完整-dockerfile">2.1 完整 Dockerfile</h3>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-dockerfile">
        <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-dockerfile" data-lang="dockerfile"><span class="line"><span class="cl"><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 信创基础镜像：Amazon Corretto 8 JDK (Alpine 3.20)</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 支持架构：x86_64, aarch64（鲲鹏）</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 适用场景：Java 微服务基础运行环境</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">FROM</span><span class="s"> alpine:3.20</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 镜像元信息</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">LABEL</span> <span class="nv">maintainer</span><span class="o">=</span><span class="s2">&#34;lin&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>      <span class="nv">description</span><span class="o">=</span><span class="s2">&#34;Amazon Corretto 8 JDK for xinchuang&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>      <span class="nv">version</span><span class="o">=</span><span class="s2">&#34;8u422&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>      architecture.multiarch<span class="o">=</span><span class="s2">&#34;true&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 环境变量</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># Corretto 版本（可通过构建参数覆盖）</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">ARG</span> <span class="nv">CORRETTO_VERSION</span><span class="o">=</span><span class="m">8</span>.422.05.1<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">ARG</span> <span class="nv">CORRETTO_SHA256_AMD64</span><span class="o">=</span>a7b7e2f8c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0
</span></span><span class="line"><span class="cl"><span class="k">ARG</span> <span class="nv">CORRETTO_SHA256_AARCH64</span><span class="o">=</span>b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">ENV</span> <span class="nv">JAVA_HOME</span><span class="o">=</span>/usr/lib/jvm/java-1.8.0-amazon-corretto <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">PATH</span><span class="o">=</span><span class="s2">&#34;/usr/lib/jvm/java-1.8.0-amazon-corretto/bin:</span><span class="si">${</span><span class="nv">PATH</span><span class="si">}</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">LC_ALL</span><span class="o">=</span>en_US.UTF-8 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">TZ</span><span class="o">=</span>Asia/Shanghai <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="c1"># JVM 默认参数（可通过环境变量覆盖）</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span>    <span class="nv">JAVA_OPTS</span><span class="o">=</span><span class="s2">&#34;-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.security.egd=file:/dev/./urandom&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 安装基础依赖 + 配置国内镜像源</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 使用阿里云镜像源加速（信创环境通常无法直接访问 dl-cdn.alpinelinux.org）</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">RUN</span> sed -i <span class="s1">&#39;s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g&#39;</span> /etc/apk/repositories <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    apk add --no-cache <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        bash <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        curl <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        wget <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        tzdata <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        ca-certificates <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        fontconfig <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        ttf-dejavu <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        busybox-extras <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        procps <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        gzip <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        tar <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        zip <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        unzip <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="o">&amp;&amp;</span> rm -rf /var/cache/apk/*<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 时区配置</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">RUN</span> ln -sf /usr/share/zoneinfo/<span class="si">${</span><span class="nv">TZ</span><span class="si">}</span> /etc/localtime <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">TZ</span><span class="si">}</span><span class="s2">&#34;</span> &gt; /etc/timezone<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># Locale 配置</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">ENV</span> <span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">LANGUAGE</span><span class="o">=</span>en_US:en <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">LC_ALL</span><span class="o">=</span>en_US.UTF-8<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 安装 Amazon Corretto 8 JDK</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">RUN</span> <span class="nv">ARCH</span><span class="o">=</span><span class="k">$(</span>uname -m<span class="k">)</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="k">case</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span><span class="s2">&#34;</span> in <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        x86_64<span class="o">)</span>  <span class="nv">CORRETTO_ARCH</span><span class="o">=</span><span class="s2">&#34;x64&#34;</span> <span class="p">;;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        aarch64<span class="o">)</span> <span class="nv">CORRETTO_ARCH</span><span class="o">=</span><span class="s2">&#34;aarch64&#34;</span> <span class="p">;;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        *<span class="o">)</span>       <span class="nb">echo</span> <span class="s2">&#34;Unsupported architecture: </span><span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">&amp;&amp;</span> <span class="nb">exit</span> <span class="m">1</span> <span class="p">;;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="k">esac</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    wget -q -O /tmp/corretto.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        <span class="s2">&#34;https://corretto.aws/downloads/latest/amazon-corretto-</span><span class="si">${</span><span class="nv">CORRETTO_VERSION</span><span class="si">}</span><span class="s2">-linux-</span><span class="si">${</span><span class="nv">CORRETTO_ARCH</span><span class="si">}</span><span class="s2">-jdk.tar.gz&#34;</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    mkdir -p /usr/lib/jvm <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    tar -xzf /tmp/corretto.tar.gz -C /usr/lib/jvm <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    ln -sf /usr/lib/jvm/amazon-corretto-<span class="si">${</span><span class="nv">CORRETTO_VERSION</span><span class="si">}</span>-linux-<span class="si">${</span><span class="nv">CORRETTO_ARCH</span><span class="si">}</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>           /usr/lib/jvm/java-1.8.0-amazon-corretto <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    rm -f /tmp/corretto.tar.gz <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    java -version<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># 内置健康检查脚本：java-info</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># ============================================================</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">RUN</span> cat &gt; /usr/local/bin/java-info &lt;&lt; <span class="s1">&#39;SCRIPT&#39;</span> <span class="o">&amp;&amp;</span> chmod +x /usr/local/bin/java-info<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c">#!/bin/bash</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;=========================================&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;  Java Environment Info&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;=========================================&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;📦 JDK Version:&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span>java -version 2&gt;<span class="p">&amp;</span><span class="m">1</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;📁 JAVA_HOME: </span><span class="si">${</span><span class="nv">JAVA_HOME</span><span class="si">}</span><span class="s2">&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;🏗️  Architecture: </span><span class="k">$(</span>uname -m<span class="k">)</span><span class="s2">&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;🐧 OS: </span><span class="k">$(</span>cat /etc/os-release 2&gt;/dev/null <span class="p">|</span> grep PRETTY_NAME <span class="p">|</span> cut -d<span class="o">=</span> -f2 <span class="p">|</span> tr -d <span class="s1">&#39;&#34;&#39;</span><span class="k">)</span><span class="s2">&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;🕐 Timezone: </span><span class="k">$(</span>cat /etc/timezone 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s1">&#39;not set&#39;</span><span class="k">)</span><span class="s2">&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;💾 Memory:&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span>free -h 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;  (free command not available)&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;🔧 JVM System Properties (key ones):&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span>java -XshowSettings:all 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> grep -E <span class="s2">&#34;(java.home|os.arch|os.name|file.encoding|user.timezone)&#34;</span> <span class="p">|</span> sed <span class="s1">&#39;s/^/  /&#39;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="nb">echo</span> <span class="s2">&#34;=========================================&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span>SCRIPT<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">WORKDIR</span><span class="s"> /app</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">CMD</span> <span class="p">[</span><span class="s2">&#34;bash&#34;</span><span class="p">]</span></span></span></code></pre></div></div>
<h3 id="22-构建与使用">2.2 构建与使用</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <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-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 构建镜像（单架构）</span>
</span></span><span class="line"><span class="cl">docker build -t xinchuang/corretto8-jdk:8u422-alpine3.20 .
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 验证</span>
</span></span><span class="line"><span class="cl">docker run --rm xinchuang/corretto8-jdk:8u422-alpine3.20 java-info</span></span></code></pre></div></div>
<hr>
<h2 id="三docker-buildx-多架构构建">三、Docker Buildx 多架构构建</h2>
<h3 id="31-buildx-基础概念">3.1 Buildx 基础概念</h3>
<p>Docker Buildx 是 Docker 的扩展构建工具，支持一次构建同时生成多架构镜像。在信创场景下，因此可以用一条命令同时构建 x86_64 和 ARM64 的镜像。</p>]]></description></item><item><title>信创实战：Java 服务管理脚本（生产级）</title><link>https://oldletter.cn/posts/xinchuang-03-java-service-script/</link><pubDate>Thu, 10 Apr 2025 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/xinchuang-03-java-service-script/</guid><description><![CDATA[<blockquote>
<p>系列：信创国产化适配 | 作者：lin | 日期：2026-05-15</p></blockquote>
<hr>
<h2 id="一背景与问题">一、背景与问题</h2>
<h3 id="11-为什么需要专业的-java-服务管理脚本">1.1 为什么需要专业的 Java 服务管理脚本</h3>
<p>在很多项目中，Java 服务的启动方式还停留在：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <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-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># ❌ 野蛮启动方式</span>
</span></span><span class="line"><span class="cl">nohup java -jar app.jar &gt; app.log 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">&amp;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$!</span> &gt; app.pid</span></span></code></pre></div></div>
<p>这种方式存在诸多问题：</p>
<table>
  <thead>
      <tr>
          <th>问题</th>
          <th>影响</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>进程意外退出后无法自动重启</td>
          <td>服务不可用，需人工介入</td>
      </tr>
      <tr>
          <td>停止服务直接 <code>kill -9</code></td>
          <td>数据丢失、连接池未关闭</td>
      </tr>
      <tr>
          <td>没有 PID 管理</td>
          <td>重复启动、僵尸进程</td>
      </tr>
      <tr>
          <td>日志输出到 nohup.out</td>
          <td>日志无法轮转，磁盘被打满</td>
      </tr>
      <tr>
          <td>无法集成 systemd</td>
          <td>不符合 Linux 服务管理规范</td>
      </tr>
      <tr>
          <td>每次部署手动操作</td>
          <td>容易出错，效率低下</td>
      </tr>
  </tbody>
</table>
<h3 id="12-设计目标">1.2 设计目标</h3>
<p>我们要实现一个生产级的 Java 服务管理脚本，满足以下要求：</p>
<ol>
<li><strong>自动检测 Java</strong>：JAVA_HOME → 常见安装路径 → PATH，三级探测</li>
<li><strong>自动识别 jar</strong>：无需硬编码 jar 文件名</li>
<li><strong>首次部署兼容</strong>：自动创建目录结构、移动配置文件</li>
<li><strong>systemd 集成</strong>：一键安装/卸载系统服务</li>
<li><strong>受控停机</strong>：发送 SIGTERM 并等待，超时后再由策略决定是否发送 SIGKILL</li>
<li><strong>PID 文件管理</strong>：防止重复启动，精确控制进程</li>
</ol>
<hr>
<h2 id="二jvm-堆内存分配公式">二、JVM 堆内存分配公式</h2>
<p>在配置 <code>JAVA_OPTS</code> 之前，理解 JVM 内存分配至关重要：</p>]]></description></item><item><title>信创实战：信创数据库全景图</title><link>https://oldletter.cn/posts/xinchuang-04-database-guide/</link><pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/xinchuang-04-database-guide/</guid><description><![CDATA[<blockquote>
<p>信创进入深水区，数据库选型不再是&quot;能不能用&quot;的问题，而是&quot;怎么选、选了怎么落地&quot;的问题。本文从技术路线出发，梳理主流信创数据库的产品矩阵，给出面向架构师的选型决策框架。</p></blockquote>
<hr>
<h2 id="一引言信创进入深水区数据库选型是关键决策">一、引言：信创进入深水区，数据库选型是关键决策</h2>
<p>2025-2026 年，信创产业已从&quot;试点验证&quot;迈向&quot;规模化落地&quot;。在这一阶段，数据库作为基础软件的核心组件，其选型决策直接影响：</p>
<ul>
<li><strong>系统架构的天花板</strong>：选错了路线，后续迁移成本可能是天文数字；</li>
<li><strong>国产 CPU 的适配深度</strong>：不同数据库对飞腾、鲲鹏、海光、龙芯、申威的支持程度差异显著；</li>
<li><strong>业务连续性保障</strong>：安全可靠测评等级直接关系到能否进入关键行业采购目录；</li>
<li><strong>团队的技术栈投入</strong>：一条技术路线背后是一整套人才培养和运维体系。</li>
</ul>
<p>对架构师而言，理解国产数据库的技术路线分类，比记住某个产品的版本号更重要。路线决定了基因，基因决定了上限。</p>
<hr>
<h2 id="二核心认知国产数据库的四条技术路线">二、核心认知：国产数据库的四条技术路线</h2>
<p>国产数据库的发展路径，大致可以归结为四条技术路线。每条路线有不同的技术基因、生态位和适用场景。</p>
<h3 id="21-完全自研路线">2.1 完全自研路线</h3>
<p><strong>代表产品</strong>：达梦（DM）、崖山（YashanDB）、OceanBase、TiDB、虚谷</p>
<p><strong>技术特征</strong>：</p>
<ul>
<li>内核完全自研，不依赖任何开源数据库内核</li>
<li>拥有完整的存储引擎、查询优化器、事务管理器的自主知识产权</li>
<li>SQL 方言可能与主流数据库存在差异，但近年来普遍加强了兼容性</li>
</ul>
<p><strong>优势</strong>：</p>
<ul>
<li>知识产权清晰，不存在开源协议争议</li>
<li>内核可控，针对国产硬件的深度优化空间上限</li>
<li>安全可靠测评中&quot;自主可控&quot;维度得分更高</li>
<li>长期来看不受上游开源项目路线变更的影响</li>
</ul>
<p><strong>劣势</strong>：</p>
<ul>
<li>生态工具链需要从零建设或自建适配层</li>
<li>学习曲线相对陡峭，DBA 迁移成本较高</li>
<li>部分产品的社区活跃度和第三方文档不如开源路线丰富</li>
</ul>
<p><strong>适用场景</strong>：对自主可控要求极高的场景（军工、核心政务系统），以及需要深度定制内核的场景。</p>
<hr>
<h3 id="22-postgresql-二次开发路线">2.2 PostgreSQL 二次开发路线</h3>
<p><strong>代表产品</strong>：金仓（KingbaseES）、瀚高（HighGo DB）、大云海山（中国移动）</p>
<p><strong>技术特征</strong>：</p>
<ul>
<li>基于 PostgreSQL 内核进行深度二次开发</li>
<li>保留了 PostgreSQL 的 SQL 语法、扩展机制和工具链兼容性</li>
<li>在此基础上增加国产 CPU 适配、安全增强、高可用扩展等能力</li>
</ul>
<p><strong>优势</strong>：</p>
<ul>
<li>继承了 PostgreSQL 成熟的 SQL 标准支持和扩展生态</li>
<li>迁移成本相对较低，Oracle/PG DBA 可快速上手</li>
<li>社区工具链（pg_dump、pgAdmin 等）可直接复用</li>
<li>经过多年打磨，稳定性和兼容性已有大量生产验证</li>
</ul>
<p><strong>劣势</strong>：</p>
<ul>
<li>受 PostgreSQL 上游版本演进影响，大版本升级需要同步跟进</li>
<li>深度定制可能导致与上游 PG 的兼容性逐渐偏离</li>
<li>在极端性能场景下，二次开发层可能引入额外开销</li>
</ul>
<p><strong>适用场景</strong>：已有 PostgreSQL 或 Oracle 技术栈的团队，需要平滑迁移的场景；对 SQL 标准兼容性要求较高的 OLTP 业务。</p>]]></description></item><item><title>Maven 国内源配置指南（2026 版）</title><link>https://oldletter.cn/posts/java-02-maven/</link><pubDate>Wed, 24 Nov 2021 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-02-maven/</guid><description><![CDATA[<blockquote>
<p>📅 2026-05-15 | 🏷️ Maven, Gradle, 信创, DevOps | 📖 阅读约 12 分钟</p></blockquote>
<h2 id="前言">前言</h2>
<p>&ldquo;Could not resolve dependencies&rdquo;，这大概是每个 Java 开发者在国内网络环境下更不想看到的错误。</p>
<p>Maven Central 在国内访问速度慢、不稳定，尤其在企业内网和信创环境下，配置国内镜像源几乎是项目初始化的第一步。但你真的会配吗？镜像优先级怎么算？私服和镜像怎么共存？Gradle 的配置和 Maven 有什么不同？</p>
<p>这篇文章给你一个<strong>完整的、可直接复制粘贴的配置方案</strong>，覆盖 Maven、Gradle、私服、代理、信创环境，2026 年当前公开版。</p>
<hr>
<h2 id="一为什么需要国内镜像">一、为什么需要国内镜像</h2>
<p>Maven Central（<code>https://repo.maven.apache.org/maven2</code>）物理上在美国，国内访问存在以下问题：</p>
<ol>
<li><strong>延迟高</strong>：HTTPS 握手 + TCP 往返，单次请求 500ms-2s</li>
<li><strong>不稳定</strong>：国际链路抖动，下载大文件容易中断</li>
<li><strong>带宽受限</strong>：高峰期下载速度可能只有几十 KB/s</li>
<li><strong>安全合规</strong>：信创/政企环境不允许直接访问外网</li>
</ol>
<p>国内镜像源同步了 Maven Central 的所有包，物理上在国内，访问速度提升 10-100 倍。</p>
<div class="details admonition note open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>Maven 依赖解析机制<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><p>Maven 的依赖解析遵循<strong>下限路径优先</strong>原则。当同一个依赖存在多个版本时，Maven 会在依赖树中选择深度更浅（路径下限）的那个版本。如果深度相同，则按 POM 中声明的顺序选择第一个。</p>
<p>形式化地说，对于依赖树中的节点 D，其解析版本为所有候选版本中深度下限的那个。因此<strong>直接声明的依赖优先级高于传递依赖</strong>。</p>
</div>
    </div>
</div>
<hr>
<h2 id="二maven-配置">二、Maven 配置</h2>
<h3 id="21-settingsxml-完整配置">2.1 settings.xml 完整配置</h3>
<p>将以下内容保存到 <code>~/.m2/settings.xml</code>（全局配置）或 <code>$MAVEN_HOME/conf/settings.xml</code>（安装级别）：</p>]]></description></item><item><title>信创项目实战总结：从申威龙芯到数据库三大件与容器化部署</title><link>https://oldletter.cn/posts/xinchuang-05-project-summary/</link><pubDate>Wed, 20 Aug 2025 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/xinchuang-05-project-summary/</guid><description><![CDATA[<blockquote>
<p>作者：林 | 系列：信创实战 | 适合读者：信创项目实施者、Java 后端/架构师、运维工程师</p></blockquote>
<hr>
<h2 id="一背景为什么要做信创">一、背景：为什么要做信创</h2>
<p>信创（信息技术应用创新）的核心目标是<strong>自主可控</strong>。从芯片到操作系统，从数据库到中间件，逐步替换国外技术栈，降低供应链风险。</p>
<p>一个典型的信创项目涉及：</p>
<ul>
<li><strong>芯片</strong>：申威、龙芯、飞腾、鲲鹏、海光、兆芯</li>
<li><strong>操作系统</strong>：麒麟（银河麒麟/中标麒麟）、统信 UOS、欧拉</li>
<li><strong>数据库</strong>：达梦、人大金仓、神通</li>
<li><strong>中间件</strong>：东方通 TongWeb、宝兰德 BES</li>
<li><strong>办公软件</strong>：WPS、永中 Office</li>
<li><strong>可信计算</strong>：国密算法（SM2/SM3/SM4）、可信平台模块</li>
<li><strong>容器化</strong>：Docker 适配、镜像编译</li>
</ul>
<p>本文是实际项目中的踩坑总结，重点覆盖申威、龙芯、数据库三大件和容器化部署。</p>
<hr>
<h2 id="二国产-cpu-处理器选型">二、国产 CPU 处理器选型</h2>
<h3 id="21-六大国产-cpu-对比">2.1 六大国产 CPU 对比</h3>
<table>
  <thead>
      <tr>
          <th>厂商</th>
          <th>指令集</th>
          <th>代表型号</th>
          <th>定位</th>
          <th>生态成熟度</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>申威</strong></td>
          <td>SW64（自主）</td>
          <td>SW1621、SW3231、HX 系列</td>
          <td>特种/超算/信创</td>
          <td>⭐⭐</td>
      </tr>
      <tr>
          <td><strong>龙芯</strong></td>
          <td>LoongArch（自主）</td>
          <td>3A5000、3C5000、3A6000、3C6000</td>
          <td>桌面/服务器</td>
          <td>⭐⭐⭐</td>
      </tr>
      <tr>
          <td><strong>飞腾</strong></td>
          <td>ARMv8/AArch64（授权）</td>
          <td>FT-2000、S2500</td>
          <td>桌面/服务器</td>
          <td>⭐⭐⭐⭐</td>
      </tr>
      <tr>
          <td><strong>鲲鹏</strong></td>
          <td>ARMv8/AArch64（授权）</td>
          <td>鲲鹏 920</td>
          <td>服务器</td>
          <td>⭐⭐⭐⭐</td>
      </tr>
      <tr>
          <td><strong>海光</strong></td>
          <td>x86（授权）</td>
          <td>海光 7000、海光 5000</td>
          <td>服务器</td>
          <td>⭐⭐⭐⭐⭐</td>
      </tr>
      <tr>
          <td><strong>兆芯</strong></td>
          <td>x86（授权）</td>
          <td>开胜 KH-40000</td>
          <td>桌面/服务器</td>
          <td>⭐⭐⭐⭐</td>
      </tr>
  </tbody>
</table>
<blockquote>
<p>⚠️ 注意：海光和兆芯的 x86 授权有争议（AMD/VIA 授权），严格意义上不算&quot;完全自主&quot;。部分信创项目不接受 x86 路线。</p>]]></description></item></channel></rss>