<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>TRON-LIXIANG</title>
  
  
  <link href="https://www.lixiangpro.com/atom.xml" rel="self"/>
  
  <link href="https://www.lixiangpro.com/"/>
  <updated>2026-09-18T05:49:20.352Z</updated>
  <id>https://www.lixiangpro.com/</id>
  
  <author>
    <name>李想</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>10分钟搭建ELK日志查询管理平台</title>
    <link href="https://www.lixiangpro.com/article/elkLogSystem/"/>
    <id>https://www.lixiangpro.com/article/elkLogSystem/</id>
    <published>2025-03-23T12:00:00.000Z</published>
    <updated>2026-09-18T05:49:20.352Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-blue"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>10分钟实现日志查询管理及其数据可视化</p></div></div><p>&emsp;&emsp;&emsp;<mark class="hl-label blue">日志查询</mark> <mark class="hl-label purple">是程序员</mark> <mark class="hl-label orange">在日常工作中很重要且使用率较高的一部分</mark> <mark class="hl-label purple">仅次于代码编写</mark> <mark class="hl-label blue">本次学习</mark> <mark class="hl-label green">继续从0到1</mark> <mark class="hl-label orange">完整搭建</mark> <mark class="hl-label pink">日志查询管理平台</mark> <mark class="hl-label green">实现安全高效的</mark> <mark class="hl-label purple">日志查询等功能</mark> </p><hr><mark class="hl-label blue">ELK资源准备</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 拉取 Elasticsearch 镜像</span></span><br><span class="line">docker pull elasticsearch:8.6.0</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 拉取 Logstash 镜像</span></span><br><span class="line">docker pull logstash:8.6.0</span><br><span class="line">   </span><br><span class="line"><span class="meta">#</span><span class="bash"> 拉取 Kibana 镜像</span></span><br><span class="line">docker pull kibana:8.6.0</span><br></pre></td></tr></table></figure><mark class="hl-label purple">服务部署</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 部署 Elasticsearch</span></span><br><span class="line">docker run -d --name elasticsearch -e &quot;discovery.type=single-node&quot; -e &quot;ELASTIC_PASSWORD=qweasdzxc&quot; -e &quot;xpack.security.enabled=false&quot; -e &quot;ES_JAVA_OPTS=-Xms512m -Xmx512m&quot; -p 9200:9200 -p 9300:9300 --network=cicd_network elasticsearch:8.6.0</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 部署 Kibana</span></span><br><span class="line">docker run -d --name kibana -e &quot;ELASTICSEARCH_HOSTS=http://192.168.1.1:9200&quot; -e &quot;ELASTICSEARCH_PASSWORD=qweasdzxc&quot; -e &quot;I18N_LOCALE=zh-CN&quot; -p 5601:5601 --network=cicd_network kibana:8.6.0</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 部署 Logstash</span></span><br><span class="line">docker run -d --name logstash -v /usr/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -v /logs/app.log:/logs/app.log -p 5044:5044 --network=cicd_network logstash:8.6.0</span><br></pre></td></tr></table></figure><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>至此_已完成ELK系统部署</p></div></div><hr><mark class="hl-label blue">使用流程:</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 访问Kibana http://localhost:5601</span></span><br><span class="line">Analytics-》Discover-》创建数据视图-》开始搜索日志</span><br></pre></td></tr></table></figure><mark class="hl-label pink">使用效果:</mark> <p><b>首页:</b><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/20250319_01.png" alt="视图1.png"><br><b>搜索功能:</b><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/20250319_00.png" alt="视图0.png"></p><hr><mark class="hl-label blue">附加:_Logstash配置</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> logstash.conf</span></span><br><span class="line">input &#123;</span><br><span class="line">  file &#123;</span><br><span class="line">    path =&gt; &quot;/logs/app.log&quot;</span><br><span class="line">    start_position =&gt; &quot;beginning&quot;</span><br><span class="line">    stat_interval =&gt; &quot;3&quot;</span><br><span class="line">    type =&gt; &quot;app_log&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line">output &#123;</span><br><span class="line">   if [type] == &quot;app_log&quot; &#123;</span><br><span class="line">     elasticsearch &#123;</span><br><span class="line">       hosts =&gt; [&quot;http://192.168.1.1:9200&quot;]</span><br><span class="line">       index =&gt; &quot;app_log-%&#123;+YYYY.MM.dd&#125;&quot;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><mark class="hl-label blue">附加:_Java项目日志配置logback.xml</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span><br><span class="line">&lt;configuration&gt;</span><br><span class="line">    &lt;!--日志文件所在目录--&gt;</span><br><span class="line">    &lt;property name=&quot;LOG_HOME&quot; value=&quot;/logs&quot; /&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--采用打印到控制台，记录日志的方式--&gt;</span><br><span class="line">    &lt;appender name=&quot;console&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&gt;</span><br><span class="line">        &lt;encoder&gt;</span><br><span class="line">            &lt;!--日志输出格式--&gt;</span><br><span class="line">            &lt;pattern&gt;%d&#123;yyyy-MM-dd HH:mm:ss.SSS&#125; [%thread] %-5level %logger&#123;36&#125; - %msg%n&lt;/pattern&gt;</span><br><span class="line">        &lt;/encoder&gt;</span><br><span class="line">    &lt;/appender&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!-- 采用保存到日志文件 记录日志的方式，</span><br><span class="line">    %d&#123;yyyy-MM-dd HH:mm:ss.SSS&#125;：输出日志发生的时间，精确到毫秒。</span><br><span class="line">    [%thread]：输出日志所在的线程名。</span><br><span class="line">    %-5level：输出日志级别，使用占位符%5level可以保持日志级别的对齐。</span><br><span class="line">    %logger&#123;36&#125;：输出日志所在的类名（只输出类名的后36个字符）。</span><br><span class="line">    %msg：输出日志消息。</span><br><span class="line">    %n：新行。</span><br><span class="line">    --&gt;</span><br><span class="line">    &lt;!--滚动记录文件--&gt;</span><br><span class="line">    &lt;appender name=&quot;rollingFile&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;</span><br><span class="line">        &lt;!--日志文件地址--&gt;</span><br><span class="line">        &lt;file&gt;$&#123;LOG_HOME&#125;/app.log&lt;/file&gt;</span><br><span class="line">        &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;</span><br><span class="line">            &lt;!--粒度：天。等价于一天一个文件--&gt;</span><br><span class="line">            &lt;fileNamePattern&gt;$&#123;LOG_HOME&#125;/appLog-%d&#123;yyyy-MM-dd&#125;.log&lt;/fileNamePattern&gt;</span><br><span class="line">        &lt;/rollingPolicy&gt;</span><br><span class="line">        &lt;encoder&gt;</span><br><span class="line">            &lt;pattern&gt;%d&#123;yyyy-MM-dd HH:mm:ss.SSS&#125; [%thread] %-5level %logger&#123;36&#125; - %msg%n&lt;/pattern&gt;</span><br><span class="line">        &lt;/encoder&gt;</span><br><span class="line">    &lt;/appender&gt;</span><br><span class="line"></span><br><span class="line">    &lt;root level=&quot;INFO&quot; additivity=&quot;false&quot;&gt;</span><br><span class="line">        &lt;appender-ref ref=&quot;rollingFile&quot; /&gt;</span><br><span class="line">        &lt;appender-ref ref=&quot;console&quot; /&gt;</span><br><span class="line">    &lt;/root&gt;</span><br><span class="line">&lt;/configuration&gt;</span><br></pre></td></tr></table></figure><mark class="hl-label purple">过往思考</mark> <p><span style="background-color: #ccf2ff;">1.首次接触ELK系统也是在虎扑体育网，有看到NOC部门同事在做一些简单的查询，而公司大部分业务用的都是云服务商提供的，少部分则需要使用跳板机在生产服务器上去命令行查看。</span><br><span style="background-color: #f2ffe5;">2.目前看到过最好的日志系统是在哈啰出行，自研的，毕竟阿里系，估计在阿里云日志基础上做的封装，每次服务发布后，同时可以看到关键日志滚动式呈现，很方便，而且搜索效率也很高。</span><br><span style="background-color: #ccf2ff;">3.印象见过最差的是京东云服务提供的，爱回收这公司“降本增效”，90%产品从【阿里云-&gt;京东云】，便宜是便宜了些，服务器-数据库-日志 全方位总是差点意思，一分钱一分货，也能理解。但是日常工作时，拿它后台去找个日志，超过7天查不了，查7天内的数据，有时浏览器能卡3-5分钟，直至浏览器卡死，很是痛苦。有一次遇到京东驻场到这边的员工，我在他的眼神中看到迷茫，知道他们被骂的很惨，但也优化不动。</span><br><span style="background-color: #f2ffe5;">4.对于高使用率项目，或开发者的不良习惯等原因，有的单服务每天日志可达到70G，运维老哥找过来，也吐槽这日志也太多了….这也是技术难点和挑战..</span></p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-blue&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot; </summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>K8S部署</title>
    <link href="https://www.lixiangpro.com/article/k8s/"/>
    <id>https://www.lixiangpro.com/article/k8s/</id>
    <published>2025-03-23T12:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.133Z</updated>
    
    <content type="html"><![CDATA[<hr><mark class="hl-label blue">K8S部署</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">    </span><br></pre></td></tr></table></figure><mark class="hl-label blue">Kuboard-SQL</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> SQL脚本</span></span><br><span class="line">CREATE DATABASE kuboard DEFAULT CHARACTER SET = &#x27;utf8mb4&#x27; DEFAULT COLLATE = &#x27;utf8mb4_unicode_ci&#x27;;</span><br><span class="line">create user &#x27;kuboard&#x27;@&#x27;%&#x27; identified by &#x27;Kuboard123&#x27;;</span><br><span class="line">grant all privileges on kuboard.* to &#x27;kuboard&#x27;@&#x27;%&#x27;;</span><br><span class="line">FLUSH PRIVILEGES;</span><br></pre></td></tr></table></figure><mark class="hl-label blue">Kuboard-V3部署</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 拉取 Kibana 镜像</span></span><br><span class="line">docker run -d --restart=unless-stopped --name=kuboard -p 8090:80/tcp -e TZ=&quot;Asia/Shanghai&quot; -e DB_DRIVER=com.mysql.cj.jdbc.Driver -e DB_URL=&quot;jdbc:mysql://192.168.159.1:3306/kuboard?serverTimezone=Asia/Shanghai&quot; -e DB_USERNAME=kuboard -e DB_PASSWORD=Kuboard123 --network=cicd_network swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;hr&gt;
&lt;mark class=&quot;hl-label blue&quot;&gt;K8S部署&lt;/mark&gt; 
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>本地部署DeepSeek-V3等AI大模型</title>
    <link href="https://www.lixiangpro.com/article/deepSeek/"/>
    <id>https://www.lixiangpro.com/article/deepSeek/</id>
    <published>2025-01-29T12:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.119Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>本地部署DeepSeek-V3等AI大模型</p></div></div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<mark class="hl-label green">最近国产AI大模型DeepSeek十分火热</mark> <mark class="hl-label pink">这也是非常值得庆祝的</mark> <mark class="hl-label orange">中国终于也是有了</mark> <mark class="hl-label purple">独立</mark> <mark class="hl-label blue">自研</mark> <mark class="hl-label green">低使用成本</mark> <mark class="hl-label red">综合能力极强的</mark> <mark class="hl-label orange">通用大模型</mark> <mark class="hl-label pink">本次博客</mark> <mark class="hl-label blue">也是做一次大语言模型本地化部署的记录</mark> <mark class="hl-label purple">参考此博客</mark> <mark class="hl-label green">可以快速的进行</mark> <mark class="hl-label orange">大语言模型本地化部署。</mark> </p><hr><mark class="hl-label blue">部署手册</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> Centos7 系统初始化</span></span><br><span class="line">docker pull centos:7.9.2009</span><br><span class="line">docker network create deepseek_network</span><br><span class="line">docker run --network deepseek_network -d -it -p 8080:8080 -p 80:80 -p 443:443 -p 11434:11434 --privileged=true --name deepseek-server centos:7.9.2009 /usr/sbin/init</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> DeepSeek 服务端部署</span></span><br><span class="line">curl -fsSL https://ollama.com/install.sh | sh</span><br><span class="line">vi /etc/systemd/system/ollama.service</span><br><span class="line"><span class="meta">#</span><span class="bash"> =&gt;[Service]部分Environment之后增加<span class="string">&quot;OLLAMA_HOST=0.0.0.0&quot;</span></span></span><br><span class="line">systemctl daemon-reload</span><br><span class="line">systemctl restart ollama</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 运行 Deepseek-R1【推理模型 1.1GB】</span></span><br><span class="line">ollama run deepseek-r1:1.5b</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 运行 Deepseek-V3【通用大模型 404GB】</span></span><br><span class="line">ollama run deepseek-v3</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> DeepSeek WebUI可视化部署【192.168.1.1需替换为本机IP】</span></span><br><span class="line">docker run --network deepseek_network -d -p 3000:8080 -e OLLAMA_BASE_URL=http://192.168.1.1:11434 -v open-webui:/app/backend/data --name deepseek-webui --restart always ghcr.io/open-webui/open-webui:main</span><br></pre></td></tr></table></figure><mark class="hl-label purple">开箱即用</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 李想已封装好的，开箱即用的DeepSeek-Server【已内置R1模型】</span></span><br><span class="line">docker network create deepseek_network</span><br><span class="line">docker run --network deepseek_network -d -it -p 8080:8080 -p 80:80 -p 443:443 -p 11434:11434 --privileged=true --name deepseek-server1 caoofduty/deepseek-server:dev /usr/sbin/init</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> DeepSeek WebUI可视化部署【192.168.1.1需替换为本机IP】</span></span><br><span class="line">docker run --network deepseek_network -d -p 3000:8080 -e OLLAMA_BASE_URL=http://192.168.159.1:11434 -v open-webui:/app/backend/data --name deepseek-webui1 --restart always ghcr.io/open-webui/open-webui:main</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 尽情使用吧~ http://127.0.0.1:3000</span></span><br></pre></td></tr></table></figure><mark class="hl-label orange">本地部署优缺点</mark> <p><strong>优势:</strong><br>1.数据隐私与安全🔒【信息安全任重而道远】<br>2.高可用-离线可用无延迟🌐【无论爆发战争或其他，只要有计算机和电力，就可使用】<br>3.可定制化-适配不同业务场景🛠️【适用于企业用户】<br><strong>不足:</strong><br>对物理机性能要求极高，个人电脑一般不推荐。否则对话会像和 一位老者说话。你提出问题，他是可以很好的回答，但是他需要思考很久。个人电脑性能不够，还会有一定概率卡死机。</p><mark class="hl-label pink">思考</mark> <p>1.肉眼可见的，近几年人工智能的应用会井喷式发展，无论是线上线下，影响是深远的。<br>2.记得很早前看过一个视频，一位爷爷给孙子花1500元买个“智能学习机器人-二蛋”，没想到却是个‘傻蛋’😂。连1+1=？都不知道，当时笑的不行了，印象深刻。【捞到了视频:<a href="https://www.douyin.com/video/7355806717126397221">https://www.douyin.com/video/7355806717126397221</a> 】<br>后面可以预见，类似的学习机，将会以极低的价格极强的能力 走遍千家万户。人类文明的AI时代已来临。<br>3.看到 杭州从 电商之城=&gt;AI之都 在创新中蜕变。虽然有舆论的推动，但“杭州六小龙”确实值得称赞，给中国和世界带来一定的正向价值。<br>4.在计算机硬件迭代，算力的提升。或许10-20年后，便携的’虚拟人’,’伪数字生命’，也将到来，能给很多人提供陪伴价值。 </p><mark class="hl-label purple">最后</mark> <p>本次主要使用Ollama大模型服务工具，不仅仅适用于DeepSeek，还可以使用其他大模型【Llama,DeepSeek,Phi-4,Mistral,Gemma等】。<br>官网:<a href="https://ollama.com/">https://ollama.com</a><br>模型:<a href="https://ollama.com/search">https://ollama.com/search</a></p><mark class="hl-label green">使用效果</mark> <p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/deepseek-1.png" alt="DeepSeek.png"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/deepseek-webui.png" alt="DeepSeek-WebUi.png"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/deepseek-2.png" alt="DeepSeek.png"></p><mark class="hl-label blue">DeepSeek-V3及其他主流模型-能力对比</mark> <p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/deepseek.JPG" alt="DeepSeek.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-green&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot;</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>10分钟搭建Harbor企业容器镜像仓库</title>
    <link href="https://www.lixiangpro.com/article/harbor/"/>
    <id>https://www.lixiangpro.com/article/harbor/</id>
    <published>2025-01-19T04:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.130Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>10分钟搭建Harbor企业容器镜像仓库</p></div></div><p>&nbsp;&nbsp;&nbsp;&nbsp; <mark class="hl-label red">世界第一大局域网得益于</mark> <mark class="hl-label orange">中国长城防火墙</mark> <mark class="hl-label pink">它既保护了国民，避免看到外面不正确的信息</mark> <mark class="hl-label red">但也设限，挡住了很多求知探索的人</mark> <mark class="hl-label blue">Docker也因某些原因，已完全被墙</mark> <mark class="hl-label green">本次我们继续用</mark> <mark class="hl-label red">10分钟</mark> <mark class="hl-label green">搭建自有的企业级容器镜像仓库</mark> </p><mark class="hl-label blue">一.Linux服务器</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 使用【已有服务器 或 新部署的Centos】</span></span><br><span class="line">docker pull centos:8</span><br><span class="line">docker run --network cicd_network -d -it -p 8888:8888 --name=harbor --privileged=true centos:8 /usr/sbin/init</span><br></pre></td></tr></table></figure><mark class="hl-label blue">二.系统环境配置</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 进入容器-指定系统环境地址</span></span><br><span class="line">cd /etc/yum.repos.d/</span><br><span class="line">sed -i &#x27;s/mirrorlist/#mirrorlist/g&#x27; /etc/yum.repos.d/CentOS-*</span><br><span class="line">sed -i &#x27;s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g&#x27; /etc/yum.repos.d/CentOS-*</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 其他系统软件安装</span> </span><br><span class="line">cd /opt</span><br><span class="line">dnf install wget</span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo</span><br><span class="line">yum clean all</span><br><span class="line">yum makecache</span><br></pre></td></tr></table></figure><mark class="hl-label blue">三.Docker环境安装</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 安装Docker环境</span></span><br><span class="line">cd /opt</span><br><span class="line">curl -fsSL https://get.docker.com -o get-docker.sh</span><br><span class="line">sh get-docker.sh</span><br><span class="line"></span><br><span class="line">yum install systemd-sysv</span><br><span class="line">systemctl start docker</span><br><span class="line">systemctl enable docker</span><br></pre></td></tr></table></figure><mark class="hl-label blue">四.安装Harbor</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> Harbor源码</span></span><br><span class="line">cd /opt/harbor</span><br><span class="line">curl -SL https://github.com/goharbor/harbor/releases/download/v2.7.1/harbor-offline-installer-v2.7.1.tgz</span><br><span class="line">tar xf harbor-offline-installer-v2.7.1.tgz</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 克隆编辑配置</span></span><br><span class="line">cp harbor.yml.tmpl harbor.yml</span><br><span class="line">vi harbor.yml</span><br><span class="line"></span><br><span class="line">hostname: 192.168.1.1</span><br><span class="line">port: 8888</span><br><span class="line">注释:https 相关代码</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> Harbor安装</span></span><br><span class="line">cd /opt/harbor</span><br><span class="line">./install.sh</span><br></pre></td></tr></table></figure><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>至此_已完成_搭建Harbor企业容器镜像仓库</p></div></div><mark class="hl-label green">使用Harbor</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> Harbor后台地址: http://192.168.1.1:8888</span></span><br><span class="line">管理员账户= admin</span><br><span class="line">管理员密码= Harbor12345</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 新建项目 和 用户</span></span><br><span class="line">用户账户= test</span><br><span class="line">用户密码= Qweasdzxc123</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> Docker调整引擎配置</span></span><br><span class="line">&#123;</span><br><span class="line">    &quot;registry-mirrors&quot;: [</span><br><span class="line">        &quot;https://registry.docker-cn.com&quot;</span><br><span class="line">    ],</span><br><span class="line">    &quot;insecure-registries&quot;: [</span><br><span class="line">        &quot;192.168.1.1:8888&quot;</span><br><span class="line">    ]</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 刷新配置&amp;&amp;重启Docker</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> Docker使用私有镜像仓库</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 登入</span></span><br><span class="line">docker login -u test -p Qweasdzxc123 http://192.168.1.1:8888</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 登出</span></span><br><span class="line">docker logout</span><br></pre></td></tr></table></figure><mark class="hl-label green">Harbor后台</mark> <p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/harbor.png" alt="harbor.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-green&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot;</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>10分钟搭建软件服务监控系统</title>
    <link href="https://www.lixiangpro.com/article/monitorSystem/"/>
    <id>https://www.lixiangpro.com/article/monitorSystem/</id>
    <published>2025-01-04T04:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.137Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>10分钟搭建Grafana监控看板和普罗米修斯_实现软件服务监控</p></div></div><p>&nbsp;&nbsp;&nbsp;&nbsp; <mark class="hl-label blue">互联网公司</mark> <mark class="hl-label purple">运维监控等基础设施的</mark> <mark class="hl-label orange">完善程度</mark> <mark class="hl-label pink">一定情况下可以看出其</mark> <mark class="hl-label orange">经营情况</mark> <mark class="hl-label pink">和</mark> <mark class="hl-label orange">技术能力。</mark> <br>&nbsp;&nbsp;&nbsp;&nbsp; <mark class="hl-label blue">本次学习的内容可对应用</mark> <mark class="hl-label pink">网络流量</mark> <mark class="hl-label pink">服务器负载</mark> <mark class="hl-label pink">存储容量</mark> <mark class="hl-label blue">等关键指标进行</mark> <mark class="hl-label green">实时监测</mark> <mark class="hl-label purple">可以及时发现和预防</mark> <mark class="hl-label red">潜在问题</mark> <mark class="hl-label green">并做出相应的处理</mark> <mark class="hl-label orange">避免因故障导致</mark> <mark class="hl-label red">服务中断或数据丢失</mark> <mark class="hl-label pink">在双11营销节日甚至是日常迭代中</mark> <mark class="hl-label orange">监控系统的作用也是</mark> <mark class="hl-label purple">至关重要的。</mark> <br>&nbsp;&nbsp;&nbsp;&nbsp; <mark class="hl-label blue">第一份互联网工作</mark> <mark class="hl-label orange">坐在我对面的几位男生</mark> <mark class="hl-label blue">他们的岗位是</mark> <mark class="hl-label purple">NOC技术支持</mark> <mark class="hl-label green">那时候也是初次看到</mark> <mark class="hl-label orange">互联网企业软件服务监控</mark> <mark class="hl-label pink">感觉很新奇，很有趣～</mark> <br>&nbsp;&nbsp;&nbsp;&nbsp; <mark class="hl-label blue">在这里，继续用</mark> <mark class="hl-label red">10分钟</mark> <mark class="hl-label blue">时间</mark> <mark class="hl-label purple">搭建运维监控系统</mark> <mark class="hl-label green">实现实时数据可视化监控。</mark> </p><hr><mark class="hl-label pink">使用效果</mark> <p><b>Grafana:</b><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/grafana.png" alt="Grafana.png"><br><b>Prometheus:</b><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/prometheus.png" alt="Prometheus.png"><br><b>Grafana-Redis:</b><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/redis.png" alt="Redis.png"><br><b>Grafana-MySQL:</b><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/mysql.png" alt="MySQL.png"></p><mark class="hl-label blue">一.Grafana</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 拉取镜像</span></span><br><span class="line">docker pull grafana/grafana</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> Grafana服务运行</span></span><br><span class="line">docker run --network cicd_network -d -p 5000:3000 --name=grafana -v grafana-storage:/var/lib/grafana grafana/grafana</span><br><span class="line"><span class="meta">  </span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入后台 初始密码【admin/admin】</span></span><br><span class="line">http://192.168.1.1:5000/login</span><br></pre></td></tr></table></figure><mark class="hl-label blue">二.普罗米修斯</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 拉取镜像</span></span><br><span class="line">docker pull prom/prometheus</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置文件</span></span><br><span class="line">mkdir /opt/prometheus</span><br><span class="line">vi /opt/prometheus/prometheus.yml #内容见附件 或下载 https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/prometheus.yml</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 普罗米修斯运行</span></span><br><span class="line">docker run --network cicd_network -d -p 9090:9090 --name=prometheus -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus</span><br></pre></td></tr></table></figure><mark class="hl-label blue">三.Node节点导出</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> Node_Exporter 运行</span></span><br><span class="line">docker run --network cicd_network -d -p 9100:9100 --name=node-exporter -v &quot;/proc:/host/proc:ro&quot; -v &quot;/sys:/host/sys:ro&quot; -v &quot;/:/rootfs:ro&quot; --net=&quot;host&quot; prom/node-exporter</span><br></pre></td></tr></table></figure><mark class="hl-label blue">四.Grafana使用与配置</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 重启普罗米修斯</span></span><br><span class="line">docker restart prometheus</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入Grafana后台 http://192.168.1.1:5000/login</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置数据源</span></span><br><span class="line">=》首页-连接-数据源-Add data source-prometheus</span><br><span class="line">Prometheus server URL = http://192.168.1.1:9090</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 导入看板视图模版【查看更多=&gt; https://grafana.com/grafana/dashboards】</span></span><br><span class="line">DEMO模版 = https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/grafana_node_exporter.json</span><br><span class="line">=》首页-仪表盘-新建-导入</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 设置默认首页看板</span></span><br><span class="line">=》首页-管理-概况-默认首选项-主页仪表板</span><br></pre></td></tr></table></figure><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>至此_已完成_部署Grafana和普罗米修斯及其应用</p></div></div><mark class="hl-label blue">拓展补充-监控MySQL</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 部署MySQL</span></span><br><span class="line">docker pull mysql:8.0.32</span><br><span class="line">docker run -p 3306:3306 --name=mysql --network cicd_network --restart=always --privileged=true -v /opt/mysql/conf:/etc/mysql/conf.d -v /opt/mysql/logs:/var/log -v /opt/mysql/data:/var/lib/mysql -v /opt/mysql/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.32</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 部署MySQL Exporter</span></span><br><span class="line">vi /opt/mysql/my.cnf</span><br><span class="line">[client]</span><br><span class="line">host=192.168.1.1</span><br><span class="line">user=root</span><br><span class="line">password=123456</span><br><span class="line"></span><br><span class="line">docker pull prom/mysqld-exporter</span><br><span class="line">docker run -d --name mysql_exporter --restart always -p 9104:9104  -v /opt/mysql/conf:/.my.cnf --network=cicd_network prom/mysqld-exporter</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 修改普罗米修斯配置</span></span><br><span class="line">vi /opt/prometheus/prometheus.yml</span><br><span class="line">  - job_name: mysql-monitor</span><br><span class="line">    static_configs:</span><br><span class="line">      - targets: [ &#x27;192.168.1.1:9104&#x27; ]</span><br><span class="line">      </span><br><span class="line"><span class="meta">#</span><span class="bash"> 重启普罗米修斯</span></span><br><span class="line">docker restart prometheus</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入Grafana后台 http://192.168.1.1:5000/login</span></span><br><span class="line">=》首页-仪表板-导入-模版ID=7362-加载-prometheus</span><br></pre></td></tr></table></figure><mark class="hl-label blue">拓展补充-监控Redis-方案一</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 直连监控</span></span><br><span class="line">=》首页-连接-添加新链接-Redis-install-Add new data source-Dashboards-Redis Import</span><br></pre></td></tr></table></figure><mark class="hl-label blue">拓展补充-监控Redis-方案二</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 本地部署Redis</span></span><br><span class="line">docker pull redis:latest</span><br><span class="line">docker run --name redis -d -p 6379:6379 -e REDIS_PASSWORD=123456 --network cicd_network redis:latest</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 本地部署Redis管理工具</span></span><br><span class="line">docker pull redis/redisinsight:latest</span><br><span class="line">docker run -d --name redisinsight -p 5540:5540 --network cicd_network redis/redisinsight:latest</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 修改普罗米修斯配置</span></span><br><span class="line">vi /opt/prometheus/prometheus.yml</span><br><span class="line">  - job_name: redis</span><br><span class="line">    static_configs:</span><br><span class="line">      - targets: [ &#x27;192.168.1.1:9121&#x27; ]</span><br><span class="line">        labels:</span><br><span class="line">          instance: redis</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 本地部署Redis管理工具</span></span><br><span class="line">docker pull oliver006/redis_exporter:v1.45.0</span><br><span class="line">docker run -d --name redis-exporter -p 9121:9121 -e REDIS_ADDR=redis://192.168.1.1:6379  -e REDIS_USER=root -e REDIS_PASSWORD=123456 oliver006/redis_exporter:v1.45.0</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 重启普罗米修斯</span></span><br><span class="line">docker restart prometheus</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入Grafana后台 http://192.168.1.1:5000/login</span></span><br><span class="line">=》首页-仪表板-导入-模版ID=763-加载-prometheus</span><br></pre></td></tr></table></figure><mark class="hl-label blue">拓展补充-飞书告警</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> Grafana配置飞书支持告警</span></span><br><span class="line">=》警报-&gt;警报规则-&gt;New alert rule</span><br><span class="line"> 填写告警名称-&gt;填写查询SQL-&gt;Expressions定义条件（比如计数汇总&gt;10）-&gt;定义执行频率-&gt;选择告警WebHook</span><br><span class="line"><span class="meta">#</span><span class="bash"> 使用效果: Grafana自动执行SQL查询业务数据,满足自己定义的条件后,可以直接发送告警数据到群聊等【飞书机器人助手】。</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 自定义的Grafana飞书告警</span></span><br><span class="line">=》警报-&gt;联络点-&gt;Create contact point</span><br><span class="line">  填写联络点名称-&gt;整合模版选择-&gt;Webhook-&gt;配置推送地址和请求方式</span><br><span class="line"><span class="meta">#</span><span class="bash"> 使用效果:可以把Grafana原始数据推送到这里的Url。后端服务,解析数据并持久化,可自定义加工并发送消息到群聊。</span></span><br></pre></td></tr></table></figure><mark class="hl-label orange">附件:prometheus.yml</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">global:</span><br><span class="line">  scrape_interval:     15s</span><br><span class="line">  evaluation_interval: 15s</span><br><span class="line">scrape_configs:</span><br><span class="line">  - job_name: prometheus</span><br><span class="line">    static_configs:</span><br><span class="line">      - targets: [&#x27;192.168.1.1:9090&#x27;]</span><br><span class="line">        labels:</span><br><span class="line">          instance: centos7</span><br><span class="line">  - job_name: grafana</span><br><span class="line">    static_configs:</span><br><span class="line">      - targets: [&#x27;192.168.1.1:9100&#x27;]</span><br><span class="line">        labels:</span><br><span class="line">          instance: centos7</span><br><span class="line">  - job_name: hello_world</span><br><span class="line">    static_configs:</span><br><span class="line">      - targets: [&#x27;192.168.1.1:8080&#x27;]</span><br><span class="line">        labels:</span><br><span class="line">          instance: centos7</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-green&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot;</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>迪士尼&amp;环球影城攻略</title>
    <link href="https://www.lixiangpro.com/article/disneyAndUniversalStudios/"/>
    <id>https://www.lixiangpro.com/article/disneyAndUniversalStudios/</id>
    <published>2024-12-23T16:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.121Z</updated>
    
    <content type="html"><![CDATA[<div class="tabs" id="disneyanduniversalstudios"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#disneyanduniversalstudios-1">迪士尼</button></li><li class="tab"><button type="button" data-href="#disneyanduniversalstudios-2">环球影城</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="disneyanduniversalstudios-1"><p><mark class="hl-label purple">项目乐趣:</mark>  <mark class="hl-label green">上海迪士尼乐园</mark> <mark class="hl-label blue">&gt;</mark> <mark class="hl-label pink">东京迪士尼乐园</mark> <mark class="hl-label blue">&gt;</mark> <mark class="hl-label orange">香港迪士尼</mark> <mark class="hl-label blue">&gt;</mark> <mark class="hl-label red">东京迪士尼海洋</mark><br><mark class="hl-label purple">演职氛围:</mark> <mark class="hl-label green">东京迪士尼乐园</mark> <mark class="hl-label blue">&gt;=</mark> <mark class="hl-label green">东京迪士尼海洋</mark> <mark class="hl-label blue">&gt;</mark> <mark class="hl-label orange">上海迪士尼乐园</mark> <mark class="hl-label blue">&gt;</mark> <mark class="hl-label red">香港迪士尼</mark> </p><details ><summary> 上海迪士尼乐园 </summary>              <div class='content'>              <p><mark class="hl-label pink">前言:</mark> <mark class="hl-label green">上海迪士尼乐园</mark> <mark class="hl-label blue">目前是我心中Top1的游乐园～</mark> <mark class="hl-label orange">此篇文章仅作为推荐有缘人的游玩攻略。</mark> <mark class="hl-label purple">建议查看以下标签，符合个人喜好。</mark> <mark class="hl-label pink">如果可以帮到你，我也会很高兴的～</mark><br><mark class="hl-label pink">标签:</mark> <mark class="hl-label blue">男性视角</mark> <mark class="hl-label orange">成人游玩</mark> <mark class="hl-label purple">时间管理</mark> <mark class="hl-label green">初次体验</mark> </p><hr><p><mark class="hl-label green">必玩:</mark><br><strong>1.疯狂动物城-热力追踪</strong> &nbsp;<span style="background-color: #f2ffe5;">【当前大热门，喜欢动物城的不可错过】</span><br><strong>2.加勒比海盗-沉落宝藏之战</strong> &nbsp;<span style="background-color: #f2ffe5;">【尽量坐第一辆车前排靠一边】【运力足，排队时间短，尽量控制在30分钟以内】</span><br><strong>3.翱翔-飞跃地平线</strong> &nbsp;<span style="background-color: #f2ffe5;">【尽量坐中间】【可还行，巨幕看短视频，人会在半空中。排队超90分钟可考虑放弃】</span><br><strong>4.<strong>🎢</strong>小矮人矿山车</strong> &nbsp;<span style="background-color: #f2ffe5;">【不太刺激，但是很有趣，排队等候区也很有故事气氛】【排队超100分钟可考虑放弃】</span><br><strong>5.<strong>🎢</strong>创极速光轮</strong> &nbsp;<span style="background-color: #f2ffe5;">【绝对必玩！本人刷了几十次的项目～请务必<strong>天黑后</strong>再玩!!!可当作看🎇烟花前最后一个项目】【排队超值，全球仅上海和美国奥兰多有，玩之前务必有看过电影TRON】</span><br><strong>6.抱抱龙冲天赛车</strong> &nbsp;<span style="background-color: #f2ffe5;">【这个有点刺激，胆小的慎选，类似常见游乐园的🏴‍☠️海盗船，还可以，排队时间一般也比较久】</span><br><strong>7.漫游童话时光</strong> &nbsp;<span style="background-color: #f2ffe5;">【排队时间较短，进城堡参观，很好的体验～】</span></p><p><mark class="hl-label green">不可错过:</mark><br><strong>1.花车巡游 12:15 15:45</strong> &nbsp;<span style="background-color: #ccf2ff;">【巡游时间务必看App,一般每天两场，可能时间临时会有变，看App路线就近能看就行】</span><br><strong>2.幻影灯光秀【烟花】</strong> <strong>21.15-21.30</strong> &nbsp;<span style="background-color: #ccf2ff;">提前20分钟到正对城堡的米奇大街即可，看具体情况有条件可以往前挤挤。如想要好位置要提前1-2小时，首次游玩的话就没必要。【务必看当日App上的时间，最近在测试2025跨年烟花，常规烟花可能提前，请勿错过。如遇到，当日空气质量不好，可能会被相关部门叫停🈲️不允许燃放，这就没办法了😂】</span></p><p><mark class="hl-label purple">时间充裕可以玩:</mark><br><strong>1.小飞侠天空奇遇</strong> &nbsp;<span style="background-color: #ffffe5;">【这个很好，时间足尽量玩】</span><br><strong>2.胡迪牛仔嘉年华</strong> &nbsp;<span style="background-color: #ffffe5;">【还是喜欢叫它”甩驴”，工作人员很认真的跟我讲这个是🐎马😂，乘坐请认准Happy或Lucky～】</span><br><strong>3.弹簧狗团团转</strong> &nbsp;<span style="background-color: #ffffe5;">【可还行，附近有安迪玩具盒游戏，俗称”川沙赌场”，可以去试试钓金猪🐷～】</span><br><strong>4.爱丽丝梦游仙境迷宫</strong> &nbsp;<span style="background-color: #ffffe5;">【我很喜欢这电影，这里也是📷拍照打卡点，女生最爱吧应该，晚上应该也很出片，路过看到好多专业跟拍的人在拍，注意时间，快到放烟花时，怕🔥烟花掉落会清场不让进了】</span><br><strong>5.小熊维尼历险记</strong> &nbsp;<span style="background-color: #ffffe5;">【喜欢维尼的可以去，偏幼儿向～】</span><br><strong>6.幻想曲旋转木马</strong> &nbsp;<span style="background-color: #ffffe5;">【📷拍照项目，女生应该更喜欢吧～】</span></p><p><mark class="hl-label red">尽量不玩:</mark><br><strong>-这里说的尽量不玩是”不建议首次玩”,时间充裕的话都可以体验～</strong><br><strong>1.雷鸣山漂流</strong>  &nbsp;<span style="background-color: #e5ffff;">【会有溅水，但不太多，可选择是否穿雨衣】【排队长，体验一般。排队不到一小时可以玩】</span><br><strong>2.精彩奇航</strong> &nbsp;<span style="background-color: #e5ffff;">【乘坐游船，晚上效果很漂亮，不适合首次玩】</span><br><strong>3.小飞象</strong> &nbsp;<span style="background-color: #e5ffff;">【小朋友玩的，离城堡比较近～】</span><br><strong>4.喷气背包飞行器</strong> &nbsp;<span style="background-color: #e5ffff;">【项目和园区命名，源自很喜欢的一部电影《明日世界》，很好看推荐看一下。但项目体验一般，不适合首次玩，有机会可以尝试坐在上边看烟花，倒是很惊艳的感觉】</span><br><strong>5.探险家独木舟</strong> &nbsp;<span style="background-color: #e5ffff;">【会发给你个🚣‍划桨板，要手动划船的，要是遇到下雨天是真的”大怨种”😂～】</span><br><strong>6.古迹探索营</strong> &nbsp;<span style="background-color: #e5ffff;">【🧗‍攀岩项目，初次玩会有点吓人，一般都是本地大人遛娃练胆量，安全性是可以的】</span><br><strong>7.太空幸会史迪奇</strong> &nbsp;<span style="background-color: #e5ffff;">【适合小朋友，史迪奇和大家聊天，也可能是i人的噩梦😂】</span><br><strong>8.巴斯光年星际营救</strong> &nbsp;<span style="background-color: #e5ffff;">【适合小朋友，射击小游戏，成年人会觉得很幼稚😂】</span></p><p><mark class="hl-label blue">演出项目:</mark><br><strong>1.米奇妙游童话书</strong> &nbsp;<span style="background-color: #e5ffff;">【💡很惊艳，要APP上提前预约，尽量看】</span><br><strong>2.冰雪奇缘</strong> &nbsp;<span style="background-color: #e5ffff;">【很有趣，很好看，尽量看，提前半小时入场❄️】</span><br><strong>3.风暴来临</strong> &nbsp;<span style="background-color: #e5ffff;">【还行，时间巧可以去，前排”显眼包”游客有概率会收到🏴‍☠️海盗送的金币💰】</span></p><p><mark class="hl-label green">隐藏项目:</mark><br><strong>1.情侣打架</strong> &nbsp;<span style="background-color: #f2ffe5;"> 遍布整个园区，而旋转疯蜜罐项目附近概率更高😂 </span></p><hr><p><mark class="hl-label pink">建议游玩路线:</mark> <img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/disney_travel_map.PNG" alt="建议游玩路线.png"></p><hr><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/hexo-tag-map/lib/leaflet@1.7.1.css"><script data-pjax src="https://cdn.jsdelivr.net/npm/hexo-tag-map/lib/leaflet@1.7.1.js"></script><script data-pjax src="https://cdn.jsdelivr.net/npm/hexo-tag-map/lib/leaflet.ChineseTmsProviders@1.0.4.js"></script><div class="map-box"><div id="map-121.661735-31.141333" style="max-width:100%; height:360px;display: block;margin:0 auto;z-index:1;border-radius: 5px;"></div></div><script type="text/javascript">var normalm=L.tileLayer.chinaProvider('GaoDe.Normal.Map',{maxZoom:20,minZoom:1,attribution:'高德地图 Amap.com'});var imgm=L.tileLayer.chinaProvider('GaoDe.Satellite.Map',{maxZoom:20,minZoom:1,attribution:'高德地图 Amap.com'});var imga=L.tileLayer.chinaProvider('GaoDe.Satellite.Annotion',{maxZoom:20,minZoom:1,attribution:'高德地图 Amap.com'});var normalMap=L.tileLayer.chinaProvider('Google.Normal.Map',{maxZoom:20,minZoom:1,attribution:'谷歌地图 Google.com'}),satelliteMap=L.tileLayer.chinaProvider('Google.Satellite.Map',{maxZoom:21,minZoom:1,attribution:'谷歌地图 Google.com'});routeMap=L.tileLayer.chinaProvider('Google.Satellite.Annotion',{maxZoom:21,minZoom:1});var normalMap=L.tileLayer.chinaProvider('Google.Normal.Map',{maxZoom:21,minZoom:1,attribution:'谷歌地图 Google.com'}),satelliteMap=L.tileLayer.chinaProvider('Google.Satellite.Map',{maxZoom:21,minZoom:1,attribution:'谷歌地图 Google.com'}),routeMap=L.tileLayer.chinaProvider('Google.Satellite.Annotion',{maxZoom:21,minZoom:1,attribution:'谷歌地图 Google.com'});var normalm1=L.tileLayer.chinaProvider('Geoq.Normal.Map',{maxZoom:21,minZoom:1,attribution:'智图地图 Geoq.cn'});var normal=L.layerGroup([normalm]),image=L.layerGroup([imgm,imga]);var baseLayers={"高德地图":normal,"智图地图":normalm1,"谷歌地图":normalMap,"高德卫星地图":imgm,"谷歌卫星地图":satelliteMap,"高德卫星标注":image,"谷歌卫星标注":routeMap};var mymap=L.map('map-121.661735-31.141333',{center:[31.141333,121.661735],zoom:15,layers:[normal],zoomControl:false});L.control.layers(baseLayers,null).addTo(mymap);L.control.zoom({zoomInTitle:'放大',zoomOutTitle:'缩小'}).addTo(mymap);var marker = L.marker(['31.141333','121.661735']).addTo(mymap);marker.bindPopup("这里是上海迪士尼！也是李想的快乐老家～").openPopup();</script><hr><p><mark class="hl-label orange">李想的特别嘱咐:</mark><br><strong>1.注意游园日期</strong> &nbsp;<span style="background-color: #ffccff;">周末无须解释，而每周一上海大部分游玩景点休息关闭，所以期间迪士尼游客爆园的概率也更大，尽量避免该时间段入园。</span><br><strong>2.尽量早起入园</strong> &nbsp;<span style="background-color: #ffffe5;">尽量开园前30分钟，到迪士尼门口排队。别等到上午9-10点入园，怕环湖绕行【啥也不干在外面绕圈排队还要多走1个多小时，这一个小时本来能玩2个项目，越早人越少，建议入园可以直接冲加勒比】</span><br><strong>3.怕累随身带小马扎</strong> &nbsp;<span style="background-color: #e5ffff;">游玩体验是会很好，但排队时间大概率会很久，怕累的可以随身带个小垫子或小凳子之类的。</span><br><strong>4.带高热量小零食</strong> &nbsp;<span style="background-color: #f2ffe5;">个人建议带花生酥等便携小零食，水每人带1瓶500ml即可，园区有很多直饮水。【夏日高温水带多点可以，甚至每人1.5L的量】</span><br><strong>5.提前熟悉App</strong> &nbsp;<span style="background-color: #ccf2ff;">提前一天下载软件，熟悉地图和大概的路线，多关注演出时间很重要。部分需要在App提前预约。</span><br><strong>6.生日月领徽章</strong> &nbsp;<span style="background-color: #fff8d5;">当月是🎂生日的，检票口入园后右侧 游客服务中心 工作人员可以送小徽章。</span><br><strong>7.拍照合影</strong> &nbsp;<span style="background-color: #ccffff;">玲娜贝尔(LinaBell)这种常年一大早就4/5小时的，初次玩就别去想了。朱迪和尼克，不是刚开园也排了3小时左右，请务必看App实时排队的耗时，个人推荐《奇想花园见面会》与米奇见面～</span><br><strong>8.合理安排游玩项目</strong> &nbsp;<span style="background-color: #ffffe5;">入园后不要太心急，过了检票口，大门拍几张照片后。建议直冲必玩项目，不要有就近原则，限时时间内能玩到更有价值的项目是最好的～</span><br><strong>9.地铁11号线末班车22.25</strong>  &nbsp;<span style="background-color: #e5ffff;">建议尽量住乐园附近，如果乘坐地铁建议最晚22.15到达地铁站。超过这个时间打车也很难了，而且价格也会高很多。闭园后工作人员一整夜都会在收拾园区内的卫生和游乐设备的保养维护，望多多理解和感谢～</span><br><strong>10.个人再次安利TRON项目</strong> &nbsp;<span style="background-color: #00FFFF;"> TRON也是我青年时期最爱的电影之一，创极速光轮项目也是基于此背景主题，建议提前看一下此电影了解其背后的故事。</span><br><strong>11.结束语</strong> &nbsp;<span style="background-color: #f2ffe5;">我所推荐必玩的项目，游玩70-80%就是胜利✌️，整个园区如果要玩全预计需要2-3天。在这里游玩体验会很梦幻，无论大人和小朋友，尽情享受吧～</span></p><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>李想也祝你在迪士尼可以度过神奇的一天～</p></div></div>              </div>            </details><details ><summary> 香港迪士尼乐园 </summary>              <div class='content'>              <div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 30%" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100"><p>Emmm还在构思中还没写0.0</p></div></div>              </div>            </details><details ><summary> 东京迪士尼陆地 </summary>              <div class='content'>              <div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 30%" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100"><p>Emmm还在构思中还没写0.0</p></div></div>              </div>            </details><details ><summary> 东京迪士尼海洋 </summary>              <div class='content'>              <div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 30%" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100"><p>Emmm还在构思中还没写0.0</p></div></div>              </div>            </details><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="disneyanduniversalstudios-2"><details ><summary> 北京环球影城 </summary>              <div class='content'>              <div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 30%" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100"><p>Emmm还在构思中还没写0.0</p></div></div>              </div>            </details><details ><summary> 大阪环球影城 </summary>              <div class='content'>              <div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 30%" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100"><p>Emmm还在构思中还没写0.0</p></div></div>              </div>            </details><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;tabs&quot; id=&quot;disneyanduniversalstudios&quot;&gt;&lt;ul class=&quot;nav-tabs&quot;&gt;&lt;li class=&quot;tab active&quot;&gt;&lt;button type=&quot;button&quot; data-href=&quot;#disneyanduniv</summary>
      
    
    
    
    <category term="娱乐攻略" scheme="https://www.lixiangpro.com/categories/%E5%A8%B1%E4%B9%90%E6%94%BB%E7%95%A5/"/>
    
    
  </entry>
  
  <entry>
    <title>10分钟搭建GitLab仓库及Drone自动化部署</title>
    <link href="https://www.lixiangpro.com/article/gitLabAndCiCd/"/>
    <id>https://www.lixiangpro.com/article/gitLabAndCiCd/</id>
    <published>2024-12-21T04:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.126Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>10分钟搭建GitLab仓库及Drone自动化部署</p></div></div><p>&nbsp;&nbsp;&nbsp;&nbsp; <mark class="hl-label blue">互联网公司成立后</mark> <mark class="hl-label orange">软件团队首要做的便是搭建基础设施</mark> <mark class="hl-label orange">运维部门搭建</mark> <mark class="hl-label pink">代码仓库</mark> <mark class="hl-label orange">和</mark> <mark class="hl-label pink">自动化集成部署</mark> <mark class="hl-label green">便是伟大的第一步。</mark> <br>&nbsp;&nbsp;&nbsp;&nbsp; <mark class="hl-label blue">在这里</mark> <mark class="hl-label red">花费10分钟</mark> <mark class="hl-label blue">时间</mark> <mark class="hl-label red">从0到1</mark> <mark class="hl-label purple">搭建完整的</mark> <mark class="hl-label green">[GitLab仓库，Drone自动化部署Java服务]</mark> <mark class="hl-label pink">轻量化CI/CD持续集成部署功能链路。</mark> </p><mark class="hl-label blue">一.GitLab搭建</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 创建公共网络</span></span><br><span class="line">docker network create cicd_network</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 下载GitLab镜像</span></span><br><span class="line">docker pull gitlab/gitlab-ce</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 运行GitLab服务</span></span><br><span class="line">docker run --network cicd_network -d -p 443:443 -p 80:80 -p 22:22 --name gitlab --restart always -v /home/gitlab/config:/home/gitlab/config -v /home/gitlab/logs:/home/gitlab/logs -v /home/gitlab/data:/home/gitlab/data gitlab/gitlab-ce</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入容器-&gt;查看管理员密码</span></span><br><span class="line">docker exec -it gitlab /bin/bash</span><br><span class="line">cat /etc/gitlab/initial_root_password</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 管理员账号: root</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 管理员密码: Mi4FZWvbeIghqMALXGZd7IkxmIfHNrmLZpnhab8Daf8=</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入容器-&gt;修改配置[首次部署需等待容器内安装完成后再修改,避免产生其他问题]</span></span><br><span class="line">docker exec -it gitlab /bin/bash</span><br><span class="line">vi /etc/gitlab/gitlab.rb</span><br><span class="line"></span><br><span class="line">external_url=&#x27;http://192.168.1.1&#x27;</span><br><span class="line">gitlab_rails[&#x27;gitlab_ssh_host&#x27;] = &#x27;192.168.1.1&#x27;</span><br><span class="line">gitlab_rails[&#x27;gitlab_shell_ssh_port&#x27;] = 22</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> GitLab外部网络设置Allow【Admin-&gt;Settings-&gt;Network-&gt;Outbound requests】</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 重启服务</span></span><br><span class="line">docker restart gitlab</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 登录GitLab</span></span><br><span class="line">http://192.168.1.1/users/sign_in</span><br></pre></td></tr></table></figure><mark class="hl-label blue">二.Java项目初始化</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> GitLab创建应用【Admin-&gt;Applications-&gt;add New application】</span></span><br><span class="line">RedirectURI= http://192.168.1.1:2080/login</span><br><span class="line">ApplicationID= 1e50d47b793a8458a62b033a2d436e2b62be2df2518218fa130b432794635c74</span><br><span class="line">Secret= gloas-bf787c02e057df6c42f772547ae3f8a3c153b6213c025450685219eeeb07448d</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 生成本地 SSH-Key</span></span><br><span class="line">ssh-keygen -t rsa -b 4096 -C &quot;lixiang@tron.com&quot;</span><br><span class="line"><span class="meta">#</span><span class="bash"> SSH-Key 添加至GitLab【点击头像-&gt;Preferences-&gt;SSH Keys-&gt;add New key】</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> Hello-World Java项目初始化及代码提交</span></span><br><span class="line">下载地址 = https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/hello-world.rar</span><br></pre></td></tr></table></figure><mark class="hl-label blue">三.部署Drone</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 拉取镜像</span></span><br><span class="line">docker pull drone/drone:2</span><br><span class="line">docker pull drone/drone-runner-docker</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 运行 Drone-server</span></span><br><span class="line">docker run --network cicd_network --volume=/var/lib/drone:/data --env=DRONE_AGENTS_ENABLED=true --env=DRONE_GITLAB_SERVER=http://192.168.1.1 --env=DRONE_GITLAB_CLIENT_ID=0b7a89352763fffc7a53ff5ebc5a49472376f8f04075d24a3d43354049915bac --env=DRONE_GITLAB_CLIENT_SECRET=gloas-932f99b89bd76ae921e0b994ac8ec47ca764d660ed86d8e7e913958749ad2b1e --env=DRONE_SERVER_HOST=192.168.1.1:2080 --env=DRONE_SERVER_PROTO=http --env=DRONE_TLS_AUTOCERT=false --env=DRONE_LOGS_DEBUG=true -e DRONE_RPC_SECRET=033a2d436e2b62be2df2518218fa130 --env=DRONE_USER_CREATE=username:root,admin:true -e TZ=&quot;Asia/Shanghai&quot; --publish=2080:80 --publish=2443:443 --restart=always --detach=true --name=drone-server drone/drone:2</span><br><span class="line"><span class="meta">  </span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 运行 Drone-runner</span></span><br><span class="line">docker run --network cicd_network -d -v /var/run/docker.sock:/var/run/docker.sock -e DRONE_RPC_PROTO=http -e DRONE_RPC_HOST=192.168.1.1:2080 -e DRONE_RPC_SECRET=033a2d436e2b62be2df2518218fa130 -e DRONE_RUNNER_CAPACITY=2 -e DRONE_RUNNER_NAME=drone-runner -e TZ=&quot;Asia/Shanghai&quot; -p 3000:3000 --restart always --name drone-runner drone/drone-runner-docker</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> Drone后台 http://192.168.1.1:2080</span></span><br><span class="line">修改配置【项目根目录/Settings/Project Settings】调整为Trust等</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> GitLab项目配置WEBHOOK</span></span><br><span class="line"> 进入GitLab后台【项目根目录-&gt;Settings-&gt;Webhooks】http://192.168.1.1</span><br><span class="line"> 检查确认WebHook地址URL = http://192.168.1.1:2080/hook</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 代码master分支提交更改 验收自动化持续集成部署</span></span><br></pre></td></tr></table></figure><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>至此_已完成_自动化持续集成部署</p></div></div><mark class="hl-label purple">DevOps流程及工具</mark> <p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/DevOps.webp" alt="DevOps及工具.webp"></p><mark class="hl-label pink">使用效果</mark> <p><b>克隆代码:</b><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/drone-run-1.png" alt="克隆.png"><br><b>打包JAR:</b><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/drone-run-2.png" alt="打包.png"><br><b>成功部署:</b><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/drone-run-3.png" alt="完成.png"><br><b>Hello World:</b><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/article/cicd-hello-world-success.png" alt="验收.png"></p><mark class="hl-label orange">附加:Drone配置</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line">kind: pipeline</span><br><span class="line">type: docker</span><br><span class="line">name: Hello_World</span><br><span class="line">clone:</span><br><span class="line">disable: true  #禁用默认克隆</span><br><span class="line">trigger:</span><br><span class="line">branch:</span><br><span class="line">- master  #仅在 master分支的代码提交,才触发部署</span><br><span class="line">steps:</span><br><span class="line">- name: 克隆</span><br><span class="line">  image: alpine/git</span><br><span class="line">  pull: if-not-exists</span><br><span class="line">  commands:</span><br><span class="line">    - git version</span><br><span class="line">    - git clone http://192.168.1.1/root/hello-world.git</span><br><span class="line">    - cd hello-world &amp;&amp; git checkout master</span><br><span class="line"></span><br><span class="line">- name: 打包</span><br><span class="line">  image: caoofduty/maven_jdk_17:v3 # maven:3.6.3-openjdk-17</span><br><span class="line">  pull: if-not-exists</span><br><span class="line">  volumes:</span><br><span class="line"><span class="meta">  #</span><span class="bash"> 挂载宿主机的目录</span></span><br><span class="line">    - name: maven-build</span><br><span class="line">      path: /data/build</span><br><span class="line">      commands:</span><br><span class="line">    - cd hello-world</span><br><span class="line">    - mvn -Dmaven.test.skip=true -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true package</span><br><span class="line">    - mkdir -p /data/build</span><br><span class="line">    - cp target/*.jar /data/build</span><br><span class="line">    - cp run.sh /data/build</span><br><span class="line">    - cp Dockerfile /data/build</span><br><span class="line"></span><br><span class="line">- name: 构建镜像</span><br><span class="line">  image: plugins/docker</span><br><span class="line">  volumes:</span><br><span class="line">    - name: maven-build</span><br><span class="line">      path: /data/build</span><br><span class="line">    - name: docker</span><br><span class="line">      path: /var/run/docker.sock # 挂载宿主机的docker</span><br><span class="line">      settings:</span><br><span class="line">      dockerfile: /data/build/Dockerfile</span><br><span class="line">      commands:</span><br><span class="line">    - cd /data/build</span><br><span class="line">    - docker --version</span><br><span class="line">    - docker build -t hello_world:latest -f /data/build/Dockerfile .</span><br><span class="line">    - docker images</span><br><span class="line"></span><br><span class="line">- name: 发布</span><br><span class="line">  image: plugins/docker</span><br><span class="line">  volumes:</span><br><span class="line">    - name: maven-build</span><br><span class="line">      path: /data/build</span><br><span class="line">    - name: docker</span><br><span class="line">      path: /var/run/docker.sock # 挂载宿主机的docker</span><br><span class="line">      settings:</span><br><span class="line">      dockerfile: /data/build/Dockerfile</span><br><span class="line">      commands:</span><br><span class="line">    - cd /data/build</span><br><span class="line">    - docker --version</span><br><span class="line">    - docker images</span><br><span class="line">    - docker run -d --name hello_world -p 8080:8080 -e TZ=&quot;Asia/Shanghai&quot; hello_world:latest</span><br><span class="line"></span><br><span class="line">- name: 成功了,庆祝~</span><br><span class="line">  image: alpine</span><br><span class="line">  commands:</span><br><span class="line">    - echo hello world</span><br><span class="line"></span><br><span class="line">volumes:</span><br><span class="line">- name: maven-build</span><br><span class="line">  host:</span><br><span class="line">  path: /data/build # 从宿主机中挂载的目录</span><br><span class="line">- name: docker</span><br><span class="line">  host:</span><br><span class="line">  path: /var/run/docker.sock</span><br><span class="line"><span class="meta">#</span><span class="bash">  - name: maven-cache</span></span><br><span class="line"><span class="meta">#</span><span class="bash">    host:</span></span><br><span class="line"><span class="meta">#</span><span class="bash">      path: /data/cache <span class="comment"># 从宿主机中挂载的目录</span></span></span><br></pre></td></tr></table></figure><mark class="hl-label purple">附加:DockerFile</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">FROM openjdk:17</span><br><span class="line"></span><br><span class="line">ADD hello-world-0.0.1-SNAPSHOT.jar /home/app.jar</span><br><span class="line"></span><br><span class="line">EXPOSE 8080</span><br><span class="line"></span><br><span class="line">CMD [&quot;java&quot;, &quot;-jar&quot;, &quot;/home/app.jar&quot;]</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-green&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot;</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>库存秒杀和高并发优化</title>
    <link href="https://www.lixiangpro.com/article/seckill/"/>
    <id>https://www.lixiangpro.com/article/seckill/</id>
    <published>2024-11-17T00:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.139Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>秒杀场景下-避免库存超卖-和高并发优化</p></div></div><h2 id="故事背景"><a href="#故事背景" class="headerlink" title="故事背景"></a>故事背景</h2><p>&nbsp;&nbsp;&nbsp;&nbsp; <mark class="hl-label pink">多年前，我在某旅游网站做酒店业务，和隔壁部门同事一起吃午饭，他讲一个事情。</mark> <mark class="hl-label blue">他们负责的一次抢购秒杀活动中，某人写的代码在生产出现了超卖的情况。例如上架了10套低价房源，最后有13人抢到了，多卖出去3套。</mark> <mark class="hl-label green">正常出现这种事情，其实就属于</mark> <mark class="hl-label red">严重事故</mark> <mark class="hl-label green">程序员和程序代码总是要有一个要跑的😂。</mark> <mark class="hl-label purple">但是后面商家给的回复令人爆笑，商家却说</mark> <mark class="hl-label orange">"太TM好了，要的就是这种效果～"</mark> <br>&nbsp;&nbsp;&nbsp;&nbsp; 这里也算当做了饭后打趣的故事，不过超卖这个技术问题，其实很恐怖的，例如1台手机价值5000元，秒杀上架1元，搞活动只卖10台，实际多卖了5台，这个损失最后总是要有人负责的。<br>&nbsp;&nbsp;&nbsp;&nbsp; 闲暇时想到这个事情，觉得要主动学习下这块，如果后面遇到类似的场景，该如何处理，避免犯类似的错误。</p><h2 id="防止超卖"><a href="#防止超卖" class="headerlink" title="防止超卖"></a>防止超卖</h2><h3 id="SQL乐观锁"><a href="#SQL乐观锁" class="headerlink" title="SQL乐观锁"></a>SQL乐观锁</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> SQL逻辑: 版本号MVCC 同时只有库存&gt;0才扣减库存</span></span><br><span class="line">UPDATE stock = stock - 1 WHERE stock = oldStock AND stock&gt;0 AND product_id = 123;</span><br></pre></td></tr></table></figure><h3 id="表字段结构兜底"><a href="#表字段结构兜底" class="headerlink" title="表字段结构兜底"></a>表字段结构兜底</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 库存字段值不可以为负数</span></span><br><span class="line">ALTER TABLE products MODIFY COLUMN stock UNSIGNED NOT NULL DEFAULT 0;</span><br></pre></td></tr></table></figure><h3 id="Redis缓存层库存计数"><a href="#Redis缓存层库存计数" class="headerlink" title="Redis缓存层库存计数"></a>Redis缓存层库存计数</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 方案一: Redis+Lua 保证一组操作的原子性，同时避免死锁。</span></span><br><span class="line">Object seckillCount = redisTemplate.execute(script, Arrays.asList(SeckillRedisKey.SECKILL_STOCK_COUNT_HASH.getRealKey(round)), &quot;-1&quot;); </span><br><span class="line"><span class="meta">#</span><span class="bash"> 方案二: Redis Increment</span> </span><br><span class="line">Long seckillCount = redisTemplate.opsForHash().increment(SeckillRedisKey.SECKILL_STOCK_COUNT_HASH.getRealKey(round),seckillId, -1);</span><br></pre></td></tr></table></figure><h3 id="分布式锁"><a href="#分布式锁" class="headerlink" title="分布式锁"></a>分布式锁</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">// 创建锁对象-Redission内置看门狗，自动锁续期。</span><br><span class="line">RLock lock = redissonClient.getLock(&quot;seckill:product:stock:lock:&quot; + seckillId);</span><br><span class="line">SeckillProductVo vo = null;</span><br><span class="line">try &#123;</span><br><span class="line">    // 加锁</span><br><span class="line">    lock.lock(10, TimeUnit.SECONDS);</span><br><span class="line">    // 查询最新的库存情况【DB直查】</span><br><span class="line">    vo = seckillProductService.findById(seckillId);</span><br><span class="line">    if (vo.getStockCount() &gt; 0) &#123; // 库存大于 0 才扣库存</span><br><span class="line">        // 扣除库存【乐观锁】</span><br><span class="line">        int row = seckillProductService.decrStockCount(seckillId);</span><br><span class="line">        if (row &lt;= 0) &#123;</span><br><span class="line">           // 库存数不足</span><br><span class="line">           throw new BusinessException(SeckillCodeMsg.SECKILL_STOCK_OVER);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    // 创建订单对象</span><br><span class="line">    OrderInfo orderInfo = this.create(userId, vo);</span><br><span class="line">    // 保存订单对象</span><br><span class="line">    orderInfoMapper.insert(orderInfo);</span><br><span class="line">    </span><br><span class="line">    return orderInfo.getOrderNo();// 秒杀成功，订单落库，恭喜用户～</span><br><span class="line">&#125; catch (BusinessException be) &#123;</span><br><span class="line">    throw be; // 不处理继续往外抛出</span><br><span class="line">&#125; catch (Exception e) &#123;</span><br><span class="line">    // 重新同步 redis 库存，设置本地库存售完标识为 false</span><br><span class="line">    if (vo != null &amp;&amp; vo.getStockCount() &gt; 0) &#123;</span><br><span class="line">        this.rollbackStockCount(vo);</span><br><span class="line">    &#125;</span><br><span class="line">    // 继续向外抛出异常</span><br><span class="line">    throw new BusinessException(500,&quot;SYSTEM_ERROR&quot;);</span><br><span class="line">&#125; finally &#123;</span><br><span class="line">    // 释放当前线程锁</span><br><span class="line">    if(lock.isHeldByCurrentThread() &amp;&amp; lock.isLocked())&#123;</span><br><span class="line">       lock.unlock();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="单机场景"><a href="#单机场景" class="headerlink" title="单机场景"></a>单机场景</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 单机场景下，可以直接使用同步锁，性能较差，不支持分布式微服务场景。</span></span><br><span class="line">synchronized(this)&#123;</span><br><span class="line">   // 库存查询扣减等业务逻辑</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="高并发性能优化"><a href="#高并发性能优化" class="headerlink" title="高并发性能优化"></a>高并发性能优化</h2><mark class="hl-label blue">思考总结:时刻要有着保护数据库,缓存抗压,流量分层,降低IO,提高吞吐量,关键节点注意加锁的思维。</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 1.前置进行各种业务校验，检查登录，检查活动是否进行，是否在灰度策略，挡掉大部分流量。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 2.JVM本地缓存一份已经抢光的商品MAP，若存在该商品，直接返回，提高响应速度。【如果进行库存补偿，需要各POD都清空此处MAP】</span></span><br><span class="line">public static final Map&lt;Long, Boolean&gt; LOCAL_STOCK_OVER_FALG_MAP = new ConcurrentHashMap&lt;&gt;();</span><br><span class="line"><span class="meta">#</span><span class="bash"> 3.检查用户是否已秒杀过该商品</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 4.Redis库存量检查</span></span><br><span class="line">Long seckillCount = redisTemplate.opsForHash().increment(SeckillRedisKey.SECKILL_STOCK_COUNT_HASH.getRealKey(round),seckillId, -1);</span><br><span class="line">if (seckillCount &lt; 0) &#123;</span><br><span class="line">   // 标记该秒杀商品已经卖完了</span><br><span class="line">   LOCAL_STOCK_OVER_FALG_MAP.put(seckillId, true);</span><br><span class="line">   return;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 5.代码编写时，注意并发请求是否会对最终结果产生影响，注意加锁。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 6.锁优化，降低锁的颗粒度，释放锁只释放本线程上的锁。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 7.扣减库存持久化到DB。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> =====其他=====&gt;</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 8.使用中间件，流量削峰，异步串行处理。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 9.异步Servelt，提高吞吐量，提高性能。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 10.提前评估请求量，服务端负载均衡，数据库多实例，缓存层多级缓存。理论上Nginx支持20w级别并发，Redis单机至高10w，MySQL至多几千，同时也受硬件磁盘读写能力影响。Java的SpringBoot内置的Tomcat上千左右。上线前也要考虑，是否进行配置调参优化或改用其他。</span> </span><br><span class="line"><span class="meta">#</span><span class="bash"> 11.热点数据提前预热等等，各大电商公司，真实的生产解决方案应该会更高效和全面，希望有一天也有机会可以见识下。</span></span><br></pre></td></tr></table></figure><h2 id="其他杂谈"><a href="#其他杂谈" class="headerlink" title="其他杂谈"></a>其他杂谈</h2><mark class="hl-label blue">1.适当超卖其实也算一种真实的业务需求,再到后面也有看到携程的后台,后面也添加了允许"超卖"和超卖数量的功能。</mark> <br><mark class="hl-label purple">2.当时所在的公司,办公室政治斗争多一些,对技术不太看重【或者说公司发展和行业都处于下行，无力拿高薪养技术人】,出现各种问题也就不奇怪了。</mark> <br><mark class="hl-label pink">3.在后面去其他公司也证实了这一点,原公司的技术大佬好多后面去了其他大型公司,剩下留下来的都是搞办公室斗争或者情商极高或者忍耐力极强,的活下来的,这些人实际出去的话竞争力是很低的,公司整体技术能力是一直走下坡的,相反很多出去的人在外面发展相对是更好些的。</mark> <br><mark class="hl-label orange">4.听老员工讲，当年上升期时门票业务可以和OTA一哥携程掰手腕，某事业部负责人年终奖1次拿过50个月工资，直接财务自由了。再到后面潮水退去，经营越来越难，甚至后面天天研究从员工身上搞钱，这些老员工表示真的好心寒。好似"眼看他起高楼，眼看他宴宾客，眼看他楼塌了"。</mark> <br><mark class="hl-label red">5.经营一门生意好难，做好一家公司好难，但是干死一家公司，搞死一个行业很容易。一纸文件+疫情时代，真的是冲击三观，令人唏嘘。</mark> <br><mark class="hl-label purple">6.现在是2024年末，可以说国内实体经济是百业萧条，经济周期加后疫情时代，人民群众失去最重要的信心，各行各业都在收缩，很是艰难。互联网行业可以提前观察和感知到，短时间内应该很难再看到，网民疯狂在线购物的场景了，消费在降级，流量在分散，而头部企业也仅仅是吃掉存量的流量，商品价格也持续内卷到，消费者对这些活动无兴趣了。我曾原以为技术是多么重要多么厉害，但现实却是如此残酷，没有业务的技术也将是无用。</mark> <br><mark class="hl-label blue">7.这家在线旅游公司现今已倒闭，2008-2024，互联网企业能生存16年也实属很不容易，它和旅游行业，基本也是被COVID-19和离谱的管控治理最终绝杀KO，至于凶手么，手动加个狗头0.0。</mark> ]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-green&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot;</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>评论推送微信及邮箱</title>
    <link href="https://www.lixiangpro.com/article/valinePush/"/>
    <id>https://www.lixiangpro.com/article/valinePush/</id>
    <published>2022-07-02T05:22:58.000Z</published>
    <updated>2026-09-09T06:43:00.145Z</updated>
    
    <content type="html"><![CDATA[<h2 id="云函数部署"><a href="#云函数部署" class="headerlink" title="云函数部署"></a>云函数部署</h2><p><strong>LeanCloud:</strong> <a href="https://console.leancloud.cn/">https://console.leancloud.cn</a><br><strong>仓库:</strong> <a href="https://github.com/Tron-lixiang/Valine-Admin">https://github.com/Tron-lixiang/Valine-Admin</a></p><h2 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h2><table><thead><tr><th>KEY</th><th>VALUE</th></tr></thead><tbody><tr><td>SITE_NAME</td><td>LiXiangPRO.com</td></tr><tr><td>SITE_URL</td><td><a href="https://lixiangpro.com/">https://lixiangpro.com</a></td></tr><tr><td>BLOGGER_EMAIL</td><td><a href="mailto:&#88;&#x58;&#x58;&#64;&#x71;&#x71;&#46;&#99;&#x6f;&#109;">&#88;&#x58;&#x58;&#64;&#x71;&#x71;&#46;&#99;&#x6f;&#109;</a></td></tr><tr><td>SENDER_EMAIL</td><td><a href="mailto:&#x58;&#x58;&#88;&#64;&#x71;&#113;&#x2e;&#99;&#x6f;&#109;">&#x58;&#x58;&#88;&#64;&#x71;&#113;&#x2e;&#99;&#x6f;&#109;</a></td></tr><tr><td>SENDER_NAME</td><td>李想的Sender</td></tr><tr><td>SMTP_SERVICE</td><td>QQ</td></tr><tr><td>SMTP_USER</td><td><a href="mailto:&#88;&#88;&#x58;&#x40;&#x71;&#113;&#x2e;&#x63;&#111;&#109;">&#88;&#88;&#x58;&#x40;&#x71;&#113;&#x2e;&#x63;&#111;&#109;</a></td></tr><tr><td>SMTP_PASS</td><td>XXXXXXX(SMTP)</td></tr><tr><td>SC_KEY</td><td>XXXXXXX(Server酱)</td></tr></tbody></table><p><strong>Server酱申请地址:</strong> <a href="https://sct.ftqq.com/">点击跳转</a></p><h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/valineAdmin.jpg" alt="图示"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;云函数部署&quot;&gt;&lt;a href=&quot;#云函数部署&quot; class=&quot;headerlink&quot; title=&quot;云函数部署&quot;&gt;&lt;/a&gt;云函数部署&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;LeanCloud:&lt;/strong&gt; &lt;a href=&quot;https://console.leanc</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>代码工具箱</title>
    <link href="https://www.lixiangpro.com/article/code/"/>
    <id>https://www.lixiangpro.com/article/code/</id>
    <published>2022-06-28T00:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.118Z</updated>
    
    <content type="html"><![CDATA[<h1 id="代码工具箱"><a href="#代码工具箱" class="headerlink" title="代码工具箱"></a><center>代码工具箱</center></h1><h2 id="Mybatis-plus工具"><a href="#Mybatis-plus工具" class="headerlink" title="Mybatis-plus工具"></a>Mybatis-plus工具</h2><mark class="hl-label blue">Mybatis-plus自动生成代码</mark> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.lixiang.tron;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.toolkit.StringPool;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.generator.AutoGenerator;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.generator.InjectionConfig;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.generator.config.*;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.generator.config.po.TableInfo;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;</span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> *  代码生成工具</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">CodeUtil</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">generate</span><span class="params">(String toPackage, String author, String... include)</span> </span>&#123;</span><br><span class="line">        <span class="comment">// 代码生成器</span></span><br><span class="line">        AutoGenerator mpg = <span class="keyword">new</span> AutoGenerator();</span><br><span class="line">        <span class="comment">// 全局配置</span></span><br><span class="line">        GlobalConfig gc = <span class="keyword">new</span> GlobalConfig();</span><br><span class="line">        String projectPath = System.getProperty(<span class="string">&quot;user.dir&quot;</span>);</span><br><span class="line">        gc.setOutputDir(projectPath + <span class="string">&quot;/mybatis-plus-generate/code/java&quot;</span>);</span><br><span class="line">        gc.setFileOverride(<span class="keyword">false</span>);</span><br><span class="line">        gc.setAuthor(author);</span><br><span class="line">        gc.setOpen(<span class="keyword">false</span>);</span><br><span class="line">        gc.setEntityName(<span class="string">&quot;%sDO&quot;</span>);</span><br><span class="line">        gc.setServiceName(<span class="string">&quot;%sDAO&quot;</span>);</span><br><span class="line">        gc.setServiceImplName(<span class="string">&quot;%sDAOImpl&quot;</span>);</span><br><span class="line">        <span class="comment">// 实体属性 Swagger2 注解</span></span><br><span class="line">        gc.setSwagger2(<span class="keyword">true</span>);</span><br><span class="line">        mpg.setGlobalConfig(gc);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 数据源配置</span></span><br><span class="line">        DataSourceConfig dsc = <span class="keyword">new</span> DataSourceConfig();</span><br><span class="line">        dsc.setUrl(<span class="string">&quot;jdbc:mysql://localhost:3306/archery?useSSL=false&amp;characterEncoding=utf8&amp;serverTimezone=GMT%2B8&quot;</span>);</span><br><span class="line">        dsc.setDriverName(<span class="string">&quot;com.mysql.cj.jdbc.Driver&quot;</span>);</span><br><span class="line">        dsc.setUsername(<span class="string">&quot;root&quot;</span>);</span><br><span class="line">        dsc.setPassword(<span class="string">&quot;123456&quot;</span>);</span><br><span class="line">        mpg.setDataSource(dsc);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 包配置</span></span><br><span class="line">        PackageConfig pc = <span class="keyword">new</span> PackageConfig();</span><br><span class="line"><span class="comment">//        pc.setModuleName(scanner(&quot;模块名&quot;));</span></span><br><span class="line">        pc.setModuleName(<span class="string">&quot;&quot;</span>);</span><br><span class="line">        pc.setParent(toPackage);</span><br><span class="line"><span class="comment">//        pc.setMapper(&quot;repo.mapper&quot;);</span></span><br><span class="line"><span class="comment">//        pc.setEntity(&quot;repo.entity&quot;);</span></span><br><span class="line"><span class="comment">//        pc.setService(&quot;service&quot;);</span></span><br><span class="line"><span class="comment">//        pc.setServiceImpl(&quot;service.impl&quot;);</span></span><br><span class="line">        mpg.setPackageInfo(pc);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 自定义配置</span></span><br><span class="line">        InjectionConfig cfg = <span class="keyword">new</span> InjectionConfig() &#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">initMap</span><span class="params">()</span> </span>&#123;</span><br><span class="line">                <span class="comment">// to do nothing</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 如果模板引擎是 freemarker</span></span><br><span class="line">        String templatePath = <span class="string">&quot;/templates/mapper.xml.ftl&quot;</span>;</span><br><span class="line">        <span class="comment">// 如果模板引擎是 velocity</span></span><br><span class="line"><span class="comment">//         String templatePath = &quot;/templates/mapper.xml.vm&quot;;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">// 自定义输出配置</span></span><br><span class="line">        List&lt;FileOutConfig&gt; focList = <span class="keyword">new</span> ArrayList&lt;&gt;();</span><br><span class="line">        <span class="comment">// 自定义配置会被优先输出</span></span><br><span class="line">        focList.add(<span class="keyword">new</span> FileOutConfig(templatePath) &#123;</span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> String <span class="title">outputFile</span><span class="params">(TableInfo tableInfo)</span> </span>&#123;</span><br><span class="line">                <span class="comment">// 自定义输出文件名，如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！</span></span><br><span class="line">                <span class="keyword">return</span> projectPath + <span class="string">&quot;/mybatis-plus-generate/code/resources/mapper/&quot;</span> + pc.getModuleName()</span><br><span class="line">                        + <span class="string">&quot;/&quot;</span> + tableInfo.getEntityName() + <span class="string">&quot;Mapper&quot;</span> + StringPool.DOT_XML;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">        cfg.setFileOutConfigList(focList);</span><br><span class="line">        mpg.setCfg(cfg);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 配置模板</span></span><br><span class="line">        TemplateConfig templateConfig = <span class="keyword">new</span> TemplateConfig();</span><br><span class="line">        templateConfig.setXml(<span class="keyword">null</span>);</span><br><span class="line">        mpg.setTemplate(templateConfig);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 策略配置</span></span><br><span class="line">        StrategyConfig strategy = <span class="keyword">new</span> StrategyConfig();</span><br><span class="line">        strategy.setNaming(NamingStrategy.underline_to_camel);</span><br><span class="line">        strategy.setColumnNaming(NamingStrategy.underline_to_camel);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 修改前缀</span></span><br><span class="line">        strategy.setTablePrefix(<span class="string">&quot;&quot;</span>);</span><br><span class="line"><span class="comment">//        strategy.setSuperEntityClass(&quot;com.baomidou.ant.common.BaseEntity&quot;);</span></span><br><span class="line">        strategy.setEntityLombokModel(<span class="keyword">true</span>);</span><br><span class="line">        strategy.setRestControllerStyle(<span class="keyword">true</span>);</span><br><span class="line">        <span class="comment">// 公共父类</span></span><br><span class="line"><span class="comment">//        strategy.setSuperControllerClass(&quot;com.baomidou.ant.common.BaseController&quot;);</span></span><br><span class="line">        <span class="comment">// 写于父类中的公共字段</span></span><br><span class="line"><span class="comment">//        strategy.setSuperEntityColumns(&quot;id&quot;);</span></span><br><span class="line">        strategy.setInclude(include);</span><br><span class="line">        strategy.setControllerMappingHyphenStyle(<span class="keyword">true</span>);</span><br><span class="line"><span class="comment">//        strategy.setTablePrefix(pc.getModuleName() + &quot;_&quot;);</span></span><br><span class="line">        mpg.setStrategy(strategy);</span><br><span class="line">        mpg.setTemplateEngine(<span class="keyword">new</span> FreemarkerTemplateEngine());</span><br><span class="line">        mpg.execute();</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 运行入口</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Test</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        String[] tables = <span class="keyword">new</span> String[] &#123;<span class="string">&quot;t_admin_info&quot;</span>&#125;;</span><br><span class="line">        CodeUtil.generate(<span class="string">&quot;com.lixiang.tron.repo&quot;</span>, <span class="string">&quot;lixiang&quot;</span>, tables);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><mark class="hl-label blue">依赖Jar包</mark> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;com.baomidou&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;mybatis-plus-boot-starter&lt;/artifactId&gt;</span><br><span class="line">    &lt;version&gt;<span class="number">3.1</span><span class="number">.0</span>&lt;/version&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br><span class="line"></span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;com.baomidou&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;mybatis-plus-generator&lt;/artifactId&gt;</span><br><span class="line">    &lt;version&gt;<span class="number">3.3</span><span class="number">.0</span>&lt;/version&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br><span class="line"></span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;org.freemarker&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;freemarker&lt;/artifactId&gt;</span><br><span class="line">    &lt;version&gt;<span class="number">2.3</span><span class="number">.28</span>&lt;/version&gt;</span><br><span class="line">    &lt;scope&gt;compile&lt;/scope&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></table></figure><h2 id="单元测试示例"><a href="#单元测试示例" class="headerlink" title="单元测试示例"></a>单元测试示例</h2><mark class="hl-label blue">单元测试</mark> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.lixiang.tron;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.junit.Test;</span><br><span class="line"><span class="keyword">import</span> org.junit.runner.RunWith;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner;</span><br><span class="line"></span><br><span class="line"><span class="meta">@SpringBootTest(classes = App.class)</span></span><br><span class="line"><span class="meta">@RunWith(SpringJUnit4ClassRunner.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">AppServiceImplTest</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">static</span> &#123;</span><br><span class="line">        System.setProperty(<span class="string">&quot;APPID&quot;</span>, <span class="string">&quot;AppService&quot;</span>);</span><br><span class="line">        System.setProperty(<span class="string">&quot;env&quot;</span>, <span class="string">&quot;dev&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">private</span> SmartIface smartIface;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Test</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">testSmartIface</span><span class="params">()</span></span>&#123;</span><br><span class="line">        smartIface.check();</span><br><span class="line">        System.out.print(<span class="string">&quot;测试&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="多数据源"><a href="#多数据源" class="headerlink" title="多数据源"></a>多数据源</h2><mark class="hl-label blue">数据源配置</mark> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.lixiang.tron.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.ibatis.session.SqlSessionFactory;</span><br><span class="line"><span class="keyword">import</span> org.mybatis.spring.SqlSessionFactoryBean;</span><br><span class="line"><span class="keyword">import</span> org.mybatis.spring.SqlSessionTemplate;</span><br><span class="line"><span class="keyword">import</span> org.mybatis.spring.annotation.MapperScan;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Qualifier;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.ConfigurationProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.jdbc.DataSourceBuilder;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.core.io.support.PathMatchingResourcePatternResolver;</span><br><span class="line"><span class="keyword">import</span> javax.sql.DataSource;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@MapperScan(basePackages = &quot;com.lixiang.tron.mapper.db0&quot;, sqlSessionTemplateRef  = &quot;db0SqlSessionTemplate&quot;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Db0Configuration</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean(name = &quot;db0DataSource&quot;)</span></span><br><span class="line">    <span class="meta">@ConfigurationProperties(prefix = &quot;spring.datasource.db0&quot;)</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> DataSource <span class="title">db0DataSource</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> DataSourceBuilder.create().build();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="meta">@Bean(name = &quot;db0SqlSessionFactory&quot;)</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> SqlSessionFactory <span class="title">db0SqlSessionFactory</span><span class="params">(<span class="meta">@Qualifier(&quot;db0DataSource&quot;)</span> DataSource db0DataSource)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">        SqlSessionFactoryBean sqlSessionFactoryBean = <span class="keyword">new</span> SqlSessionFactoryBean();</span><br><span class="line">        <span class="comment">//设置数据源</span></span><br><span class="line">        sqlSessionFactoryBean.setDataSource(db0DataSource);</span><br><span class="line">        org.apache.ibatis.session.Configuration config = <span class="keyword">new</span> org.apache.ibatis.session.Configuration();</span><br><span class="line">        config.setMapUnderscoreToCamelCase(<span class="keyword">true</span>);</span><br><span class="line">        sqlSessionFactoryBean.setConfiguration(config);</span><br><span class="line">        sqlSessionFactoryBean.setMapperLocations(<span class="keyword">new</span> PathMatchingResourcePatternResolver().getResources(<span class="string">&quot;classpath:mapper/db0/*.xml&quot;</span>));</span><br><span class="line">        <span class="keyword">return</span> sqlSessionFactoryBean.getObject();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="meta">@Bean(name = &quot;db0SqlSessionTemplate&quot;)</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> SqlSessionTemplate <span class="title">db0SqlSessionTemplate</span><span class="params">(<span class="meta">@Qualifier(&quot;db0SqlSessionFactory&quot;)</span> SqlSessionFactory sqlSessionFactory)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> SqlSessionTemplate(sqlSessionFactory);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;代码工具箱&quot;&gt;&lt;a href=&quot;#代码工具箱&quot; class=&quot;headerlink&quot; title=&quot;代码工具箱&quot;&gt;&lt;/a&gt;&lt;center&gt;代码工具箱&lt;/center&gt;&lt;/h1&gt;&lt;h2 id=&quot;Mybatis-plus工具&quot;&gt;&lt;a href=&quot;#Mybatis-pl</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>Linux工具箱</title>
    <link href="https://www.lixiangpro.com/article/linux/"/>
    <id>https://www.lixiangpro.com/article/linux/</id>
    <published>2022-01-08T00:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.133Z</updated>
    
    <content type="html"><![CDATA[<mark class="hl-label blue">Linux常用</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 复制</span></span><br><span class="line">cp -r folder1 folder2</span><br><span class="line"><span class="meta">#</span><span class="bash"> 压缩</span></span><br><span class="line">tar zcf folder.tar.gz folder</span><br><span class="line"><span class="meta">#</span><span class="bash"> 解压</span></span><br><span class="line">tar zxvf filename.tar</span><br><span class="line"><span class="meta">#</span><span class="bash"> 传输文件到本地桌面</span></span><br><span class="line">sz filename</span><br><span class="line"><span class="meta">#</span><span class="bash"> 传输文件到远程机器</span></span><br><span class="line">scp filename.tar.gz root@192.168.0.1:/opt</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查找文件夹内运行的进程</span></span><br><span class="line">ps -ef|grep 文件夹</span><br><span class="line"><span class="meta">#</span><span class="bash"> 杀掉进程</span></span><br><span class="line">kill -9 123</span><br><span class="line"><span class="meta">#</span><span class="bash"> 指定目录下查找文件</span></span><br><span class="line">find /usr -name &#x27;a&#x27; </span><br><span class="line"><span class="meta">#</span><span class="bash"> 模糊查找文件</span></span><br><span class="line">grep -r &#x27;XXX&#x27; /</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看文件中包含的关键字</span></span><br><span class="line">grep &quot;keyword&quot; xxx.log</span><br><span class="line">cat xxx.log | grep keyword</span><br></pre></td></tr></table></figure><mark class="hl-label blue">Linux定时脚本</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 定时脚本</span> </span><br><span class="line">yum install crontabs</span><br><span class="line"><span class="meta">#</span><span class="bash"> 编辑任务 no.1</span></span><br><span class="line">crontab -e</span><br><span class="line"><span class="meta">#</span><span class="bash"> 编辑任务 no.2</span></span><br><span class="line">vim /etc/crontab  </span><br><span class="line"><span class="meta">#</span><span class="bash"> 定时命令</span></span><br><span class="line">*/1 * * * * ab -n 3000 -c 500 http://localhost:8080/</span><br><span class="line"><span class="meta">#</span><span class="bash"> 启动定时服务</span></span><br><span class="line">/sbin/service crond start</span><br><span class="line"><span class="meta">#</span><span class="bash"> 关闭定时服务</span></span><br><span class="line">/sbin/service crond stop</span><br><span class="line"><span class="meta">#</span><span class="bash"> 重启定时服务</span></span><br><span class="line">/sbin/service crond restart</span><br><span class="line"><span class="meta">#</span><span class="bash"> 重新载入定时配置</span></span><br><span class="line">/sbin/service crond reload</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看crontab定时服务状态</span></span><br><span class="line">service crond status</span><br><span class="line"><span class="meta">#</span><span class="bash"> 手动启动crontab定时服务</span></span><br><span class="line">service crond start</span><br></pre></td></tr></table></figure><mark class="hl-label blue">Linux网络</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 搜索指定端口</span></span><br><span class="line">netstat -an | grep 8080</span><br><span class="line"><span class="meta">#</span><span class="bash"> 关闭防火墙</span></span><br><span class="line">chkconfig iptables off</span><br><span class="line"><span class="meta">#</span><span class="bash"> 重启网络</span></span><br><span class="line">service network restart</span><br></pre></td></tr></table></figure><mark class="hl-label blue">通用故障排查</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 内存</span></span><br><span class="line">free</span><br><span class="line"><span class="meta">#</span><span class="bash"> 磁盘</span></span><br><span class="line">df</span><br><span class="line"><span class="meta">#</span><span class="bash"> 磁盘IO</span></span><br><span class="line">iostat</span><br><span class="line"><span class="meta">#</span><span class="bash"> 网络IO</span></span><br><span class="line">ifstat</span><br><span class="line"><span class="meta">#</span><span class="bash"> 进程</span></span><br><span class="line">top</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看占用CPU最高的进程对应线程,可得到线程ID tid</span></span><br><span class="line">top -H-p pid</span><br><span class="line"><span class="meta">#</span><span class="bash"> 线程ID转为16进制</span></span><br><span class="line">printf ‘%x’ tid</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看进程中占用CPU最高的线程，发现是GC线程</span></span><br><span class="line">jstack pid | grep -C 5 tid</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查下GC情况</span></span><br><span class="line">jstat -gc pid 500</span><br><span class="line"><span class="meta">#</span><span class="bash"> dump出JVM堆内存的数据</span></span><br><span class="line">jmap -dump:format=b,file=/tmp/**.dump pid</span><br><span class="line"><span class="meta">#</span><span class="bash"> 分析堆快照</span></span><br><span class="line">visualvm mat</span><br></pre></td></tr></table></figure><mark class="hl-label blue">Kafka</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 查看topic列表</span></span><br><span class="line">./kafka-topics.sh --list --zookeeper 192.168.0.1:2181</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看消费者列表</span></span><br><span class="line">./kafka-consumer-groups.sh --bootstrap-server 192.168.0.1:9092 --list</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看指定分组的消费情况</span></span><br><span class="line">./kafka-consumer-groups.sh --bootstrap-server 192.168.0.1:9092,192.168.0.2:9092,192.168.0.3:9092 --describe --group groupName</span><br><span class="line"><span class="meta">#</span><span class="bash"> 生产消息</span></span><br><span class="line">./kafka-console-producer.sh --broker-list 192.168.0.1:9092 --topic topicName</span><br><span class="line"><span class="meta">#</span><span class="bash"> 消费消息</span></span><br><span class="line">./kafka-console-consumer.sh --bootstrap-server 192.168.0.1:9092 --topic topicName</span><br><span class="line"><span class="meta">#</span><span class="bash"> 从0消费所有消息</span></span><br><span class="line">./kafka-console-consumer.sh --bootstrap-server 192.168.0.1:9092 --topic topicName --from-beginning</span><br></pre></td></tr></table></figure><mark class="hl-label blue">ES</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> ES导出指定索引中的数据</span></span><br><span class="line">elasticdump --input http://192.168.0.1:9200/default_data --output ./default_data.json --type=data</span><br><span class="line"><span class="meta">#</span><span class="bash"> ES导入指定数据到索引中</span></span><br><span class="line">elasticdump --input=/opt/default_data.json --output=http://192.168.0.1:9200/default_data</span><br><span class="line"><span class="meta">#</span><span class="bash"> 集群属性</span></span><br><span class="line">GET _cluster/health    </span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看所有的索引</span></span><br><span class="line">curl http://192.168.0.1:9200/_cat/indices</span><br><span class="line"><span class="meta">#</span><span class="bash"> 获取文档指定id的数据</span></span><br><span class="line">curl -XGET &#x27;http://192.168.0.1:9200/default_index/_doc/123456?pretty=true&#x27;</span><br><span class="line">GET default_index/_doc/123456</span><br><span class="line"><span class="meta">#</span><span class="bash"> 全量查询</span></span><br><span class="line">GET default_index/_search</span><br><span class="line">&#123;</span><br><span class="line">    &quot;query&quot;: &#123;</span><br><span class="line">        &quot;match_all&quot;: &#123;&#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 条件查询</span></span><br><span class="line">GET default_index/_search</span><br><span class="line">&#123;</span><br><span class="line">   &quot;query&quot;: &#123;</span><br><span class="line">       &quot;match&quot;: &#123;</span><br><span class="line">         &quot;uid&quot;: 111</span><br><span class="line">       &#125;</span><br><span class="line">   &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 覆盖修改</span></span><br><span class="line">PUT default_index/_doc/123456</span><br><span class="line">&#123;</span><br><span class="line">    &quot;id&quot;: 42,</span><br><span class="line">    &quot;name&quot;: &quot;技师1&quot;,</span><br><span class="line">    &quot;price&quot;: 298</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 局部修改</span></span><br><span class="line">POST default_index/_doc/123456</span><br><span class="line">&#123;</span><br><span class="line">    &quot;id&quot;: 66,</span><br><span class="line">    &quot;name&quot;: &quot;技师2&quot;,</span><br><span class="line">    &quot;price&quot;: 398</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 清除索引内指定id的数据</span></span><br><span class="line">DELETE default_index/_doc/123456</span><br><span class="line"><span class="meta">#</span><span class="bash"> 分析</span></span><br><span class="line">GET _analyze</span><br><span class="line">&#123;</span><br><span class="line">    &quot;analyzer&quot;: &quot;standard&quot;,</span><br><span class="line">    &quot;text&quot; : &quot;wu yi fan&quot;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 去除分页数量限制报错</span></span><br><span class="line">curl -XPUT http://192.168.0.1:9200/default_index/_settings -d &#x27;&#123; &quot;index&quot; : &#123; &quot;max_result_window&quot; : 100000000&#125;&#125;&#x27;</span><br><span class="line">PUT default_index/_settings</span><br><span class="line">&#123;</span><br><span class="line">    &quot;index&quot;:&#123;</span><br><span class="line">    &quot;max_result_window&quot;:1000000</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 全量查询分页及排序</span></span><br><span class="line">GET default_index/_search</span><br><span class="line">&#123;</span><br><span class="line">    &quot;query&quot;: &#123;</span><br><span class="line">        &quot;match&quot;: &#123;</span><br><span class="line">            &quot;name&quot;: &quot;技师2&quot;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;,</span><br><span class="line">    &quot;from&quot;:0,</span><br><span class="line">    &quot;size&quot;:1,</span><br><span class="line">    &quot;_source&quot;:[&quot;name&quot;],</span><br><span class="line">    &quot;sort&quot;:&#123;</span><br><span class="line">        &quot;id&quot;:&#123;</span><br><span class="line">            &quot;order&quot;:&quot;desc&quot;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 多条件查找</span></span><br><span class="line">GET default_index/_search</span><br><span class="line">&#123;</span><br><span class="line">    &quot;query&quot;: &#123;</span><br><span class="line">        &quot;bool&quot;:&#123;</span><br><span class="line">            &quot;must&quot;:[</span><br><span class="line">                &#123;&quot;match&quot;:&#123;</span><br><span class="line">                    &quot;name&quot;:&quot;技师2&quot;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;&quot;match&quot;:&#123;</span><br><span class="line">                    &quot;id&quot;: 66</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            ],</span><br><span class="line">            &quot;filter&quot;:&#123;</span><br><span class="line">                &quot;range&quot;:&#123;</span><br><span class="line">                    &quot;price&quot;:&#123;</span><br><span class="line">                        &quot;gt&quot;: 298</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 新增索引</span></span><br><span class="line">curl -X PUT &quot;http://192.168.0.1:9200/default_index&quot; -H &#x27;Content-Type: application/json&#x27; -d&#x27;</span><br><span class="line">PUT default_index</span><br><span class="line">&#123;</span><br><span class="line">  &quot;mappings&quot;: &#123;</span><br><span class="line">    &quot;_doc&quot;: &#123;</span><br><span class="line">      &quot;properties&quot;: &#123;</span><br><span class="line">        &quot;USER_ID&quot;: &#123;</span><br><span class="line">          &quot;type&quot;: &quot;long&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;someString&quot;: &#123;</span><br><span class="line">          &quot;type&quot;: &quot;text&quot;,</span><br><span class="line">          &quot;fields&quot;: &#123;</span><br><span class="line">            &quot;keyword&quot;: &#123;</span><br><span class="line">              &quot;type&quot;: &quot;keyword&quot;,</span><br><span class="line">              &quot;ignore_above&quot;: 256</span><br><span class="line">            &#125;</span><br><span class="line">          &#125;,</span><br><span class="line">          &quot;fielddata&quot;: true</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;someShortName&quot;: &#123;</span><br><span class="line">          &quot;type&quot;: &quot;text&quot;,</span><br><span class="line">          &quot;analyzer&quot;: &quot;ik_max_word&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;someType&quot;: &#123;</span><br><span class="line">          &quot;type&quot;: &quot;text&quot;,</span><br><span class="line">          &quot;analyzer&quot;: &quot;ik_smart&quot;,</span><br><span class="line">          &quot;fielddata&quot;: true</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;roomId&quot;: &#123;</span><br><span class="line">          &quot;type&quot;: &quot;integer&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;someIds&quot;: &#123;</span><br><span class="line">          &quot;type&quot;: &quot;text&quot;,</span><br><span class="line">          &quot;fields&quot;: &#123;</span><br><span class="line">            &quot;keyword&quot;: &#123;</span><br><span class="line">              &quot;type&quot;: &quot;keyword&quot;,</span><br><span class="line">              &quot;ignore_above&quot;: 256</span><br><span class="line">            &#125;</span><br><span class="line">          &#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;somePrices&quot;: &#123;</span><br><span class="line">          &quot;type&quot;: &quot;nested&quot;,</span><br><span class="line">          &quot;properties&quot;: &#123;</span><br><span class="line">            &quot;endDate&quot;: &#123;</span><br><span class="line">              &quot;type&quot;: &quot;date&quot;</span><br><span class="line">            &#125;,</span><br><span class="line">            &quot;sellPrice&quot;: &#123;</span><br><span class="line">              &quot;type&quot;: &quot;double&quot;</span><br><span class="line">            &#125;,</span><br><span class="line">            &quot;startDate&quot;: &#123;</span><br><span class="line">              &quot;type&quot;: &quot;date&quot;</span><br><span class="line">            &#125;</span><br><span class="line">          &#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;isSale&quot;: &#123;</span><br><span class="line">          &quot;type&quot;: &quot;boolean&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;location&quot;: &#123;</span><br><span class="line">          &quot;type&quot;: &quot;geo_point&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;valid&quot;: &#123;</span><br><span class="line">          &quot;type&quot;: &quot;boolean&quot;</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><mark class="hl-label blue">Centos7.9&bt</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> centos 基础</span></span><br><span class="line">docker pull centos:7.9.2009</span><br><span class="line"><span class="meta">#</span><span class="bash"> 运行基础</span></span><br><span class="line">docker run -d -it -p 8888:8888 -p 888:888 -p 80:80 -p 443:443 -p 3306:3306 --privileged=true centos:7.9.2009</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看当前运行</span></span><br><span class="line">docker ps</span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入容器</span></span><br><span class="line">docker exec -it 容器ID bash</span><br><span class="line"><span class="meta">#</span><span class="bash"> 安装宝塔</span></span><br><span class="line">yum install -y wget &amp;&amp; wget -O install.sh https://download.bt.cn/install/install_6.0.sh &amp;&amp; sh install.sh ed8484bec</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 容器转镜像</span></span><br><span class="line">docker commit -m=&quot;centos_7.9_bt&quot; -a=&quot;caoofduty&quot; 1e625addbac9 caoofduty/centos_7.9_bt:pro</span><br></pre></td></tr></table></figure><mark class="hl-label blue">集成环境运行</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 拉取生成镜像</span></span><br><span class="line">docker pull caoofduty/centos_7.9_bt:pro</span><br><span class="line"><span class="meta">#</span><span class="bash"> 服务运行</span></span><br><span class="line">docker run -d -it -p 8888:8888 -p 888:888 -p 80:80 -p 443:443 -p 3306:3306 -p 40465:40465 --privileged=true caoofduty/centos_7.9_bt:pro</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看当前运行</span></span><br><span class="line">docker ps</span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入容器</span></span><br><span class="line">docker exec -it 容器ID bash</span><br><span class="line"><span class="meta">#</span><span class="bash"> 宝塔重启</span></span><br><span class="line">bt restart</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash">其他:</span></span><br><span class="line">外网面板地址: http://101.87.XXX.XXX:40465/a20130f1</span><br><span class="line">内网面板地址: http://127.0.0.1:40465/a20130f1</span><br><span class="line">username: xxxxx</span><br><span class="line">password: xxxxx</span><br><span class="line"></span><br></pre></td></tr></table></figure><mark class="hl-label blue">CYCLE_GRID</mark> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 拉取镜像</span></span><br><span class="line">docker pull caoofduty/merchant_2023:dev</span><br><span class="line"><span class="meta">#</span><span class="bash"> 服务运行</span></span><br><span class="line">docker run -d -it -p 8888:8888 -p 888:888 -p 80:80 -p 443:443 -p 3306:3306 -p 40465:40465 --privileged=true caoofduty/merchant_2023:dev</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看当前运行</span></span><br><span class="line">docker ps</span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入容器</span></span><br><span class="line">docker exec -it 容器ID bash</span><br><span class="line"><span class="meta">#</span><span class="bash"> 宝塔重启</span></span><br><span class="line">bt restart</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 其他:</span></span><br><span class="line">外网面板地址: http://101.87.XXX.XXX:40465/a20130f1</span><br><span class="line">内网面板地址: http://127.0.0.1:40465/a20130f1</span><br><span class="line">username: xxxxx</span><br><span class="line">password: xxxxx</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 装填:</span> </span><br><span class="line">软件商店-&gt;开启各服务</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 输出</span></span><br><span class="line">cd /www/wwwroot/xxx.merchant.cn</span><br><span class="line">php think swoole restart &amp;</span><br><span class="line">php think queue:listen --tries 2 &amp;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;mark class=&quot;hl-label blue&quot;&gt;Linux常用&lt;/mark&gt; 
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;b</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>Spring学习</title>
    <link href="https://www.lixiangpro.com/article/spring/"/>
    <id>https://www.lixiangpro.com/article/spring/</id>
    <published>2021-12-11T01:22:58.000Z</published>
    <updated>2026-09-09T06:43:00.141Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Spring笔记"><a href="#Spring笔记" class="headerlink" title="Spring笔记"></a><center>Spring笔记</center></h1><h2 id="初识"><a href="#初识" class="headerlink" title="初识"></a><center>初识</center></h2><h3 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a><center>介绍</center></h3><mark class="hl-label green">Spring</mark> <mark class="hl-label purple">框架</mark> <mark class="hl-label blue">是</mark> <mark class="hl-label orange">Java</mark> <mark class="hl-label blue">应用最广的框架</mark> ,<mark class="hl-label purple">它的成功</mark> <mark class="hl-label green">来源于</mark> <mark class="hl-label orange">理念</mark> ,<mark class="hl-label blue">而不是</mark> <mark class="hl-label green">技术</mark> <mark class="hl-label blue">本身</mark> ,<mark class="hl-label blue">它的理念包括</mark> <mark class="hl-label orange">IoC</mark> <mark class="hl-label blue">和</mark> <mark class="hl-label orange">AOP</mark> 。<p><strong>IoC</strong>: <em>Inversion of Control，控制反转。</em><br><strong>AOP</strong>: <em>Aspect Oriented Programming，面向切面编程。</em></p><h3 id="什么是Spring？"><a href="#什么是Spring？" class="headerlink" title="什么是Spring？"></a><center>什么是Spring？</center></h3><p><strong>Spring</strong>：<em>是一个轻量级的 DI / IoC 和 AOP 容器的开源框架，来源于 <strong>Rod Johnson</strong> 在其著作《Expert one on one J2EE design and development》中阐述的部分理念和原型衍生而来。</em><br><strong>Spring提倡</strong>：<em>以“最少侵入”的方式来管理应用中的代码，这意味着我们可以随时安装或者卸载 Spring。</em><br><strong>适用范围</strong>：<em>任何 Java 应用。</em><br><strong>Spring的根本使命</strong>：<em>简化 Java 开发。</em></p><h3 id="Spring架构图"><a href="#Spring架构图" class="headerlink" title="Spring架构图"></a><center>Spring架构图</center></h3><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/cover/spring.png" alt="Spring架构"></p><ul><li><em>Data Access/Integration层包含有JDBC、ORM、OXM、JMS和Transaction模块。</em></li><li><em>Web层包含了Web、Web-Servlet、WebSocket、Web-Porlet模块。</em></li><li><em>AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现。</em></li><li><em>Core Container(核心容器)：包含有Beans、Core、Context和SpEL模块。</em></li><li><em>Test模块支持使用JUnit和TestNG对Spring组件进行测试。</em></li><li><strong>Spring Core</strong>、<strong>Spring AOP</strong>、<strong>Spring ORM</strong>、<strong>Spring DAO</strong>、<strong>Spring Context</strong>、 <strong>Spring Web</strong>、<strong>Spring Web MVC</strong>。</li></ul><h3 id="Spring的优势"><a href="#Spring的优势" class="headerlink" title="Spring的优势"></a><center>Spring的优势</center></h3><ul><li><strong>低侵入/低耦合 (降低组件之间的耦合度，实现软件各层之间的解耦)</strong></li><li><strong>声明式事务管理(基于切面和惯例)</strong></li><li><strong>方便集成其他框架(如MyBatis、Hibernate)</strong></li><li><strong>降低Java开发难度</strong></li><li><strong>Spring框架中包括了 J2EE 三层的每一层的解决方案(一站式)</strong></li></ul><h3 id="Spring能帮我们做什么"><a href="#Spring能帮我们做什么" class="headerlink" title="Spring能帮我们做什么"></a><center>Spring能帮我们做什么</center></h3><p><strong>①</strong> Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。<br><strong>②</strong> Spring 面向切面编程能帮助我们无耦合的实现日志记录，性能统计，安全控制。<br><strong>③</strong> Spring 能非常简单的帮我们管理数据库事务。<br><strong>④</strong> Spring 还提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成，而且自己也提供了一套JDBC访问模板来方便数据库访问。<br><strong>⑤</strong> Spring 还提供与第三方Web(如Struts1/2、JSF)框架无缝集成，而且自己也提供了一套Spring MVC框架，来方便web层搭建。<br><strong>⑥</strong> Spring 能方便的与Java EE(如Java Mail、任务调度)整合，与更多技术整合(比如缓存框架)。</p><h3 id="常用术语"><a href="#常用术语" class="headerlink" title="常用术语"></a><center>常用术语</center></h3><mark class="hl-label purple">框架</mark> <strong>:</strong>是指能完成一定功能的半成品。<br><p>&emsp;&emsp;框架能帮助我们完成的是:</strong>项目的整体框架、一些基础功能、规定了类和对象如何创建，如何协作等，当我们开发一个项目时，框架帮助我们完成了一部分功能，我们自己再完成一部分，那这个项目就完成了。<br></p><mark class="hl-label purple">非侵入式</mark> <strong>:</strong><br><p>&emsp;&emsp;从框架的角度可以理解为：<strong>无需继承框架提供的任何类。</strong>这样我们在更换框架时，之前写过的代码几乎可以继续使用。</p><mark class="hl-label purple">轻量级</mark> 是相对于重量级而言的，<strong>轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等</strong>，其实就是<strong>比较容易使用</strong>，而<strong>重量级正好相反</strong>。<br><br><mark class="hl-label purple">容器</mark> <strong>:</strong>在日常生活中容器就是一种盛放东西的器具，从程序设计角度看就是装对象的的对象，因为存在放入、拿出等操作，所以容器还要管理对象的生命周期。<br><br><mark class="hl-label purple">JavaBean</mark> <strong>:</strong>即<strong>符合 JavaBean 规范</strong>的 Java 类。<br><mark class="hl-label purple">POJO</mark> <strong>:</strong>即 <strong>Plain Old Java Objects</strong>，简单老式 Java 对象。<strong>它可以包含业务逻辑或持久化逻辑</strong>，但不担当任何特殊角色且不继承或不实现任何其它Java框架的类或接口。<br><p><strong>注意：</strong><em>bean 的各种名称——虽然 Spring 用 bean 或者 JavaBean 来表示应用组件，但并不意味着 Spring 组件必须遵循 JavaBean 规范，一个 Spring 组件可以是任意形式的 POJO。</em></p><h2 id="流程理解"><a href="#流程理解" class="headerlink" title="流程理解"></a><center>流程理解</center></h2><p>&emsp;&emsp;Spring源码中的基本原理其实就是通过反射解析类及其类的各种信息，包括构造器、方法及其参数，属性。然后将其封装成bean定义信息类、constructor信息类、method信息类、property信息类，最终放在一个map里，也就是所谓的container，池等等，其实就是个map……<br>&emsp;&emsp;当你写好配置文件，启动项目后，框架会先按照你的配置文件找到那个要scan的包，然后解析包里面的所有类，找到所有含有@bean，@service等注解的类，利用反射解析它们，包括解析构造器，方法，属性等等，然后封装成各种信息类放到一个map里。每当你需要一个bean的时候，框架就会从container找是不是有这个类的定义啊？如果找到则通过构造器new出来(这就是控制反转，不用你new,框架帮你new)，再在这个类找是不是有要注入的属性或者方法，比如标有@autowired的属性，如果有则还是到container找对应的解析类，new出对象，并通过之前解析出来的信息类找到setter方法，然后用该方法注入对象(这就是依赖注入)。<br>&emsp;&emsp;如果其中有一个类container里没找到，则抛出异常，比如常见的spring无法找到该类定义，无法wire的异常。还有就是嵌套bean则用了一下递归，container会放到servletcontext里面，每次request从servletcontext找这个container即可，不用多次解析类定义。如果bean的scope是singleton，则会重用这个bean不再重新创建，将这个bean放到一个map里，每次用都先从这个map里面找。如果scope是session，则该bean会放到session里面。</p><p>—转自 @王奕然 -知乎。</p><h2 id="Bean的生命周期"><a href="#Bean的生命周期" class="headerlink" title="Bean的生命周期"></a>Bean的生命周期</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/cover/bean.jpg" alt="Bean"></p><p><strong>①</strong> <mark class="hl-label green">Spring</mark> 启动，查找并加载需要被Spring管理的bean，进行<mark class="hl-label purple">Bean的实例化</mark> 。<br><strong>②</strong> <mark class="hl-label blue">Bean</mark> 实例化后对将Bean的<strong>引入和值</strong><mark class="hl-label purple">注入到Bean的属性中</mark> 。<br><strong>③</strong> 如果<mark class="hl-label blue">Bean</mark> 实现了<strong>BeanNameAware</strong>接口的话，Spring将Bean的<mark class="hl-label purple">Id传递</mark> 给<strong>setBeanName()</strong>方法<br><strong>④</strong> 如果<mark class="hl-label blue">Bean</mark> 实现了<strong>BeanFactoryAware</strong>接口的话，Spring将调用<strong>setBeanFactory()</strong>方法，将<mark class="hl-label purple">BeanFactory容器实例传入</mark> 。<br><strong>⑤</strong> 如果<mark class="hl-label blue">Bean</mark> 实现了<strong>ApplicationContextAware</strong>接口的话，Spring将调用Bean的<strong>setApplicationContext()</strong>方法，将bean所在<mark class="hl-label purple">应用上下文引用传入</mark> 进来。<br><strong>⑥</strong> 如果<mark class="hl-label blue">Bean</mark> 实现了<strong>BeanPostProcessor</strong>接口，Spring就将调用他们的<strong>postProcessBeforeInitialization()</strong>方法。<br><strong>⑦</strong> 如果<mark class="hl-label blue">Bean</mark> 实现了<strong>InitializingBean</strong>接口，Spring将调用他们的<strong>afterPropertiesSet()</strong>方法。类似的，如果bean使用init-method声明了<mark class="hl-label purple">初始化</mark> 方法，该方法也会被调用<br><strong>⑧</strong> 如果<mark class="hl-label blue">Bean</mark> 实现了<strong>BeanPostProcessor</strong>接口，Spring就将调用他们的<strong>postProcessAfterInitialization()</strong>方法。<br><strong>⑨</strong> 此时，Bean已经<mark class="hl-label purple">准备就绪</mark> ，可以被应用程序使用了。他们将一直驻留在应用上下文中，直到应用上下文被销毁。<br><strong>⑩</strong> 如果bean实现了<strong>DisposableBean</strong>接口，Spring将调用它的<strong>destory()</strong>接口方法，同样，如果bean使用了<strong>destory-method</strong> 声明<mark class="hl-label purple">销毁</mark> 方法，该方法也会被调用。</p><h2 id="IoC"><a href="#IoC" class="headerlink" title="IoC"></a><center>IoC</center></h2><h3 id="思考"><a href="#思考" class="headerlink" title="思考"></a>思考</h3><mark class="hl-label purple">谁控制谁?</mark> <mark class="hl-label blue">IoC容器管理对象的生命周期!</mark> </br><mark class="hl-label purple">控制什么?</mark> <mark class="hl-label blue">控制对象!</mark> </br><mark class="hl-label purple">为何要反转?</mark> <mark class="hl-label blue">方便管理，降低耦合度!</mark> </br><mark class="hl-label purple">哪些方面反转了?</mark> <mark class="hl-label blue">原来是资源的使用者,现在是IoC容器!</mark> <h3 id="作用"><a href="#作用" class="headerlink" title="作用"></a>作用</h3><ul><li><strong>①</strong> 资源集中管理，方便易于管理。</li><li><strong>②</strong> 降低了双方依赖资源的依赖程度，也就是降低耦合度。</li></ul><h3 id="重点"><a href="#重点" class="headerlink" title="重点"></a>重点</h3><p>控制反转是目的，依赖注入(和依赖查找)是手段。</p><h3 id="底层原理"><a href="#底层原理" class="headerlink" title="底层原理"></a>底层原理</h3><p><strong>IoC底层原理:</strong>XML解析，工厂模式，反射。</p><h3 id="正反转对比"><a href="#正反转对比" class="headerlink" title="正反转对比"></a>正反转对比</h3><p>正控：若要使用某个对象，需要自己去负责对象的创建。<br>反控：若要使用某个对象，只需要从 Spring 容器中获取需要使用的对象，不关心对象的创建过程，也就是把创建对象的控制权反转给了Spring框架。</p><figure class="highlight java"><figcaption><span>正转代码示例:</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Boy boy=<span class="keyword">new</span> Boy();</span><br><span class="line"></span><br><span class="line">BeautfulGirl beatuifulGirl=<span class="keyword">new</span> BeautifulGirl();</span><br><span class="line">beautifulGirl.setAttributes(<span class="string">&quot;性格好,身材好.&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">true</span>==boy.getHouseAndCar())&#123;</span><br><span class="line">   boy.setGirlFriend(beautifulGirl);</span><br><span class="line">   boy.doSomething();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight java"><figcaption><span>反转代码示例:</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 孙笑川童鞋  @带带大师兄</span></span><br><span class="line">Boy sunXiaoChuan=<span class="keyword">new</span> Boy();</span><br><span class="line"></span><br><span class="line">ApplicationContet context = <span class="keyword">new</span> ClassPathXmlApplicationContext(<span class="string">&quot;beans.xml&quot;</span>);</span><br><span class="line">BeautfulGirl beautifulGirl = (BeautfulGirl)context.getBean(<span class="string">&quot;beautifulGay&quot;</span>);</span><br><span class="line"></span><br><span class="line">sunXiaoChuan.setGirlFriend(beautifulGirl);</span><br><span class="line">sunXiaoChuan.doSomething(); </span><br></pre></td></tr></table></figure><h3 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h3><p><strong>控制反转:</strong>&ensp;把对象创建和对象之间的调用过程，交给spring管理。方便管理，降低耦合度。<br><strong>IoC的操作bean管理：</strong>1.创建对象 2.注入属性。</p><h2 id="AOP"><a href="#AOP" class="headerlink" title="AOP"></a>AOP</h2><h3 id="含义"><a href="#含义" class="headerlink" title="含义"></a>含义</h3><mark class="hl-label purple">AOP</mark> <strong>:</strong>面向切面编程。不修改源码，可以增加某些逻辑，降低逻辑间的耦合度。<h3 id="实现方式"><a href="#实现方式" class="headerlink" title="实现方式"></a>实现方式</h3><mark class="hl-label purple">方式</mark> <strong>:</strong><ul><li>有接口用jdk动态代理，实现类实现。</li><li>没接口用cglib动态代理。子类继承实现。</li></ul><h3 id="底层原理-1"><a href="#底层原理-1" class="headerlink" title="底层原理"></a>底层原理</h3><mark class="hl-label purple">原理</mark> <strong>:</strong>使用动态代理。<h3 id="关键词"><a href="#关键词" class="headerlink" title="关键词"></a>关键词</h3><h4 id="连接点"><a href="#连接点" class="headerlink" title="连接点"></a>连接点</h4><mark class="hl-label purple">连接点</mark> <strong>:</strong>类中可以加强的方法，称为连接点。<h4 id="切入点"><a href="#切入点" class="headerlink" title="切入点"></a>切入点</h4><mark class="hl-label purple">切入点</mark> <strong>:</strong>类中实际加强的方法，称为切入点。<h4 id="切面"><a href="#切面" class="headerlink" title="切面"></a>切面</h4><mark class="hl-label purple">切面</mark> <strong>:</strong>把通知应用到切入点的过程。<h4 id="通知范围"><a href="#通知范围" class="headerlink" title="通知范围"></a>通知范围</h4><mark class="hl-label purple">范围</mark> <strong>:</strong><strong>前置通知</strong>，<strong>后置通知</strong>，<strong>环绕通知</strong>，<strong>异常通知</strong>，<strong>最终通知</strong>。<hr>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Spring笔记&quot;&gt;&lt;a href=&quot;#Spring笔记&quot; class=&quot;headerlink&quot; title=&quot;Spring笔记&quot;&gt;&lt;/a&gt;&lt;center&gt;Spring笔记&lt;/center&gt;&lt;/h1&gt;&lt;h2 id=&quot;初识&quot;&gt;&lt;a href=&quot;#初识&quot; class=</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>《鱿鱼游戏》与职场</title>
    <link href="https://www.lixiangpro.com/article/squid-game/"/>
    <id>https://www.lixiangpro.com/article/squid-game/</id>
    <published>2021-12-02T12:00:02.000Z</published>
    <updated>2026-09-09T06:43:00.144Z</updated>
    
    <content type="html"><![CDATA[<h1 id="《鱿鱼游戏》"><a href="#《鱿鱼游戏》" class="headerlink" title="《鱿鱼游戏》 "></a><center>《鱿鱼游戏》 </center></h1><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-red"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>警告:本文内容可能会涉及到一定的剧透</p></div></div><mark class="hl-label pink">假如生活欺骗了你^</mark> <mark class="hl-label green">你是否还会保持微笑呢？</mark> <p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-01-10.jpg" alt="SquidGame-01-10.jpg"></p><h2 id="123木头人"><a href="#123木头人" class="headerlink" title="123木头人"></a>123木头人</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-01-00.jpg" alt="SquidGame-01-00.jpg"></p><mark class="hl-label purple">剧中:</mark> 在规定时间内冲到终点，人偶回头的时候要定在原地不能动，如被扫描到有移动将会被<mark class="hl-label red">射杀</mark> 。</br><mark class="hl-label blue">职场:</mark> 现实中职场，打工人需保持持续进步哪怕是划水学习，需要不断提升自身能力，才不会被职场游戏或这个社会所淘汰(划水过多或成长太少-><mark class="hl-label red">淘汰</mark> )。<h2 id="抠糖饼"><a href="#抠糖饼" class="headerlink" title="抠糖饼"></a>抠糖饼</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-02-00.jpg" alt="SquidGame-02-00.jpg"></p><mark class="hl-label purple">剧中:</mark> 每人一根针，从糖饼中将自己在游戏前选的图案完整扣下来，超时或损坏则视为失败将被<mark class="hl-label red">射杀</mark> 。</br><mark class="hl-label blue">职场:</mark> 想要做成一件事，需具备一定的耐心和细心，战友的援助和较好的工具支持是“雪中送碳”，但是人的能力总是会达到一定的天花板，<mark class="hl-label green">舔</mark> 的好也不可谓是一项"硬"本领，避免前期就被<mark class="hl-label red">淘汰</mark> 。<p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-02-00-00.jpg" alt="SquidGame-02-00-00.jpg"></p><mark class="hl-label orange">联想:</mark> "糖饼"确实是自己选的，然而大家的选择潜意识是被上一代人所影响的，或当下所稀缺的。</br><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;就像大部分人的<strong>大学选专业</strong>也是类似，特别是高中时期的眼界有限，精力都用在<strong>洗脑八股文</strong>上。这里其实比拼的是<mark class="hl-label green">运气</mark> 和上一代人的<mark class="hl-label green">智慧和眼界</mark> 。不同的选择，所需付出的<strong>努力</strong>-&gt;<strong>天差地别</strong>。没有开天眼，你怎么会知道自己的选择是条不归路？现在的血与泪就是原来选择时候脑子进的水。小事情可以随性，关键的选择要<strong>慎重</strong>，需有<strong>独立思考</strong>的能力。</p><h2 id="拔河"><a href="#拔河" class="headerlink" title="拔河"></a>拔河</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-03-04.jpg" alt="SquidGame-03-04.jpg"></p><mark class="hl-label purple">剧中:</mark> 拔河是主要拼团队力量的游戏，输的一方全部人员会直接从高空堕落<mark class="hl-label red">死亡</mark> 。</br><mark class="hl-label blue">职场:</mark> 公司开辟两条新业务线，每个业务线的Leader都会招人，不同部门产品技术力量的实力会有一些差距，但是这部分差距不是唯一因素。真正决定业务的发展和公司的生存往往是中高层Leader的决策，及成员的齐心协力。失败一方，就要面对<mark class="hl-label red">裁员</mark> 。<p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-03-00-00.jpg" alt="SquidGame-03-00-00.jpg"></p><h2 id="弹珠"><a href="#弹珠" class="headerlink" title="弹珠"></a>弹珠</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-04-02.jpg" alt="SquidGame-04-02.jpg"></p><mark class="hl-label purple">剧中:</mark> 两人一组，要使用各自的弹珠和身旁的同伴比赛，赢得对方弹珠的人获胜，输者将被<mark class="hl-label red">枪毙</mark> 。他们都是不知道游戏内容的时候组成的队伍，按照之前的逻辑，他们会选择和最强者组队，或者是和<strong>最信任的人</strong>，<strong>最亲的人</strong>，<strong>最熟悉的人</strong>组队。</br><mark class="hl-label blue">职场:</mark> 前一秒两个人是<strong>“共生死”</strong>的"战友"，后一秒就要<strong>"二选一"</strong>。都肩负着各自的<strong>家庭</strong>，却要共同争夺同一个职位。大一点的像经营公司的夫妻去争夺公章。小一点的，像老家店铺旁，一对租房做生意的夫妻，辛辛苦苦的劳作，却还是“干黄铺了”，最终离婚收场。<mark class="hl-label red">零和博弈</mark> ，<strong>生存</strong>逼着人<strong>不择手段</strong>。<p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-04-00-01.jpg" alt="SquidGame-04-00-01.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-04-00-02.jpg" alt="SquidGame-04-00-02.jpg"></p><mark class="hl-label orange">联想:</mark> 没有最惨只有更惨，剧中的<strong>机械从业者</strong>在糟糕的工作环境下，受工伤手指断掉(制造业<mark class="hl-label green">正常情况</mark> ，有资深经验的“<strong>老师傅</strong>”还讲过制造型小企业里-“<mark class="hl-label red">断掉的手指</mark> 可以用<mark class="hl-label red">筐</mark> 装”)，身体残缺还会被歧视，如此还被拖欠微薄的工资，工作成长的附加值可能就是"<strong>力气更大了</strong>"。<h2 id="猜玻璃"><a href="#猜玻璃" class="headerlink" title="猜玻璃"></a>猜玻璃</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-05-02.jpg" alt="SquidGame-05-02.jpg"></p><mark class="hl-label purple">剧中:</mark> 玻璃桥由<strong>普通玻璃</strong>和<strong>钢化玻璃</strong>组成，垫脚过玻璃桥，踩到<strong>普通玻璃</strong>即会堕落<mark class="hl-label red">死亡</mark> ，前进的序号跟自己选取的号码有关，大家都不知道是前面号码好还是后面号码好，这个游戏考验的是<strong>运气</strong>和<strong>性格</strong>。</br><mark class="hl-label blue">职场:</mark> 任何领域的发展都有无数个前行者、勇士去探索，而这个世界有些人注定是<strong>倒霉蛋</strong>或<strong>傻蛋</strong>，比如工业时代做农业，互联网时代做工业，当今“生化环材-土木机械”中的<strong>机械</strong>，是<strong>“化环材”</strong>的<strong>集大成者</strong>。总是要有<strong>倒霉傻蛋</strong>去学~~子子孙孙搞奉献去<mark class="hl-label red">送死</mark> ，公平么？“也许这就是<strong>生活</strong>吧”。</br><mark class="hl-label orange">联想:</mark> 不过剧中的有位<strong>20多年经验</strong>的玻璃生产的工人师傅，专业能力过强，可以通过玻璃的反射判断哪个是安全的，一路开挂，但是走到了最后，马上看见<mark class="hl-label green">“曙光”</mark> 的时候被玩金融的一下给扔了下去，<mark class="hl-label red">死</mark> 掉了。<p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-05-01.jpg" alt="SquidGame-05-01.jpg"></p><h2 id="鱿鱼游戏"><a href="#鱿鱼游戏" class="headerlink" title="鱿鱼游戏"></a>鱿鱼游戏</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-07-01.jpg" alt="SquidGame-01-01-00.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-07-04.jpg" alt="SquidGame-01-01-00.jpg"></p><mark class="hl-label purple">剧中:</mark> 韩国国民童年游戏，攻击者进入鱿鱼图案中，突破防守者，踩在鱿鱼图案的头部即为获胜，防守者把进入鱿鱼图案中的攻击者推出去即为获胜，当攻击或者防守者任何一方进入了无法继续的状态(<mark class="hl-label red">死亡</mark> )，剩余的一方即为获胜。</br><mark class="hl-label blue">职场:</mark> 赢者通吃，输者功亏一篑，留给普通人的容错率不高，而坚持到最后的也会失去一些东西，例如<mark class="hl-label green">时间、活力、健康</mark> 。<h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-07-03.jpg" alt="SquidGame-01-01-00.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-07-02.jpg" alt="SquidGame-01-01-00.jpg"></p><h2 id="胡思乱想"><a href="#胡思乱想" class="headerlink" title="胡思乱想"></a>胡思乱想</h2><ul><li><mark class="hl-label pink">运气</mark> 也属于<mark class="hl-label purple">实力</mark> 的一部分。</li><li>普通人和富豪应该都会面对生活最终无趣。那就在有限的时间，尽量去做些<mark class="hl-label green">有意义</mark> 的事。</li><li>过度负债会让人失去胆量，同时失去现金流，将被上层阶级-安排的明明白白，<mark class="hl-label red">疲于奔命</mark> 。</li><li>把“小🐷储钱罐”当作养老金，那就更<mark class="hl-label red">恐怖</mark> 了</li></ul><h2 id="最后还是要选择SMILE"><a href="#最后还是要选择SMILE" class="headerlink" title="最后还是要选择SMILE"></a>最后还是要选择SMILE</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/GIF-2021-11-23-001055_compress.gif" alt="GIF-2021-11-23-001055.gif"></p><h2 id="主角经历"><a href="#主角经历" class="headerlink" title="主角经历"></a>主角经历</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-01-00-00.jpg" alt="SquidGame-01-01.jpg"></p><h2 id="截图与壁纸"><a href="#截图与壁纸" class="headerlink" title="截图与壁纸"></a>截图与壁纸</h2><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-google-04.jpg" alt="SquidGame-google-04.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-google-03.jpg" alt="SquidGame-google-03.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-google-05.jpg" alt="SquidGame-google-05.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-google-07.jpg" alt="SquidGame-google-07.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-google-06.jpg" alt="SquidGame-google-06.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-02-03.jpg" alt="SquidGame-02-03.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-02-09.jpg" alt="SquidGame-02-09.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-01-09.jpg" alt="SquidGame-01-09.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-02-02.jpg" alt="SquidGame-02-02.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-02-04.jpg" alt="SquidGame-02-04.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-02-05.jpg" alt="SquidGame-02-05.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-06-02.jpg" alt="SquidGame-06-02.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-01-08.jpg" alt="SquidGame-01-08.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/SquidGame/SquidGame-06-05.jpg" alt="SquidGame-06-05.jpg"></p><h2 id="END"><a href="#END" class="headerlink" title="END"></a>END</h2><mark class="hl-label purple">001号的观点也是故事作者的想法。</mark> <div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>到这里是否还会有人坚持，去选择相信人性呢？</p></div></div>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;《鱿鱼游戏》&quot;&gt;&lt;a href=&quot;#《鱿鱼游戏》&quot; class=&quot;headerlink&quot; title=&quot;《鱿鱼游戏》 &quot;&gt;&lt;/a&gt;&lt;center&gt;《鱿鱼游戏》 &lt;/center&gt;&lt;/h1&gt;&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;prog</summary>
      
    
    
    
    <category term="影视" scheme="https://www.lixiangpro.com/categories/%E5%BD%B1%E8%A7%86/"/>
    
    
  </entry>
  
  <entry>
    <title>Hadoop集群搭建</title>
    <link href="https://www.lixiangpro.com/article/hadoop/"/>
    <id>https://www.lixiangpro.com/article/hadoop/</id>
    <published>2021-09-25T10:22:58.000Z</published>
    <updated>2026-09-09T06:43:00.128Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-blue"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>Hadoop集群搭建部署</p></div></div><hr><h1 id="Hadoop基础"><a href="#Hadoop基础" class="headerlink" title="Hadoop基础"></a>Hadoop基础</h1><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>&emsp;&emsp;Hadoop是一个由Apache基金会所开发的分布式系统基础架构。它可以充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统(Distributed File System),其中的一个组件是HDFS(Hadoop Distributed File System)。HDFS有高容错性的特点,并且设计用来部署在低廉的(Low Cost)硬件上,而且它提供高吞吐量(High Throughput)来访问应用程序的数据,适合那些有着超大数据集(Large Data Set)的应用程序。HDFS放宽了(Relax)POSIX的要求,可以以流的形式访问(Streaming Access)文件系统中的数据。<br>&emsp;&emsp;Hadoop的框架最核心的设计就是：HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。</p><h2 id="架构图"><a href="#架构图" class="headerlink" title="架构图"></a>架构图</h2><h3 id="HDFS"><a href="#HDFS" class="headerlink" title="HDFS"></a>HDFS</h3><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/hdfs.png" alt="HDFS"></p><h3 id="MapReduce"><a href="#MapReduce" class="headerlink" title="MapReduce"></a>MapReduce</h3><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/mapreduce.jpg" alt="MapReduce"></p><h3 id="Yarn"><a href="#Yarn" class="headerlink" title="Yarn"></a>Yarn</h3><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/yarn.jpg" alt="Yarn"></p><h1 id="Hadoop集群搭建"><a href="#Hadoop集群搭建" class="headerlink" title="Hadoop集群搭建"></a>Hadoop集群搭建</h1><h2 id="架设Bridge网络及集群部署"><a href="#架设Bridge网络及集群部署" class="headerlink" title="架设Bridge网络及集群部署"></a>架设Bridge网络及集群部署</h2><p>作者已在DockerHub上构建集成 JDK1.8&amp;&amp;Hadoop3.2.0 的镜像：<a href="https://registry.hub.docker.com/repository/docker/caoofduty/hadoop-base">caoofduty/hadoop-base</a> 开箱即用~~</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 拉取镜像</span></span><br><span class="line">docker pull caoofduty/hadoop-base:latest</span><br><span class="line"><span class="meta">#</span><span class="bash"> 搭建网络</span></span><br><span class="line">docker network create --subnet=172.8.0.0/16 hadoopnetwork</span><br><span class="line"><span class="meta">#</span><span class="bash"> 集群战术部署</span></span><br><span class="line">docker run -itd --name hadoop2  --net hadoopnetwork  --ip 172.8.0.2 --add-host hadoop2:172.8.0.2 --add-host hadoop3:172.8.0.3 --add-host hadoop4:172.8.0.4 -d -p 8088:8088 -p 9000:9000 -p 50070:50070 -p 9001:9001 -p 8030:8030 -p 8031:8031 -p 8032:8032 -p 8033:8033 -p 10020:10020 -p 19888:19888 caoofduty/hadoop-base:latest /bin/bash</span><br><span class="line">docker run -itd --name hadoop3  --net hadoopnetwork  --ip 172.8.0.3 --add-host hadoop2:172.8.0.2 --add-host hadoop3:172.8.0.3 --add-host hadoop4:172.8.0.4 -d -P caoofduty/hadoop-base:latest /bin/bash</span><br><span class="line">docker run -itd --name hadoop4  --net hadoopnetwork  --ip 172.8.0.4 --add-host hadoop2:172.8.0.2 --add-host hadoop3:172.8.0.3 --add-host hadoop4:172.8.0.4 -d -P caoofduty/hadoop-base:latest /bin/bash</span><br><span class="line"><span class="meta">#</span><span class="bash"> 开启容器的SSH</span></span><br><span class="line">docker exec -d hadoop2 /usr/sbin/sshd</span><br><span class="line">docker exec -d hadoop3 /usr/sbin/sshd</span><br><span class="line">docker exec -d hadoop4 /usr/sbin/sshd</span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入Master容器-刷新环境变量</span></span><br><span class="line">source /etc/profile </span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入Master容器-启动集群</span></span><br><span class="line">/usr/local/hadoop/sbin/start-all.sh</span><br><span class="line"><span class="meta">#</span><span class="bash"> 该镜像已集成后续的核心配置项,无需调整-开箱即用。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 访问后台查看节点状态: http://localhost:8088/cluster</span></span><br></pre></td></tr></table></figure><h2 id="附-含SSH功能的Centos系统"><a href="#附-含SSH功能的Centos系统" class="headerlink" title="附:含SSH功能的Centos系统"></a>附:含SSH功能的Centos系统</h2><p>作者已在DockerHub上构建好包含SSH服务的Linux镜像：<a href="https://registry.hub.docker.com/repository/docker/caoofduty/centos-ssh">caoofduty/centos-ssh</a> 开箱即用哦~~<br><b>说明:</b>此镜像可以视为一个可快速部署的Linux基本盘。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 拉取镜像</span></span><br><span class="line">docker pull caoofduty/centos-ssh</span><br><span class="line"><span class="meta">#</span><span class="bash"> 启动容器</span></span><br><span class="line">docker run -itd --name centos-ssh caoofduty/centos-ssh /bin/bash</span><br><span class="line"><span class="meta">#</span><span class="bash">查看ssh服务是否已开启</span></span><br><span class="line">netstat -antp | grep sshd</span><br><span class="line"><span class="meta">#</span><span class="bash"> 开启SSH服务</span></span><br><span class="line">/usr/sbin/sshd</span><br><span class="line"><span class="meta">#</span><span class="bash"> 设置免密登录</span></span><br><span class="line">ssh-keygen -t rsa -P &#x27;&#x27; -f ~/.ssh/id_rsa</span><br><span class="line">cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><h1 id="Hadoop核心配置"><a href="#Hadoop核心配置" class="headerlink" title="Hadoop核心配置"></a>Hadoop核心配置</h1><h2 id="core-site-xml"><a href="#core-site-xml" class="headerlink" title="core-site.xml"></a>core-site.xml</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 配置文件:core-site.xml</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置用途:Hadoop Core的配置项，例如HDFS和MapReduce常用的I/O设置等。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置详情:</span></span><br><span class="line">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span><br><span class="line">&lt;?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;configuration.xsl&quot;?&gt;</span><br><span class="line">&lt;!--</span><br><span class="line">  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span><br><span class="line">  you may not use this file except in compliance with the License.</span><br><span class="line">  You may obtain a copy of the License at</span><br><span class="line"></span><br><span class="line">    http://www.apache.org/licenses/LICENSE-2.0</span><br><span class="line"></span><br><span class="line">  Unless required by applicable law or agreed to in writing, software</span><br><span class="line">  distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span><br><span class="line">  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span><br><span class="line">  See the License for the specific language governing permissions and</span><br><span class="line">  limitations under the License. See accompanying LICENSE file.</span><br><span class="line"><span class="meta">--&gt;</span><span class="bash"></span></span><br><span class="line"><span class="bash"></span></span><br><span class="line">&lt;!-- Put site-specific property overrides in this file. --&gt;</span><br><span class="line"></span><br><span class="line">&lt;configuration&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;fs.default.name&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;hdfs://hadoop2/&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;io.file.buffer.size&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;131072&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;hadoop.tmp.dir&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;/home/hadoop/tmp&lt;/value&gt;</span><br><span class="line">        &lt;description&gt;Abase for other temporary directories.&lt;/description&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">&lt;/configuration&gt;</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 配置文件:hdfs-site.xml</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置用途:HDFS功能配置等。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置详情:</span></span><br><span class="line">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span><br><span class="line">&lt;?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;configuration.xsl&quot;?&gt;</span><br><span class="line">&lt;!--</span><br><span class="line">  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span><br><span class="line">  you may not use this file except in compliance with the License.</span><br><span class="line">  You may obtain a copy of the License at</span><br><span class="line">    http://www.apache.org/licenses/LICENSE-2.0</span><br><span class="line">  Unless required by applicable law or agreed to in writing, software</span><br><span class="line">  distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span><br><span class="line">  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span><br><span class="line">  See the License for the specific language governing permissions and</span><br><span class="line">  limitations under the License. See accompanying LICENSE file.</span><br><span class="line"><span class="meta">--&gt;</span><span class="bash"></span></span><br><span class="line"><span class="bash"></span></span><br><span class="line">&lt;!-- Put site-specific property overrides in this file. --&gt;</span><br><span class="line"></span><br><span class="line">&lt;configuration&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;dfs.namenode.secondary.http-address&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;hadoop2:9001&lt;/value&gt;</span><br><span class="line">        &lt;description&gt;# 通过web界面来查看HDFS状态 &lt;/description&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;dfs.namenode.name.dir&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;/home/hadoop/dfs/name&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;dfs.datanode.data.dir&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;/home/hadoop/dfs/data&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;dfs.replication&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;2&lt;/value&gt;</span><br><span class="line">        &lt;description&gt;# 每个Block有2个备份&lt;/description&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;dfs.webhdfs.enabled&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;true&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">&lt;/configuration&gt;</span><br></pre></td></tr></table></figure><h2 id="mapred-site-xml"><a href="#mapred-site-xml" class="headerlink" title="mapred-site.xml"></a>mapred-site.xml</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 配置文件:mapred-site.xml</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置用途:MapReduce配置相关。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置详情:</span></span><br><span class="line">&lt;?xml version=&quot;1.0&quot;?&gt;</span><br><span class="line">&lt;?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;configuration.xsl&quot;?&gt;</span><br><span class="line">&lt;!--</span><br><span class="line">  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span><br><span class="line">  you may not use this file except in compliance with the License.</span><br><span class="line">  You may obtain a copy of the License at</span><br><span class="line"></span><br><span class="line">    http://www.apache.org/licenses/LICENSE-2.0</span><br><span class="line"></span><br><span class="line">  Unless required by applicable law or agreed to in writing, software</span><br><span class="line">  distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span><br><span class="line">  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span><br><span class="line">  See the License for the specific language governing permissions and</span><br><span class="line">  limitations under the License. See accompanying LICENSE file.</span><br><span class="line"><span class="meta">--&gt;</span><span class="bash"></span></span><br><span class="line"><span class="bash"></span></span><br><span class="line">&lt;!-- Put site-specific property overrides in this file. --&gt;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&lt;configuration&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;mapreduce.framework.name&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;yarn&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;mapreduce.jobhistory.address&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;hadoop2:10020&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;mapreduce.jobhistory.webapp.address&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;hadoop2:19888&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">&lt;/configuration&gt;</span><br></pre></td></tr></table></figure><h2 id="yarn-site-xml"><a href="#yarn-site-xml" class="headerlink" title="yarn-site.xml"></a>yarn-site.xml</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 配置文件:yarn-site.xml</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置用途:yarn配置相关。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置详情:</span></span><br><span class="line">&lt;?xml version=&quot;1.0&quot;?&gt;</span><br><span class="line">&lt;!--</span><br><span class="line">  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span><br><span class="line">  you may not use this file except in compliance with the License.</span><br><span class="line">  You may obtain a copy of the License at</span><br><span class="line">    http://www.apache.org/licenses/LICENSE-2.0</span><br><span class="line">  Unless required by applicable law or agreed to in writing, software</span><br><span class="line">  distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span><br><span class="line">  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span><br><span class="line">  See the License for the specific language governing permissions and</span><br><span class="line">  limitations under the License. See accompanying LICENSE file.</span><br><span class="line"><span class="meta">--&gt;</span><span class="bash"></span></span><br><span class="line"><span class="bash">&lt;configuration&gt;</span></span><br><span class="line">    &lt;!-- Site specific YARN configuration properties --&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;yarn.nodemanager.aux-services&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;mapreduce_shuffle&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;yarn.nodemanager.aux-services.mapreduce.shuffle.class&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;org.apache.hadoop.mapred.ShuffleHandler&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;yarn.resourcemanager.address&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;hadoop2:8032&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;yarn.resourcemanager.scheduler.address&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;hadoop2:8030&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;yarn.resourcemanager.resource-tracker.address&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;hadoop2:8031&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;yarn.resourcemanager.admin.address&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;hadoop2:8033&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;yarn.resourcemanager.webapp.address&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;hadoop2:8088&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;yarn.nodemanager.resource.memory-mb&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;1024&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">    &lt;property&gt;</span><br><span class="line">        &lt;name&gt;yarn.nodemanager.resource.cpu-vcores&lt;/name&gt;</span><br><span class="line">        &lt;value&gt;1&lt;/value&gt;</span><br><span class="line">    &lt;/property&gt;</span><br><span class="line">&lt;/configuration&gt;</span><br></pre></td></tr></table></figure><h2 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 配置Hadoop的相关JAVA环境变量</span></span><br><span class="line">vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh</span><br><span class="line">export JAVA_HOME=/usr/local/jdk1.8</span><br><span class="line"></span><br><span class="line">vi /usr/local/hadoop/etc/hadoop/mapred-env.sh</span><br><span class="line">export JAVA_HOME=/usr/local/jdk1.8</span><br><span class="line"></span><br><span class="line">vi /usr/local/hadoop/etc/hadoop/yarn-env.sh</span><br><span class="line">export JAVA_HOME=/usr/local/jdk1.8</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 同步命令(场景:以当前hadoop2为主,向hadoop3同步数据)</span></span><br><span class="line">scp -rq /usr/local/hadoop hadoop3:/usr/local</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 初次运行-进入容器-对HDFS进行初始化</span></span><br><span class="line">/usr/local/hadoop/bin/hdfs namenode -format</span><br></pre></td></tr></table></figure><h2 id="可能遇到的问题"><a href="#可能遇到的问题" class="headerlink" title="可能遇到的问题"></a>可能遇到的问题</h2><h3 id="scp–lost-connection"><a href="#scp–lost-connection" class="headerlink" title="scp–lost connection"></a>scp–lost connection</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> scp命令传输报错丢链接(PING主机可正常通信的情况)</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 编辑ip登录白名单</span></span><br><span class="line">vi /etc/hosts.allow</span><br><span class="line"><span class="meta">#</span><span class="bash"> 添加ip</span></span><br><span class="line">sshd:172.8.0.2</span><br><span class="line">sshd:172.8.0.3</span><br><span class="line">sshd:172.8.0.4</span><br><span class="line"><span class="meta">#</span><span class="bash"> 重启sshd服务</span></span><br><span class="line">service sshd restart</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看服务启动状态</span></span><br><span class="line">service sshd status</span><br><span class="line"><span class="meta">#</span><span class="bash"> 注意:不同的服务器都要设置哦,如Hadoop2传输到Hadoop3,两台都需要。</span></span><br></pre></td></tr></table></figure><h3 id="集群启动"><a href="#集群启动" class="headerlink" title="集群启动"></a>集群启动</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 启动报错</span></span><br><span class="line">Starting namenodes on [hadoop2]</span><br><span class="line">ERROR: Attempting to operate on hdfs namenode as root</span><br><span class="line">ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.</span><br><span class="line">Starting datanodes</span><br><span class="line">ERROR: Attempting to operate on hdfs datanode as root</span><br><span class="line">ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.</span><br><span class="line">Starting secondary namenodes [hadoop2]</span><br><span class="line">ERROR: Attempting to operate on hdfs secondarynamenode as root</span><br><span class="line">ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.</span><br><span class="line">2021-09-25 08:16:02,231 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable</span><br><span class="line">Starting resourcemanager</span><br><span class="line">ERROR: Attempting to operate on yarn resourcemanager as root</span><br><span class="line">ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.</span><br><span class="line">Starting nodemanagers</span><br><span class="line">ERROR: Attempting to operate on yarn nodemanager as root</span><br><span class="line">ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.</span><br></pre></td></tr></table></figure><h4 id="解决："><a href="#解决：" class="headerlink" title="解决："></a>解决：</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 编辑配置</span></span><br><span class="line">vi /etc/profile</span><br><span class="line"><span class="meta">#</span><span class="bash"> 添加内容</span></span><br><span class="line">export HDFS_NAMENODE_USER=root</span><br><span class="line">export HDFS_DATANODE_USER=root</span><br><span class="line">export HDFS_SECONDARYNAMENODE_USER=root</span><br><span class="line">export YARN_RESOURCEMANAGER_USER=root</span><br><span class="line">export YARN_NODEMANAGER_USER=root</span><br><span class="line"><span class="meta">#</span><span class="bash"> 立即生效</span></span><br><span class="line">source /etc/profile </span><br></pre></td></tr></table></figure><h1 id="Hadoop知识点补充与总结"><a href="#Hadoop知识点补充与总结" class="headerlink" title="Hadoop知识点补充与总结"></a>Hadoop知识点补充与总结</h1><h2 id="Hadoop集群运行所需进程"><a href="#Hadoop集群运行所需进程" class="headerlink" title="Hadoop集群运行所需进程"></a>Hadoop集群运行所需进程</h2><h3 id="NameNode"><a href="#NameNode" class="headerlink" title="NameNode"></a>NameNode</h3><p>&emsp;&emsp;它是hadoop中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问,保存有metadate。</p><h3 id="SecondaryNameNode"><a href="#SecondaryNameNode" class="headerlink" title="SecondaryNameNode"></a>SecondaryNameNode</h3><p>&emsp;&emsp;它不是namenode的冗余守护进程,而是提供周期检查点和清理任务。帮助NN合并editslog,减少NN启动时间。</p><h3 id="DataNode"><a href="#DataNode" class="headerlink" title="DataNode"></a>DataNode</h3><p>&emsp;&emsp;它负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个datanode守护进程。</p><h3 id="ResourceManager"><a href="#ResourceManager" class="headerlink" title="ResourceManager"></a>ResourceManager</h3><p>&emsp;&emsp;JobTracker负责调度DataNode上的工作。每个DataNode有一个TaskTracker，它们执行实际工作。</p><h3 id="NodeManager"><a href="#NodeManager" class="headerlink" title="NodeManager"></a>NodeManager</h3><p>&emsp;&emsp;执行任务</p><h3 id="DFSZKFailoverController"><a href="#DFSZKFailoverController" class="headerlink" title="DFSZKFailoverController"></a>DFSZKFailoverController</h3><p>&emsp;&emsp;高可用时它负责监控NN的状态,并及时的把状态信息写入ZK。它通过一个独立线程周期性的调用NN上的一个特定接口来获 取NN的健康状态。FC也有选择谁作为Active NN的权利,因为最多只有两个节点,目前选择策略还比较简单(先到先得，轮换)。</p><h3 id="JournalNode"><a href="#JournalNode" class="headerlink" title="JournalNode"></a>JournalNode</h3><p>&emsp;&emsp;高可用情况下存放namenode的editlog文件。</p><h2 id="部署方式"><a href="#部署方式" class="headerlink" title="部署方式"></a>部署方式</h2><h3 id="单机版"><a href="#单机版" class="headerlink" title="单机版"></a>单机版</h3><p>&emsp;&emsp;无需任何守护进程,所有的程序都运行在同一个JVM上执行。在独立模式下调试MR程序非常高效方便。所以一般该模式主要是在学习或者开发阶段调试使用。</p><h3 id="伪分布式"><a href="#伪分布式" class="headerlink" title="伪分布式"></a>伪分布式</h3><p>&emsp;&emsp;Hadoop守护进程运行在本地机器上,模拟一个小规模的集群,换句话说,可以配置一台机器的Hadoop集群,伪分布式是完全分布式的一个特例。</p><h3 id="完全分布式"><a href="#完全分布式" class="headerlink" title="完全分布式"></a>完全分布式</h3><p>&emsp;&emsp;Hadoop守护进程运行在一个集群上。</p><h2 id="特点"><a href="#特点" class="headerlink" title="特点"></a>特点</h2><h3 id="优点："><a href="#优点：" class="headerlink" title="优点："></a>优点：</h3><h4 id="支持超大文件"><a href="#支持超大文件" class="headerlink" title="支持超大文件:"></a>支持超大文件:</h4><p>&emsp;&emsp;HDFS存储的文件可以支持TB和PB级别的数据。在不保证低延时的前提下,具有相当大的吞吐量,非常适合海量数据的运算。</p><h4 id="可靠性"><a href="#可靠性" class="headerlink" title="可靠性:"></a>可靠性:</h4><p>&emsp;&emsp;hadoop能自动地维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。</p><h4 id="高扩展-amp-amp-成本低"><a href="#高扩展-amp-amp-成本低" class="headerlink" title="高扩展&amp;&amp;成本低:"></a>高扩展&amp;&amp;成本低:</h4><p>&emsp;&emsp;可建构在廉价机上,实现线性(横向)扩展,当集群增加新节点之后,NameNode也可以感知,将数据分发和备份到相应的节点上。</p><h4 id="成熟的生态圈"><a href="#成熟的生态圈" class="headerlink" title="成熟的生态圈:"></a>成熟的生态圈:</h4><p>&emsp;&emsp;借助开源的力量,围绕Hadoop衍生的一些小工具。</p><h4 id="高效率"><a href="#高效率" class="headerlink" title="高效率:"></a>高效率:</h4><p>&emsp;&emsp;通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。</p><h3 id="缺点："><a href="#缺点：" class="headerlink" title="缺点："></a>缺点：</h3><h4 id="不能做到低延迟"><a href="#不能做到低延迟" class="headerlink" title="不能做到低延迟:"></a>不能做到低延迟:</h4><p>&emsp;&emsp;既然是海量数据的处理,优先考虑的是该系统的吞吐量等性能问题。所以也很难满足平常的低时延的需求,这点是不可避免的,只能说想办法尽量去权衡两者,进而优化。</p><h4 id="不适合大量的小文件存储"><a href="#不适合大量的小文件存储" class="headerlink" title="不适合大量的小文件存储:"></a>不适合大量的小文件存储:</h4><p>&emsp;&emsp;该框架设计的初衷是针对海量数据的运算处理的问题。因此对于一些数据量很小的处理没有任何优势可言,甚至还不如单机串行的效果,性能也完全体现不出来。</p><h4 id="文件修改效率低"><a href="#文件修改效率低" class="headerlink" title="文件修改效率低:"></a>文件修改效率低:</h4><p>&emsp;&emsp;其文件系统设计的前提是一次写入多次读取的情况,因此我们是无法修改某条详细的数据,只能overwrite全部的数据,或者是在文件末尾追加数据。</p><h4 id="开源项目"><a href="#开源项目" class="headerlink" title="开源项目:"></a>开源项目:</h4><p>&emsp;&emsp;开源本身是一柄双刃剑,它方便了大多数人,但是对于一个有一定规模的公司,项目发展方向的把握,技术保密和支持等都是采用Hadoop这种开源项目必须考虑的问题。</p><h4 id="网络瓶颈"><a href="#网络瓶颈" class="headerlink" title="网络瓶颈:"></a>网络瓶颈:</h4><p>&emsp;&emsp;集群内部是通过tcp/ip协议进行通信的,所以网络带宽也会成为系统的瓶颈之一。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-blue&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot; </summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>SpringCloudGird</title>
    <link href="https://www.lixiangpro.com/article/spring-cloud-grid/"/>
    <id>https://www.lixiangpro.com/article/spring-cloud-grid/</id>
    <published>2021-08-28T13:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.142Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>非网飞新组件，中二少年自娱自乐学习项目。</p></div></div><center><h1>什么是SpringCloudGird?</h1></center><mark class="hl-label blue">SpringCloudGird:</mark> <mark class="hl-label purple">是基于</mark> <mark class="hl-label orange">Netflix</mark> <mark class="hl-label purple">的</mark> <mark class="hl-label blue">SpringCloud</mark> <mark class="hl-label purple">微服务架构，使用</mark> <mark class="hl-label blue">Docker</mark> <mark class="hl-label purple">容器引擎，实现可快速的分布式服务搭建，服务于李想的技术学习与探索。</mark> <h2 id="仓库地址"><a href="#仓库地址" class="headerlink" title="仓库地址:"></a>仓库地址:</h2><p>GIT：<em><a href="https://github.com/Tron-lixiang/SpringCloudGrid">https://github.com/Tron-lixiang/SpringCloudGrid</a></em></p><h2 id="架构图"><a href="#架构图" class="headerlink" title="架构图:"></a>架构图:</h2><h2 id="说明"><a href="#说明" class="headerlink" title="说明:"></a>说明:</h2><p><em>1.项目中基础服务的搭建位于 MiddlewareServices目录下，使用 DockerCompose快速环境搭建，同时可进行服务自定义编排。</em><br><em>2.可模拟不同硬件环境，进行集群学习调试及高并发场景的实现。</em><br><em>3.数据库这种就不走容器部署了，没必要也不建议。</em><br><em>4.Grid命名源于 TRON：Legacy电影中的 Grid System。</em><br><em>5.致敬_TRON。</em></p><h2 id="配置项"><a href="#配置项" class="headerlink" title="配置项:"></a>配置项:</h2><h2 id="TODO"><a href="#TODO" class="headerlink" title="TODO:"></a>TODO:</h2><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 30%" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100"><p>持续迭代</p></div></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-green&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot;</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>Docker笔记</title>
    <link href="https://www.lixiangpro.com/article/docker/"/>
    <id>https://www.lixiangpro.com/article/docker/</id>
    <published>2021-08-21T15:22:58.000Z</published>
    <updated>2026-09-09T06:43:00.121Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-blue"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>此篇笔记的意义:</p></div></div><ul><li><mark class="hl-label purple">上次Docker的学习是好久好久以前,基础的概念和实际使用也是可以的,但是在实际工作中却很少使用(哪怕是真的方便好用),面试时候问相关知识还记得但说不出来,很尴尬。此篇笔记用作复习回忆和指导书型存档。</mark> </li></ul><hr><h1>Docker是什么？</h1>Docker是一个虚拟环境容器,基于Go语言,可以将开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。<h1>Docker的三个关键概念</h1><h3 id="镜像（Image）"><a href="#镜像（Image）" class="headerlink" title="镜像（Image）"></a>镜像（Image）</h3><p>镜像类似于虚拟机中的镜像，是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境，而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板，同理在该镜像上装上Apache软件，就可以称为Apache镜像。</p><h3 id="容器（Container）"><a href="#容器（Container）" class="headerlink" title="容器（Container）"></a>容器（Container）</h3><p>容器类似于一个轻量级的沙盒，可以将其看作一个极简的Linux系统环境（包括root权限、进程空间、用户空间和网络空间等），以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例，可以创建、启动、停止、删除容器，各个容器之间是是相互隔离的，互不影响。注意：镜像本身是只读的，容器从镜像启动时，Docker在镜像的上层创建一个可写层，镜像本身不变。</p><h3 id="仓库（Repository）"><a href="#仓库（Repository）" class="headerlink" title="仓库（Repository）"></a>仓库（Repository）</h3><p>仓库类似于代码仓库，这里是镜像仓库，是Docker用来集中存放镜像文件的地方。注意与注册服务器（Registry）的区别：注册服务器是存放仓库的地方，一般会有多个仓库；而仓库是存放镜像的地方，一般每个仓库存放一类镜像，每个镜像利用tag进行区分，比如Ubuntu仓库存放有多个版本（12.04、14.04等）的Ubuntu镜像。</p><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/docker01.png" alt="架构"></p><h1>Docker的常用命令</h1><h3 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 拉取镜像</span></span><br><span class="line">docker pull centos:7</span><br><span class="line"><span class="meta">#</span><span class="bash"> 启动容器  -i: 交互式操作。 -t: 终端。 -d: 在后台运行。 centos: centos镜像。 /bin/bash：放在镜像名后的是命令，这里我们希望有个交互式 Shell，因此用的是 /bin/bash。</span>   </span><br><span class="line">docker run -it centos /bin/bash</span><br><span class="line"><span class="meta">#</span><span class="bash"> 退出终端</span></span><br><span class="line">exit</span><br><span class="line"><span class="meta">#</span><span class="bash"> 运行web应用  -d:让容器在后台运行。 -P:将容器内部使用的网络端口随机映射到我们使用的主机上。</span></span><br><span class="line">docker run -d -P training/webapp python app.py</span><br><span class="line"><span class="meta">#</span><span class="bash"> 运行web应用指定端口</span></span><br><span class="line">docker run -d -p 5000:5000 training/webapp python app.py</span><br><span class="line"><span class="meta">#</span><span class="bash"> 停止web应用容器</span></span><br><span class="line">docker stop redis(CONTAINER)</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看运行的容器</span></span><br><span class="line">docker ps</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看web应用日志(docker logs可以像使用 tail -f 一样来输出容器内部的标准输出)</span></span><br><span class="line">docker logs -f &lt;CONTAINER_ID&gt;(容器ID)</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看应用容器进程</span></span><br><span class="line">docker top redis(CONTAINER)</span><br></pre></td></tr></table></figure><h3 id="容器命令"><a href="#容器命令" class="headerlink" title="容器命令"></a>容器命令</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 查看所有容器</span></span><br><span class="line">docker ps -a</span><br><span class="line"><span class="meta">#</span><span class="bash"> 启动已停止运行的容器</span></span><br><span class="line">docker start &lt;CONTAINER_ID&gt;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 停止一个容器</span></span><br><span class="line">docker stop &lt;CONTAINER_ID&gt;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入容器</span></span><br><span class="line">docker attach &lt;CONTAINER_ID&gt;   输入exit从容器退出后，容器会停止。</span><br><span class="line">docker exec -it &lt;CONTAINER_ID&gt; 输入exit从容器退出后，容器不会停止。</span><br><span class="line"><span class="meta">#</span><span class="bash"> 导出容器</span></span><br><span class="line">docker export &lt;CONTAINER_ID&gt; &gt; centos.tar  </span><br><span class="line"><span class="meta">#</span><span class="bash"> 删除容器</span></span><br><span class="line">docker rm -f &lt;CONTAINER_ID&gt;</span><br></pre></td></tr></table></figure><h3 id="镜像命令"><a href="#镜像命令" class="headerlink" title="镜像命令"></a>镜像命令</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 列出镜像列表    说明:REPOSITORY：表示镜像的仓库源。 TAG：镜像的标签。 IMAGE ID：镜像ID。 CREATED：镜像创建时间。 SIZE：镜像大小。</span></span><br><span class="line">docker images </span><br><span class="line"><span class="meta">#</span><span class="bash"> 查找镜像       说明:NAME: 镜像仓库源的名称。 DESCRIPTION: 镜像的描述。 OFFICIAL: 是否 docker 官方发布。 stars: 类似 Github 里面的 star，表示点赞、喜欢的意思。 AUTOMATED: 自动构建。</span></span><br><span class="line">docker search hello-world</span><br><span class="line"><span class="meta">#</span><span class="bash"> 删除镜像</span> </span><br><span class="line">docker rmi hello-world</span><br><span class="line"><span class="meta">#</span><span class="bash"> 创建镜像    1、从已经创建的容器中更新镜像，并且提交这个镜像 2、使用 Dockerfile 指令来创建一个新的镜像  说明：-m: 提交的描述信息。 -a: 指定镜像作者。 e218edb10551：容器 ID。 lixiang707/haha:v2: 指定要创建的目标镜像名。</span></span><br><span class="line">docker commit -m=&quot;MOSS INIT&quot; -a=&quot;caoofduty&quot; e218edb10551 caoofduty/moss:v1</span><br><span class="line"><span class="meta">#</span><span class="bash"> 构建镜像   -t ：指定要创建的目标镜像名。  . ：Dockerfile 文件所在目录，可以指定Dockerfile 的绝对路径。</span></span><br><span class="line">cat Dockerfile </span><br><span class="line">docker build -t lixiang707/centos:6.7 .</span><br><span class="line"><span class="meta"> #</span><span class="bash"> 本地保存镜像</span></span><br><span class="line">docker save -o moss.tar caoofduty/moss:v1</span><br><span class="line"><span class="meta">#</span><span class="bash"> 设置镜像标签</span></span><br><span class="line">docker tag 860c279d2aaa lixiang707/haha:dev</span><br><span class="line">  </span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 容器打包成镜像</span></span><br><span class="line">docker commit deepseek-server deepseek-server:dev</span><br><span class="line"><span class="meta">#</span><span class="bash"> 镜像打标</span></span><br><span class="line">docker tag deepseek-server:dev caoofduty/deepseek-server:dev</span><br><span class="line"><span class="meta">#</span><span class="bash"> 镜像推送到远程</span></span><br><span class="line">docker push caoofduty/deepseek-server:dev</span><br></pre></td></tr></table></figure><h1>Dockerfile</h1><h3 id="FROM"><a href="#FROM" class="headerlink" title="FROM"></a>FROM</h3><p>FROM：定制的镜像都是基于 FROM 的镜像，这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。</p><h3 id="RUN"><a href="#RUN" class="headerlink" title="RUN"></a>RUN</h3><p>RUN：用于执行后面跟着的命令行命令。</p><h3 id="COPY"><a href="#COPY" class="headerlink" title="COPY"></a>COPY</h3><p>COPY：复制指令，从上下文目录中复制文件或者目录到容器里指定路径。</p><h3 id="ADD"><a href="#ADD" class="headerlink" title="ADD"></a>ADD</h3><p>ADD: ADD 指令和 COPY 的使用格类似（同样需求下，官方推荐使用 COPY）。功能也类似。ADD 的缺点：在不解压的前提下，无法复制 tar 压缩文件。会令镜像构建缓存失效，从而可能会令镜像构建变得比较缓慢。具体是否使用，可以根据是否需要自动解压来决定。</p><h3 id="CMD"><a href="#CMD" class="headerlink" title="CMD"></a>CMD</h3><p>CMD: 类似于 RUN 指令，用于运行程序，但二者运行的时间点不同:CMD 在docker run 时运行。RUN 是在 docker build。 作用：为启动的容器指定默认要运行的程序，程序运行结束，容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。</p><h3 id="ENTRYPOINT"><a href="#ENTRYPOINT" class="headerlink" title="ENTRYPOINT"></a>ENTRYPOINT</h3><p>ENTRYPOIN: 类似于 CMD 指令，但其不会被 docker run 的命令行参数指定的指令所覆盖，而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。 优点：在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。 注意：如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令，仅最后一个生效。</p><h3 id="ENV"><a href="#ENV" class="headerlink" title="ENV"></a>ENV</h3><p>ENV: 设置环境变量，定义了环境变量，那么在后续的指令中，就可以使用这个环境变量。</p><h3 id="ARG"><a href="#ARG" class="headerlink" title="ARG"></a>ARG</h3><p>ARG: 构建参数，与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效，也就是说只有 docker build 的过程中有效，构建好的镜像内不存在此环境变量。</p><h3 id="VOLUME"><a href="#VOLUME" class="headerlink" title="VOLUME"></a>VOLUME</h3><p>VOLUME: 定义匿名数据卷。在启动容器时忘记挂载数据卷，会自动挂载到匿名卷。</p><h3 id="EXPOSE"><a href="#EXPOSE" class="headerlink" title="EXPOSE"></a>EXPOSE</h3><p>EXPOSE: 仅仅只是声明端口。</p><h3 id="WORKDIR"><a href="#WORKDIR" class="headerlink" title="WORKDIR"></a>WORKDIR</h3><p>WORKDIR: 指定工作目录。用 WORKDIR 指定的工作目录，会在构建镜像的每一层中都存在。（WORKDIR 指定的工作目录，必须是提前创建好的）。</p><h3 id="USER"><a href="#USER" class="headerlink" title="USER"></a>USER</h3><p>USER: 用于指定执行后续命令的用户和用户组，这边只是切换后续命令执行的用户（用户和用户组必须提前已经存在）。</p><h3 id="HEALTHCHECK"><a href="#HEALTHCHECK" class="headerlink" title="HEALTHCHECK"></a>HEALTHCHECK</h3><p>HEALTHCHECK: 用于指定某个程序或者指令来监控 docker 容器服务的运行状态。</p><h3 id="ONBUILD"><a href="#ONBUILD" class="headerlink" title="ONBUILD"></a>ONBUILD</h3><p>ONBUILD: 用于延迟构建命令的执行。简单的说，就是 Dockerfile 里用 ONBUILD 指定的命令，在本次构建镜像的过程中不会执行（假设镜像为 test-build）。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ，这时执行新镜像的 Dockerfile 构建时候，会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。</p><h3 id="LABEL"><a href="#LABEL" class="headerlink" title="LABEL"></a>LABEL</h3><p>LABEL 指令用来给镜像添加一些元数据（metadata）。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-blue&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot; </summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>快捷导航</title>
    <link href="https://www.lixiangpro.com/article/navigation/"/>
    <id>https://www.lixiangpro.com/article/navigation/</id>
    <published>2021-08-15T15:22:58.000Z</published>
    <updated>2026-09-09T06:43:00.138Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>快捷入口</p></div></div><div id="categoryBar">    <ul class="categoryBar-list">        <li class="categoryBar-list-item" onclick="location='https://lixiangpro.com/gallery/'" ><a class="categoryBar-list-link" href="https://lixiangpro.com/gallery/" data-pjax-state="">🎯图集</a><span class="categoryBar-list-count">8</span></li><li class="categoryBar-list-item" onclick="location='https://lixiangpro.com/video/'" ><a class="categoryBar-list-link" href="https://lixiangpro.com/video/" data-pjax-state="">📽️视频</a><span class="categoryBar-list-count">4</span></li><li class="categoryBar-list-item" onclick="location='https://lixiangpro.com/shuoshuo/'" ><a class="categoryBar-list-link" href="https://lixiangpro.com/shuoshuo/" data-pjax-state="">🎀说说</a><span class="categoryBar-list-count">12</span></li><li class="categoryBar-list-item" onclick="location='https://lixiangpro.com/messages/'" ><a class="categoryBar-list-link" href="https://lixiangpro.com/messages/" data-pjax-state="">🍉留言板</a><span class="categoryBar-list-count">9</span></li><li class="categoryBar-list-item" onclick="location='https://lixiangpro.com/movies/'" ><a class="categoryBar-list-link" href="https://lixiangpro.com/movies/" data-pjax-state="">🎬电影</a><span class="categoryBar-list-count">69</span></li><li class="categoryBar-list-item" onclick="location='https://lixiangpro.com/games/'" ><a class="categoryBar-list-link" href="https://lixiangpro.com/games/" data-pjax-state="">🎮游戏</a><span class="categoryBar-list-count">9</span></li>      </ul></div><hr><center><mark class="hl-label purple">欢迎来到本站,愿您在此度过美好的时光~</mark> </center><center><mark class="hl-label pink">亲,如果有什么建议或想法可以在留言板进行留言~</mark> </center><style type="text/css" data-typed-js-css="true">    span.categoryBar-list-count::before,#categoryBar {    width: 100% !important;}ul.categoryBar-list {    margin: 5px 5px 0 5px !important;    padding: 0 !important;}li.categoryBar-list-item {    font-weight: bold;    display: inline-block;    height: 180px !important;    margin: 5px 0.5% 0 0.5% !important;    background-image: -webkit-linear-gradient(rgba(0,0,0,0.4) 25%, rgba(16,16,16,0) 100%);    background-image: -moz-linear-gradient(rgba(0,0,0,0.4) 25%, rgba(16,16,16,0) 100%);    background-image: -o-linear-gradient(rgba(0,0,0,0.4) 25%, rgba(16,16,16,0) 100%);    background-image: -ms-linear-gradient(rgba(0,0,0,0.4) 25%, rgba(16,16,16,0) 100%);    background-image: linear-gradient(rgba(0,0,0,0.4) 25%, rgba(16,16,16,0) 100%);    border-radius: 10px;    padding: 25px 0 25px 25px !important;    -webkit-box-shadow: rgba(50,50,50,0.3) 50px 50px 50px 50px inset;    box-shadow: rgba(50,50,50,0.3) 50px 50px 50px 50px inset;    overflow: hidden;    /*-webkit-background-size: 'url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_01.jpg')' !important;*/    /*-moz-background-size: 'url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_01.jpg')' !important;*/    /*background-size: 'url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_01.jpg')' !important;*/    background-position: center !important;}li.categoryBar-list-item:hover {    -webkit-box-shadow: inset 500px 50px 50px 50px rgba(50,50,50,0.6);    box-shadow: inset 500px 50px 50px 50px rgba(50,50,50,0.6);}li.categoryBar-list-item:hover span.categoryBar-list-count::after {    -webkit-transition: all 0.5s;    -moz-transition: all 0.5s;    -o-transition: all 0.5s;    -ms-transition: all 0.5s;    transition: all 0.5s;    -webkit-transform: translate(-100%, 0);    -moz-transform: translate(-100%, 0);    -o-transform: translate(-100%, 0);    -ms-transform: translate(-100%, 0);    transform: translate(-100%, 0);}a.categoryBar-list-link {    color: #fff !important;    font-size: 20px !important;}a.categoryBar-list-link::before {    content: '|' !important;    color: #fff !important;    font-size: 20px !important;}a.categoryBar-list-link:after {    content: '';    position: relative;    width: 0;    bottom: 0;    display: block;    height: 3px;    border-radius: 3px;    background-color: #fff;}a.categoryBar-list-link:hover:after {    width: 90%;    left: 1%;    -webkit-transition: all 0.5s;    -moz-transition: all 0.5s;    -o-transition: all 0.5s;    -ms-transition: all 0.5s;    transition: all 0.5s;~~~~}span.categoryBar-list-count {    display: block !important;    color: #fff !important;    font-size: 20px !important;}span.categoryBar-list-count::before {    content: '✻' !important;    padding-right: 15px !important;}span.categoryBar-list-count::after {    padding: 5px;    display: block !important;    color: #fff !important;    font-size: 20px !important;    position: relative;    right: -100%;}li.categoryBar-list-item:nth-child(1) {    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_02.jpg');}li.categoryBar-list-item:nth-child(2) {    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_03.jpg');}li.categoryBar-list-item:nth-child(3) {    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_04.jpg');}li.categoryBar-list-item:nth-child(4) {    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_05.jpg');}li.categoryBar-list-item:nth-child(5) {    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_06.jpg');}li.categoryBar-list-item:nth-child(6) {    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_07.jpg');}/*li.categoryBar-list-item:nth-child(7) {*//*    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_08.jpg');*//*}*//*li.categoryBar-list-item:nth-child(8) {*//*    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_09.jpg');*//*}*//*li.categoryBar-list-item:nth-child(9) {*//*    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_10.jpg');*//*}*//*li.categoryBar-list-item:nth-child(10) {*//*    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_11.jpg');*//*}*//*li.categoryBar-list-item:nth-child(11) {*//*    background: url('https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/ACG/ACG_01.jpg');*//*}*/li.categoryBar-list-item:nth-child(1)>span::after {    content: '超级精彩' !important;}li.categoryBar-list-item:nth-child(2)>span::after {    content: 'VeryGood' !important;}li.categoryBar-list-item:nth-child(3)>span::after {    content: '自言自语' !important;}li.categoryBar-list-item:nth-child(4)>span::after {    content: '欢乐留言' !important;}li.categoryBar-list-item:nth-child(5)>span::after {    content: '豆瓣记录' !important;}li.categoryBar-list-item:nth-child(6)>span::after {    content: '豆瓣记录' !important;}/*li.categoryBar-list-item:nth-child(7)>span::after {*//*    content: '快捷入口' !important;*//*}*//*li.categoryBar-list-item:nth-child(8)>span::after {*//*    content: '快捷入口' !important;*//*}*//*li.categoryBar-list-item:nth-child(9)>span::after {*//*    content: '快捷入口' !important;*//*}*//*li.categoryBar-list-item:nth-child(10)>span::after {*//*    content: '快捷入口' !important;*//*}*//*li.categoryBar-list-item:nth-child(11)>span::after {*//*    content: '快捷入口' !important;*//*}*/li.categoryBar-list-item {    width: 32.3% !important;}@media screen and (max-width: 650px) {    li.categoryBar-list-item {        width: 48% !important;        height: 150px !important;        margin: 5px 1% 0 1% !important;    }}.categoryBar-list {    max-height: 380px;    max-width: 1200px;    overflow: auto;}.categoryBar-list::-webkit-scrollbar {    width: 0 !important;}@media screen and (max-width: 650px) {    .categoryBar-list {        max-height: 320px;    }}</style>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-green&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot;</summary>
      
    
    
    
    <category term="博客导航" scheme="https://www.lixiangpro.com/categories/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA/"/>
    
    
  </entry>
  
  <entry>
    <title>ShardingSphere 分库分表</title>
    <link href="https://www.lixiangpro.com/article/sharding-sphere/"/>
    <id>https://www.lixiangpro.com/article/sharding-sphere/</id>
    <published>2021-08-10T13:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.139Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>ShardingJDBC_学习笔记</p></div></div><figure class="highlight shell"><figcaption><span>水平分表</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 配置数据源，数据源命名</span></span><br><span class="line">spring.shardingsphere.datasource.names=m1</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 允许一个实体类对应两张表</span></span><br><span class="line">spring.main.allow-bean-definition-overriding=true</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置数据源及连接池相关属性</span></span><br><span class="line">spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource</span><br><span class="line">spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver</span><br><span class="line">spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8</span><br><span class="line">spring.shardingsphere.datasource.m1.username=root</span><br><span class="line">spring.shardingsphere.datasource.m1.password=qweasdzxc</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 指定user表分布情况,配置表在哪个数据库里面,表名称  m1.user_1 , m1.user_2</span></span><br><span class="line">spring.shardingsphere.sharding.tables.user.actual-data-nodes=m1.user_$-&gt;&#123;1..2&#125;</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 指定user表里面主键uid 生成策略  SNOWFLAKE</span></span><br><span class="line">spring.shardingsphere.sharding.tables.user.key-generator.column=uid</span><br><span class="line">spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 指定分片策略,约定uid值偶数添加到user_1表，如果uid是奇数添加到user_2表</span></span><br><span class="line">spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=uid</span><br><span class="line">spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$-&gt;&#123;uid % 2 + 1&#125;</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 打开sql输出日志</span></span><br><span class="line">spring.shardingsphere.props.sql.show=true</span><br></pre></td></tr></table></figure><figure class="highlight shell"><figcaption><span>水平分库</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 配置数据源，数据源命名</span></span><br><span class="line">spring.shardingsphere.datasource.names=m1,m2</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 允许一个实体类对应两张表</span></span><br><span class="line">spring.main.allow-bean-definition-overriding=true</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置第一个数据源及连接池相关属性</span></span><br><span class="line">spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource</span><br><span class="line">spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver</span><br><span class="line">spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/test_1?serverTimezone=GMT%2B8</span><br><span class="line">spring.shardingsphere.datasource.m1.username=root</span><br><span class="line">spring.shardingsphere.datasource.m1.password=qweasdzxc</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置第二个数据源及连接池相关属性</span></span><br><span class="line">spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource</span><br><span class="line">spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver</span><br><span class="line">spring.shardingsphere.datasource.m2.url=jdbc:mysql://localhost:3306/test_2?serverTimezone=GMT%2B8</span><br><span class="line">spring.shardingsphere.datasource.m2.username=root</span><br><span class="line">spring.shardingsphere.datasource.m2.password=qweasdzxc</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash">指定数据库分布情况，数据库里面表分布情况</span> </span><br><span class="line"><span class="meta">#</span><span class="bash"> m1  m2  user_1 user_2</span></span><br><span class="line">spring.shardingsphere.sharding.tables.user.actual-data-nodes=m$-&gt;&#123;1..2&#125;.user_$-&gt;&#123;1..2&#125;</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 指定user表里面主键uid 生成策略  SNOWFLAKE</span></span><br><span class="line">spring.shardingsphere.sharding.tables.user.key-generator.column=uid</span><br><span class="line">spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 指定分片策略,约定uid值偶数添加到user_1表，如果uid是奇数添加到user_2表</span></span><br><span class="line">spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=uid</span><br><span class="line">spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$-&gt;&#123;uid % 2 + 1&#125;</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 指定数据库分片策略，(Android或IOS) 约定cid是偶数添加m1，是奇数添加到m2</span></span><br><span class="line"><span class="meta">#</span><span class="bash">spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=cid</span></span><br><span class="line"><span class="meta">#</span><span class="bash">spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=m$-&gt;&#123;cid % 2 + 1&#125;</span></span><br><span class="line"></span><br><span class="line">spring.shardingsphere.sharding.tables.user.database-strategy.inline..sharding-column=cid</span><br><span class="line">spring.shardingsphere.sharding.tables.user.database-strategy.inline.algorithm-expression=m$-&gt;&#123;cid % 2 + 1&#125;</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 打开sql输出日志</span></span><br><span class="line">spring.shardingsphere.props.sql.show=true</span><br></pre></td></tr></table></figure><figure class="highlight shell"><figcaption><span>垂直分库</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 配置数据源，数据源命名</span></span><br><span class="line">spring.shardingsphere.datasource.names=m1,m0</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 允许一个实体类对应两张表</span></span><br><span class="line">spring.main.allow-bean-definition-overriding=true</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置第一个数据源及连接池相关属性</span></span><br><span class="line">spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource</span><br><span class="line">spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver</span><br><span class="line">spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/test_1?serverTimezone=GMT%2B8</span><br><span class="line">spring.shardingsphere.datasource.m1.username=root</span><br><span class="line">spring.shardingsphere.datasource.m1.password=qweasdzxc</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置第二个数据源及连接池相关属性</span></span><br><span class="line">spring.shardingsphere.datasource.m0.type=com.alibaba.druid.pool.DruidDataSource</span><br><span class="line">spring.shardingsphere.datasource.m0.driver-class-name=com.mysql.cj.jdbc.Driver</span><br><span class="line">spring.shardingsphere.datasource.m0.url=jdbc:mysql://localhost:3306/test_3?serverTimezone=GMT%2B8</span><br><span class="line">spring.shardingsphere.datasource.m0.username=root</span><br><span class="line">spring.shardingsphere.datasource.m0.password=qweasdzxc</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 配置专库专表</span></span><br><span class="line">spring.shardingsphere.sharding.tables.t_only.actual-data-nodes=m$-&gt;&#123;0&#125;.t_only</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 指定t_only表中主键的生成策略</span></span><br><span class="line">spring.shardingsphere.sharding.tables.t_only.key-generator.column = oid</span><br><span class="line">spring.shardingsphere.sharding.tables.t_only.key-generator.type =SNOWFLAKE</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 打开sql的输出日志</span></span><br><span class="line">spring.shardingsphere.props.sql.show = true</span><br></pre></td></tr></table></figure><figure class="highlight shell"><figcaption><span>配置公共表</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spring.shardingsphere.sharding.broadcast-tables=biz_dict</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-green&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot;</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>从0-1架设一个VPN</title>
    <link href="https://www.lixiangpro.com/article/vpn/"/>
    <id>https://www.lixiangpro.com/article/vpn/</id>
    <published>2021-08-01T13:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.149Z</updated>
    
    <content type="html"><![CDATA[<div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-red"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>本文章仅作技术探索和学习记录，切勿用于违法用途。</p></div></div><h2 id="第一步-购买VPS"><a href="#第一步-购买VPS" class="headerlink" title="第一步: 购买VPS"></a>第一步: 购买VPS</h2><h2 id="第二步-搭建环境"><a href="#第二步-搭建环境" class="headerlink" title="第二步: 搭建环境"></a>第二步: 搭建环境</h2><div class="tabs" id="搭建"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#搭建-1">方案一:Shadowsocks</button></li><li class="tab"><button type="button" data-href="#搭建-2">方案二:IPsec/L2TP 快速脚本</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="搭建-1"><p><mark class="hl-label blue">安装Wget:</mark> </p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install wget</span><br></pre></td></tr></table></figure><p><mark class="hl-label blue">安装Shadowsocks:</mark> </p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget –no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh</span><br></pre></td></tr></table></figure><p><mark class="hl-label blue">获取权限:</mark> </p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod +x shadowsocks.sh</span><br></pre></td></tr></table></figure><p><mark class="hl-label blue">设置端口号及密码:</mark> </p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./shadowsocks.sh 2&gt;&amp;1 | tee shadowsocks.log</span><br></pre></td></tr></table></figure><p><mark class="hl-label blue">关键参数:</mark> </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Congratulations, Shadowsocks-python server install completed!</span><br><span class="line">Your Server IP        :  172.93.43.XX</span><br><span class="line">Your Server Port      :  9595</span><br><span class="line">Your Password         :  password</span><br><span class="line">Your Encryption Method:  aes-256-cfb</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="搭建-2"><p><mark class="hl-label blue">安装Wget:</mark> </p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install wget</span><br></pre></td></tr></table></figure><p><mark class="hl-label blue">快速搭建脚本:</mark> </p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://git.io/vpnsetup-centos -O vpnsetup.sh &amp;&amp; sudo sh vpnsetup.sh</span><br></pre></td></tr></table></figure><p><mark class="hl-label blue">关键参数:</mark> </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Server IP: 172.93.43.XX</span><br><span class="line">IPsec PSK: XXXXXXXXX</span><br><span class="line">Username: user</span><br><span class="line">Password: password</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="第三步-使用VPN"><a href="#第三步-使用VPN" class="headerlink" title="第三步: 使用VPN"></a>第三步: 使用VPN</h2><p>–<mark class="hl-label default">平台支持:</mark> <mark class="hl-label orange">全平台(Windows/Mac/iOS/Android)</mark> <br>–<mark class="hl-label default">使用软件:</mark> <mark class="hl-label orange">Shadowsocks客户端,OpenVPN等。</mark> </p><h2 id="起源-amp-amp-小故事"><a href="#起源-amp-amp-小故事" class="headerlink" title="起源&amp;&amp;小故事"></a>起源&amp;&amp;小故事</h2><p>–<mark class="hl-label blue">2008年，为了在Youtube下载游戏宣传片，开始接触与使用VPN。</mark> <br>–<mark class="hl-label purple">2019年4月，在杭州面试一家智能电视应用的互联网公司，被面试官问“用谷歌搜索还是百度？“因为答”百度“被叼，当时觉得一个工具的使用竟还有鄙视链，都快要吵起来了😂。内心:你叼我技术菜我认，毕竟非科班无经验，也许这就是文人相轻吧，对于热爱技术且谦虚的科班生是尊重的，但也一直坚信，填鸭教育出来的'正规军'与兴趣支撑出来的'八路'，那就是个弟弟，谁笑到最后是不一定的。</mark> <br>–<mark class="hl-label pink">2021年8月，突然想探索VPN，从0->1搭建共耗时30min。</mark> </p><h2 id="探索TODO"><a href="#探索TODO" class="headerlink" title="探索TODO"></a>探索TODO</h2><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>信息安全</p></div></div><div class="tabs" id="探索"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#探索-1">TCP/IP流连接信息</button></li><li class="tab"><button type="button" data-href="#探索-2">未完待续</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="探索-1"><p><mark class="hl-label blue">安装IPTRAF:</mark> </p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install iptraf </span><br></pre></td></tr></table></figure><p><mark class="hl-label blue">日志存储:</mark> </p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo iptraf -i eth0 -L /var/log/traffic_log -B</span><br><span class="line"><span class="meta">#</span><span class="bash"> 如命令找不到,尝试调整为：</span></span><br><span class="line">sudo iptraf-ng -i eth0 -L /var/log/traffic_log -B</span><br></pre></td></tr></table></figure><p><mark class="hl-label purple">查看TCP/IP流日志</mark> </p><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/vpn_view_log0.png" alt="查看流日志0.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/vpn_view_log1.png" alt="查看流日志1.jpg"></p><p><mark class="hl-label red">根据用户访问网站的IP地址,判断用户访问的网站。</mark><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/vpn_google1.png" alt="测试指定IP.jpg"><br><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/gallery/iteration/vpn_google0.png" alt="确认IP为用户访问页面.jpg"><br><mark class="hl-label blue">根据此部分信息,确认用户于2021.08.11-17:00(时区:Asia/Shanghai)左右访问了GOOGLE.COM。</mark> </p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="探索-2"><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 60%" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"><p>持续探索</p></div></div><p><img src="https://lixiangpro.oss-cn-hangzhou.aliyuncs.com/resource/img/hacker.jpg?x-oss-process=style/compress" alt="探索.jpg"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;progress&quot;&gt;&lt;div class=&quot;progress-bar-animated progress-bar progress-bar-striped bg-red&quot;  style=&quot;width: 100%&quot; aria-valuenow=&quot;100&quot; a</summary>
      
    
    
    
    <category term="技术学习" scheme="https://www.lixiangpro.com/categories/%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>快乐数</title>
    <link href="https://www.lixiangpro.com/article/happy-number/"/>
    <id>https://www.lixiangpro.com/article/happy-number/</id>
    <published>2021-07-05T01:00:00.000Z</published>
    <updated>2026-09-09T06:43:00.129Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight java"><figcaption><span>《快乐数》之做完了你就快樂了么？</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> Set&lt;Integer&gt; set=<span class="keyword">new</span> HashSet();</span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">int</span> <span class="title">getNext</span><span class="params">(<span class="keyword">int</span> n)</span></span>&#123;</span><br><span class="line">   <span class="keyword">int</span> sum=<span class="number">0</span>;</span><br><span class="line">   <span class="keyword">while</span>(n!=<span class="number">0</span>)&#123;</span><br><span class="line">      <span class="keyword">int</span> cur=n%<span class="number">10</span>;</span><br><span class="line">      n=n/<span class="number">10</span>;</span><br><span class="line">      sum+=cur*cur;</span><br><span class="line">   &#125;</span><br><span class="line">   <span class="keyword">return</span> sum;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isHappy</span><span class="params">(<span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line">   <span class="keyword">while</span>(n!=<span class="number">1</span>)&#123;</span><br><span class="line">      <span class="keyword">if</span>(set.contains(n))&#123;</span><br><span class="line">          <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">      &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">          set.add(n);</span><br><span class="line">      &#125;</span><br><span class="line">      n=getNext(n);</span><br><span class="line">   &#125;</span><br><span class="line">   <span class="keyword">return</span> n==<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;figure class=&quot;highlight java&quot;&gt;&lt;figcaption&gt;&lt;span&gt;《快乐数》之做完了你就快樂了么？&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1</summary>
      
    
    
    
    
  </entry>
  
</feed>
