<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Henry</title>
  
  
  <link href="https://henryxcy.github.io/atom.xml" rel="self"/>
  
  <link href="https://henryxcy.github.io/"/>
  <updated>2023-05-13T11:11:47.717Z</updated>
  <id>https://henryxcy.github.io/</id>
  
  <author>
    <name>Henry</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Powerjob部署</title>
    <link href="https://henryxcy.github.io/2023/05/13/Powerjob%E9%83%A8%E7%BD%B2/"/>
    <id>https://henryxcy.github.io/2023/05/13/Powerjob%E9%83%A8%E7%BD%B2/</id>
    <published>2023-05-13T07:16:16.000Z</published>
    <updated>2023-05-13T11:11:47.717Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="Powerjob部署"><a href="#Powerjob部署" class="headerlink" title="Powerjob部署"></a>Powerjob部署</h2><h2 id="快速开始（docker-compose版）"><a href="#快速开始（docker-compose版）" class="headerlink" title="快速开始（docker-compose版）"></a>快速开始（docker-compose版）</h2><p><img src="/2023/05/13/Powerjob%E9%83%A8%E7%BD%B2/image-20230513151808976.png" alt="image-20230513151808976"></p><span id="more"></span><h2 id="环境要求"><a href="#环境要求" class="headerlink" title="环境要求"></a>环境要求</h2><p>本地需要安装docker和docker-compose</p><h2 id="1-下载项目"><a href="#1-下载项目" class="headerlink" title="1. 下载项目"></a>1. 下载项目</h2><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone --depth=<span class="number">1</span> https:<span class="comment">//github.com/PowerJob/PowerJob.git</span></span><br></pre></td></tr></tbody></table></figure><h2 id="2-运行"><a href="#2-运行" class="headerlink" title="2. 运行"></a>2. 运行</h2><p>在正式运行之前，首先需要删除低版本 powerjob 相关依赖</p><figure class="highlight java"><table><tbody><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><br><span class="line">docker rmi $(docker images | grep <span class="string">"powerjob"</span> | awk <span class="string">'{print $3}'</span>) </span><br></pre></td></tr></tbody></table></figure><figure class="highlight java"><table><tbody><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"># 进入到PowerJob工作目录</span><br><span class="line">cd PowerJob</span><br><span class="line"></span><br><span class="line"># 前台运行（初次运行时，推荐使用该方式，方便实时查看日志，排查问题）</span><br><span class="line">docker-compose up</span><br><span class="line"></span><br><span class="line"># 后台运行</span><br><span class="line">docker-compose up -d</span><br></pre></td></tr></tbody></table></figure><p>刚开始启动时，<code>powerjob-worker-samples</code>会启动失败，等<code>powerjob-server</code>启动成功后，<code>powerjob-worker-samples</code>才会启动成功。这大概需要几分钟。</p><p>运行成功后，浏览器访问 <a href="http://127.0.0.1:7700/">http://127.0.0.1:7700/</a> </p><p>应用名称：powerjob-worker-samples</p><p>密码：powerjob123</p><p>到这里是官方文档给出的步骤</p><p>如果只需要单独启动一个powerjob-server服务，其他服务不用启动,那么则需要去修改docker-compose文件</p><p>将其他服务注释掉，只保留powerjob-server服务</p><figure class="highlight yaml"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用说明 V4.3.1</span></span><br><span class="line"><span class="comment"># 1. PowerJob 根目录执行：docker-compose up</span></span><br><span class="line"><span class="comment"># 2. 静静等待服务启动。</span></span><br><span class="line"></span><br><span class="line"><span class="attr">version:</span> <span class="string">'3'</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line"><span class="comment">#   powerjob-mysql:</span></span><br><span class="line"><span class="comment">#     environment:</span></span><br><span class="line"><span class="comment">#       MYSQL_ROOT_HOST: "%"</span></span><br><span class="line"><span class="comment">#       MYSQL_ROOT_PASSWORD: 'OSUsol!LSMUswe#'</span></span><br><span class="line"><span class="comment">#     restart: always</span></span><br><span class="line"><span class="comment">#     container_name: powerjob-mysql</span></span><br><span class="line"><span class="comment">#     image: powerjob/powerjob-mysql:latest</span></span><br><span class="line"><span class="comment">#     ports:</span></span><br><span class="line"><span class="comment">#       - "3307:3306"</span></span><br><span class="line"><span class="comment">#     volumes:</span></span><br><span class="line"><span class="comment">#       - ./powerjob-data/powerjob-mysql:/var/lib/mysql</span></span><br><span class="line"><span class="comment">#     command: --lower_case_table_names=1</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">powerjob-server:</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">powerjob-server</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">powerjob/powerjob-server:latest</span></span><br><span class="line">    <span class="attr">network_mode:</span> <span class="string">bridge</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">    <span class="comment"># depends_on:</span></span><br><span class="line">    <span class="comment">#   - powerjob-mysql</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="attr">JVMOPTIONS:</span> <span class="string">"-Xmx512m"</span></span><br><span class="line">      <span class="attr">PARAMS:</span> <span class="string">"--oms.mongodb.enable=false --spring.datasource.core.jdbc-url=jdbc:mysql://192.168.1.1:3306/powerjob-product?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai --spring.datasource.core.username=root --spring.datasource.core.password=root"</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"7700:7700"</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"10086:10086"</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"10010:10010"</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./powerjob-data/powerjob-server:/root/powerjob/server/</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#   powerjob-worker-samples:</span></span><br><span class="line"><span class="comment">#     container_name: powerjob-worker-samples</span></span><br><span class="line"><span class="comment">#     image: powerjob/powerjob-worker-samples:latest</span></span><br><span class="line"><span class="comment">#     restart: always</span></span><br><span class="line"><span class="comment">#     depends_on:</span></span><br><span class="line"><span class="comment">#       - powerjob-mysql</span></span><br><span class="line"><span class="comment">#       - powerjob-server</span></span><br><span class="line"><span class="comment"># #    environment:</span></span><br><span class="line"><span class="comment"># #      PARAMS: "--powerjob.worker.server-address=powerjob-server:7700"</span></span><br><span class="line"><span class="comment">#     ports:</span></span><br><span class="line"><span class="comment">#       - "8081:8081"</span></span><br><span class="line"><span class="comment">#       - "27777:27777"</span></span><br><span class="line"><span class="comment">#     volumes:</span></span><br><span class="line"><span class="comment">#       - ./powerjob-data/powerjob-worker-samples:/root/powerjob/worker</span></span><br><span class="line"><span class="comment">#       - ./others/script/wait-for-it.sh:/wait-for-it.sh</span></span><br><span class="line"><span class="comment">#     entrypoint:</span></span><br><span class="line"><span class="comment">#       - "sh"</span></span><br><span class="line"><span class="comment">#       - "-c"</span></span><br><span class="line"><span class="comment">#       - "chmod +x wait-for-it.sh &amp;&amp; ./wait-for-it.sh powerjob-server:7700 --strict -- java -Xmx512m -jar /powerjob-worker-samples.jar --powerjob.worker.server-address=powerjob-server:7700"</span></span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><p>紧接着需要去修改powerjob-server中starter的配置文件，完整目录为PowerJob/powerjob-server/powerjob-server-starter/src/main/resources</p><p><img src="/2023/05/13/Powerjob%E9%83%A8%E7%BD%B2/image-20230513143306144.png" alt="image-20230513143306144"></p><p>从这张图可以看出当前使用的是application-daily的配置文件，所以去修改这个配置文件中与数据库相关的配置即可</p><p>准备工作做完后使用docker-compose up启动(docker-compose up -d后台启动)</p><p>这里已经成功部署起来了</p><p><img src="/2023/05/13/Powerjob%E9%83%A8%E7%BD%B2/image-20230513143558233.png" alt="image-20230513143558233"></p><p>浏览器7700端口也可以访问了</p><p><img src="/2023/05/13/Powerjob%E9%83%A8%E7%BD%B2/image-20230513143630816.png" alt="image-20230513143630816"></p><h2 id="遇到的问题"><a href="#遇到的问题" class="headerlink" title="遇到的问题"></a>遇到的问题</h2><p>我自己其实在配置过程只用了很少时间，大部分问题主要是因为我部署后总是连接不到数据库，因为我的MySQL数据库也是采用docker容器来部署的，再排查过username和password后仍然不行，这时我想到会不会是因为不在同一个网段呢？</p><p>于是我使用</p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker network ls <span class="comment">//查看所有网络</span></span><br></pre></td></tr></tbody></table></figure><p>发现除了bridge、host、null以外还有一个powerjob-default网络,这时我才意识到我连接不上的原因，在docker容器内，不同容器之间互相通信需要在同一个网段内，于是我在docker-compose配置文件中指定了加入到docker的默认bridge网络中</p><p><img src="/2023/05/13/Powerjob%E9%83%A8%E7%BD%B2/image-20230513144158888.png" alt="image-20230513144158888"></p><p>启动检查网络</p><figure class="highlight java"><table><tbody><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="comment">//查看bridge下的所有容器</span></span><br><span class="line">docker network inspect bridge | grep <span class="string">"Name\|IPv4Address"</span></span><br></pre></td></tr></tbody></table></figure><p><img src="/2023/05/13/Powerjob%E9%83%A8%E7%BD%B2/image-20230513144358481.png" alt="image-20230513144358481"></p><p>这样powerjob-server和mysql在同一个网段下就可以进行通信了</p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;Powerjob部署&quot;&gt;&lt;a href=&quot;#Powerjob部署&quot; class=&quot;headerlink&quot; title=&quot;Powerjob部署&quot;&gt;&lt;/a&gt;Powerjob部署&lt;/h2&gt;&lt;h2 id=&quot;快速开始（docker-compose版）&quot;&gt;&lt;a href=&quot;#快速开始（docker-compose版）&quot; class=&quot;headerlink&quot; title=&quot;快速开始（docker-compose版）&quot;&gt;&lt;/a&gt;快速开始（docker-compose版）&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;/2023/05/13/Powerjob%E9%83%A8%E7%BD%B2/image-20230513151808976.png&quot; alt=&quot;image-20230513151808976&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    
    <category term="powerjob" scheme="https://henryxcy.github.io/tags/powerjob/"/>
    
    <category term="docker-compose" scheme="https://henryxcy.github.io/tags/docker-compose/"/>
    
  </entry>
  
  <entry>
    <title>使用APlayer和MetingJS解决博客页面跳转音乐暂停的问题</title>
    <link href="https://henryxcy.github.io/2022/09/16/%E4%BD%BF%E7%94%A8APlayer%E5%92%8CMetingJS%E8%A7%A3%E5%86%B3%E5%8D%9A%E5%AE%A2%E9%A1%B5%E9%9D%A2%E8%B7%B3%E8%BD%AC%E9%9F%B3%E4%B9%90%E6%9A%82%E5%81%9C%E7%9A%84%E9%97%AE%E9%A2%98/"/>
    <id>https://henryxcy.github.io/2022/09/16/%E4%BD%BF%E7%94%A8APlayer%E5%92%8CMetingJS%E8%A7%A3%E5%86%B3%E5%8D%9A%E5%AE%A2%E9%A1%B5%E9%9D%A2%E8%B7%B3%E8%BD%AC%E9%9F%B3%E4%B9%90%E6%9A%82%E5%81%9C%E7%9A%84%E9%97%AE%E9%A2%98/</id>
    <published>2022-09-15T16:25:39.000Z</published>
    <updated>2023-05-13T07:37:54.358Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="使用APlayer和MetingJS解决博客页面跳转音乐暂停的问题"><a href="#使用APlayer和MetingJS解决博客页面跳转音乐暂停的问题" class="headerlink" title="使用APlayer和MetingJS解决博客页面跳转音乐暂停的问题"></a>使用APlayer和MetingJS解决博客页面跳转音乐暂停的问题</h1><p><img src="/2022/09/16/%E4%BD%BF%E7%94%A8APlayer%E5%92%8CMetingJS%E8%A7%A3%E5%86%B3%E5%8D%9A%E5%AE%A2%E9%A1%B5%E9%9D%A2%E8%B7%B3%E8%BD%AC%E9%9F%B3%E4%B9%90%E6%9A%82%E5%81%9C%E7%9A%84%E9%97%AE%E9%A2%98/image-20220916002626344.png" alt="image-20220916002626344"></p><span id="more"></span><p>之前使用APlayer播放器时会出现点击文章或链接音乐播放器就暂停了，我找了许多方法尝试都不行，终于发现使用MetingJS插件搭配APlayer可以完美解决这个问题，方法也很简单。可以参考<a href="https://github.com/metowolf/MetingJS">MetingJS</a>文档</p><p><strong>1.打开路径 <code>themes/yilia/layout/_partial/left-col.ejs</code>，在最后一个<code>&lt;/nav&gt;</code>上面添加以下代码</strong></p><figure class="highlight javascript"><table><tbody><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></pre></td><td class="code"><pre><span class="line">&lt;!-- <span class="built_in">require</span> <span class="title class_">APlayer</span> --&gt;</span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css"</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.js"</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="comment">&lt;!-- require MetingJS --&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.jsdelivr.net/npm/meting@2/dist/Meting.min.js"</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">"opacity:0.7;text-align:left"</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;<span class="name">meting-js</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">server</span>=<span class="string">"netease"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">type</span>=<span class="string">"playlist"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">id</span>=<span class="string">"7638842540"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">fixed</span>=<span class="string">"true"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">volume</span>=<span class="string">"0.3"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">order</span>=<span class="string">"list"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        &gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/<span class="name">meting-js</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">    ap = <span class="literal">null</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">    <span class="title class_">Object</span>.<span class="title function_">defineProperty</span>(<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">'meting-js'</span>),<span class="string">"aplayer"</span>,{</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">        <span class="attr">set</span>: <span class="keyword">function</span>(<span class="params">aplayer</span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">            ap=aplayer</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">            <span class="title function_">ready</span>();</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">        }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">    });</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">    </span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">    isRecover = <span class="literal">false</span>;</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">    <span class="keyword">function</span> <span class="title function_">ready</span>(<span class="params"></span>){</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">        ap.<span class="title function_">on</span>(<span class="string">'canplay'</span>, <span class="keyword">function</span> (<span class="params"></span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">            <span class="keyword">if</span>(!isRecover){</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                <span class="keyword">if</span>(<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">"musicIndex"</span>) != <span class="literal">null</span>){</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                    musicIndex = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">"musicIndex"</span>);</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                    musicTime = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">"musicTime"</span>);</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                    <span class="keyword">if</span>(ap.<span class="property">list</span>.<span class="property">index</span> != musicIndex){</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                        ap.<span class="property">list</span>.<span class="title function_">switch</span>(musicIndex);</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                    }<span class="keyword">else</span>{</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                        ap.<span class="title function_">seek</span>(musicTime);</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                        ap.<span class="title function_">play</span>();</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                        <span class="variable language_">localStorage</span>.<span class="title function_">clear</span>();</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                        isRecover = <span class="literal">true</span>;</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                    }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                }<span class="keyword">else</span>{</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                    isRecover = <span class="literal">true</span>;</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">                }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">            }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">        });</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">    }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">    <span class="variable language_">window</span>.<span class="property">onbeforeunload</span> = <span class="keyword">function</span>(<span class="params">event</span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">        <span class="keyword">if</span>(!ap.<span class="property">audio</span>.<span class="property">paused</span>){</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">            musicIndex = ap.<span class="property">list</span>.<span class="property">index</span>;</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">            musicTime = ap.<span class="property">audio</span>.<span class="property">currentTime</span>;</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">            <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">"musicIndex"</span>,musicIndex);</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">            <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">"musicTime"</span>,musicTime);</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">        }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">    };</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span></span><br></pre></td></tr></tbody></table></figure><p><strong>注：meting-js中的id对应的是网易云的歌单id</strong></p><p><img src="/2022/09/16/%E4%BD%BF%E7%94%A8APlayer%E5%92%8CMetingJS%E8%A7%A3%E5%86%B3%E5%8D%9A%E5%AE%A2%E9%A1%B5%E9%9D%A2%E8%B7%B3%E8%BD%AC%E9%9F%B3%E4%B9%90%E6%9A%82%E5%81%9C%E7%9A%84%E9%97%AE%E9%A2%98/image-20220916003424273.png" alt="image-20220916003424273"></p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;使用APlayer和MetingJS解决博客页面跳转音乐暂停的问题&quot;&gt;&lt;a href=&quot;#使用APlayer和MetingJS解决博客页面跳转音乐暂停的问题&quot; class=&quot;headerlink&quot; title=&quot;使用APlayer和MetingJS解决博客页面跳转音乐暂停的问题&quot;&gt;&lt;/a&gt;使用APlayer和MetingJS解决博客页面跳转音乐暂停的问题&lt;/h1&gt;&lt;p&gt;&lt;img src=&quot;/2022/09/16/%E4%BD%BF%E7%94%A8APlayer%E5%92%8CMetingJS%E8%A7%A3%E5%86%B3%E5%8D%9A%E5%AE%A2%E9%A1%B5%E9%9D%A2%E8%B7%B3%E8%BD%AC%E9%9F%B3%E4%B9%90%E6%9A%82%E5%81%9C%E7%9A%84%E9%97%AE%E9%A2%98/image-20220916002626344.png&quot; alt=&quot;image-20220916002626344&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="学习笔记" scheme="https://henryxcy.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="个人博客" scheme="https://henryxcy.github.io/tags/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="音乐播放器" scheme="https://henryxcy.github.io/tags/%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>微服务-服务注册发现、配置、网关</title>
    <link href="https://henryxcy.github.io/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/"/>
    <id>https://henryxcy.github.io/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/</id>
    <published>2022-09-15T14:30:25.000Z</published>
    <updated>2022-09-15T14:54:37.124Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="微服务-服务注册发现、配置、网关"><a href="#微服务-服务注册发现、配置、网关" class="headerlink" title="微服务-服务注册发现、配置、网关"></a>微服务-服务注册发现、配置、网关</h1><h2 id="SpringBoot整合MyBatis-Plus"><a href="#SpringBoot整合MyBatis-Plus" class="headerlink" title="SpringBoot整合MyBatis-Plus"></a>SpringBoot整合MyBatis-Plus</h2><p><img src="/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220915225329626.png" alt="image-20220915225329626"></p><span id="more"></span><p>一、整合MyBatis-Plus</p><p>1）、导入依赖</p><figure class="highlight java"><table><tbody><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">&lt;!-- mybatis-plus--&gt;</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-boot-starter&lt;/artifactId&gt;</span><br><span class="line">    &lt;version&gt;<span class="number">3.5</span><span class="number">.1</span>&lt;/version&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>2）、配置</p><p>​1.配置数据源：</p><p>​a.导入数据库的驱动</p><figure class="highlight java"><table><tbody><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">&lt;!--    导入mysql驱动    --&gt;</span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;mysql&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;</span><br><span class="line">    &lt;version&gt;<span class="number">8.0</span><span class="number">.17</span>&lt;/version&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>​b.在application.yml配置数据源相关信息</p><p>如：</p><figure class="highlight java"><table><tbody><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">spring:</span><br><span class="line">  datasource:</span><br><span class="line">    username: root</span><br><span class="line">    password: <span class="number">123456</span></span><br><span class="line">    driver-class-name: com.mysql.cj.jdbc.Driver</span><br><span class="line">    url: jdbc:mysql:<span class="comment">//192.168.184.128:3306/henrymail_pms</span></span><br></pre></td></tr></tbody></table></figure><p>​2.配置MyBatis-Plus:</p><p>​ a.在启动类中使用MapperScan注解扫描dao层下的mapper接口(右键Copy Path -&gt; Copy Reference)</p><p><img src="/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220914202705224.png" alt="image-20220914202705224"></p><p>​ b.在application.yml中告诉MyBatis-Plus,sql映射文件位置并设置id自增</p><figure class="highlight java"><table><tbody><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">mybatis-plus:</span><br><span class="line">  mapper-locations: classpath:/mapper<span class="comment">/**/*.xml</span></span><br><span class="line"><span class="comment">  global-config:</span></span><br><span class="line"><span class="comment">    db-config:</span></span><br><span class="line"><span class="comment">      id-type: auto</span></span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220914203112012.png" alt="image-20220914203112012"></p><h2 id="远程调用其他微服务"><a href="#远程调用其他微服务" class="headerlink" title="远程调用其他微服务"></a>远程调用其他微服务</h2><p>一、使用openFeign</p><p>1）、引入openFeign</p><figure class="highlight plaintext"><table><tbody><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">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;spring-cloud-starter-openfeign&lt;/artifactId&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>2）、编写一个接口，告诉Spring Cloud这个接口需要调用远程服务(建议单独建一个feign包来存放远程调用的接口)</p><p>声明接口的每一个方法都是调用哪个远程服务的哪个请求</p><p><img src="/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220914231735422.png" alt="image-20220914231735422"></p><p><strong>@FeignClient()放入需要调用远程服务的微服务名</strong></p><p><strong>@RequestMapping()中需要填写完整的接口路径</strong></p><p>3）、开启远程调用功能</p><p>启动类上添加@EnableFeignClients注解</p><figure class="highlight java"><table><tbody><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">@EnableFeignClients(basePackages = "com.xyc.henrymail.member.feign")</span> </span><br><span class="line"><span class="comment">//basePackages为自动扫描feign包下所有带有FeignClient注解的接口</span></span><br></pre></td></tr></tbody></table></figure><h2 id="Nacos服务注册中心"><a href="#Nacos服务注册中心" class="headerlink" title="Nacos服务注册中心"></a>Nacos服务注册中心</h2><h3 id="Nacos服务搭建"><a href="#Nacos服务搭建" class="headerlink" title="Nacos服务搭建"></a>Nacos服务搭建</h3><ul><li>下载安装包</li><li>解压</li><li>在bin目录下运行指令：startup.cmd -m standalone</li><li>默认服务地址端口为localhost:8848，可以在conf配置文件中修改端口</li></ul><h3 id="Nacos服务注册或发现"><a href="#Nacos服务注册或发现" class="headerlink" title="Nacos服务注册或发现"></a>Nacos服务注册或发现</h3><ul><li>引入nacos.discovery依赖</li><li>配置nacos地址spring.cloud.nacos.server-addr</li><li>使用 @EnableDiscoveryClient 注解开启服务注册与发现功能</li></ul><figure class="highlight java"><table><tbody><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">@SpringBootApplication</span></span><br><span class="line"><span class="meta">@EnableDiscoveryClient</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ProviderApplication</span> {</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line">SpringApplication.run(ProviderApplication.class, args);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">EchoController</span> {</span><br><span class="line"><span class="meta">@GetMapping(value = "/echo/{string}")</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">echo</span><span class="params">(<span class="meta">@PathVariable</span> String string)</span> {</span><br><span class="line"><span class="keyword">return</span> string;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="Nacos配置管理"><a href="#Nacos配置管理" class="headerlink" title="Nacos配置管理"></a>Nacos配置管理</h3><p>一、将配置统一到nacos配置中心</p><p>1）、引入nacos-config依赖</p><figure class="highlight java"><table><tbody><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">&lt;!--   ncaos配置中心--&gt;</span><br><span class="line">        &lt;dependency&gt;</span><br><span class="line">            &lt;groupId&gt;com.alibaba.cloud&lt;/groupId&gt;</span><br><span class="line">            &lt;artifactId&gt;spring-cloud-starter-alibaba-nacos-config&lt;/artifactId&gt;</span><br><span class="line">        &lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>2）、在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据</p><figure class="highlight java"><table><tbody><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">spring.application.name=nacos-config-example</span><br><span class="line">spring.cloud.nacos.config.server-addr=<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8848</span></span><br></pre></td></tr></tbody></table></figure><p>3）、需要给配置中心默认添加一个数据集（Data Id）henrymail-coupon.properties。默认规则：<strong>应用名.properties</strong></p><p>1、添加的配置的详情如下</p><figure class="highlight java"><table><tbody><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">dataId 为 nacos-config-example.properties</span><br><span class="line">group 为 DEFAULT_GROUP</span><br><span class="line"></span><br><span class="line">内容如下:</span><br><span class="line"></span><br><span class="line">spring.cloud.nacos.config.serverAddr=<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8848</span></span><br><span class="line">spring.cloud.nacos.config.prefix=PREFIX</span><br><span class="line">spring.cloud.nacos.config.group=GROUP</span><br><span class="line">spring.cloud.nacos.config.namespace=NAMESPACE</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220915162443112.png" alt="image-20220915162443112"></p><p>2、动态获取配置</p><p>添加@RefreshScope 动态获取并刷新配置</p><p><img src="/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220915163608926.png" alt="image-20220915163608926"></p><p><strong>开启后就可以直接在nacos管理界面直接修改配置无需重新打包部署项目</strong></p><p>@Value(“${配置项的名}”)，获取到配置。</p><p><strong>如果配置中心和当前应用都配置了相同的项优先使用配置中心</strong></p><p>二、命名空间：配置隔离</p><p>1）、默认：public(保留空间)：默认新增的所有配置都在public空间中。</p><p>​       1、开发、测试、生产：利用命名空间来做环境隔离。</p><p>​注意：在bootstrap.properties配置上，需要使用哪个命名空间下的配置。</p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spring.cloud.nacos.config.namespace=a5e74974-aa6c-<span class="number">4009</span>-<span class="number">9087</span>-692b88dad128 </span><br></pre></td></tr></tbody></table></figure><p>​        2、每一个微服务之间互相隔离，每一个微服务都创建自己的命名空间，只加载自己命名空间下的所有配置</p><p><img src="/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220915170115045.png" alt="image-20220915170115045"></p><p>3）、配置分组：</p><p>   默认所有配置集都属于：DEFAULT_GROUP:</p><p>​可以配置每个微服务中不同环境下的分组</p><p>项目中的使用：每个微服务自己的命名空间，使用配置分组区分环境，dev，test，prod</p><figure class="highlight java"><table><tbody><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">spring.application.name=henrymail-coupon</span><br><span class="line">spring.cloud.nacos.config.server-addr=<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8848</span></span><br><span class="line">spring.cloud.nacos.config.namespace=4536bae5-a710-47b6-ba45-<span class="number">059314489e31</span></span><br><span class="line">spring.cloud.nacos.config.group=dev </span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220915170603987.png" alt="image-20220915170603987"></p><p>三、同时加载多个配置集</p><p>1）、微服务任何配置信息、任何配置文件都可以放在配置中心中</p><p>2）、只需要在bootstrap.properties说明加载配置中心哪些配置文件即可</p><figure class="highlight java"><table><tbody><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></pre></td><td class="code"><pre><span class="line">spring.application.name=henrymail-coupon</span><br><span class="line">spring.cloud.nacos.config.server-addr=<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8848</span></span><br><span class="line">spring.cloud.nacos.config.namespace=4536bae5-a710-47b6-ba45-<span class="number">059314489e31</span></span><br><span class="line">spring.cloud.nacos.config.group=dev</span><br><span class="line">    </span><br><span class="line">spring.cloud.nacos.config.ext-config[<span class="number">0</span>].data-id=datasource.yml</span><br><span class="line">spring.cloud.nacos.config.ext-config[<span class="number">0</span>].group=dev</span><br><span class="line"></span><br><span class="line">spring.cloud.nacos.config.ext-config[<span class="number">1</span>].data-id=mybatis-plus.yml</span><br><span class="line">spring.cloud.nacos.config.ext-config[<span class="number">1</span>].group=dev</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">spring.cloud.nacos.config.ext-config[<span class="number">2</span>].data-id=other.yml</span><br><span class="line">spring.cloud.nacos.config.ext-config[<span class="number">2</span>].group=dev</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220915203003174.png" alt="image-20220915203003174"></p><p>3）、@Value、@ConfigurationProperties。。。</p><p>以前SpringBoot任何方法从配置文件中获取值，都能使用。</p><p>配置中心有的优先使用配置中心的</p><h3 id="网关-SpringCloud-Gateway"><a href="#网关-SpringCloud-Gateway" class="headerlink" title="网关 SpringCloud-Gateway"></a>网关 SpringCloud-Gateway</h3><p>一、核心配置</p><p>1）、导入Gateway依赖</p><figure class="highlight java"><table><tbody><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">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;spring-cloud-starter-gateway&lt;/artifactId&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>2）、将自己注册到nacos注册中心和配置管理中去</p><p>bootstrap.properties:</p><figure class="highlight java"><table><tbody><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">spring.application.name=henrymail-gateway</span><br><span class="line">spring.cloud.nacos.config.server-addr=<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8848</span></span><br><span class="line">spring.cloud.nacos.config.namespace=6bb6ded0-5a50-49d1-be60-14b0fef5c0cc</span><br></pre></td></tr></tbody></table></figure><p>application.properties:</p><figure class="highlight java"><table><tbody><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><br><span class="line">spring.application.name=henrymail-gateway</span><br><span class="line">spring.cloud.nacos.config.server-addr=<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8848</span></span><br><span class="line">server.port=<span class="number">88</span></span><br></pre></td></tr></tbody></table></figure><p>3）、配置路由规则(参照SpringCloud-Gtaeway官网找相对应的路由规则)</p><p>如:application.yml:</p><figure class="highlight java"><table><tbody><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">spring:</span><br><span class="line">  cloud:</span><br><span class="line">    gateway:</span><br><span class="line">      routes:</span><br><span class="line">        - id: test_route</span><br><span class="line">          uri: https:<span class="comment">//www.baidu.com</span></span><br><span class="line">          predicates:</span><br><span class="line">          - Query=url,baidu</span><br><span class="line"></span><br><span class="line">        - id: test_route2</span><br><span class="line">          uri: https:<span class="comment">//www.qq.com</span></span><br><span class="line">          predicates:</span><br><span class="line">          - Query=url,qq</span><br></pre></td></tr></tbody></table></figure><p>请求参数中包含url=???时，gateway会路由到对应的uri</p><p><img src="/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220915222515516.png" alt="image-20220915222515516"></p>]]></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;/h1&gt;&lt;h2 id=&quot;SpringBoot整合MyBatis-Plus&quot;&gt;&lt;a href=&quot;#SpringBoot整合MyBatis-Plus&quot; class=&quot;headerlink&quot; title=&quot;SpringBoot整合MyBatis-Plus&quot;&gt;&lt;/a&gt;SpringBoot整合MyBatis-Plus&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;/2022/09/15/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%8F%91%E7%8E%B0%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E7%BD%91%E5%85%B3/image-20220915225329626.png&quot; alt=&quot;image-20220915225329626&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="学习笔记" scheme="https://henryxcy.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="微服务" scheme="https://henryxcy.github.io/tags/%E5%BE%AE%E6%9C%8D%E5%8A%A1/"/>
    
    <category term="Nacos服务注册" scheme="https://henryxcy.github.io/tags/Nacos%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C/"/>
    
    <category term="Nacos配置管理" scheme="https://henryxcy.github.io/tags/Nacos%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/"/>
    
    <category term="Gateway网关" scheme="https://henryxcy.github.io/tags/Gateway%E7%BD%91%E5%85%B3/"/>
    
  </entry>
  
  <entry>
    <title>博客部署到自己的云服务器</title>
    <link href="https://henryxcy.github.io/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    <id>https://henryxcy.github.io/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/</id>
    <published>2022-09-09T12:24:00.000Z</published>
    <updated>2022-09-09T13:17:03.189Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="将博客部署到自己的云服务器"><a href="#将博客部署到自己的云服务器" class="headerlink" title="将博客部署到自己的云服务器"></a>将博客部署到自己的云服务器</h1><p>只需四步就能完成将博客部署到自己的云服务器上，我这里使用的是腾讯云服务器(阿里的太贵买不起…)</p><p><img src="/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20220909211647678.png" alt="image-20220909211647678"></p><span id="more"></span><h2 id="一-安装git环境"><a href="#一-安装git环境" class="headerlink" title="一.安装git环境"></a>一.安装git环境</h2><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install git </span><br></pre></td></tr></tbody></table></figure><p><strong>安装完成后查看版本是否成功安装</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git --version</span><br></pre></td></tr></tbody></table></figure><p><strong>创建用户组和用户，并授予权限，创建仓库</strong></p><figure class="highlight java"><table><tbody><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">useradd git  <span class="comment">//设置用户名</span></span><br><span class="line">passwd git <span class="comment">//设置密码 密码建议设置复杂一点不容易被破解</span></span><br></pre></td></tr></tbody></table></figure><p><strong>将公钥给服务器</strong></p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-copy-id -i id_rsa.pub git@<span class="number">120.77</span><span class="number">.46</span><span class="number">.95</span> <span class="comment">//后面是自己的云服务地址</span></span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20220909194649962.png" alt="image-20220909194649962"></p><h2 id="二-安装nginx作为web服务器"><a href="#二-安装nginx作为web服务器" class="headerlink" title="二.安装nginx作为web服务器"></a>二.安装nginx作为web服务器</h2><p><strong>下载nginx压缩包</strong></p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget http:<span class="comment">//nginx.org/download/nginx-1.20.2.tar.gz</span></span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20220909195031376.png" alt="image-20220909195031376"></p><p><strong>安装依赖</strong></p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install gcc pcre-devel zlib-devel openssl-devel</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20220909195048550.png" alt="image-20220909195048550"></p><p><strong>解压配置编译运行</strong></p><figure class="highlight java"><table><tbody><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">tar -zxvf nginx-<span class="number">1.20</span><span class="number">.2</span>.tar.gz</span><br><span class="line"></span><br><span class="line">cd nginx-<span class="number">1.20</span><span class="number">.2</span></span><br><span class="line"></span><br><span class="line">./configure</span><br><span class="line"></span><br><span class="line">make</span><br><span class="line"></span><br><span class="line">make install</span><br></pre></td></tr></tbody></table></figure><p><strong>进入目录</strong></p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd /usr/local/nginx/sbin</span><br></pre></td></tr></tbody></table></figure><p><strong>运行nginx</strong></p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./nginx</span><br></pre></td></tr></tbody></table></figure><p><strong>访问浏览器查看是否成功运行</strong></p><p><img src="/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20220909195544835.png" alt="image-20220909195544835"></p><h2 id="三-博客仓库创建"><a href="#三-博客仓库创建" class="headerlink" title="三.博客仓库创建"></a>三.博客仓库创建</h2><p>1.新建仓库用来存放博客内容</p><p>2.提交后博客自动同步到站点目录</p><p><strong>#不使用宝塔：</strong></p><p><strong>创建博客目录并进入hooks目录</strong></p><figure class="highlight java"><table><tbody><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">cd /home/git</span><br><span class="line"></span><br><span class="line">git init --bare blog.git</span><br><span class="line">    </span><br><span class="line">cd blog.git/hooks</span><br></pre></td></tr></tbody></table></figure><p><strong>修改钩子函数，同步到nginx的html文件</strong></p><figure class="highlight java"><table><tbody><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">vi post-receive <span class="comment">//创建post-receive文件</span></span><br><span class="line"></span><br><span class="line">#将以下内容粘贴进去</span><br><span class="line"></span><br><span class="line">#!/bin/bash</span><br><span class="line">#nginx下html文件夹目录</span><br><span class="line">DIR=/usr/local/nginx/html</span><br><span class="line">git --work-tree=${DIR} clean -fd</span><br><span class="line">#直接强制检出</span><br><span class="line">git --work-tree=${DIR} checkout --force</span><br><span class="line"></span><br><span class="line">    </span><br><span class="line">#!/bin/bash</span><br></pre></td></tr></tbody></table></figure><p><strong>目前这个文件是没有运行权限的所以我们要给它修改权限</strong></p><p><img src="/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20220909200520714.png" alt="image-20220909200520714"></p><p><strong>给post-receive添加运行权限</strong></p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod +x post-receive</span><br></pre></td></tr></tbody></table></figure><p><strong>授予git用户</strong></p><figure class="highlight java"><table><tbody><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">chown -R git post-receive</span><br><span class="line"></span><br><span class="line">chmod <span class="number">777</span> post-receive</span><br></pre></td></tr></tbody></table></figure><p><strong>回到git目录下，同样的操作给blog.git权限</strong></p><figure class="highlight java"><table><tbody><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">cd /home/git</span><br><span class="line"></span><br><span class="line">chmod <span class="number">777</span> blog.git/</span><br><span class="line"></span><br><span class="line">chown -R git blog.git/</span><br></pre></td></tr></tbody></table></figure><p><strong>被同步的目录也要授予写入的最高权限</strong></p><figure class="highlight java"><table><tbody><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">cd /usr/local/nginx</span><br><span class="line"></span><br><span class="line">chmod <span class="number">777</span> html/ </span><br><span class="line"></span><br><span class="line">chown -R git html/</span><br></pre></td></tr></tbody></table></figure><h2 id="四-修改hexo的主配置文件"><a href="#四-修改hexo的主配置文件" class="headerlink" title="四.修改hexo的主配置文件"></a>四.修改hexo的主配置文件</h2><p><strong>最终测试：</strong></p><p><strong>修改hexo的配置：</strong></p><p><img src="/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20220909201235271.png" alt="image-20220909201235271"></p><h2 id="最终效果图"><a href="#最终效果图" class="headerlink" title="最终效果图"></a>最终效果图</h2><p><strong>直接通过服务器ip进行访问</strong></p><p><img src="/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20220909201739575.png" alt="image-20220909201739575"></p><p><strong>注：后续如果需要使用自己的域名的话，需要备案而且需要将域名和ip绑定后进行备案。</strong></p>]]></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;/h1&gt;&lt;p&gt;只需四步就能完成将博客部署到自己的云服务器上，我这里使用的是腾讯云服务器(阿里的太贵买不起…)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/2022/09/09/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%88%B0%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20220909211647678.png&quot; alt=&quot;image-20220909211647678&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    
    <category term="个人博客" scheme="https://henryxcy.github.io/tags/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>hexo-yilia添加音乐播放器</title>
    <link href="https://henryxcy.github.io/2022/08/21/hexo-yilia%E6%B7%BB%E5%8A%A0%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/"/>
    <id>https://henryxcy.github.io/2022/08/21/hexo-yilia%E6%B7%BB%E5%8A%A0%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/</id>
    <published>2022-08-21T15:06:59.213Z</published>
    <updated>2023-05-13T07:04:56.813Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="hexo-yilia主题添加音乐播放器"><a href="#hexo-yilia主题添加音乐播放器" class="headerlink" title="hexo-yilia主题添加音乐播放器"></a>hexo-yilia主题添加音乐播放器</h1><p><img src="/2022/08/21/hexo-yilia%E6%B7%BB%E5%8A%A0%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/image-20220821233328446.png" alt="image-20220821233328446"></p><span id="more"></span><p>为hexo-主题添加背景音乐播放器，有两种方式</p><h2 id="一、-简易版-添加网易云外链"><a href="#一、-简易版-添加网易云外链" class="headerlink" title="一、(简易版)添加网易云外链"></a>一、(简易版)添加网易云外链</h2><p><strong>1.打开路径 <code>themes/yilia/layout/_partial/left-col.ejs</code>，在最后一个<code>&lt;/nav&gt;</code>上面添加代码</strong></p><figure class="highlight java"><table><tbody><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">&lt;!-- music --&gt;</span><br><span class="line">&lt;% <span class="keyword">if</span> (theme.music &amp;&amp; theme.music.enable) { %&gt;</span><br><span class="line">&lt;!-- &lt;div style=<span class="string">"position: absolute; bottom: 120px; left: auto; width: 85%;"</span>&gt; --&gt;</span><br><span class="line">&lt;div style=<span class="string">"position: absolute; left: auto; width: 85%;"</span>&gt;</span><br><span class="line">&lt;iframe frameborder=<span class="string">"no"</span> border=<span class="string">"0"</span> marginwidth=<span class="string">"0"</span> marginheight=<span class="string">"0"</span> width=<span class="number">220</span> height=<span class="number">86</span> src=<span class="string">"//music.163.com/outchain/player?type=2&amp;id=&lt;%- theme.music.id %&gt;&amp;auto=1&amp;height=66"</span>&gt;&lt;/iframe&gt;</span><br><span class="line">&lt;/div&gt;</span><br><span class="line">&lt;% } %&gt;</span><br></pre></td></tr></tbody></table></figure><p><strong>2.在主题配置文件中添加以下代码：</strong></p><figure class="highlight java"><table><tbody><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"># NetEase Cloud <span class="title function_">Music</span> <span class="params">(wangyiyun of course)</span></span><br><span class="line">music:</span><br><span class="line">  enable: <span class="literal">true</span></span><br><span class="line">  # id of a certain music on NetEase Cloud Music</span><br><span class="line">  # 添加网易云音乐id</span><br><span class="line">  id: <span class="number">1944221025</span> </span><br></pre></td></tr></tbody></table></figure><p><strong>3.获取音乐id的方式(有很多种,这里只介绍其中一种)</strong></p><p><img src="/2022/08/21/hexo-yilia%E6%B7%BB%E5%8A%A0%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/image-20220821230603618-1661095822986.png" alt="image-20220821230603618"></p><p>从链接中获取id</p><p><img src="/2022/08/21/hexo-yilia%E6%B7%BB%E5%8A%A0%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/image-20220821230616899-1661095822987.png" alt="image-20220821230616899"></p><p><strong>4.重新部署</strong></p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean &amp;&amp; hexo g &amp;&amp; hexo s</span><br></pre></td></tr></tbody></table></figure><p>效果图：</p><p><img src="/2022/08/21/hexo-yilia%E6%B7%BB%E5%8A%A0%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/image-20220821231608232.png" alt="image-20220821231608232"></p><h2 id="二、-复杂版-使用Aplayer播放器"><a href="#二、-复杂版-使用Aplayer播放器" class="headerlink" title="二、(复杂版)使用Aplayer播放器"></a>二、(复杂版)使用Aplayer播放器</h2><p>参考博主： <a href="https://yansheng836.github.io/article/5c52aefe.html">hexo+yilia添加背景音乐 | 荷塘月色的博客 (yansheng836.github.io)</a></p><ul><li><p>APlayer官网：<a href="https://aplayer.js.org/">https://aplayer.js.org</a></p></li><li><p>github仓库：<a href="https://github.com/MoePlayer/APlayer">https://github.com/MoePlayer/APlayer</a></p></li><li><p>使用说明：<a href="https://aplayer.js.org/#/zh-Hans/">https://aplayer.js.org/#/zh-Hans/</a></p></li><li></li></ul><p><strong>1.打开路径 <code>themes/yilia/layout/_partial/left-col.ejs</code>，在最后一个<code>&lt;/nav&gt;</code>上面添加以下代码</strong></p><figure class="highlight java"><table><tbody><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></pre></td><td class="code"><pre><span class="line">&lt;!-- 《左侧边栏添加--APlayer音乐播放器：详见：https:<span class="comment">//aplayer.js.org/#/zh-Hans/ --&gt;</span></span><br><span class="line">&lt;% <span class="keyword">if</span>(theme.aplayer.enable) { %&gt;</span><br><span class="line">    &lt;link rel=<span class="string">"stylesheet"</span> href=<span class="string">"https://cdn.jsdelivr.net/npm/aplayer@1.10.1/dist/APlayer.min.css"</span>&gt;</span><br><span class="line"></span><br><span class="line">    &lt;div id=<span class="string">"aplayer"</span> style=<span class="string">"text-align:left"</span>&gt;&lt;/div&gt;</span><br><span class="line">    &lt;script src=<span class="string">"https://cdn.jsdelivr.net/npm/aplayer@1.10.1/dist/APlayer.min.js"</span>&gt;&lt;/script&gt;</span><br><span class="line">    &lt;script src=<span class="string">"https://cdn.jsdelivr.net/npm/color-thief-don@2.0.2/src/color-thief.js"</span>&gt;&lt;/script&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!-- 为方便修改，添加一个配置文件，修改时直接修改配置文件即可。 --&gt;</span><br><span class="line">    &lt;script type=<span class="string">"text/javascript"</span> src=<span class="string">"&lt;%- url_for('js/APlayer_config.js') %&gt;"</span>&gt;&lt;/script&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!-- 根据封面自适应主题色，主要是作用于进度条 --&gt;</span><br><span class="line">    &lt;script type=<span class="string">"text/javascript"</span>&gt;</span><br><span class="line">          <span class="type">const</span> <span class="variable">colorThief</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ColorThief</span>();</span><br><span class="line">          <span class="type">const</span> <span class="variable">setTheme</span> <span class="operator">=</span> (index) =&gt; {</span><br><span class="line">            <span class="keyword">if</span> (!ap.list.audios[index].theme) {</span><br><span class="line">              colorThief.getColorAsync(ap.list.audios[index].cover, function(color) {</span><br><span class="line">                ap.theme(`rgb(${color[<span class="number">0</span>]}, ${color[<span class="number">1</span>]}, ${color[<span class="number">2</span>]})`, index);</span><br><span class="line">              });</span><br><span class="line">            }</span><br><span class="line">          };</span><br><span class="line">          setTheme(ap.list.index);</span><br><span class="line">          ap.on(<span class="string">'listswitch'</span>, (data) =&gt; {</span><br><span class="line">            setTheme(data.index);</span><br><span class="line">          });       </span><br><span class="line">    &lt;/script&gt;</span><br><span class="line">&lt;% } %&gt;</span><br><span class="line">&lt;!-- 左侧边栏添加--APlayer音乐播放器》 --&gt;</span><br></pre></td></tr></tbody></table></figure><p><strong>2.新建配置文件<code>D:\blog\themes\yilia\source\js\APlayer_config.js</code>:</strong></p><p><strong>其中lrc为歌词，cover为歌曲封面，url为歌曲外链</strong></p><figure class="highlight java"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="type">const</span> <span class="variable">ap</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">APlayer</span>({</span><br><span class="line">    container: document.getElementById(<span class="string">'aplayer'</span>),</span><br><span class="line">    fixed: <span class="literal">true</span>,</span><br><span class="line">    autoplay: <span class="literal">false</span>,</span><br><span class="line">    theme: <span class="string">'#b7daff'</span>,</span><br><span class="line">    loop: <span class="string">'all'</span>,</span><br><span class="line">    order: <span class="string">'list'</span>,</span><br><span class="line">    preload: <span class="string">'auto'</span>,</span><br><span class="line">    volume: <span class="number">0.5</span>,</span><br><span class="line">    lrcType: <span class="number">3</span>,</span><br><span class="line">    mutex: <span class="literal">true</span>,</span><br><span class="line">    listFolded: <span class="literal">false</span>,</span><br><span class="line"></span><br><span class="line">    audio: [{</span><br><span class="line">            name: <span class="string">'裂缝中的阳光'</span>,</span><br><span class="line">            artist: <span class="string">'林俊杰'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/裂缝中的阳光-LBI利比.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M000001gqOnU3DTg2S_2.jpg?max_age=2592000'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C400001cS6VI1XeMHN.m4a?guid=180896750&amp;vkey=4B51FF092AB4EEB0754A1539399F801EDADA3CC1028D3840EBAFAA5E82D04149DBCB45887C30C8FE32E68AF759C434ABA044F006F8C22E79&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  },</span><br><span class="line">{</span><br><span class="line">            name: <span class="string">'珊瑚海'</span>,</span><br><span class="line">            artist: <span class="string">'周杰伦'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/珊瑚海 (Live)-陈思思、周杰伦.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M0000024bjiL2aocxT.jpg?max_age=2592000'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C400001pcURc0YZlCM.m4a?guid=7073585700&amp;vkey=374491702BD053FCF5A04206BB41AA731E46A8CE46D8DE70811F251AE225AF564EDAECF374933F6F65DAA9D3A3C024FB29CCAFC260D42636&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  },</span><br><span class="line">{</span><br><span class="line">            name: <span class="string">'就是爱你'</span>,</span><br><span class="line">            artist: <span class="string">'陶喆'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/就是爱你-陶喆.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M000003ofGzS3C23Ow.jpg?max_age=2592000'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C400000c72vs0aRony.m4a?guid=8151800783&amp;vkey=6D599785E164E66F9F825B2B9BF3D4FD9FB9FBC035486EBB123F05502E2D3339C666040657F1844A9944FAD018209AA849BAE5FFD66C260D&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  },</span><br><span class="line">{</span><br><span class="line">            name: <span class="string">'不流泪的机场'</span>,</span><br><span class="line">            artist: <span class="string">'林俊杰'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/不流泪的机场-林俊杰.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M000002byTjo3vFz40.jpg?max_age=2592000'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C400000nVR614KJmJv.m4a?guid=2219193548&amp;vkey=74C814CB2C6DE9EDB9DC310F2773FB26F80745920EEE4D5934832E2A53BE60ABDFDC6F7BF9DD2CF0DF4845FB7F736C533796CE89C8C0996E&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  },</span><br><span class="line">        {</span><br><span class="line">            name: <span class="string">'必杀技'</span>,</span><br><span class="line">            artist: <span class="string">'古巨基'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/必杀技-古巨基.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M000004MOwZC3HaQFc.jpg?max_age=2592000?param=300x300'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C400002ixWbp3N9FqG.m4a?guid=2763488988&amp;vkey=0E862A403A9FA2D645C1BE5C071E87C6F81B7D031D546FB498575E95D74FA249018CA8CFBFA572906758569FCEBF3A366C2F667C9A66285B&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  },</span><br><span class="line">            {</span><br><span class="line">            name: <span class="string">'轨迹'</span>,</span><br><span class="line">            artist: <span class="string">'周杰伦'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/轨迹 (电台版)-周杰伦.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M000001BGzMs369FzU.jpg?max_age=2592000'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C4000021XVFE34Wsbw.m4a?guid=2710359602&amp;vkey=4ACDC94F1B996F366558F7FE4880124FAD225CF71461908E1F4DF876636BDC51BBE72F1B9DAA5C0DFBFAD8D4DB3C9B2FCEE84047D7D014C1&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  },</span><br><span class="line">            {</span><br><span class="line">            name: <span class="string">'野孩子'</span>,</span><br><span class="line">            artist: <span class="string">'杨千嬅'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/野孩子-杨千嬅.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M000001mImhQ4doM89.jpg?max_age=2592000'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C400002ctpWm3389rs.m4a?guid=8577755719&amp;vkey=F9EB727A962A27B75AC637F7F3C39870C0B9799162FE208E0E47B87273BB796EA48D55EECE165962F95C5A82FF2D347E0DF05F07B378F2BE&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  },</span><br><span class="line">{</span><br><span class="line">            name: <span class="string">'单车'</span>,</span><br><span class="line">            artist: <span class="string">'陈奕迅'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/单车-陈奕迅.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M000004S8YQr3UmEbG.jpg?max_age=2592000'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C400000wa9ED359rBP.m4a?guid=2940626500&amp;vkey=CF3F96BE00357516C2F2A943F67DB2C92454AF4F74FA0F6ECDB54B9BDD30D4710055D79CE7B13540783240F72A7DDD1A59EE6A977361952A&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  },</span><br><span class="line">{</span><br><span class="line">            name: <span class="string">'枫'</span>,</span><br><span class="line">            artist: <span class="string">'周杰伦'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/枫 (Live)-杨搏.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M0000024bjiL2aocxT.jpg?max_age=2592000'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C4000044M6Un0RXph2.m4a?guid=5755143211&amp;vkey=D799340E0A109DF3AA6D4FE7A77A7292474DBF154E2E54962172B58B8F1A5B949755EDA38FD173E9065B6017A495A4D3426FC3363DAADC54&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  },</span><br><span class="line"></span><br><span class="line">{</span><br><span class="line">            name: <span class="string">'阴天快乐'</span>,</span><br><span class="line">            artist: <span class="string">'陈奕迅'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/阴天快乐-陈奕迅.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M000003rytri2FHG3V.jpg?max_age=2592000'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C400002lRDaP1XC1vD.m4a?guid=4230386196&amp;vkey=D6ABC61F96CFDB4F2FED01FD415CD497D3C3AE0FE7A0DE4C0D0D97587E1E48AE17305DF0092DBCB8864D9BD565071568B7B7DDF337ADCCDB&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  },</span><br><span class="line">{</span><br><span class="line">            name: <span class="string">'Butter-Fly'</span>,</span><br><span class="line">            artist: <span class="string">'和田光司'</span>,</span><br><span class="line">            lrc: <span class="string">'lrc/Butter-Fly-和田光司.lrc'</span>,</span><br><span class="line">            cover: <span class="string">'https://y.qq.com/music/photo_new/T002R300x300M000003hS7PE1Sk8yu_1.jpg?max_age=2592000'</span>,</span><br><span class="line">            url: <span class="string">'https://dl.stream.qqmusic.qq.com/C400000ROsEZ1uLivT.m4a?guid=8720133235&amp;vkey=770C74EFC77B81F8C81488C9589EA62C5ED6BEB7F89D4C8B33EB7325F84054D5A8D0A26742FDC6AD773AFC300424796254280E9F364BE18D&amp;uin=496286034&amp;fromtag=120032'</span></span><br><span class="line">                  }</span><br><span class="line">        ]</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><p>这里给大家提供一个快速获取歌曲信息的网站</p><p><a href="https://music.liuzhijin.cn/">https://music.liuzhijin.cn/</a></p><p><strong>3.同时需要在主题的配置文件<code>themes/yilia/_config.yml</code>中开启：</strong></p><figure class="highlight java"><table><tbody><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"># 添加APlayer音乐播放器，官网：https:<span class="comment">//aplayer.js.org</span></span><br><span class="line"># github: https:<span class="comment">//github.com/MoePlayer/APlayer</span></span><br><span class="line">aplayer:</span><br><span class="line">  enable: <span class="literal">true</span></span><br></pre></td></tr></tbody></table></figure><p><strong>4.效果图：</strong></p><p><img src="/2022/08/21/hexo-yilia%E6%B7%BB%E5%8A%A0%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/image-20220821232726380.png" alt="image-20220821232726380"></p><p>后续如果需要更改歌单直接到js\APlayer_config.js文件修改相应的信息即可</p><p><strong>注：这种方式网页端有显示播放器但是在手机端无法显示，有设置手机端能显示的办法但是网页端又不能显示了，我目前还没解决这个问题</strong></p><h2 id="三、手机端设置播放器发方法"><a href="#三、手机端设置播放器发方法" class="headerlink" title="三、手机端设置播放器发方法"></a><strong>三、手机端设置播放器发方法</strong></h2><p><strong>1.添加插件</strong></p><p>找到对应<code>D:\blog\themes\yilia\layout\layout.ejs</code>的文件，在<code>&lt;body&gt;</code>和 <code>&lt;div id="container"</code>之间添加：</p><figure class="highlight java"><table><tbody><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></pre></td><td class="code"><pre><span class="line">&lt;!-- 《添加--APlayer音乐播放器,详见: https:<span class="comment">//aplayer.js.org/#/zh-Hans/ --&gt;</span></span><br><span class="line">&lt;% <span class="keyword">if</span>(theme.aplayer.enable) { %&gt;</span><br><span class="line">    &lt;link rel=<span class="string">"stylesheet"</span> href=<span class="string">"https://cdn.jsdelivr.net/npm/aplayer@1.10.1/dist/APlayer.min.css"</span>&gt;</span><br><span class="line"></span><br><span class="line">    &lt;div id=<span class="string">"aplayer"</span> style=<span class="string">"text-align:left;z-index: 10;"</span>&gt;&lt;/div&gt;</span><br><span class="line">    &lt;script src=<span class="string">"https://cdn.jsdelivr.net/npm/aplayer@1.10.1/dist/APlayer.min.js"</span>&gt;&lt;/script&gt;</span><br><span class="line">    &lt;script src=<span class="string">"https://cdn.jsdelivr.net/npm/color-thief-don@2.0.2/src/color-thief.js"</span>&gt;&lt;/script&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!-- 为方便修改，添加一个配置文件，修改时直接修改配置文件即可。 --&gt;</span><br><span class="line">    &lt;script type=<span class="string">"text/javascript"</span> src=<span class="string">"&lt;%- url_for('js/APlayer_config.js') %&gt;"</span>&gt;&lt;/script&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!-- 根据封面自适应主题色，主要是作用于进度条 --&gt;</span><br><span class="line">    &lt;script type=<span class="string">"text/javascript"</span>&gt;</span><br><span class="line">          <span class="type">const</span> <span class="variable">colorThief</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ColorThief</span>();</span><br><span class="line">          <span class="type">const</span> <span class="variable">setTheme</span> <span class="operator">=</span> (index) =&gt; {</span><br><span class="line">            <span class="keyword">if</span> (!ap.list.audios[index].theme) {</span><br><span class="line">              colorThief.getColorAsync(ap.list.audios[index].cover, function(color) {</span><br><span class="line">                ap.theme(`rgb(${color[<span class="number">0</span>]}, ${color[<span class="number">1</span>]}, ${color[<span class="number">2</span>]})`, index);</span><br><span class="line">              });</span><br><span class="line">            }</span><br><span class="line">          };</span><br><span class="line">          setTheme(ap.list.index);</span><br><span class="line">          ap.on(<span class="string">'listswitch'</span>, (data) =&gt; {</span><br><span class="line">            setTheme(data.index);</span><br><span class="line">          });</span><br><span class="line">    &lt;/script&gt;</span><br><span class="line">&lt;% } %&gt;</span><br><span class="line">&lt;!-- 添加--APlayer音乐播放器》 --&gt;</span><br></pre></td></tr></tbody></table></figure><p><strong>2.添加样式</strong></p><p>在<code>D:\blog\themes\yilia\source\main.0cf68a.css</code>任意位置添加如下代码：</p><figure class="highlight java"><table><tbody><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">@media</span> screen <span class="title function_">and</span> <span class="params">(max-width: 800px)</span> {</span><br><span class="line">    .aplayer {</span><br><span class="line">        opacity:<span class="number">0.8</span>;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;hexo-yilia主题添加音乐播放器&quot;&gt;&lt;a href=&quot;#hexo-yilia主题添加音乐播放器&quot; class=&quot;headerlink&quot; title=&quot;hexo-yilia主题添加音乐播放器&quot;&gt;&lt;/a&gt;hexo-yilia主题添加音乐播放器&lt;/h1&gt;&lt;p&gt;&lt;img src=&quot;/2022/08/21/hexo-yilia%E6%B7%BB%E5%8A%A0%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/image-20220821233328446.png&quot; alt=&quot;image-20220821233328446&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="学习笔记" scheme="https://henryxcy.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="个人博客" scheme="https://henryxcy.github.io/tags/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="hexo-yilia" scheme="https://henryxcy.github.io/tags/hexo-yilia/"/>
    
    <category term="音乐播放器" scheme="https://henryxcy.github.io/tags/%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>搭建个人博客</title>
    <link href="https://henryxcy.github.io/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
    <id>https://henryxcy.github.io/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/</id>
    <published>2022-08-21T07:19:54.000Z</published>
    <updated>2022-08-22T08:51:37.465Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="搭建个人博客"><a href="#搭建个人博客" class="headerlink" title="搭建个人博客"></a>搭建个人博客</h1><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/%E6%96%91-1660892269400.jpg" alt="斑"></p><span id="more"></span><h2 id="1-下载node-js"><a href="#1-下载node-js" class="headerlink" title="1.下载node.js"></a>1.下载node.js</h2><p>1.并安装，安装完成后使用命令行终端查看版本信息</p><figure class="highlight plaintext"><table><tbody><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">node -v</span><br><span class="line"></span><br><span class="line">npm -v</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818160250509-1660892269400.png" alt="image-20220818160250509"></p><h2 id="2-安装搭建个人博客博客框架"><a href="#2-安装搭建个人博客博客框架" class="headerlink" title="2.安装搭建个人博客博客框架"></a>2.安装搭建个人博客博客框架</h2><p><strong>2.1 由于在国内用npm包管理器安装镜像源很慢，我们需要用淘宝的镜像源cnpm来安装</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g cnpm --registry=http://registry.npm.taobao.org</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818160632643-1660892269401.png" alt="image-20220818160632643"></p><p><strong>2.2 安装完后查看版本信息确保安装完成</strong></p><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818160909327-1660892269401.png" alt="image-20220818160909327"></p><p><strong>2.3 确认完成后开始安装搭建个人博客博客框架</strong></p><figure class="highlight plaintext"><table><tbody><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">cnpm install -g 搭建个人博客-cli</span><br><span class="line"></span><br><span class="line">hexo -v</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818161330937-1660892269401.png" alt="image-20220818161330937"></p><p><strong>2.4 创建blog目录</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir blog</span><br></pre></td></tr></tbody></table></figure><p><strong>2.5 初始化搭建个人博客博客(速度太慢的可以在git bash里面做初始化)</strong></p><figure class="highlight plaintext"><table><tbody><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">hexo init  #Windows</span><br><span class="line">sudo hexo init  #Mac</span><br></pre></td></tr></tbody></table></figure><p>出现下面提示代表初始化完成！</p><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818162416708-1660892269401.png" alt="image-20220818162416708"></p><p><strong>2.6 启动博客</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo s</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818162612195-1660892269401.png" alt="image-20220818162612195"></p><p>访问<a href="http://localhost:4000/">http://localhost:4000</a></p><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818163035144-1660892269401.png" alt="image-20220818163035144"></p><h2 id="3-创建文章"><a href="#3-创建文章" class="headerlink" title="3.创建文章"></a>3.创建文章</h2><p>3.1 使用搭建个人博客 n命令创建文章</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo n "我的第一篇文章"</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818163453476-1660892269401.png" alt="image-20220818163453476"></p><p>3.2 进入目录查看</p><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818163540306-1660892269401.png" alt="image-20220818163540306"></p><p>3.3 退回到blog目录下，清理并重新生成</p><figure class="highlight plaintext"><table><tbody><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">hexo clean #清理</span><br><span class="line"> </span><br><span class="line">hexo g #重新生成</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818163817902-1660892269401.png" alt="image-20220818163817902"></p><p>3.4 重启搭建个人博客</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo s</span><br></pre></td></tr></tbody></table></figure><p>成功上传</p><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818175434919-1660892269401.png" alt="image-20220818175434919"></p><h2 id="4-将博客推到公网-GitHub"><a href="#4-将博客推到公网-GitHub" class="headerlink" title="4. 将博客推到公网(GitHub)"></a>4. 将博客推到公网(GitHub)</h2><p>4.1 创建仓库</p><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818175418861-1660892269401.png" alt="image-20220818175418861"></p><p>4.2 安装部署插件</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cnpm install --save hexo-deployer-git</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818175640809-1660892269401.png" alt="image-20220818175640809"></p><p>4.3 配置_config.yml文件，配置仓库地址</p><figure class="highlight plaintext"><table><tbody><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"># Deployment</span><br><span class="line">## Docs: https://hexo.io/docs/one-command-deployment</span><br><span class="line">deploy:</span><br><span class="line">  type: 'git'</span><br><span class="line">  repo: https://github.com/Henryxyc/Henryxyc.github.io.git</span><br><span class="line">  branch: master</span><br></pre></td></tr></tbody></table></figure><p>4.4 部署到远程仓库并输入GitHub账号密码</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo d</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220818180349664-1660892269401.png" alt="image-20220818180349664"></p><p>推送成功提示</p><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220819082135691-1660892269401.png" alt="image-20220819082135691"></p><p>GitHub也成功刷新</p><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220819082256133-1660892269401.png" alt="image-20220819082256133"></p><h2 id="5-设置主题"><a href="#5-设置主题" class="headerlink" title="5.设置主题"></a>5.设置主题</h2><p>5.1将主题clone到themes文件夹下</p><p>例如：</p><ul><li>git clone到themes目录下</li></ul><p>jelly主题：git clone <a href="https://gitee.com/preccrep/hexo-theme-jelly.git">https://gitee.com/preccrep/hexo-theme-jelly.git</a> themes/jelly</p><p>yilia主题： git clone <a href="https://github.com/litten/hexo-theme-yilia.git">https://github.com/litten/hexo-theme-yilia.git</a> themes/yilia</p><ul><li>或直接下载压缩包</li></ul><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220819162012401.png" alt="image-20220819162012401"></p><p>更多主题可以到搭建个人博客官网下载</p><p>5.2修改_config.yml文件</p><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220819095019469-1660892269401.png" alt="image-20220819095019469"></p><p>效果图：</p><p><img src="/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/image-20220819105243618.png" alt="image-20220819105243618"></p>]]></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;/h1&gt;&lt;p&gt;&lt;img src=&quot;/2022/08/21/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/%E6%96%91-1660892269400.jpg&quot; alt=&quot;斑&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="学习笔记" scheme="https://henryxcy.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="个人博客" scheme="https://henryxcy.github.io/tags/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>SpringCloud笔记</title>
    <link href="https://henryxcy.github.io/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/"/>
    <id>https://henryxcy.github.io/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/</id>
    <published>2022-08-19T09:42:31.000Z</published>
    <updated>2022-08-22T08:51:44.958Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="SpringCloud"><a href="#SpringCloud" class="headerlink" title="SpringCloud"></a>SpringCloud</h1><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/%E4%B8%8D%E8%89%AF%E4%BA%BA.webp" alt="不良人"></p><span id="more"></span><h2 id="一-微服务的调用方式"><a href="#一-微服务的调用方式" class="headerlink" title="一.微服务的调用方式"></a>一.微服务的调用方式</h2><h3 id="基于RestTemplate发起的http请求实现远程调用"><a href="#基于RestTemplate发起的http请求实现远程调用" class="headerlink" title="基于RestTemplate发起的http请求实现远程调用"></a>基于RestTemplate发起的http请求实现远程调用</h3><p>使用Srping提供的RestTemplate进行远程调用</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220801210443979.png" alt="image-20220801210443979"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220801210504244.png" alt="image-20220801210504244"></p><p>RestTemplate中使用getForObject或postForObject来发起http的get或post请求</p><p>注意：得到的是json格式的数据，使用第二个参数RestTemplate可以自动为我们提供反序列化将json格式转换为java对象</p><h3 id="提供者与消费者"><a href="#提供者与消费者" class="headerlink" title="提供者与消费者"></a>提供者与消费者</h3><ul><li>服务提供者：一次业务中，被其他微服务调用的业务。(提供接口给其他微服务)</li><li>服务消费者：一次业务中，调用其他微服务的服务。（调用其他微服务提供的接口）</li></ul><p>由订单微服务调用查询用户微服务</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220801211207489.png" alt="image-20220801211207489"></p><p>总结：</p><p>1.服务的调用关系</p><ul><li>服务提供者：暴露接口给其他微服务调用</li><li>服务消费者：调用其他微服务提供的接口</li><li>提供者与消费者角色是<strong>相对</strong>的</li><li>一个微服务既可以是提供者也可以使消费者</li></ul><h2 id="二-Eureka注册中心"><a href="#二-Eureka注册中心" class="headerlink" title="二.Eureka注册中心"></a>二.Eureka注册中心</h2><h3 id="服务调用出现的问题"><a href="#服务调用出现的问题" class="headerlink" title="服务调用出现的问题"></a>服务调用出现的问题</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220801212038651.png" alt="image-20220801212038651"></p><h3 id="Eureka的作用"><a href="#Eureka的作用" class="headerlink" title="Eureka的作用"></a>Eureka的作用</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220801212202558.png" alt="image-20220801212202558"></p><p>总结：</p><p>在Eureka架构中，微服务角色有两种：</p><ul><li><p>EurekaServer：服务端，注册中心</p><ul><li>记录服务信息</li><li>心跳监控</li></ul></li><li><p>EurekaClient：客户端 </p><ul><li><p>Provider：服务提供者，例如案例中的user-server</p><ul><li>注册自己的信息到EurekaServer</li><li>每隔30秒向EurekaServer发送心跳</li></ul></li><li><p>consumer：服务消费者，例如案例中的order-server</p><ul><li>根据服务名称从EurekaServer拉取服务列表</li><li>基于服务列表做负载均衡，选中一个微服务后发起远程调用</li></ul></li></ul></li></ul><h3 id="搭建EurekaServer"><a href="#搭建EurekaServer" class="headerlink" title="搭建EurekaServer"></a>搭建EurekaServer</h3><p>搭建EurekaServer步骤</p><p>1.创建项目，引入spring-cloud-starter-netflix-eureka-server的依赖</p><figure class="highlight java"><table><tbody><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">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;spring-cloud-starter-netflix-eureka-server&lt;/artifactId&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>2.编写启动类，添加@EnableEurekaServer注解(开启EurekaServer)</p><p>3.添加applicat.yml文件，编写下面配置</p><figure class="highlight yml"><table><tbody><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="attr">server:</span></span><br><span class="line">  <span class="attr">port:</span> <span class="number">10086</span> <span class="comment">#服务端口</span></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line">  <span class="attr">application:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">eurekaserver</span> <span class="comment">#eureka的服务名称</span></span><br><span class="line"><span class="attr">eureka:</span></span><br><span class="line">  <span class="attr">client:</span></span><br><span class="line">    <span class="attr">service-url:</span>  <span class="comment">#eureka的地址信息</span></span><br><span class="line">      <span class="attr">defaultZone:</span> <span class="string">http://127.0.0.1:10086/eureka</span></span><br></pre></td></tr></tbody></table></figure><h3 id="Ribbon负载均衡"><a href="#Ribbon负载均衡" class="headerlink" title="Ribbon负载均衡"></a>Ribbon负载均衡</h3><h4 id="负载均衡流程"><a href="#负载均衡流程" class="headerlink" title="负载均衡流程"></a>负载均衡流程</h4><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220804220329156.png" alt="image-20220804220329156"></p><h4 id="负载均衡策略"><a href="#负载均衡策略" class="headerlink" title="负载均衡策略"></a>负载均衡策略</h4><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220804222344886.png" alt="image-20220804222344886"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220804222410385.png" alt="image-20220804222410385"></p><p>通过定义IRule实现可以修改负载均衡规则，有两种方式：</p><p>1.代码方式：在配置类中定义一个全新的IRule：</p><figure class="highlight java"><table><tbody><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">@Bean</span></span><br><span class="line"><span class="keyword">public</span> IRule <span class="title function_">RandomRule</span><span class="params">()</span>{</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">RandomRule</span>();</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>2.配置文件方式：在yml中，添加新的配置也可以修改规则</p><figure class="highlight yml"><table><tbody><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="attr">userservice:</span></span><br><span class="line">  <span class="attr">ribbon:</span></span><br><span class="line">    <span class="attr">NFLoadBalancerRuleClassName:</span> <span class="string">com.netflix.loadbalancer.RandomRule</span> <span class="comment">#负载均衡规则</span></span><br></pre></td></tr></tbody></table></figure><h3 id="饥饿加载"><a href="#饥饿加载" class="headerlink" title="饥饿加载"></a>饥饿加载</h3><p>Ribbon默认采用的是懒加载，即第一次访问时才会去创建LoadBanlanceClient，请求时间很长，而饥饿加载则会在项目启动时创建，降低第一次访问的耗时，通过下面配置开启饥饿加载</p><figure class="highlight yml"><table><tbody><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="attr">ribbon:</span></span><br><span class="line">  <span class="attr">eager-load:</span></span><br><span class="line">    <span class="attr">enabled:</span> <span class="literal">true</span> <span class="comment">#开启饥饿加载</span></span><br><span class="line">    <span class="attr">clients:</span></span><br><span class="line">      <span class="string">-userservice</span> <span class="comment">#指定对userservice这个服务饥饿加载</span></span><br></pre></td></tr></tbody></table></figure><p>对比：</p><p>默认懒加载第一次访问所需时间：366ms</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220804223354536.png" alt="image-20220804223354536"></p><p>第二次访问所需时间：15ms</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220804223422603.png" alt="image-20220804223422603"></p><p>开启饥饿加载后第一次所需时间：296ms（第一次加载时还要完成dispatcherServlet初始化）</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220804223727380.png" alt="image-20220804223727380"></p><p>第二次访问所需时间：14ms</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220804223810341.png" alt="image-20220804223810341"></p><p>总结：</p><p>1.Ribbon负载均衡规则</p><ul><li>规则接口是IRule</li><li>默认实现的是ZoneAvoidanceRule，根据zone选择服务列表，然后轮询</li></ul><p>2.负载均衡自定义方式</p><ul><li>代码方式：配置灵活、但修改时需要重新打包发布</li><li>配置方式：直观，方便，无需重新打包发布，但是无法做到全局配置</li></ul><p>3.饥饿加载</p><ul><li>开启饥饿加载</li><li>指定饥饿加载的服务名称</li></ul><h2 id="三-Nacos服务注册中心"><a href="#三-Nacos服务注册中心" class="headerlink" title="三.Nacos服务注册中心"></a>三.Nacos服务注册中心</h2><h3 id="Nacos服务搭建"><a href="#Nacos服务搭建" class="headerlink" title="Nacos服务搭建"></a>Nacos服务搭建</h3><ul><li>下载安装包</li><li>解压</li><li>在bin目录下运行指令：startup.cmd -m standalone</li><li>默认服务地址端口为localhost:8848，可以在conf配置文件中修改端口</li></ul><h3 id="Nacos服务注册或发现"><a href="#Nacos服务注册或发现" class="headerlink" title="Nacos服务注册或发现"></a>Nacos服务注册或发现</h3><ul><li>引入nacos.discovery依赖</li><li>配置nacos地址spring.cloud.nacos.server-addr</li></ul><h3 id="Nacos服务分级存储模型"><a href="#Nacos服务分级存储模型" class="headerlink" title="Nacos服务分级存储模型"></a>Nacos服务分级存储模型</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805093344004.png" alt="image-20220805093344004"></p><p>总结：</p><p>1.Nacos服务分级存储模型</p><ul><li>一级是服务，例如userservice</li><li>二级是集群，例如杭州或上海</li><li>三级是实例，例如杭州机房的某台部署了userservice的服务器</li></ul><p>2.如何设置实例的集群属性</p><ul><li>修改application.yml文件，添加spring.cloud.nacos.discovery.cluster-name属性即可</li></ul><figure class="highlight yml"><table><tbody><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="attr">spring:</span></span><br><span class="line">  <span class="attr">datasource:</span></span><br><span class="line">    <span class="attr">url:</span> <span class="string">jdbc:mysql://localhost:3306/cloud_user?useSSL=false&amp;serverTimezone=UTC</span></span><br><span class="line">    <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line">    <span class="attr">password:</span> <span class="number">123456</span></span><br><span class="line">    <span class="attr">driver-class-name:</span> <span class="string">com.mysql.jdbc.Driver</span></span><br><span class="line">  <span class="attr">application:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">userservice</span></span><br><span class="line">  <span class="attr">cloud:</span></span><br><span class="line">    <span class="attr">nacos:</span></span><br><span class="line">      <span class="attr">server-addr:</span> <span class="string">localhost:8848</span> <span class="comment">#nacos服务地址</span></span><br><span class="line">      <span class="attr">discovery:</span></span><br><span class="line">        <span class="attr">cluster-name:</span> <span class="string">SH</span> <span class="comment">#集群名称 这里代指杭州或上海</span></span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805093710997.png" alt="image-20220805093710997"></p><h3 id="根据集群负载均衡"><a href="#根据集群负载均衡" class="headerlink" title="根据集群负载均衡"></a>根据集群负载均衡</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805095127731.png" alt="image-20220805095127731"></p><p>application.yml配置文件设置如下</p><figure class="highlight yml"><table><tbody><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="attr">spring:</span></span><br><span class="line">  <span class="attr">datasource:</span></span><br><span class="line">    <span class="attr">url:</span> <span class="string">jdbc:mysql://localhost:3306/cloud_order?useSSL=false&amp;serverTimezone=UTC</span></span><br><span class="line">    <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line">    <span class="attr">password:</span> <span class="number">123456</span></span><br><span class="line">    <span class="attr">driver-class-name:</span> <span class="string">com.mysql.jdbc.Driver</span></span><br><span class="line">  <span class="attr">application:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">orderservice</span></span><br><span class="line">  <span class="attr">cloud:</span></span><br><span class="line">    <span class="attr">nacos:</span></span><br><span class="line">      <span class="attr">server-addr:</span> <span class="string">localhost:8848</span></span><br><span class="line">      <span class="attr">discovery:</span></span><br><span class="line">        <span class="attr">cluster-name:</span> <span class="string">HZ</span> <span class="comment"># 配置集群名称，也就是机房位置 这里代指杭州</span></span><br></pre></td></tr></tbody></table></figure><p>设置NacosRule，默认先在本地同集群中寻找服务(NacosRule会优先选择同集群服务，然后在同集群服务中再使用随机选择方式，如果找不到同集群服务就会去其他集群寻找并且会报警告)</p><p>application.yml配置文件设置如下</p><figure class="highlight yml"><table><tbody><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="attr">userservice:</span></span><br><span class="line">  <span class="attr">ribbon:</span></span><br><span class="line">    <span class="attr">NFLoadBalancerRuleClassName:</span> <span class="string">com.alibaba.cloud.nacos.ribbon.NacosRule</span> <span class="comment">#负载均衡规则</span></span><br></pre></td></tr></tbody></table></figure><p>警告信息如下</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805095813500.png" alt="image-20220805095813500"></p><p>总结：</p><p>1.Nacos负载均衡策略</p><ul><li>优先选择同集群服务实例列表</li><li>本地集群找不到提供者，才会去其他集群寻找，并且会报警告</li><li>确定了可用实例列表后，再采用随机负载均衡挑选实例</li></ul><h3 id="加权负载均衡"><a href="#加权负载均衡" class="headerlink" title="加权负载均衡"></a>加权负载均衡</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805102430420.png" alt="image-20220805102430420"></p><p>给服务设置权重</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805102504995.png" alt="image-20220805102504995"></p><p>总结：</p><p>1.实例的权重控制</p><ul><li>Nacos控制台可以设置实例的权重值，0-1之间</li><li>同集群内的多个实例，权重越高被访问的频率越高</li><li>权重设置为0则完全不会被访问</li></ul><h3 id="环境隔离-namespace"><a href="#环境隔离-namespace" class="headerlink" title="环境隔离 - namespace"></a>环境隔离 - namespace</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805103256985.png" alt="image-20220805103256985"></p><p><strong>创建namespace步骤</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805103344742.png" alt="image-20220805103344742"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805103405361.png" alt="image-20220805103405361"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805103427046.png" alt="image-20220805103427046"></p><p><strong>将order-service放入dev空间后，order-service就访问不到userservice，请求时会报错</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805103710122.png" alt="image-20220805103710122"></p><p>总结：</p><p>1.Nacos环境隔离</p><ul><li>namespace用来做环境隔离</li><li>每个namespace都有唯一id</li><li>不同namespace下的服务不可见</li></ul><h3 id="Nacos注册中心原理"><a href="#Nacos注册中心原理" class="headerlink" title="Nacos注册中心原理"></a>Nacos注册中心原理</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220805113222613.png" alt="image-20220805113222613"></p><h3 id="临时实例和非临时实例"><a href="#临时实例和非临时实例" class="headerlink" title="临时实例和非临时实例"></a>临时实例和非临时实例</h3><p>服务注册到Nacos时，可以选择注册为临时或非临时实例，通过下面配置来设置</p><figure class="highlight yml"><table><tbody><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="attr">spring:</span></span><br><span class="line">  <span class="attr">cloud:</span></span><br><span class="line">    <span class="attr">nacos:</span></span><br><span class="line">      <span class="attr">server-addr:</span> <span class="string">localhost:8848</span></span><br><span class="line">      <span class="attr">discovery:</span></span><br><span class="line">        <span class="attr">cluster-name:</span> <span class="string">HZ</span></span><br><span class="line">        <span class="attr">namespace:</span> <span class="string">a5e74974-aa6c-4009-9087-692b88dad128</span></span><br><span class="line">        <span class="attr">ephemeral:</span> <span class="literal">false</span>  <span class="comment">#设置为非临时实例</span></span><br></pre></td></tr></tbody></table></figure><p><strong>临时实例宕机时，会从nacos的服务列表中剔除，而非临时实例则不会</strong></p><p>总结：</p><p>1.Nacos与Eureka的共同点</p><ul><li>都支持服务注册和服务拉取</li><li>都支持服务提供者心跳方式做健康监测</li></ul><p>2.Nacos与Eureka的区别</p><ul><li>Nacos支持服务端主动监测提供者状态：临时实例采用心跳模式，非临时实例采用主动检测模式</li><li>临时实例心跳不正常会被剔除，而非临时实例则不会被剔除</li><li>Nacos支持服务列表变更的消息推送模式，服务列表更新更及时</li><li>Nacos集群默认采用AP方式，当集群中存在非临时实例时，采用CP模式；Eureka采用AP模式</li></ul><h3 id="Nacos配置管理"><a href="#Nacos配置管理" class="headerlink" title="Nacos配置管理"></a>Nacos配置管理</h3><h4 id="微服务配置拉取"><a href="#微服务配置拉取" class="headerlink" title="微服务配置拉取"></a>微服务配置拉取</h4><p>原本的配置文件读取过程</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220806153358914.png" alt="image-20220806153358914"></p><p>使用Nacos配置管理后配置文件读取过程</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220806153518537.png" alt="image-20220806153518537"></p><p>统一配置管理</p><p>1.引入Nacos的配置管理客户端依赖</p><figure class="highlight java"><table><tbody><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">&lt;!--nacos配置管理客户端依赖--&gt;</span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;com.alibaba.cloud&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;spring-cloud-starter-alibaba-nacos-config&lt;/artifactId&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>2.在userservice中的source目录添加一个bootstrap.yml文件，这个文件是引导文件，优先级高于application.yml:</p><figure class="highlight yaml"><table><tbody><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="attr">spring:</span></span><br><span class="line">  <span class="attr">application:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">userservice</span> <span class="comment">#服务名称</span></span><br><span class="line">  <span class="attr">profiles:</span></span><br><span class="line">    <span class="attr">active:</span> <span class="string">dev</span> <span class="comment">#环境</span></span><br><span class="line">  <span class="attr">cloud:</span></span><br><span class="line">    <span class="attr">nacos:</span></span><br><span class="line">      <span class="attr">server-addr:</span> <span class="string">localhost:8848</span> <span class="comment">#服务地址</span></span><br><span class="line">      <span class="attr">config:</span></span><br><span class="line">        <span class="attr">file-extension:</span> <span class="string">yaml</span> <span class="comment">#文件后缀名</span></span><br></pre></td></tr></tbody></table></figure><p>总结：</p><p>将配置交给Nacos管理的步骤</p><p>①在Nacos中添加配置文件</p><p>②在微服务中引入nacos的config依赖</p><p>③在微服务中添加bootstrap.yml，配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件</p><h4 id="配置热更新"><a href="#配置热更新" class="headerlink" title="配置热更新"></a>配置热更新</h4><p>有两种配置热更新方式：</p><p>1.使用@Value方式注入</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808082253365.png" alt="image-20220808082253365"></p><p>2.使用@ConfigurationProperties注入</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808082336763.png" alt="image-20220808082336763"></p><p>再结合@Autowired使用</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808082413644.png" alt="image-20220808082413644"></p><p>总结：</p><p>Nacos配置更改后，微服务可以实现热更新，方式：</p><p>①通过@Value注解注入，结合@RefreshScope来刷新</p><p>②通过@ConfigurationProperties注入，自动更新</p><p>注意事项：</p><ul><li>不是所有配置都适合放到配置中心，维护起来比较麻烦</li><li>建议将一些关键参数，需要运行时调整的参数放到Nacos配置中心，一般都是自定义配置</li></ul><h4 id="多环境配置共享"><a href="#多环境配置共享" class="headerlink" title="多环境配置共享"></a>多环境配置共享</h4><p>多服务共享配置</p><p>多种配置的优先级:</p><ul><li>服务名-profile.yaml(Nacos中配置) &gt; 服务名称.yaml(Nacos中配置) &gt; 本地配置</li></ul><p>总结：</p><p><strong>微服务会从Nacos读取的配置文件：</strong></p><p>①[服务名]-[spring.profile.active].yaml,环境配置</p><p>②[服务名].yaml,默认配置，多环境共享</p><p><strong>优先级：</strong></p><p>[服务名]-[环境].yaml &gt; [服务名].yaml &gt; 本地配置</p><h3 id="Nacos集群搭建"><a href="#Nacos集群搭建" class="headerlink" title="Nacos集群搭建"></a>Nacos集群搭建</h3><h4 id="1-集群结构图"><a href="#1-集群结构图" class="headerlink" title="1.集群结构图"></a>1.集群结构图</h4><p>官方给出的Nacos集群图：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/../../Typora%E7%AC%94%E8%AE%B0/springcloud/image-20210409210621117.png" alt="image-20210409210621117"></p><p>其中包含3个nacos节点，然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。</p><p>我们计划的集群结构：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/../../Typora%E7%AC%94%E8%AE%B0/springcloud/image-20210409211355037.png" alt="image-20210409211355037"></p><p>三个nacos节点的地址：</p><table><thead><tr><th>节点</th><th>ip</th><th>port</th></tr></thead><tbody><tr><td>nacos1</td><td>192.168.150.1</td><td>8845</td></tr><tr><td>nacos2</td><td>192.168.150.1</td><td>8846</td></tr><tr><td>nacos3</td><td>192.168.150.1</td><td>8847</td></tr></tbody></table><h4 id="2-搭建集群"><a href="#2-搭建集群" class="headerlink" title="2.搭建集群"></a>2.搭建集群</h4><p>搭建集群的基本步骤：</p><ul><li>搭建数据库，初始化数据库表结构</li><li>下载nacos安装包</li><li>配置nacos</li><li>启动nacos集群</li><li>nginx反向代理</li></ul><h4 id="2-1-初始化数据库"><a href="#2-1-初始化数据库" class="headerlink" title="2.1.初始化数据库"></a>2.1.初始化数据库</h4><p>Nacos默认数据存储在内嵌数据库Derby中，不属于生产可用的数据库。</p><p>官方推荐的最佳实践是使用带有主从的高可用数据库集群，主从模式的高可用数据库可以参考<strong>传智教育</strong>的后续高手课程。</p><p>这里我们以单点的数据库为例来讲解。</p><p>首先新建一个数据库，命名为nacos，而后导入下面的SQL：</p><figure class="highlight sql"><table><tbody><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><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `config_info` (</span><br><span class="line">  `id` <span class="type">bigint</span>(<span class="number">20</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> AUTO_INCREMENT COMMENT <span class="string">'id'</span>,</span><br><span class="line">  `data_id` <span class="type">varchar</span>(<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'data_id'</span>,</span><br><span class="line">  `group_id` <span class="type">varchar</span>(<span class="number">255</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `content` longtext <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'content'</span>,</span><br><span class="line">  `md5` <span class="type">varchar</span>(<span class="number">32</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'md5'</span>,</span><br><span class="line">  `gmt_create` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">'创建时间'</span>,</span><br><span class="line">  `gmt_modified` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">'修改时间'</span>,</span><br><span class="line">  `src_user` text COMMENT <span class="string">'source user'</span>,</span><br><span class="line">  `src_ip` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'source ip'</span>,</span><br><span class="line">  `app_name` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `tenant_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="string">''</span> COMMENT <span class="string">'租户字段'</span>,</span><br><span class="line">  `c_desc` <span class="type">varchar</span>(<span class="number">256</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `c_use` <span class="type">varchar</span>(<span class="number">64</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `effect` <span class="type">varchar</span>(<span class="number">64</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `type` <span class="type">varchar</span>(<span class="number">64</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `c_schema` text,</span><br><span class="line">  <span class="keyword">PRIMARY</span> KEY (`id`),</span><br><span class="line">  <span class="keyword">UNIQUE</span> KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)</span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8 <span class="keyword">COLLATE</span><span class="operator">=</span>utf8_bin COMMENT<span class="operator">=</span><span class="string">'config_info'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="comment">/*   数据库全名 = nacos_config   */</span></span><br><span class="line"><span class="comment">/*   表名称 = config_info_aggr   */</span></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `config_info_aggr` (</span><br><span class="line">  `id` <span class="type">bigint</span>(<span class="number">20</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> AUTO_INCREMENT COMMENT <span class="string">'id'</span>,</span><br><span class="line">  `data_id` <span class="type">varchar</span>(<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'data_id'</span>,</span><br><span class="line">  `group_id` <span class="type">varchar</span>(<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'group_id'</span>,</span><br><span class="line">  `datum_id` <span class="type">varchar</span>(<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'datum_id'</span>,</span><br><span class="line">  `content` longtext <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'内容'</span>,</span><br><span class="line">  `gmt_modified` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'修改时间'</span>,</span><br><span class="line">  `app_name` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `tenant_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="string">''</span> COMMENT <span class="string">'租户字段'</span>,</span><br><span class="line">  <span class="keyword">PRIMARY</span> KEY (`id`),</span><br><span class="line">  <span class="keyword">UNIQUE</span> KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)</span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8 <span class="keyword">COLLATE</span><span class="operator">=</span>utf8_bin COMMENT<span class="operator">=</span><span class="string">'增加租户字段'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="comment">/*   数据库全名 = nacos_config   */</span></span><br><span class="line"><span class="comment">/*   表名称 = config_info_beta   */</span></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `config_info_beta` (</span><br><span class="line">  `id` <span class="type">bigint</span>(<span class="number">20</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> AUTO_INCREMENT COMMENT <span class="string">'id'</span>,</span><br><span class="line">  `data_id` <span class="type">varchar</span>(<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'data_id'</span>,</span><br><span class="line">  `group_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'group_id'</span>,</span><br><span class="line">  `app_name` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'app_name'</span>,</span><br><span class="line">  `content` longtext <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'content'</span>,</span><br><span class="line">  `beta_ips` <span class="type">varchar</span>(<span class="number">1024</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'betaIps'</span>,</span><br><span class="line">  `md5` <span class="type">varchar</span>(<span class="number">32</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'md5'</span>,</span><br><span class="line">  `gmt_create` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">'创建时间'</span>,</span><br><span class="line">  `gmt_modified` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">'修改时间'</span>,</span><br><span class="line">  `src_user` text COMMENT <span class="string">'source user'</span>,</span><br><span class="line">  `src_ip` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'source ip'</span>,</span><br><span class="line">  `tenant_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="string">''</span> COMMENT <span class="string">'租户字段'</span>,</span><br><span class="line">  <span class="keyword">PRIMARY</span> KEY (`id`),</span><br><span class="line">  <span class="keyword">UNIQUE</span> KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)</span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8 <span class="keyword">COLLATE</span><span class="operator">=</span>utf8_bin COMMENT<span class="operator">=</span><span class="string">'config_info_beta'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="comment">/*   数据库全名 = nacos_config   */</span></span><br><span class="line"><span class="comment">/*   表名称 = config_info_tag   */</span></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `config_info_tag` (</span><br><span class="line">  `id` <span class="type">bigint</span>(<span class="number">20</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> AUTO_INCREMENT COMMENT <span class="string">'id'</span>,</span><br><span class="line">  `data_id` <span class="type">varchar</span>(<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'data_id'</span>,</span><br><span class="line">  `group_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'group_id'</span>,</span><br><span class="line">  `tenant_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="string">''</span> COMMENT <span class="string">'tenant_id'</span>,</span><br><span class="line">  `tag_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'tag_id'</span>,</span><br><span class="line">  `app_name` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'app_name'</span>,</span><br><span class="line">  `content` longtext <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'content'</span>,</span><br><span class="line">  `md5` <span class="type">varchar</span>(<span class="number">32</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'md5'</span>,</span><br><span class="line">  `gmt_create` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">'创建时间'</span>,</span><br><span class="line">  `gmt_modified` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">'修改时间'</span>,</span><br><span class="line">  `src_user` text COMMENT <span class="string">'source user'</span>,</span><br><span class="line">  `src_ip` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'source ip'</span>,</span><br><span class="line">  <span class="keyword">PRIMARY</span> KEY (`id`),</span><br><span class="line">  <span class="keyword">UNIQUE</span> KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)</span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8 <span class="keyword">COLLATE</span><span class="operator">=</span>utf8_bin COMMENT<span class="operator">=</span><span class="string">'config_info_tag'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="comment">/*   数据库全名 = nacos_config   */</span></span><br><span class="line"><span class="comment">/*   表名称 = config_tags_relation   */</span></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `config_tags_relation` (</span><br><span class="line">  `id` <span class="type">bigint</span>(<span class="number">20</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'id'</span>,</span><br><span class="line">  `tag_name` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'tag_name'</span>,</span><br><span class="line">  `tag_type` <span class="type">varchar</span>(<span class="number">64</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'tag_type'</span>,</span><br><span class="line">  `data_id` <span class="type">varchar</span>(<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'data_id'</span>,</span><br><span class="line">  `group_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'group_id'</span>,</span><br><span class="line">  `tenant_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="string">''</span> COMMENT <span class="string">'tenant_id'</span>,</span><br><span class="line">  `nid` <span class="type">bigint</span>(<span class="number">20</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> AUTO_INCREMENT,</span><br><span class="line">  <span class="keyword">PRIMARY</span> KEY (`nid`),</span><br><span class="line">  <span class="keyword">UNIQUE</span> KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),</span><br><span class="line">  KEY `idx_tenant_id` (`tenant_id`)</span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8 <span class="keyword">COLLATE</span><span class="operator">=</span>utf8_bin COMMENT<span class="operator">=</span><span class="string">'config_tag_relation'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="comment">/*   数据库全名 = nacos_config   */</span></span><br><span class="line"><span class="comment">/*   表名称 = group_capacity   */</span></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `group_capacity` (</span><br><span class="line">  `id` <span class="type">bigint</span>(<span class="number">20</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> AUTO_INCREMENT COMMENT <span class="string">'主键ID'</span>,</span><br><span class="line">  `group_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">''</span> COMMENT <span class="string">'Group ID，空字符表示整个集群'</span>,</span><br><span class="line">  `quota` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'配额，0表示使用默认值'</span>,</span><br><span class="line">  `usage` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'使用量'</span>,</span><br><span class="line">  `max_size` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'单个配置大小上限，单位为字节，0表示使用默认值'</span>,</span><br><span class="line">  `max_aggr_count` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'聚合子配置最大个数，，0表示使用默认值'</span>,</span><br><span class="line">  `max_aggr_size` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值'</span>,</span><br><span class="line">  `max_history_count` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'最大变更历史数量'</span>,</span><br><span class="line">  `gmt_create` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">'创建时间'</span>,</span><br><span class="line">  `gmt_modified` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">'修改时间'</span>,</span><br><span class="line">  <span class="keyword">PRIMARY</span> KEY (`id`),</span><br><span class="line">  <span class="keyword">UNIQUE</span> KEY `uk_group_id` (`group_id`)</span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8 <span class="keyword">COLLATE</span><span class="operator">=</span>utf8_bin COMMENT<span class="operator">=</span><span class="string">'集群、各Group容量信息表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="comment">/*   数据库全名 = nacos_config   */</span></span><br><span class="line"><span class="comment">/*   表名称 = his_config_info   */</span></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `his_config_info` (</span><br><span class="line">  `id` <span class="type">bigint</span>(<span class="number">64</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `nid` <span class="type">bigint</span>(<span class="number">20</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> AUTO_INCREMENT,</span><br><span class="line">  `data_id` <span class="type">varchar</span>(<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `group_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `app_name` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'app_name'</span>,</span><br><span class="line">  `content` longtext <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `md5` <span class="type">varchar</span>(<span class="number">32</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `gmt_create` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span>,</span><br><span class="line">  `gmt_modified` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span>,</span><br><span class="line">  `src_user` text,</span><br><span class="line">  `src_ip` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `op_type` <span class="type">char</span>(<span class="number">10</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `tenant_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">DEFAULT</span> <span class="string">''</span> COMMENT <span class="string">'租户字段'</span>,</span><br><span class="line">  <span class="keyword">PRIMARY</span> KEY (`nid`),</span><br><span class="line">  KEY `idx_gmt_create` (`gmt_create`),</span><br><span class="line">  KEY `idx_gmt_modified` (`gmt_modified`),</span><br><span class="line">  KEY `idx_did` (`data_id`)</span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8 <span class="keyword">COLLATE</span><span class="operator">=</span>utf8_bin COMMENT<span class="operator">=</span><span class="string">'多租户改造'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="comment">/*   数据库全名 = nacos_config   */</span></span><br><span class="line"><span class="comment">/*   表名称 = tenant_capacity   */</span></span><br><span class="line"><span class="comment">/******************************************/</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `tenant_capacity` (</span><br><span class="line">  `id` <span class="type">bigint</span>(<span class="number">20</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> AUTO_INCREMENT COMMENT <span class="string">'主键ID'</span>,</span><br><span class="line">  `tenant_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">''</span> COMMENT <span class="string">'Tenant ID'</span>,</span><br><span class="line">  `quota` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'配额，0表示使用默认值'</span>,</span><br><span class="line">  `usage` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'使用量'</span>,</span><br><span class="line">  `max_size` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'单个配置大小上限，单位为字节，0表示使用默认值'</span>,</span><br><span class="line">  `max_aggr_count` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'聚合子配置最大个数'</span>,</span><br><span class="line">  `max_aggr_size` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值'</span>,</span><br><span class="line">  `max_history_count` <span class="type">int</span>(<span class="number">10</span>) unsigned <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="string">'0'</span> COMMENT <span class="string">'最大变更历史数量'</span>,</span><br><span class="line">  `gmt_create` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">'创建时间'</span>,</span><br><span class="line">  `gmt_modified` datetime <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">'修改时间'</span>,</span><br><span class="line">  <span class="keyword">PRIMARY</span> KEY (`id`),</span><br><span class="line">  <span class="keyword">UNIQUE</span> KEY `uk_tenant_id` (`tenant_id`)</span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8 <span class="keyword">COLLATE</span><span class="operator">=</span>utf8_bin COMMENT<span class="operator">=</span><span class="string">'租户容量信息表'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `tenant_info` (</span><br><span class="line">  `id` <span class="type">bigint</span>(<span class="number">20</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> AUTO_INCREMENT COMMENT <span class="string">'id'</span>,</span><br><span class="line">  `kp` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'kp'</span>,</span><br><span class="line">  `tenant_id` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">default</span> <span class="string">''</span> COMMENT <span class="string">'tenant_id'</span>,</span><br><span class="line">  `tenant_name` <span class="type">varchar</span>(<span class="number">128</span>) <span class="keyword">default</span> <span class="string">''</span> COMMENT <span class="string">'tenant_name'</span>,</span><br><span class="line">  `tenant_desc` <span class="type">varchar</span>(<span class="number">256</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'tenant_desc'</span>,</span><br><span class="line">  `create_source` <span class="type">varchar</span>(<span class="number">32</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'create_source'</span>,</span><br><span class="line">  `gmt_create` <span class="type">bigint</span>(<span class="number">20</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'创建时间'</span>,</span><br><span class="line">  `gmt_modified` <span class="type">bigint</span>(<span class="number">20</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> COMMENT <span class="string">'修改时间'</span>,</span><br><span class="line">  <span class="keyword">PRIMARY</span> KEY (`id`),</span><br><span class="line">  <span class="keyword">UNIQUE</span> KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),</span><br><span class="line">  KEY `idx_tenant_id` (`tenant_id`)</span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8 <span class="keyword">COLLATE</span><span class="operator">=</span>utf8_bin COMMENT<span class="operator">=</span><span class="string">'tenant_info'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `users` (</span><br><span class="line">`username` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">PRIMARY</span> KEY,</span><br><span class="line">`password` <span class="type">varchar</span>(<span class="number">500</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">`enabled` <span class="type">boolean</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span></span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `roles` (</span><br><span class="line">`username` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">`role` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"><span class="keyword">UNIQUE</span> INDEX `idx_user_role` (`username` <span class="keyword">ASC</span>, `role` <span class="keyword">ASC</span>) <span class="keyword">USING</span> BTREE</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `permissions` (</span><br><span class="line">    `role` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">    `resource` <span class="type">varchar</span>(<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">    `action` <span class="type">varchar</span>(<span class="number">8</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">    <span class="keyword">UNIQUE</span> INDEX `uk_role_permission` (`role`,`resource`,`action`) <span class="keyword">USING</span> BTREE</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> users (username, password, enabled) <span class="keyword">VALUES</span> (<span class="string">'nacos'</span>, <span class="string">'$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu'</span>, <span class="literal">TRUE</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> roles (username, role) <span class="keyword">VALUES</span> (<span class="string">'nacos'</span>, <span class="string">'ROLE_ADMIN'</span>);</span><br></pre></td></tr></tbody></table></figure><h4 id="2-2-下载nacos"><a href="#2-2-下载nacos" class="headerlink" title="2.2.下载nacos"></a>2.2.下载nacos</h4><p>nacos在GitHub上有下载地址：<a href="https://github.com/alibaba/nacos/tags%EF%BC%8C%E5%8F%AF%E4%BB%A5%E9%80%89%E6%8B%A9%E4%BB%BB%E6%84%8F%E7%89%88%E6%9C%AC%E4%B8%8B%E8%BD%BD%E3%80%82">https://github.com/alibaba/nacos/tags，可以选择任意版本下载。</a></p><p>本例中才用1.4.1版本：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/../../Typora%E7%AC%94%E8%AE%B0/springcloud/image-20210409212119411.png" alt="image-20210409212119411"></p><h4 id="2-3-配置Nacos"><a href="#2-3-配置Nacos" class="headerlink" title="2.3.配置Nacos"></a>2.3.配置Nacos</h4><p>将这个包解压到任意非中文目录下，如图：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210402161843337.png" alt="image-20210402161843337"></p><p>目录说明：</p><ul><li>bin：启动脚本</li><li>conf：配置文件</li></ul><p>进入nacos的conf目录，修改配置文件cluster.conf.example，重命名为cluster.conf：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/../../Typora%E7%AC%94%E8%AE%B0/springcloud/image-20210409212459292.png" alt="image-20210409212459292"></p><p>然后添加内容：</p><figure class="highlight plaintext"><table><tbody><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">127.0.0.1:8845</span><br><span class="line">127.0.0.1.8846</span><br><span class="line">127.0.0.1.8847</span><br></pre></td></tr></tbody></table></figure><p>然后修改application.properties文件，添加数据库配置</p><figure class="highlight properties"><table><tbody><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"><span class="attr">spring.datasource.platform</span>=<span class="string">mysql</span></span><br><span class="line"></span><br><span class="line"><span class="attr">db.num</span>=<span class="string">1</span></span><br><span class="line"></span><br><span class="line"><span class="attr">db.url.0</span>=<span class="string">jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&amp;connectTimeout=1000&amp;socketTimeout=3000&amp;autoReconnect=true&amp;useUnicode=true&amp;useSSL=false&amp;serverTimezone=UTC</span></span><br><span class="line"><span class="attr">db.user.0</span>=<span class="string">root</span></span><br><span class="line"><span class="attr">db.password.0</span>=<span class="string">123</span></span><br></pre></td></tr></tbody></table></figure><h4 id="2-4-启动"><a href="#2-4-启动" class="headerlink" title="2.4.启动"></a>2.4.启动</h4><p>将nacos文件夹复制三份，分别命名为：nacos1、nacos2、nacos3</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/../../Typora%E7%AC%94%E8%AE%B0/springcloud/image-20210409213335538.png" alt="image-20210409213335538"> </p><p>然后分别修改三个文件夹中的application.properties，</p><p>nacos1:</p><figure class="highlight properties"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">server.port</span>=<span class="string">8845</span></span><br></pre></td></tr></tbody></table></figure><p>nacos2:</p><figure class="highlight properties"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">server.port</span>=<span class="string">8846</span></span><br></pre></td></tr></tbody></table></figure><p>nacos3:</p><figure class="highlight properties"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">server.port</span>=<span class="string">8847</span></span><br></pre></td></tr></tbody></table></figure><p>然后分别启动三个nacos节点：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">startup.cmd</span><br></pre></td></tr></tbody></table></figure><h4 id="2-5-nginx反向代理"><a href="#2-5-nginx反向代理" class="headerlink" title="2.5.nginx反向代理"></a>2.5.nginx反向代理</h4><p>找到课前资料提供的nginx安装包： </p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/../../Typora%E7%AC%94%E8%AE%B0/springcloud/image-20210410103253355.png" alt="image-20210410103253355"> </p><p>解压到任意非中文目录下：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/../../Typora%E7%AC%94%E8%AE%B0/springcloud/image-20210410103322874.png" alt="image-20210410103322874"> </p><p>修改conf/nginx.conf文件，配置如下：</p><figure class="highlight nginx"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="section">upstream</span> nacos-cluster {</span><br><span class="line">    <span class="attribute">server</span> <span class="number">127.0.0.1:8845</span>;</span><br><span class="line"><span class="attribute">server</span> <span class="number">127.0.0.1:8846</span>;</span><br><span class="line"><span class="attribute">server</span> <span class="number">127.0.0.1:8847</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="section">server</span> {</span><br><span class="line">    <span class="attribute">listen</span>       <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span>  localhost;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> /nacos {</span><br><span class="line">        <span class="attribute">proxy_pass</span> http://nacos-cluster;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>而后在浏览器访问：<a href="http://localhost/nacos%E5%8D%B3%E5%8F%AF%E3%80%82">http://localhost/nacos即可。</a></p><p>代码中application.yml文件配置如下：</p><figure class="highlight yaml"><table><tbody><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="attr">spring:</span></span><br><span class="line">  <span class="attr">cloud:</span></span><br><span class="line">    <span class="attr">nacos:</span></span><br><span class="line">      <span class="attr">server-addr:</span> <span class="string">localhost:80</span> <span class="comment"># Nacos地址</span></span><br></pre></td></tr></tbody></table></figure><h4 id="2-6-优化"><a href="#2-6-优化" class="headerlink" title="2.6.优化"></a>2.6.优化</h4><ul><li><p>实际部署时，需要给做反向代理的nginx服务器设置一个域名，这样后续如果有服务器迁移nacos的客户端也无需更改配置.</p></li><li><p>Nacos的各个节点应该部署到多个不同服务器，做好容灾和隔离</p></li></ul><p>总结：</p><p>①搭建MySQL集群并初始化数据表</p><p>②下载解压nacos</p><p>③修改集群配置(节点信息)、数据库配置</p><p>④分别启动多个nacos节点</p><p>⑤nginx反向代理</p><h2 id="http客户端Fegin-快速入门"><a href="#http客户端Fegin-快速入门" class="headerlink" title="http客户端Fegin-快速入门"></a>http客户端Fegin-快速入门</h2><h3 id="feign替代RestTemplate"><a href="#feign替代RestTemplate" class="headerlink" title="feign替代RestTemplate"></a>feign替代RestTemplate</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808112513306.png" alt="image-20220808112513306"></p><p>使用RestTemplate存在下面问题：</p><ul><li><p>代码可读性差,编程体验不统一</p></li><li><p>参数复杂URL难以维护</p></li></ul><p>使用Feign的步骤如下：</p><p>1.引入依赖</p><figure class="highlight java"><table><tbody><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">&lt;!--fegin客户端依赖--&gt;</span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;spring-cloud-starter-openfeign&lt;/artifactId&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>2.在启动类添加注解开启Feign的功能：</p><figure class="highlight java"><table><tbody><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">@MapperScan("cn.itcast.order.mapper")</span></span><br><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="meta">@EnableFeignClients</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">OrderApplication</span> {</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line">        SpringApplication.run(OrderApplication.class, args);</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>3.编写Feign客户端：</p><figure class="highlight java"><table><tbody><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">@FeignClient("userservice")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">UserClient</span> {</span><br><span class="line"></span><br><span class="line">    <span class="meta">@GetMapping("/user/{id}")</span></span><br><span class="line">    User <span class="title function_">findById</span><span class="params">(<span class="meta">@PathVariable("id")</span> Long id)</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>主要是基于springMVC的注解来声明远程调用的信息，比如：</p><ul><li>服务名称：userservice</li><li>请求方式：GET</li><li>请求路径：/user/{id}</li><li>请求参数：Long id</li><li>返回值类型：User</li></ul><p>总结：</p><p>①引入依赖</p><p>②添加EnableFeignClients注解</p><p>③编写FeignClient接口</p><p>④使用FeignClient中定义的方法代替RestTemplate</p><h3 id="自定义Feign的配置"><a href="#自定义Feign的配置" class="headerlink" title="自定义Feign的配置"></a>自定义Feign的配置</h3><p>配置Feign的两种方式：</p><p>方式一：配置文件方式</p><p>①全局生效：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808154602741.png" alt="image-20220808154602741"></p><p>②局部生效:</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808154633945.png" alt="image-20220808154633945"></p><p>方式二：java代码方式，需要先声明一个Bean：</p><figure class="highlight java"><table><tbody><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"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">DefaultConfig</span> {</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="keyword">public</span> Logger.Level <span class="title function_">feignLogLevel</span><span class="params">()</span>{</span><br><span class="line">        <span class="keyword">return</span> Logger.Level.BASIC;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>①而后如果是全局配置，则放到@EnableFeignClients这个注解中：</p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@EnableFeignClients(defaultConfiguration = DefaultConfig.class)</span></span><br></pre></td></tr></tbody></table></figure><p>②如果是局部配置，则放到@FeignClient这个注解中：</p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@FeignClient(value = "userservice",configuration = DefaultConfig.class)</span></span><br></pre></td></tr></tbody></table></figure><h3 id="Feign性能优化"><a href="#Feign性能优化" class="headerlink" title="Feign性能优化"></a>Feign性能优化</h3><p><strong>Feign需要优化的原因：避免多次创建和消耗连接所带来的性能消耗，http连接需要三次握手而断开连接又需要四次挥手，降低了性能。</strong></p><p>Feign底层的客户端实现：</p><ul><li>URLConnection：默认实现，不支持连接池</li><li>Apache HttpClient：支持连接池</li><li>OKHttp：支持连接池</li></ul><p>因此优化Feign的性能优化主要包括：</p><p>①使用连接池代替默认的URLConnection</p><p>②日志级别：最好使用basic或none</p><p><strong>Feign的性能优化-连接池配置</strong></p><p>Feign添加HttpClient的支持：</p><p>引入依赖：</p><figure class="highlight java"><table><tbody><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">&lt;!--引入HttpClient依赖--&gt;</span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;io.github.openfeign&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;feign-httpclient&lt;/artifactId&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>配置连接池：</p><figure class="highlight java"><table><tbody><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">feign:</span><br><span class="line">  client:</span><br><span class="line">    config:</span><br><span class="line">      <span class="keyword">default</span>:  #<span class="keyword">default</span>全局的配置</span><br><span class="line">        loggerLevel: BASIC #日志级别，BASIC就是基本的请求和响应结果</span><br><span class="line">  httpclient:</span><br><span class="line">    enabled: <span class="literal">true</span> # 支持HttpClient开关</span><br><span class="line">    max-connections: <span class="number">200</span> # 最大连接数</span><br><span class="line">    max-connections-per-route: <span class="number">50</span> # 单个路径最大连接数</span><br></pre></td></tr></tbody></table></figure><h3 id="Feign的最佳实践"><a href="#Feign的最佳实践" class="headerlink" title="Feign的最佳实践"></a>Feign的最佳实践</h3><p>方式一：继承</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808204949779.png" alt="image-20220808204949779"></p><p><strong>缺点：①耦合度太高，后期如果UserAPI需要更改，其子类和实现类都要进行修改</strong></p><p>​<strong>②这种继承对springMVC是不起作用的，即方法参数是继承不下来的，UserController需要自己去实现逻辑，而且注解需要自己再写一遍。</strong></p><p>方式二：抽取</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808205255845.png" alt="image-20220808205255845"></p><p>缺点：①如果orderservice只需要一个其中的某一两个方法，但是用依赖会将整个feign-api引入，就显得比较多余。 </p><h4 id="抽取FeignClient"><a href="#抽取FeignClient" class="headerlink" title="抽取FeignClient"></a>抽取FeignClient</h4><p>实现最佳实践方式二的步骤如下：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808210117928.png" alt="image-20220808210117928"></p><p>①创建module并引入feign依赖</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808211303270.png" alt="image-20220808211303270"></p><p>②在orderservice引入feign-api的依赖</p><figure class="highlight java"><table><tbody><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">&lt;!--引入feign的统一api--&gt;</span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;cn.itcast.demo&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;feign-api&lt;/artifactId&gt;</span><br><span class="line">    &lt;version&gt;<span class="number">1.0</span>&lt;/version&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p><strong>启动时发现报找不到UserClient，编译没报错说明有这个类确实有，无法注入成功说明这个类没有创建对象，在spring容器中找不到</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808211439517.png" alt="image-20220808211439517"></p><p><strong>原因：原先能创建对象的原因是@FeignClient(value = “userservice”)这个注解，spring扫描到这个注解就会给这个注解创建对象，而现在UserCilent在feign-api的包中，spring扫描不到所以无法创建对象。</strong></p><p>解决方案：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808211848271.png" alt="image-20220808211848271"></p><p><strong>方式一：会将Client包中的所有的客户端都加载进来</strong></p><p><strong>方式二：会精准加载对应的客户端(推荐)</strong></p><p>解决后启动成功！</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808212223762.png" alt="image-20220808212223762"></p><h2 id="统一网关Gateway"><a href="#统一网关Gateway" class="headerlink" title="统一网关Gateway"></a>统一网关Gateway</h2><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808213959719.png" alt="image-20220808213959719"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808214025074.png" alt="image-20220808214025074"></p><p>总结：</p><ul><li>对用户请求做身份认证、权限校验</li><li>将用户请求路由到微服务，并实现负载均衡</li><li>对用户请求做限流(防止超额请求访问微服务)</li></ul><h3 id="搭建网关服务"><a href="#搭建网关服务" class="headerlink" title="搭建网关服务"></a>搭建网关服务</h3><p>搭建网关的步骤：</p><p>1.创建新的module，引入springCloudGateway的依赖和nacos的服务发现依赖(<strong>因为网关本身也是一个微服务所以也需要注册到nacos中</strong>)</p><figure class="highlight java"><table><tbody><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">&lt;!-- nacos服务发现依赖--&gt;</span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;com.alibaba.cloud&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;spring-cloud-starter-alibaba-nacos-discovery&lt;/artifactId&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br><span class="line">&lt;!--网关gateway依赖--&gt;</span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;spring-cloud-starter-gateway&lt;/artifactId&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>2.编写路由配置及nacos地址</p><figure class="highlight java"><table><tbody><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">server:</span><br><span class="line">  port: <span class="number">10010</span></span><br><span class="line">spring:</span><br><span class="line">  application:</span><br><span class="line">    name: gateway # 服务名称</span><br><span class="line">  cloud:</span><br><span class="line">    nacos:</span><br><span class="line">      server-addr: localhost:<span class="number">8848</span> #nacos地址</span><br><span class="line">    gateway:</span><br><span class="line">      routes:</span><br><span class="line">        - id: user-service # 路由id，自定义，只要唯一即可</span><br><span class="line">          uri: lb:<span class="comment">//userservice # 路由的目标地址 lb就是负载均衡，后面跟的是服务名称</span></span><br><span class="line">          predicates: #路由断言，也就是判断请求是否符合路由规则的条件</span><br><span class="line">            - Path=/user<span class="comment">/** # 这个是按照路径匹配，只要以/user/开头就是符合要求</span></span><br><span class="line"><span class="comment">        - id: order-service</span></span><br><span class="line"><span class="comment">          uri: lb://orderservice</span></span><br><span class="line"><span class="comment">          predicates:</span></span><br><span class="line"><span class="comment">            - Path=/order/**</span></span><br></pre></td></tr></tbody></table></figure><p>重启测试发现即使我们在gateway中没有做业务逻辑也是可以查询到数据的，因为网关将请求发送到对应的微服务中。</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808221506238.png" alt="image-20220808221506238"></p><p>整个流程图解：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808221319533.png" alt="image-20220808221319533"></p><p>总结：</p><p><strong>网关搭建步骤：</strong></p><p>1.创建项目，引入nacos服务发现和gateway依赖</p><p>2.配置application.yml,包括服务基本信息，nacos地址，路由</p><p><strong>路由配置包括：</strong></p><p>1.路由id：路由的唯一标示</p><p>2.路由目标(url)：路由的目标地址，http代表固定地址，lb代表根据服务名负载均衡</p><p>3.路由断言(predicates):判断路由规则</p><h3 id="路由断言工厂Route-Predicate-Factory"><a href="#路由断言工厂Route-Predicate-Factory" class="headerlink" title="路由断言工厂Route Predicate Factory"></a>路由断言工厂Route Predicate Factory</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808234844030.png" alt="image-20220808234844030"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808234918971.png" alt="image-20220808234918971"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808234929445.png" alt="image-20220808234929445"></p><p><strong>需要时可以根据需求去spring官方文档查阅直接用</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220808235011014.png" alt="image-20220808235011014"></p><h3 id="路由过滤器GatewayFilter"><a href="#路由过滤器GatewayFilter" class="headerlink" title="路由过滤器GatewayFilter"></a>路由过滤器GatewayFilter</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809090138541.png" alt="image-20220809090138541"></p><p>Spring官方提供了30多种过滤器，可按需查询配置</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809090221911.png" alt="image-20220809090221911"></p><p><strong>实现方式</strong>(只对user/**下的请求有效)</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809090332090.png" alt="image-20220809090332090"></p><p><strong>默认过滤器</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809090440528.png" alt="image-20220809090440528"></p><p>总结：</p><ul><li>过滤器的作用是什么？</li></ul><p>①对路由的请求或响应做加工处理，比如添加请求头</p><p>②配置在路由下的过滤器只对当前路由的请求生效</p><ul><li>defaultFilters的作用是什么？</li></ul><p>①对所有路由都生效的过滤器</p><h3 id="全局过滤器GlobalFilter"><a href="#全局过滤器GlobalFilter" class="headerlink" title="全局过滤器GlobalFilter"></a>全局过滤器GlobalFilter</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809092140017.png" alt="image-20220809092140017"></p><p><strong>案例：</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809092200315.png" alt="image-20220809092200315"></p><p><strong>步骤：自定义过滤器</strong></p><p><strong>自定义类,实现GlobaFilter接口，添加Order注解</strong></p><figure class="highlight java"><table><tbody><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">@Component</span></span><br><span class="line"><span class="comment">//@Order(-1)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AuthorizeFilter</span> <span class="keyword">implements</span> <span class="title class_">GlobalFilter</span>, Ordered {</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> Mono&lt;Void&gt; <span class="title function_">filter</span><span class="params">(ServerWebExchange exchange, GatewayFilterChain chain)</span> {</span><br><span class="line">        <span class="comment">//1.获取请求参数</span></span><br><span class="line">        <span class="type">ServerHttpRequest</span> <span class="variable">request</span> <span class="operator">=</span> exchange.getRequest();</span><br><span class="line">        MultiValueMap&lt;String, String&gt; params = request.getQueryParams();</span><br><span class="line">        <span class="comment">//2.获取其中authorization参数</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">auth</span> <span class="operator">=</span> params.getFirst(<span class="string">"authorization"</span>);</span><br><span class="line">        <span class="comment">//3.判断authorization是否等于admin</span></span><br><span class="line">       <span class="keyword">if</span> (<span class="string">"admin"</span>.equals(auth)){</span><br><span class="line">            <span class="comment">//4.是，放行</span></span><br><span class="line">           <span class="keyword">return</span> chain.filter(exchange);</span><br><span class="line">        }</span><br><span class="line">        <span class="comment">//5.否，拦截</span></span><br><span class="line">        <span class="comment">//5.1设置状态码</span></span><br><span class="line">        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);</span><br><span class="line">       <span class="keyword">return</span> exchange.getResponse().setComplete();</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getOrder</span><span class="params">()</span> {</span><br><span class="line">        <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p><strong>使用@Order注解或者实现Ordered中的getOrder方法来设置过滤的执行优先级(数值越低优先级越高)</strong></p><p>运行效果：</p><p>失败：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809092433868.png" alt="image-20220809092433868"></p><p>成功：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809092454689.png" alt="image-20220809092454689"></p><p>总结：</p><ul><li>全局过滤器的作用是什么？</li></ul><p>对所有路由都生效的过滤器，并且可以自定义处理逻辑</p><ul><li>实现全局过滤器的步骤？</li></ul><p>①实现GlobaFilter接口</p><p>②添加@Order注解或实现Ordered接口</p><p>③编写处理逻辑</p><h3 id="过滤器执行顺序"><a href="#过滤器执行顺序" class="headerlink" title="过滤器执行顺序"></a>过滤器执行顺序</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809094243403.png" alt="image-20220809094243403"></p><p>执行顺序规则：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809094320541.png" alt="image-20220809094320541"></p><h3 id="跨域问题处理"><a href="#跨域问题处理" class="headerlink" title="跨域问题处理"></a>跨域问题处理</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809101420732.png" alt="image-20220809101420732"></p><p>网关处理采用的同样是CORS方案，并且只需要简单配置即可实现：</p><figure class="highlight java"><table><tbody><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">spring:</span><br><span class="line">  cloud:</span><br><span class="line">    gateway:</span><br><span class="line">      globalcors: # 全局的跨域处理</span><br><span class="line">        add-to-simple-url-handler-mapping: <span class="literal">true</span> # 解决options请求被拦截问题</span><br><span class="line">        corsConfigurations:</span><br><span class="line">          <span class="string">'[/**]'</span>:</span><br><span class="line">            allowedOrigins: # 允许哪些网站的跨域请求</span><br><span class="line">              - <span class="string">"http://localhost:8090"</span></span><br><span class="line">              - <span class="string">"http://www.leyou.com"</span></span><br><span class="line">            allowedMethods: # 允许的跨域ajax的请求方式</span><br><span class="line">              - <span class="string">"GET"</span></span><br><span class="line">              - <span class="string">"POST"</span></span><br><span class="line">              - <span class="string">"DELETE"</span></span><br><span class="line">              - <span class="string">"PUT"</span></span><br><span class="line">              - <span class="string">"OPTIONS"</span></span><br><span class="line">            allowedHeaders: <span class="string">"*"</span> # 允许在请求中携带的头信息</span><br><span class="line">            allowCredentials: <span class="literal">true</span> # 是否允许携带cookie</span><br><span class="line">            maxAge: <span class="number">360000</span> # 这次跨域检测的有效期</span><br></pre></td></tr></tbody></table></figure><p>总结：</p><p>CORS跨域需要配置的参数包括哪几个：</p><ul><li>允许哪些域名跨域？</li><li>允许哪些请求头？</li><li>允许哪些请求方式？</li><li>是否允许使用cookie？</li><li>有效期是多久？</li></ul><h2 id="什么是Docker"><a href="#什么是Docker" class="headerlink" title="什么是Docker"></a>什么是Docker</h2><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809115556041.png" alt="image-20220809115556041"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809115614633.png" alt="image-20220809115614633"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809115637438.png" alt="image-20220809115637438"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809115704872.png" alt="image-20220809115704872"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809115725284.png" alt="image-20220809115725284"></p><p>总结：</p><p>Docker是一个快速交付应用、运行应用的技术：</p><p>1.可以将程序及其依赖、运行环境一起打包为一个镜像，可以迁移到任意Linux操作系统</p><p>2.运行时利用沙箱机制形成隔离容器，各个应用互不干扰</p><p>3.启动、移除都可以通过一行命令完成，方便快捷</p><h3 id="Docker架构"><a href="#Docker架构" class="headerlink" title="Docker架构"></a>Docker架构</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809152129313.png" alt="image-20220809152129313"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809152146518.png" alt="image-20220809152146518"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809152201783.png" alt="image-20220809152201783"></p><p>总结：</p><p>镜像：</p><ul><li>将应用程序及其依赖、环境、配置打包在一起</li></ul><p>容器：</p><ul><li>镜像运行起来就是容器，一个镜像可以运行多个容器</li></ul><p>Docker结构：</p><ul><li>服务端：接收命令或远程请求，操作镜像或容器</li><li>客户端：发送命令或者请求到Docker服务端</li></ul><p>DockerHub：</p><ul><li>一个镜像托管的服务器，类似的还有阿里云镜像服务，统称为DockerRegistry</li></ul><h2 id="0-安装Docker"><a href="#0-安装Docker" class="headerlink" title="0.安装Docker"></a>0.安装Docker</h2><p>Docker 分为 CE 和 EE 两大版本。CE 即社区版（免费，支持周期 7 个月），EE 即企业版，强调安全，付费使用，支持周期 24 个月。</p><p>Docker CE 分为 <code>stable</code> <code>test</code> 和 <code>nightly</code> 三个更新频道。</p><p>官方网站上有各种环境下的 <a href="https://docs.docker.com/install/">安装指南</a>，这里主要介绍 Docker CE 在 CentOS上的安装。</p><h3 id="1-CentOS安装Docker"><a href="#1-CentOS安装Docker" class="headerlink" title="1.CentOS安装Docker"></a>1.CentOS安装Docker</h3><p>Docker CE 支持 64 位版本 CentOS 7，并且要求内核版本不低于 3.10， CentOS 7 满足最低内核的要求，所以我们在CentOS 7安装Docker。</p><h3 id="1-1-卸载（可选）"><a href="#1-1-卸载（可选）" class="headerlink" title="1.1.卸载（可选）"></a>1.1.卸载（可选）</h3><p>如果之前安装过旧版本的Docker，可以使用下面命令卸载：</p><figure class="highlight plaintext"><table><tbody><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">yum remove docker \</span><br><span class="line">                  docker-client \</span><br><span class="line">                  docker-client-latest \</span><br><span class="line">                  docker-common \</span><br><span class="line">                  docker-latest \</span><br><span class="line">                  docker-latest-logrotate \</span><br><span class="line">                  docker-logrotate \</span><br><span class="line">                  docker-selinux \</span><br><span class="line">                  docker-engine-selinux \</span><br><span class="line">                  docker-engine \</span><br><span class="line">                  docker-ce</span><br></pre></td></tr></tbody></table></figure><h3 id="1-2-安装docker"><a href="#1-2-安装docker" class="headerlink" title="1.2.安装docker"></a>1.2.安装docker</h3><p>首先需要大家虚拟机联网，安装yum工具</p><figure class="highlight sh"><table><tbody><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">yum install -y yum-utils \</span><br><span class="line">           device-mapper-persistent-data \</span><br><span class="line">           lvm2 --skip-broken</span><br></pre></td></tr></tbody></table></figure><p>然后更新本地镜像源：</p><figure class="highlight shell"><table><tbody><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 prompt_"># </span><span class="language-bash">设置docker镜像源</span></span><br><span class="line">yum-config-manager \</span><br><span class="line">    --add-repo \</span><br><span class="line">    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class="line">    </span><br><span class="line">sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo</span><br><span class="line"></span><br><span class="line">yum makecache fast</span><br><span class="line">注意：yum makecache fast在Centos8不再适用，可以更换为yum makecache</span><br></pre></td></tr></tbody></table></figure><p>然后输入命令：</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y docker-ce</span><br></pre></td></tr></tbody></table></figure><p>docker-ce为社区免费版本。稍等片刻，docker即可安装成功。</p><h3 id="1-3-启动docker"><a href="#1-3-启动docker" class="headerlink" title="1.3.启动docker"></a>1.3.启动docker</h3><p>Docker应用需要用到各种端口，逐一去修改防火墙设置。非常麻烦，因此建议大家直接关闭防火墙！</p><p>启动docker前，一定要关闭防火墙后！！</p><p>启动docker前，一定要关闭防火墙后！！</p><p>启动docker前，一定要关闭防火墙后！！</p><figure class="highlight sh"><table><tbody><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="comment"># 关闭</span></span><br><span class="line">systemctl stop firewalld</span><br><span class="line"></span><br><span class="line"><span class="comment"># 禁止开机启动防火墙</span></span><br><span class="line">systemctl <span class="built_in">disable</span> firewalld</span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><p>通过命令启动docker：</p><figure class="highlight sh"><table><tbody><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">systemctl start docker  <span class="comment"># 启动docker服务</span></span><br><span class="line"></span><br><span class="line">systemctl stop docker  <span class="comment"># 停止docker服务</span></span><br><span class="line"></span><br><span class="line">systemctl restart docker  <span class="comment"># 重启docker服务</span></span><br></pre></td></tr></tbody></table></figure><p>然后输入命令，可以查看docker版本：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker -v</span><br></pre></td></tr></tbody></table></figure><p>如图：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210418154704436.png" alt="image-20210418154704436"> </p><h3 id="1-4-配置镜像加速"><a href="#1-4-配置镜像加速" class="headerlink" title="1.4.配置镜像加速"></a>1.4.配置镜像加速</h3><p>docker官方镜像仓库网速较差，我们需要设置国内镜像服务：</p><p>参考阿里云的镜像加速文档：<a href="https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors">https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors</a></p><h3 id="2-CentOS7安装DockerCompose"><a href="#2-CentOS7安装DockerCompose" class="headerlink" title="2.CentOS7安装DockerCompose"></a>2.CentOS7安装DockerCompose</h3><h3 id="2-1-下载"><a href="#2-1-下载" class="headerlink" title="2.1.下载"></a>2.1.下载</h3><p>Linux下需要通过命令下载：</p><figure class="highlight sh"><table><tbody><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="comment"># 安装</span></span><br><span class="line">curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`<span class="built_in">uname</span> -s`-`<span class="built_in">uname</span> -m` &gt; /usr/local/bin/docker-compose</span><br></pre></td></tr></tbody></table></figure><p>如果下载速度较慢，或者下载失败，可以使用课前资料提供的docker-compose文件：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210417133020614.png" alt="image-20210417133020614"></p><p>上传到<code>/usr/local/bin/</code>目录也可以。</p><h3 id="2-2-修改文件权限"><a href="#2-2-修改文件权限" class="headerlink" title="2.2.修改文件权限"></a>2.2.修改文件权限</h3><p>修改文件权限：</p><figure class="highlight sh"><table><tbody><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="comment"># 修改权限</span></span><br><span class="line"><span class="built_in">chmod</span> +x /usr/local/bin/docker-compose</span><br></pre></td></tr></tbody></table></figure><h3 id="2-3-Base自动补全命令："><a href="#2-3-Base自动补全命令：" class="headerlink" title="2.3.Base自动补全命令："></a>2.3.Base自动补全命令：</h3><figure class="highlight sh"><table><tbody><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="comment"># 补全命令</span></span><br><span class="line">curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose &gt; /etc/bash_completion.d/docker-compose</span><br></pre></td></tr></tbody></table></figure><p>如果这里出现错误，需要修改自己的hosts文件：</p><figure class="highlight sh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">"199.232.68.133 raw.githubusercontent.com"</span> &gt;&gt; /etc/hosts</span><br></pre></td></tr></tbody></table></figure><h3 id="3-Docker镜像仓库"><a href="#3-Docker镜像仓库" class="headerlink" title="3.Docker镜像仓库"></a>3.Docker镜像仓库</h3><p>搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。</p><p>官网地址：<a href="https://hub.docker.com/_/registry">https://hub.docker.com/_/registry</a></p><h3 id="3-1-简化版镜像仓库"><a href="#3-1-简化版镜像仓库" class="headerlink" title="3.1.简化版镜像仓库"></a>3.1.简化版镜像仓库</h3><p>Docker官方的Docker Registry是一个基础版本的Docker镜像仓库，具备仓库管理的完整功能，但是没有图形化界面。</p><p>搭建方式比较简单，命令如下：</p><figure class="highlight sh"><table><tbody><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">docker run -d \</span><br><span class="line">    --restart=always \</span><br><span class="line">    --name registry\</span><br><span class="line">    -p 5000:5000 \</span><br><span class="line">    -v registry-data:/var/lib/registry \</span><br><span class="line">    registry</span><br></pre></td></tr></tbody></table></figure><p>命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录，这是私有镜像库存放数据的目录。</p><p>访问<a href="http://yourip:5000/v2/_catalog">http://YourIp:5000/v2/_catalog</a> 可以查看当前私有镜像服务中包含的镜像</p><h3 id="3-2-带有图形化界面版本"><a href="#3-2-带有图形化界面版本" class="headerlink" title="3.2.带有图形化界面版本"></a>3.2.带有图形化界面版本</h3><p>使用DockerCompose部署带有图象界面的DockerRegistry，命令如下：</p><figure class="highlight yaml"><table><tbody><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="attr">version:</span> <span class="string">'3.0'</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">registry:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">registry</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./registry-data:/var/lib/registry</span></span><br><span class="line">  <span class="attr">ui:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">joxit/docker-registry-ui:static</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">8080</span><span class="string">:80</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">REGISTRY_TITLE=传智教育私有仓库</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">REGISTRY_URL=http://registry:5000</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">registry</span></span><br></pre></td></tr></tbody></table></figure><h3 id="3-3-配置Docker信任地址"><a href="#3-3-配置Docker信任地址" class="headerlink" title="3.3.配置Docker信任地址"></a>3.3.配置Docker信任地址</h3><p>我们的私服采用的是http协议，默认不被Docker信任，所以需要做一个配置：</p><figure class="highlight sh"><table><tbody><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">vi /etc/docker/daemon.json</span><br><span class="line"><span class="comment"># 添加内容：</span></span><br><span class="line"><span class="string">"insecure-registries"</span>:[<span class="string">"http://192.168.150.101:8080"</span>] //地址是使用的服务器地址，需要更改</span><br><span class="line"><span class="comment"># 重加载</span></span><br><span class="line">systemctl daemon-reload</span><br><span class="line"><span class="comment"># 重启docker</span></span><br><span class="line">systemctl restart docker</span><br></pre></td></tr></tbody></table></figure><h2 id="Docker镜像命令"><a href="#Docker镜像命令" class="headerlink" title="Docker镜像命令"></a>Docker镜像命令</h2><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809173741142.png" alt="image-20220809173741142"></p><p><strong>命令：</strong></p><p>docker –help 查看所有命令</p><p>如：docker ./springcloud/ –help 查看该命令及其使用方法</p><p>步骤：</p><p>拉取镜像：</p><p>docker pull redis</p><p>查看镜像：</p><p>docker ./springcloud/</p><p>保存本地镜像为一个压缩包：</p><p>docker save -o redis.tar (如果不存在该文件会自动创建)</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809175146192.png" alt="image-20220809175146192"></p><p>删除本地redis镜像：</p><p>docker rmi redis:latest</p><p>加载压缩包为本地镜像：</p><p>docker load -i redis.tar</p><h2 id="Docker容器相关命令"><a href="#Docker容器相关命令" class="headerlink" title="Docker容器相关命令"></a>Docker容器相关命令</h2><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809202449766.png" alt="image-20220809202449766"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809175917648.png" alt="image-20220809175917648"></p><h3 id="案例一"><a href="#案例一" class="headerlink" title="案例一"></a>案例一</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809202123788.png" alt="image-20220809202123788"></p><p>操作：</p><p>创建容器：<strong>返回的一长串是容器的唯一标识id</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809202702156.png" alt="image-20220809202702156"></p><p>查看容器状态：可以获取容器的创建时间，状态，宿主机和容器端口映射关系以及容器名字</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809202852651.png" alt="image-20220809202852651"></p><p>通过浏览器访问宿主机ip端口出现如下页面说明nginx容器已经启动成功了(阿里云服务器需要配置安全组端口才可以访问到80端口)</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809204642439.png" alt="image-20220809204642439"></p><ul><li>查看日志：docker logs ikun(后面需要跟上容器确切的容器名称)</li></ul><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809204750711.png" alt="image-20220809204750711"></p><ul><li>查看跟踪日志:docker logs  -f  ikun</li></ul><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220809204906776.png" alt="image-20220809204906776"></p><h3 id="案例二"><a href="#案例二" class="headerlink" title="案例二"></a>案例二</h3><p>1.进入容器中：docker exec -it ikun bash</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810081653603.png" alt="image-20220810081653603"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810081830136.png" alt="image-20220810081830136"></p><p>2.去docker hub官方查找静态文件夹目录</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810082046025.png" alt="image-20220810082046025"></p><p>3.查看html文件内容：cat index.html</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810082139895.png" alt="image-20220810082139895"></p><p>4.替换文件内容：</p><p>sed -i ‘s#Welcome to nginx#大头川欢迎您#g’ index.html<br>sed -i ‘s##<meta charset="utf-8">#g’ index.html</p><p>5.浏览器访问成功替换：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810082315233.png" alt="image-20220810082315233"></p><p>6.删除容器：docker rm ikun(此命令不能删除运行中的容器) 、docker rm -f  ikun(强制删除，可以删除运行中的容器)</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810082520728.png" alt="image-20220810082520728"></p><h2 id="数据卷命令"><a href="#数据卷命令" class="headerlink" title="数据卷命令"></a>数据卷命令</h2><h3 id="为什么要使用数据卷？"><a href="#为什么要使用数据卷？" class="headerlink" title="为什么要使用数据卷？"></a>为什么要使用数据卷？</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810091029662.png" alt="image-20220810091029662"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810091054245.png" alt="image-20220810091054245"></p><h3 id="操作数据卷基本命令"><a href="#操作数据卷基本命令" class="headerlink" title="操作数据卷基本命令"></a>操作数据卷基本命令</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810091109188.png" alt="image-20220810091109188"></p><p>总结：</p><p><strong>数据卷的作用：</strong></p><ul><li>将容器与数据分离，解耦合，方便操作容器内数据，保证数据安全</li></ul><p><strong>数据卷操作：</strong></p><ul><li>docker volume create</li><li>docker volume ls</li><li>docker volume inspect</li><li>docker volume rm</li><li>docker volume prune</li></ul><h3 id="挂载数据卷"><a href="#挂载数据卷" class="headerlink" title="挂载数据卷"></a>挂载数据卷</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810091613074.png" alt="image-20220810091613074"></p><h4 id="案例一-1"><a href="#案例一-1" class="headerlink" title="案例一"></a>案例一</h4><p><strong>基于数据卷挂载</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810093003454.png" alt="image-20220810093003454"></p><p>创建数据卷加载到容器内的html目录:(容器内的目录可以去docker hub官方查阅)</p><ul><li><p>docker volume create html  (创建数据卷)</p></li><li><p>docker run –name kun -p 80:80 -v html:/usr/share/nginx/html -d nginx (运行容器并加载数据卷)</p></li><li><p>docker volume inspect html (查看数据卷挂载点;查看html数据卷位置)</p></li><li><p>cd /var/lib/docker/volumes/html/_data （进入目录)</p></li><li><p>使用高级编辑工具直接编辑html文件 或 使用 vi index.html 修改文件</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810093412297.png" alt="image-20220810093412297"></p></li></ul><p><strong>注意:运行容器并加载数据卷时，如果数据卷不存在docker会为我们自动创建数据卷</strong></p><h4 id="案例二-1"><a href="#案例二-1" class="headerlink" title="案例二"></a><strong>案例二</strong></h4><p><strong>基于目录挂载</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810101751141.png" alt="image-20220810101751141"></p><p>1.创建文件夹</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810213555947.png" alt="image-20220810213555947"></p><p>2.运行mysql容器(其中容器中的conf文件夹和data文件夹可以去docker hub官方查询)</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810213640583.png" alt="image-20220810213640583"></p><p>3.运行成功后，data文件夹就会映射到容器中data文件夹的数据</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810213858557.png" alt="image-20220810213858557"></p><p>4.测试数据库远程连接</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810213955212.png" alt="image-20220810213955212"></p><h4 id="两种数据卷挂载方式对比"><a href="#两种数据卷挂载方式对比" class="headerlink" title="两种数据卷挂载方式对比"></a>两种数据卷挂载方式对比</h4><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810214142257.png" alt="image-20220810214142257"></p><p>基于数据卷挂载：</p><p>优点：docker会全自动帮我们创建数据卷挂载目录，我们挂载时只需要挂载文件不需要考虑目录问题</p><p>缺点：目录位置不清楚，目录结构较深</p><p>基于目录挂载：</p><p>优点：目录是自己创建，虽然创建目录较为麻烦，但是后期可以自己快速定位到挂载文件目录</p><p>缺点：需要自己管理目录</p><h2 id="Dockerfile自定义镜像"><a href="#Dockerfile自定义镜像" class="headerlink" title="Dockerfile自定义镜像"></a>Dockerfile自定义镜像</h2><h3 id="镜像结构"><a href="#镜像结构" class="headerlink" title="镜像结构"></a>镜像结构</h3><ul><li><strong>镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。</strong></li></ul><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810215432481.png" alt="image-20220810215432481"></p><p>总结：</p><p>镜像是分层的结构，每一层称为一个Layer</p><ul><li>BaseImage层：包含基本的系统函数库、环境变量、文件系统</li><li>Entrypoint：入口，是镜像中应用启动的命令</li><li>其他：在Baseimage基础上添加依赖、安装程序、完成整个应用的安装和配置</li></ul><h3 id="自定义镜像"><a href="#自定义镜像" class="headerlink" title="自定义镜像"></a>自定义镜像</h3><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810220152411.png" alt="image-20220810220152411"></p><h4 id="案例一-2"><a href="#案例一-2" class="headerlink" title="案例一"></a>案例一</h4><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810220313779.png" alt="image-20220810220313779"></p><p>dockerfile内容</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810221525906.png" alt="image-20220810221525906"></p><p>1.在tmp目录下创建docker-demo目录</p><p>cd tmp</p><p>mkdir docker-demo</p><p>2.将资料放到指定文件夹下后(-t 后面添加要构建的名称和版本,空格后需要加上dockerfile的路径，由于已经在docker-demo路径下所以只需添加.即可)</p><p>执行 docker build -t javaweb:1.0  .</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810221645754.png" alt="image-20220810221645754"></p><p>3.构建完成后查看镜像是否加载完成</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810222246943.png" alt="image-20220810222246943"></p><p>4.运行容器</p><p>docker run –name web -p 8090:8090 -d javaweb:1.0 </p><p>5.使用浏览器访问端口(阿里云需要配置安全组允许访问8090端口)</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810222746396.png" alt="image-20220810222746396"></p><h4 id="案例二-2"><a href="#案例二-2" class="headerlink" title="案例二"></a>案例二</h4><p>由于构建镜像中这么多步骤而真正构建java项目的只有一行，其余步骤都是安装jdk，为了避免在很多微服务构建时中重复做这些操作，我们可以进行分层，将构建好的分层做一个镜像，以后就可以在此镜像基础上做构建，<strong>而java:8-alpine是一个体积非常小的jdk镜像，相当于已经帮我们把其余步骤做完了，我们可以在它的基础上进行构建</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810223149729.png" alt="image-20220810223149729"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810223548678.png" alt="image-20220810223548678"></p><p>基于java:8-alpine构建时只需要简单的步骤就能完成构建</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810223630304.png" alt="image-20220810223630304"></p><p>1.修改dockerfile文件并重新构建项目</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810224111019.png" alt="image-20220810224111019"></p><p>同样也能完成构建</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220810224145460.png" alt="image-20220810224145460"></p><h2 id="RabbitMQ部署指南"><a href="#RabbitMQ部署指南" class="headerlink" title="RabbitMQ部署指南"></a>RabbitMQ部署指南</h2><h3 id="1-单机部署"><a href="#1-单机部署" class="headerlink" title="1.单机部署"></a>1.单机部署</h3><p>我们在Centos7虚拟机中使用Docker来安装。</p><h3 id="1-1-下载镜像"><a href="#1-1-下载镜像" class="headerlink" title="1.1.下载镜像"></a>1.1.下载镜像</h3><p>方式一：在线拉取</p><figure class="highlight sh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull rabbitmq:3-management</span><br></pre></td></tr></tbody></table></figure><p>方式二：从本地加载</p><p>在课前资料已经提供了镜像包：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210423191210349.png" alt="image-20210423191210349"> </p><p>上传到虚拟机中后，使用命令加载镜像即可：</p><figure class="highlight sh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker load -i mq.tar</span><br></pre></td></tr></tbody></table></figure><h3 id="1-2-安装MQ"><a href="#1-2-安装MQ" class="headerlink" title="1.2.安装MQ"></a>1.2.安装MQ</h3><p>执行下面的命令来运行MQ容器：</p><figure class="highlight sh"><table><tbody><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">docker run \</span><br><span class="line"> -e RABBITMQ_DEFAULT_USER=henry \</span><br><span class="line"> -e RABBITMQ_DEFAULT_PASS=123456 \</span><br><span class="line"> --name mq \</span><br><span class="line"> --hostname mq1 \</span><br><span class="line"> -p 15672:15672 \</span><br><span class="line"> -p 5672:5672 \</span><br><span class="line"> -d \</span><br><span class="line"> rabbitmq:3-management</span><br></pre></td></tr></tbody></table></figure><h3 id="2-集群部署"><a href="#2-集群部署" class="headerlink" title="2.集群部署"></a>2.集群部署</h3><p>接下来，我们看看如何安装RabbitMQ的集群。</p><h3 id="2-1-集群分类"><a href="#2-1-集群分类" class="headerlink" title="2.1.集群分类"></a>2.1.集群分类</h3><p>在RabbitMQ的官方文档中，讲述了两种集群的配置方式：</p><ul><li>普通模式：普通模式集群不进行数据同步，每个MQ都有自己的队列、数据信息（其它元数据信息如交换机等会同步）。例如我们有2个MQ：mq1，和mq2，如果你的消息在mq1，而你连接到了mq2，那么mq2会去mq1拉取消息，然后返回给你。如果mq1宕机，消息就会丢失。</li><li>镜像模式：与普通模式不同，队列会在各个mq的镜像节点之间同步，因此你连接到任何一个镜像节点，均可获取到消息。而且如果一个节点宕机，并不会导致数据丢失。不过，这种方式增加了数据同步的带宽消耗。</li></ul><p>我们先来看普通模式集群。</p><h3 id="2-2-设置网络"><a href="#2-2-设置网络" class="headerlink" title="2.2.设置网络"></a>2.2.设置网络</h3><p>首先，我们需要让3台MQ互相知道对方的存在。</p><p>分别在3台机器中，设置 /etc/hosts文件，添加如下内容：</p><figure class="highlight plaintext"><table><tbody><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">192.168.150.101 mq1</span><br><span class="line">192.168.150.102 mq2</span><br><span class="line">192.168.150.103 mq3</span><br></pre></td></tr></tbody></table></figure><p>并在每台机器上测试，是否可以ping通对方：</p><h2 id="springAMQP"><a href="#springAMQP" class="headerlink" title="springAMQP"></a>springAMQP</h2><h3 id="入门案例的消息发送"><a href="#入门案例的消息发送" class="headerlink" title="入门案例的消息发送"></a>入门案例的消息发送</h3><p>流程如下：</p><p>步骤一：</p><p>1.在父工程中引入spring-amqp的依赖</p><p>2.在publisher(消息发送者)服务中利用RabbitTemplate发送消息到simple.queue这个队列</p><p>因为publisher和consumer中都需要引入amqp依赖，因此直接把依赖放到父依赖中</p><figure class="highlight java"><table><tbody><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">&lt;!--AMQP依赖，包含RabbitMQ--&gt;</span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;spring-boot-starter-amqp&lt;/artifactId&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></tbody></table></figure><p>步骤二：</p><p>1.在publisher服务中编写application.yml,添加mq连接信息：</p><figure class="highlight java"><table><tbody><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">spring:</span><br><span class="line">  rabbitmq: </span><br><span class="line">    host: <span class="number">120.77</span><span class="number">.46</span><span class="number">.95</span>  #主机名</span><br><span class="line">    port: <span class="number">5672</span>   #端口</span><br><span class="line">    virtual-host: /   #虚拟主机</span><br><span class="line">    username: henry  #用户名</span><br><span class="line">    password: <span class="number">123456</span>  #密码</span><br></pre></td></tr></tbody></table></figure><p>2.在publisher服务中新建一个测试类，编写测试方法：</p><figure class="highlight java"><table><tbody><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">@SpringBootTest</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SpringAmqpTest</span> {</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> RabbitTemplate rabbitTemplate;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Test</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">TestSendMessage2SimpleQueue</span><span class="params">()</span>{</span><br><span class="line">        <span class="type">String</span> <span class="variable">queueName</span> <span class="operator">=</span> <span class="string">"simple.queue"</span>;</span><br><span class="line">        <span class="type">String</span> <span class="variable">message</span> <span class="operator">=</span> <span class="string">"hello! spring Amqp"</span>;</span><br><span class="line">        rabbitTemplate.convertAndSend(queueName,message);</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>总结：</p><p>什么是AMQP？</p><ul><li>应用间消息通信的一种协议，与语言和平台无关。</li></ul><p>SpringAMQP如何发送消息？</p><ul><li>引入amqp的starter依赖</li><li>配置RabbitMQ地址</li><li>利用RabbitTemplate的convertAndSend方法</li></ul><h3 id="入门案例的消息接收"><a href="#入门案例的消息接收" class="headerlink" title="入门案例的消息接收"></a>入门案例的消息接收</h3><p>步骤3：</p><p>流程如下:</p><p>1.在consumer服务中编写application.yml，添加mq连接信息：</p><figure class="highlight java"><table><tbody><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">spring:</span><br><span class="line">  rabbitmq: </span><br><span class="line">    host: <span class="number">120.77</span><span class="number">.46</span><span class="number">.95</span>  #主机名</span><br><span class="line">    port: <span class="number">5672</span>   #端口</span><br><span class="line">    virtual-host: /   #虚拟主机</span><br><span class="line">    username: henry  #用户名</span><br><span class="line">    password: <span class="number">123456</span>  #密码</span><br></pre></td></tr></tbody></table></figure><p>2.在consumer服务中新建一个类，编写消费逻辑：</p><figure class="highlight java"><table><tbody><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">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ConsumerRabbitmqListener</span> {</span><br><span class="line"></span><br><span class="line">    <span class="meta">@RabbitListener(queues = "simple.queue")</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">ListenSimpleQueue</span><span class="params">(String msg)</span>{</span><br><span class="line">        System.out.println(<span class="string">"simple.queue消息队列接收信息:【"</span>+msg+<span class="string">"】"</span>);</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>总结：</p><p>SpringAMQP如何接收消息？</p><ul><li>引入amqp的starter依赖</li><li>配置RabbitMQ地址</li><li>定义类，添加@Component注解</li><li>类中声明方法，添加@RabbitListener注解，方法参数就是消息</li></ul><p><strong>注意：消息一旦消费就会从队列删除，RabbitMQ没有回溯消息功能</strong></p><h3 id="消费预取限制"><a href="#消费预取限制" class="headerlink" title="消费预取限制"></a>消费预取限制</h3><p>原因：默认情况是rabbitmq会把消息<strong>平均</strong>分配给多个消费者，但是有些消费者的处理速度很慢，导致其他消费者都处理完成以后还在处理。所以设置消费预取限制，<em>*<em>规定每个消费者每次预取多少个消息处理</em>，*避免消息的堆积</em>***。</p><p>修改application.yml文件，设置preFetch这个值，可以控制预取消息的上限：</p><figure class="highlight java"><table><tbody><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">spring:</span><br><span class="line">  rabbitmq:</span><br><span class="line">    host: <span class="number">120.77</span><span class="number">.46</span><span class="number">.95</span></span><br><span class="line">    port: <span class="number">5672</span></span><br><span class="line">    virtual-host: /</span><br><span class="line">    username: henry</span><br><span class="line">    password: <span class="number">123456</span></span><br><span class="line">    listener:</span><br><span class="line">      simple:</span><br><span class="line">        prefetch: <span class="number">1</span></span><br></pre></td></tr></tbody></table></figure><p>总结：</p><p>Work模型的使用：</p><ul><li>多个消费者绑定到一个队列，同一条消息只会被一个消费者处理</li><li>通过设置prefetch来控制消费者预取的消息数量</li></ul><h3 id="交换机类型"><a href="#交换机类型" class="headerlink" title="交换机类型"></a>交换机类型</h3><p>因为消息发布者发布的消息每次只能被一个消费者消费，如果我们在处理支付功能时需要把支付成功消息同时发送给订单管理，库存管理和短信业务模块，<strong>普通的模式不能满足我们的需求，所以我们需要使用交换机来完成。</strong></p><p><strong>注意：交换机只进行消息的转发，并不会存储消息，如果转发失败消息则会丢失。</strong></p><h4 id="Fanoutchange"><a href="#Fanoutchange" class="headerlink" title="Fanoutchange"></a>Fanoutchange</h4><p>步骤1：在consumer服务声明Exchange、Queue、Binding</p><p>在consumer服务创建一个类，添加@Configuration注解，并声明FanoutExchange、Queue和绑定关系对象Binding，代码如下：</p><figure class="highlight java"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FanoutConfig</span> {</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="comment">//1.声明交换机</span></span><br><span class="line">    <span class="keyword">public</span> FanoutExchange <span class="title function_">fanoutExchange</span><span class="params">()</span>{</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">FanoutExchange</span>(<span class="string">"henry.fanout"</span>);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="comment">//2.1 声明队列fanout.queue1</span></span><br><span class="line">    <span class="keyword">public</span> Queue <span class="title function_">fanoutQueue1</span><span class="params">()</span>{</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Queue</span>(<span class="string">"fanout.queue1"</span>);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="comment">//2.2 声明队列fanout.queue2</span></span><br><span class="line">    <span class="keyword">public</span> Queue <span class="title function_">fanoutQueue2</span><span class="params">()</span>{</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Queue</span>(<span class="string">"fanout.queue2"</span>);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="comment">//3.1  将队列1与交换机绑定</span></span><br><span class="line">    <span class="keyword">public</span> Binding <span class="title function_">fanoutBinding1</span><span class="params">(FanoutExchange fanoutExchange,Queue fanoutQueue1)</span>{</span><br><span class="line">        <span class="keyword">return</span> BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="comment">//3.1  将队列2与交换机绑定</span></span><br><span class="line">    <span class="keyword">public</span> Binding <span class="title function_">fanoutBinding2</span><span class="params">(FanoutExchange fanoutExchange,Queue fanoutQueue2)</span>{</span><br><span class="line">        <span class="keyword">return</span> BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>步骤2：在consumer服务声明两个消费者</p><p>在consumer服务的SpringRabbitListener类中，添加两个方法，分别监听fanout.queue和fanout.queue2:</p><figure class="highlight java"><table><tbody><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">@RabbitListener(queues = "fanout.queue1")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">ListenFanoutQueue1</span><span class="params">(String msg)</span>{</span><br><span class="line">    System.out.println(<span class="string">"fanout.queue1消息队列接收信息:【"</span>+msg+<span class="string">"】"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@RabbitListener(queues = "fanout.queue2")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">ListenFanoutQueue2</span><span class="params">(String msg)</span>{</span><br><span class="line">    System.out.println(<span class="string">"fanout.queue2消息队列接收信息:【"</span>+msg+<span class="string">"】"</span>);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>步骤3：在publisher服务发送消息到FanoutExchange</p><p>在publisher服务的SpringAmqpTest类中添加测试方法：</p><figure class="highlight java"><table><tbody><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">@Test</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">TestSendFanoutExchange</span><span class="params">()</span> {</span><br><span class="line">    <span class="type">String</span> <span class="variable">exchangeName</span> <span class="operator">=</span> <span class="string">"henry.fanout"</span>;</span><br><span class="line">    <span class="type">String</span> <span class="variable">message</span> <span class="operator">=</span> <span class="string">"hello! everyone"</span>;</span><br><span class="line">    rabbitTemplate.convertAndSend(exchangeName,<span class="string">""</span>,message);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>总结：</p><p>交换机的作用是什么？</p><ul><li>接收publisher发送的消息</li><li>将消息按照规则路由到与之绑定的队列</li><li>不能缓存消息，路由失败，消息丢失</li><li>FanoutExchange的会将消息路由到每个绑定的队列</li></ul><p>声明队列、交换机、绑定关系的Bean是什么？</p><ul><li>Queue</li><li>FanoutExchange</li><li>Binding</li></ul><h4 id="DirectExchange"><a href="#DirectExchange" class="headerlink" title="DirectExchange"></a>DirectExchange</h4><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816161659781.png" alt="image-20220816161659781"></p><p>步骤1：</p><p>1.在consumer服务中，编写两个消费者方法，分别监听direct.queue1和direct.queue2</p><p>2.并利用@RabbitListener声明Exchange、Queue、RoutingKey</p><figure class="highlight java"><table><tbody><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">@RabbitListener(bindings = @QueueBinding(</span></span><br><span class="line"><span class="meta">        value = @Queue(name = "direct.queue1"),</span></span><br><span class="line"><span class="meta">        exchange = @Exchange(name = "henry.direct",type = ExchangeTypes.DIRECT),</span></span><br><span class="line"><span class="meta">        key = {"red","blue"}</span></span><br><span class="line"><span class="meta">))</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">ListenDirectQueue1</span><span class="params">(String msg)</span>{</span><br><span class="line">    System.out.println(<span class="string">"direct.queue1消息队列接收信息:【"</span>+msg+<span class="string">"】"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@RabbitListener(bindings = @QueueBinding(</span></span><br><span class="line"><span class="meta">        value = @Queue(name = "direct.queue2"),</span></span><br><span class="line"><span class="meta">        exchange = @Exchange(name = "henry.direct",type = ExchangeTypes.DIRECT),</span></span><br><span class="line"><span class="meta">        key = {"red","yellow"}</span></span><br><span class="line"><span class="meta">))</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">ListenDirectQueue2</span><span class="params">(String msg)</span>{</span><br><span class="line">    System.out.println(<span class="string">"direct.queue2消息队列接收信息:【"</span>+msg+<span class="string">"】"</span>);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>步骤2</p><p>在publisher服务的SpringAmqpTest类中添加测试方法</p><figure class="highlight java"><table><tbody><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">@Test</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">TestSendDirectExchange</span><span class="params">()</span> {</span><br><span class="line">    <span class="type">String</span> <span class="variable">exchangeName</span> <span class="operator">=</span> <span class="string">"henry.direct"</span>;</span><br><span class="line">    <span class="type">String</span> <span class="variable">message</span> <span class="operator">=</span> <span class="string">"hello! red"</span>;</span><br><span class="line">    rabbitTemplate.convertAndSend(exchangeName,<span class="string">"red"</span>,message);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>运行结果：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816163435958.png" alt="image-20220816163435958"></p><p>总结：</p><p>Direct交换机与Fanout交换机的差异？</p><ul><li>Fanout交换机将消息路由给每一个与之绑定的队列</li><li>Direct交换机根据RoutingKey判断路由给哪个队列</li><li>如果多个队列具有相同的RoutingKey，则与Fanout功能类似</li></ul><p>基于@RabbitListener注解声明队列和交换机有哪些常见注解？</p><ul><li>@Queue</li><li>@Exchange</li></ul><h4 id="TopicExchange"><a href="#TopicExchange" class="headerlink" title="TopicExchange"></a>TopicExchange</h4><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816164201437.png" alt="image-20220816164201437"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816164220638.png" alt="image-20220816164220638"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816164454864.png" alt="image-20220816164454864"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816164716743.png" alt="image-20220816164716743"></p><p>总结：</p><p>Direct交换机与Topic交换机的差异？</p><p>两者非常相似，主要差异为Topic交换机BindingKey支持通配符,RoutingKey多个单词以.分隔</p><h4 id="消息转换器"><a href="#消息转换器" class="headerlink" title="消息转换器"></a>消息转换器</h4><p>如果我们传的发送的消息是object类型，spring会对类型进行序列化处理。</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816170431354.png" alt="image-20220816170431354"></p><p>基于默认的序列化得到的数据有以下缺点：</p><p>1.性能差</p><p>2.安全性：容易出现注入的问题</p><p>3.数据长度过长</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816170448901.png" alt="image-20220816170448901"></p><p>因此我们可以修改序列化方式来改良这种情况</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816170417014.png" alt="image-20220816170417014"></p><figure class="highlight java"><table><tbody><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">@SpringBootApplication</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">PublisherApplication</span> {</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line">        SpringApplication.run(PublisherApplication.class);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="keyword">public</span> MessageConverter <span class="title function_">jsonMessageConverter</span><span class="params">()</span>{</span><br><span class="line">        <span class="keyword">return</span>  <span class="keyword">new</span> <span class="title class_">Jackson2JsonMessageConverter</span>();</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>再运行查看消息队列：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816171217150.png" alt="image-20220816171217150"></p><p><strong>消费者接收消息也需要导入依赖</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816171248782.png" alt="image-20220816171248782"></p><p>总结：</p><p>SpringAMQP中消息的序列化和反序列化是怎么实现的？</p><ul><li>利用MessageConverter实现的，默认是JDK的序列化</li><li>注意发送方与接收方必须使用相同的MessageConverter</li></ul><h2 id="Elasticsearch"><a href="#Elasticsearch" class="headerlink" title="Elasticsearch"></a>Elasticsearch</h2><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816172854523.png" alt="image-20220816172854523"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816172917767.png" alt="image-20220816172917767"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816172938126.png" alt="image-20220816172938126"></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816172954248.png" alt="image-20220816172954248"></p><h3 id="正向索引和倒排索引"><a href="#正向索引和倒排索引" class="headerlink" title="正向索引和倒排索引"></a>正向索引和倒排索引</h3><p>正向索引</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816174647621.png" alt="image-20220816174647621"></p><p>如果有上千万条数据则需要扫描上千万次，效率低</p><p>倒排索引</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816174730506.png" alt="image-20220816174730506"></p><p><strong>正向索引：文本找词</strong></p><p><strong>倒排索引：词找文本</strong></p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220816174804938.png" alt="image-20220816174804938"></p><h3 id="安装elasticsearch"><a href="#安装elasticsearch" class="headerlink" title="安装elasticsearch"></a>安装elasticsearch</h3><h4 id="1-部署单点es"><a href="#1-部署单点es" class="headerlink" title="1.部署单点es"></a>1.部署单点es</h4><h5 id="1-1-创建网络"><a href="#1-1-创建网络" class="headerlink" title="1.1.创建网络"></a>1.1.创建网络</h5><p>因为我们还需要部署kibana容器，因此需要让es和kibana容器互联。这里先创建一个网络：</p><figure class="highlight sh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker network create es-net</span><br></pre></td></tr></tbody></table></figure><h5 id="1-2-加载镜像"><a href="#1-2-加载镜像" class="headerlink" title="1.2.加载镜像"></a>1.2.加载镜像</h5><p>这里我们采用elasticsearch的7.12.1版本的镜像，这个镜像体积非常大，接近1G。不建议大家自己pull。</p><p>课前资料提供了镜像的tar包：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210510165308064.png" alt="image-20210510165308064"></p><p>大家将其上传到虚拟机中，然后运行命令加载即可：</p><figure class="highlight sh"><table><tbody><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="comment"># 导入数据</span></span><br><span class="line">docker load -i es.tar</span><br></pre></td></tr></tbody></table></figure><p>同理还有<code>kibana</code>的tar包也需要这样做。</p><h5 id="1-3-运行"><a href="#1-3-运行" class="headerlink" title="1.3.运行"></a>1.3.运行</h5><p>运行docker命令，部署单点es：</p><figure class="highlight sh"><table><tbody><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">docker run -d \</span><br><span class="line">--name es \</span><br><span class="line">    -e <span class="string">"ES_JAVA_OPTS=-Xms512m -Xmx512m"</span> \</span><br><span class="line">    -e <span class="string">"discovery.type=single-node"</span> \</span><br><span class="line">    -v es-data:/usr/share/elasticsearch/data \</span><br><span class="line">    -v es-plugins:/usr/share/elasticsearch/plugins \</span><br><span class="line">    --privileged \</span><br><span class="line">    --network es-net \</span><br><span class="line">    -p 9200:9200 \</span><br><span class="line">    -p 9300:9300 \</span><br><span class="line">elasticsearch:7.12.1</span><br></pre></td></tr></tbody></table></figure><p>命令解释：</p><ul><li><code>-e "cluster.name=es-docker-cluster"</code>：设置集群名称</li><li><code>-e "http.host=0.0.0.0"</code>：监听的地址，可以外网访问</li><li><code>-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"</code>：内存大小</li><li><code>-e "discovery.type=single-node"</code>：非集群模式</li><li><code>-v es-data:/usr/share/elasticsearch/data</code>：挂载逻辑卷，绑定es的数据目录</li><li><code>-v es-logs:/usr/share/elasticsearch/logs</code>：挂载逻辑卷，绑定es的日志目录</li><li><code>-v es-plugins:/usr/share/elasticsearch/plugins</code>：挂载逻辑卷，绑定es的插件目录</li><li><code>--privileged</code>：授予逻辑卷访问权</li><li><code>--network es-net</code> ：加入一个名为es-net的网络中</li><li><code>-p 9200:9200</code>：端口映射配置</li></ul><p>在浏览器中输入：<a href="http://192.168.150.101:9200/">http://192.168.150.101:9200</a> 即可看到elasticsearch的响应结果：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210506101053676.png" alt="image-20210506101053676"></p><h4 id="2-部署kibana"><a href="#2-部署kibana" class="headerlink" title="2.部署kibana"></a>2.部署kibana</h4><p>kibana可以给我们提供一个elasticsearch的可视化界面，便于我们学习。</p><h5 id="2-1-部署"><a href="#2-1-部署" class="headerlink" title="2.1.部署"></a>2.1.部署</h5><p>运行docker命令，部署kibana</p><figure class="highlight sh"><table><tbody><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">docker run -d \</span><br><span class="line">--name kibana \</span><br><span class="line">-e ELASTICSEARCH_HOSTS=http://es:9200 \</span><br><span class="line">--network=es-net \</span><br><span class="line">-p 5601:5601  \</span><br><span class="line">kibana:7.12.1</span><br></pre></td></tr></tbody></table></figure><ul><li><code>--network es-net</code> ：加入一个名为es-net的网络中，与elasticsearch在同一个网络中</li><li><code>-e ELASTICSEARCH_HOSTS=http://es:9200"</code>：设置elasticsearch的地址，因为kibana已经与elasticsearch在一个网络，因此可以用容器名直接访问elasticsearch</li><li><code>-p 5601:5601</code>：端口映射配置</li></ul><p>kibana启动一般比较慢，需要多等待一会，可以通过命令：</p><figure class="highlight sh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker logs -f kibana</span><br></pre></td></tr></tbody></table></figure><p>查看运行日志，当查看到下面的日志，说明成功：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210109105135812.png" alt="image-20210109105135812"></p><p>此时，在浏览器输入地址访问：<a href="http://192.168.150.101:5601，即可看到结果">http://192.168.150.101:5601，即可看到结果</a></p><h5 id="2-2-DevTools"><a href="#2-2-DevTools" class="headerlink" title="2.2.DevTools"></a>2.2.DevTools</h5><p>kibana中提供了一个DevTools界面：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210506102630393.png" alt="image-20210506102630393"></p><p>这个界面中可以编写DSL来操作elasticsearch。并且对DSL语句有自动补全功能。</p><h4 id="3-安装IK分词器"><a href="#3-安装IK分词器" class="headerlink" title="3.安装IK分词器"></a>3.安装IK分词器</h4><h5 id="3-1-在线安装ik插件（较慢）"><a href="#3-1-在线安装ik插件（较慢）" class="headerlink" title="3.1.在线安装ik插件（较慢）"></a>3.1.在线安装ik插件（较慢）</h5><figure class="highlight shell"><table><tbody><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 prompt_"># </span><span class="language-bash">进入容器内部</span></span><br><span class="line">docker exec -it elasticsearch /bin/bash</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在线下载并安装</span></span><br><span class="line">./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">退出</span></span><br><span class="line">exit</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">重启容器</span></span><br><span class="line">docker restart elasticsearch</span><br></pre></td></tr></tbody></table></figure><h5 id="3-2-离线安装ik插件（推荐）"><a href="#3-2-离线安装ik插件（推荐）" class="headerlink" title="3.2.离线安装ik插件（推荐）"></a>3.2.离线安装ik插件（推荐）</h5><h6 id="1）查看数据卷目录"><a href="#1）查看数据卷目录" class="headerlink" title="1）查看数据卷目录"></a>1）查看数据卷目录</h6><p>安装插件需要知道elasticsearch的plugins目录位置，而我们用了数据卷挂载，因此需要查看elasticsearch的数据卷目录，通过下面命令查看:</p><figure class="highlight sh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker volume inspect es-plugins</span><br></pre></td></tr></tbody></table></figure><p>显示结果：</p><figure class="highlight json"><table><tbody><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="punctuation">[</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">        <span class="attr">"CreatedAt"</span><span class="punctuation">:</span> <span class="string">"2022-05-06T10:06:34+08:00"</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">"Driver"</span><span class="punctuation">:</span> <span class="string">"local"</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">"Labels"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">"Mountpoint"</span><span class="punctuation">:</span> <span class="string">"/var/lib/docker/volumes/es-plugins/_data"</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">"Name"</span><span class="punctuation">:</span> <span class="string">"es-plugins"</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">"Options"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">"Scope"</span><span class="punctuation">:</span> <span class="string">"local"</span></span><br><span class="line">    <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></tbody></table></figure><p>说明plugins目录被挂载到了：<code>/var/lib/docker/volumes/es-plugins/_data </code>这个目录中。</p><h6 id="2）解压缩分词器安装包"><a href="#2）解压缩分词器安装包" class="headerlink" title="2）解压缩分词器安装包"></a>2）解压缩分词器安装包</h6><p>下面我们需要把课前资料中的ik分词器解压缩，重命名为ik</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210506110249144.png" alt="image-20210506110249144"></p><h6 id="3）上传到es容器的插件数据卷中"><a href="#3）上传到es容器的插件数据卷中" class="headerlink" title="3）上传到es容器的插件数据卷中"></a>3）上传到es容器的插件数据卷中</h6><p>也就是<code>/var/lib/docker/volumes/es-plugins/_data </code>：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210506110704293.png" alt="image-20210506110704293"></p><h6 id="4）重启容器"><a href="#4）重启容器" class="headerlink" title="4）重启容器"></a>4）重启容器</h6><figure class="highlight shell"><table><tbody><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 prompt_"># </span><span class="language-bash">4、重启容器</span></span><br><span class="line">docker restart es</span><br></pre></td></tr></tbody></table></figure><figure class="highlight sh"><table><tbody><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="comment"># 查看es日志</span></span><br><span class="line">docker logs -f es</span><br></pre></td></tr></tbody></table></figure><h6 id="5）测试："><a href="#5）测试：" class="headerlink" title="5）测试："></a>5）测试：</h6><p>IK分词器包含两种模式：</p><ul><li><p><code>ik_smart</code>：最少切分</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220817090600447.png" alt="image-20220817090600447"></p></li><li><p><code>ik_max_word</code>：最细切分</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20220817090626677.png" alt="image-20220817090626677"></p></li></ul><figure class="highlight json"><table><tbody><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">GET /_analyze</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"analyzer"</span><span class="punctuation">:</span> <span class="string">"ik_max_word"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"text"</span><span class="punctuation">:</span> <span class="string">"黑马程序员学习java太棒了"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p>结果：</p><figure class="highlight json"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"tokens"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"token"</span> <span class="punctuation">:</span> <span class="string">"黑马"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"start_offset"</span> <span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"end_offset"</span> <span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"type"</span> <span class="punctuation">:</span> <span class="string">"CN_WORD"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"position"</span> <span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line">    <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"token"</span> <span class="punctuation">:</span> <span class="string">"程序员"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"start_offset"</span> <span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"end_offset"</span> <span class="punctuation">:</span> <span class="number">5</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"type"</span> <span class="punctuation">:</span> <span class="string">"CN_WORD"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"position"</span> <span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line">    <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"token"</span> <span class="punctuation">:</span> <span class="string">"程序"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"start_offset"</span> <span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"end_offset"</span> <span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"type"</span> <span class="punctuation">:</span> <span class="string">"CN_WORD"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"position"</span> <span class="punctuation">:</span> <span class="number">2</span></span><br><span class="line">    <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"token"</span> <span class="punctuation">:</span> <span class="string">"员"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"start_offset"</span> <span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"end_offset"</span> <span class="punctuation">:</span> <span class="number">5</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"type"</span> <span class="punctuation">:</span> <span class="string">"CN_CHAR"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"position"</span> <span class="punctuation">:</span> <span class="number">3</span></span><br><span class="line">    <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"token"</span> <span class="punctuation">:</span> <span class="string">"学习"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"start_offset"</span> <span class="punctuation">:</span> <span class="number">5</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"end_offset"</span> <span class="punctuation">:</span> <span class="number">7</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"type"</span> <span class="punctuation">:</span> <span class="string">"CN_WORD"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"position"</span> <span class="punctuation">:</span> <span class="number">4</span></span><br><span class="line">    <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"token"</span> <span class="punctuation">:</span> <span class="string">"java"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"start_offset"</span> <span class="punctuation">:</span> <span class="number">7</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"end_offset"</span> <span class="punctuation">:</span> <span class="number">11</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"type"</span> <span class="punctuation">:</span> <span class="string">"ENGLISH"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"position"</span> <span class="punctuation">:</span> <span class="number">5</span></span><br><span class="line">    <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"token"</span> <span class="punctuation">:</span> <span class="string">"太棒了"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"start_offset"</span> <span class="punctuation">:</span> <span class="number">11</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"end_offset"</span> <span class="punctuation">:</span> <span class="number">14</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"type"</span> <span class="punctuation">:</span> <span class="string">"CN_WORD"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"position"</span> <span class="punctuation">:</span> <span class="number">6</span></span><br><span class="line">    <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"token"</span> <span class="punctuation">:</span> <span class="string">"太棒"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"start_offset"</span> <span class="punctuation">:</span> <span class="number">11</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"end_offset"</span> <span class="punctuation">:</span> <span class="number">13</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"type"</span> <span class="punctuation">:</span> <span class="string">"CN_WORD"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"position"</span> <span class="punctuation">:</span> <span class="number">7</span></span><br><span class="line">    <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"token"</span> <span class="punctuation">:</span> <span class="string">"了"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"start_offset"</span> <span class="punctuation">:</span> <span class="number">13</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"end_offset"</span> <span class="punctuation">:</span> <span class="number">14</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"type"</span> <span class="punctuation">:</span> <span class="string">"CN_CHAR"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"position"</span> <span class="punctuation">:</span> <span class="number">8</span></span><br><span class="line">    <span class="punctuation">}</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><h5 id="3-3-扩展词词典"><a href="#3-3-扩展词词典" class="headerlink" title="3.3 扩展词词典"></a>3.3 扩展词词典</h5><p>随着互联网的发展，“造词运动”也越发的频繁。出现了很多新的词语，在原有的词汇列表中并不存在。比如：“奥力给”，“传智播客” 等。</p><p>所以我们的词汇也需要不断的更新，IK分词器提供了扩展词汇的功能。</p><p>1）打开IK分词器config目录：</p><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20210506112225508.png" alt="image-20210506112225508"></p><p>2）在IKAnalyzer.cfg.xml配置文件内容添加：</p><figure class="highlight xml"><table><tbody><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"><span class="meta">&lt;?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">properties</span> <span class="keyword">SYSTEM</span> <span class="string">"http://java.sun.com/dtd/properties.dtd"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">properties</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">comment</span>&gt;</span>IK Analyzer 扩展配置<span class="tag">&lt;/<span class="name">comment</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">entry</span> <span class="attr">key</span>=<span class="string">"ext_dict"</span>&gt;</span>ext.dic<span class="tag">&lt;/<span class="name">entry</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">properties</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><p>3）新建一个 ext.dic，可以参考config目录下复制一个配置文件进行修改</p><figure class="highlight properties"><table><tbody><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="attr">传智播客</span></span><br><span class="line"><span class="attr">奥力给</span></span><br></pre></td></tr></tbody></table></figure><p>4）重启elasticsearch </p><figure class="highlight sh"><table><tbody><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">docker restart es</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看 日志</span></span><br><span class="line">docker logs -f elasticsearch</span><br></pre></td></tr></tbody></table></figure><p><img src="/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/image-20201115230900504.png" alt="image-20201115230900504"></p><p>日志中已经成功加载ext.dic配置文件</p><p>5）测试效果：</p><figure class="highlight json"><table><tbody><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">GET /_analyze</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"analyzer"</span><span class="punctuation">:</span> <span class="string">"ik_max_word"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"text"</span><span class="punctuation">:</span> <span class="string">"传智播客Java就业超过90%,奥力给！"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><blockquote><p>注意当前文件的编码必须是 UTF-8 格式，严禁使用Windows记事本编辑</p></blockquote><h5 id="3-4-停用词词典"><a href="#3-4-停用词词典" class="headerlink" title="3.4 停用词词典"></a>3.4 停用词词典</h5><p>在互联网项目中，在网络间传输的速度很快，所以很多语言是不允许在网络上传递的，如：关于宗教、政治等敏感词语，那么我们在搜索时也应该忽略当前词汇。</p><p>IK分词器也提供了强大的停用词功能，让我们在索引时就直接忽略当前的停用词汇表中的内容。</p><p>1）IKAnalyzer.cfg.xml配置文件内容添加：</p><figure class="highlight xml"><table><tbody><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">&lt;?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">properties</span> <span class="keyword">SYSTEM</span> <span class="string">"http://java.sun.com/dtd/properties.dtd"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">properties</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">comment</span>&gt;</span>IK Analyzer 扩展配置<span class="tag">&lt;/<span class="name">comment</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--用户可以在这里配置自己的扩展字典--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">entry</span> <span class="attr">key</span>=<span class="string">"ext_dict"</span>&gt;</span>ext.dic<span class="tag">&lt;/<span class="name">entry</span>&gt;</span></span><br><span class="line">         <span class="comment">&lt;!--用户可以在这里配置自己的扩展停止词字典  *** 添加停用词词典--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">entry</span> <span class="attr">key</span>=<span class="string">"ext_stopwords"</span>&gt;</span>stopword.dic<span class="tag">&lt;/<span class="name">entry</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">properties</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><p>3）在 stopword.dic 添加停用词</p><figure class="highlight properties"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">习大大</span></span><br></pre></td></tr></tbody></table></figure><p>4）重启elasticsearch </p><figure class="highlight sh"><table><tbody><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="comment"># 重启服务</span></span><br><span class="line">docker restart elasticsearch</span><br><span class="line">docker restart kibana</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看 日志</span></span><br><span class="line">docker logs -f elasticsearch</span><br></pre></td></tr></tbody></table></figure><p>日志中已经成功加载stopword.dic配置文件</p><p>5）测试效果：</p><figure class="highlight json"><table><tbody><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">GET /_analyze</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"analyzer"</span><span class="punctuation">:</span> <span class="string">"ik_max_word"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"text"</span><span class="punctuation">:</span> <span class="string">"传智播客Java就业率超过95%,习大大都点赞,奥力给！"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><blockquote><p>注意当前文件的编码必须是 UTF-8 格式，严禁使用Windows记事本编辑</p></blockquote><h4 id="4-部署es集群"><a href="#4-部署es集群" class="headerlink" title="4.部署es集群"></a>4.部署es集群</h4><p>部署es集群可以直接使用docker-compose来完成，不过要求你的Linux虚拟机至少有<strong>4G</strong>的内存空间</p><p>首先编写一个docker-compose文件，内容如下：</p><figure class="highlight sh"><table><tbody><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></pre></td><td class="code"><pre><span class="line">version: <span class="string">'2.2'</span></span><br><span class="line">services:</span><br><span class="line">  es01:</span><br><span class="line">    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1</span><br><span class="line">    container_name: es01</span><br><span class="line">    environment:</span><br><span class="line">      - node.name=es01</span><br><span class="line">      - cluster.name=es-docker-cluster</span><br><span class="line">      - discovery.seed_hosts=es02,es03</span><br><span class="line">      - cluster.initial_master_nodes=es01,es02,es03</span><br><span class="line">      - bootstrap.memory_lock=<span class="literal">true</span></span><br><span class="line">      - <span class="string">"ES_JAVA_OPTS=-Xms512m -Xmx512m"</span></span><br><span class="line">    ulimits:</span><br><span class="line">      memlock:</span><br><span class="line">        soft: -1</span><br><span class="line">        hard: -1</span><br><span class="line">    volumes:</span><br><span class="line">      - data01:/usr/share/elasticsearch/data</span><br><span class="line">    ports:</span><br><span class="line">      - 9200:9200</span><br><span class="line">    networks:</span><br><span class="line">      - elastic</span><br><span class="line">  es02:</span><br><span class="line">    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1</span><br><span class="line">    container_name: es02</span><br><span class="line">    environment:</span><br><span class="line">      - node.name=es02</span><br><span class="line">      - cluster.name=es-docker-cluster</span><br><span class="line">      - discovery.seed_hosts=es01,es03</span><br><span class="line">      - cluster.initial_master_nodes=es01,es02,es03</span><br><span class="line">      - bootstrap.memory_lock=<span class="literal">true</span></span><br><span class="line">      - <span class="string">"ES_JAVA_OPTS=-Xms512m -Xmx512m"</span></span><br><span class="line">    ulimits:</span><br><span class="line">      memlock:</span><br><span class="line">        soft: -1</span><br><span class="line">        hard: -1</span><br><span class="line">    volumes:</span><br><span class="line">      - data02:/usr/share/elasticsearch/data</span><br><span class="line">    networks:</span><br><span class="line">      - elastic</span><br><span class="line">  es03:</span><br><span class="line">    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1</span><br><span class="line">    container_name: es03</span><br><span class="line">    environment:</span><br><span class="line">      - node.name=es03</span><br><span class="line">      - cluster.name=es-docker-cluster</span><br><span class="line">      - discovery.seed_hosts=es01,es02</span><br><span class="line">      - cluster.initial_master_nodes=es01,es02,es03</span><br><span class="line">      - bootstrap.memory_lock=<span class="literal">true</span></span><br><span class="line">      - <span class="string">"ES_JAVA_OPTS=-Xms512m -Xmx512m"</span></span><br><span class="line">    ulimits:</span><br><span class="line">      memlock:</span><br><span class="line">        soft: -1</span><br><span class="line">        hard: -1</span><br><span class="line">    volumes:</span><br><span class="line">      - data03:/usr/share/elasticsearch/data</span><br><span class="line">    networks:</span><br><span class="line">      - elastic</span><br><span class="line"></span><br><span class="line">volumes:</span><br><span class="line">  data01:</span><br><span class="line">    driver: <span class="built_in">local</span></span><br><span class="line">  data02:</span><br><span class="line">    driver: <span class="built_in">local</span></span><br><span class="line">  data03:</span><br><span class="line">    driver: <span class="built_in">local</span></span><br><span class="line"></span><br><span class="line">networks:</span><br><span class="line">  elastic:</span><br><span class="line">    driver: bridge</span><br></pre></td></tr></tbody></table></figure><p>Run <code>docker-compose</code> to bring up the cluster:</p><figure class="highlight sh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker-compose up</span><br></pre></td></tr></tbody></table></figure><h3 id="操作索引库"><a href="#操作索引库" class="headerlink" title="操作索引库"></a>操作索引库</h3><figure class="highlight plaintext"><table><tbody><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></pre></td><td class="code"><pre><span class="line">#模拟请求</span><br><span class="line">GET /</span><br><span class="line"></span><br><span class="line">#测试分词器</span><br><span class="line">POST /_analyze</span><br><span class="line">{</span><br><span class="line">  "text": "Henry程序员学习java真不错！太棒了",</span><br><span class="line">  "analyzer": "ik_max_word"</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">#测试分词器</span><br><span class="line">POST /_analyze</span><br><span class="line">{</span><br><span class="line">  "text": "传智教育的课程可以白嫖！学生就业率高达95%，奥利给",</span><br><span class="line">  "analyzer": "ik_smart"</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">#创建索引库</span><br><span class="line">PUT /henry</span><br><span class="line">{</span><br><span class="line">  "mappings":{</span><br><span class="line">    "properties":{</span><br><span class="line">      "info":{</span><br><span class="line">        "type":"text",</span><br><span class="line">        "analyzer":"ik_smart"</span><br><span class="line">      },</span><br><span class="line">      "email":{</span><br><span class="line">        "type":"keyword",</span><br><span class="line">        "index":false</span><br><span class="line">      },</span><br><span class="line">      "name":{</span><br><span class="line">        "type":"object", </span><br><span class="line">        "properties":{</span><br><span class="line">          "firstName":{</span><br><span class="line">            "type":"keyword"</span><br><span class="line">          },</span><br><span class="line">          "lastName":{</span><br><span class="line">            "type":"keyword"</span><br><span class="line">          }</span><br><span class="line">        }</span><br><span class="line">      }</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">#查看索引库</span><br><span class="line">GET /henry</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#修改索引库</span><br><span class="line">PUT /henry/_mapping</span><br><span class="line">{</span><br><span class="line">  "properties":{</span><br><span class="line">    "age":{</span><br><span class="line">      "type":"integer"</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#删除索引库</span><br><span class="line">DELETE /henry</span><br></pre></td></tr></tbody></table></figure><h3 id="操作文档"><a href="#操作文档" class="headerlink" title="操作文档"></a>操作文档</h3><figure class="highlight plaintext"><table><tbody><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><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br></pre></td><td class="code"><pre><span class="line">#插入文档</span><br><span class="line">POST /henry/_doc/1</span><br><span class="line">{</span><br><span class="line">  "info":"henry爱学java",</span><br><span class="line">  "email":"496286034@qq.com",</span><br><span class="line">  "age":21,</span><br><span class="line">  "name":{</span><br><span class="line">    "firstName":"云",</span><br><span class="line">    "lastName":"赵"</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#查看文档</span><br><span class="line">GET /henry/_doc/1</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#删除文档</span><br><span class="line">DELETE /henry/_doc/1</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#全局修改文档</span><br><span class="line">PUT /henry/_doc/1</span><br><span class="line">{</span><br><span class="line">  "info":"爱睡觉的Henry喜欢学java",</span><br><span class="line">  "email":"127001@qq.com",</span><br><span class="line">  "name":{</span><br><span class="line">    "firstName":"白",</span><br><span class="line">    "lastName":"李"</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">#局部修改文档</span><br><span class="line">POST /henry/_update/1</span><br><span class="line">{</span><br><span class="line">  "doc": {</span><br><span class="line">    "email":"11111@qq.com"</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">#酒店的mapping</span><br><span class="line">PUT /hotel</span><br><span class="line">{</span><br><span class="line">  "mappings": {</span><br><span class="line">    "properties": {</span><br><span class="line">      "id":{</span><br><span class="line">        "type": "keyword"</span><br><span class="line">      },</span><br><span class="line">      "name":{</span><br><span class="line">        "type": "text",</span><br><span class="line">        "analyzer": "ik_max_word",</span><br><span class="line">        "copy_to": "all"</span><br><span class="line">      },</span><br><span class="line">      "address":{</span><br><span class="line">        "type": "keyword",</span><br><span class="line">        "index": false</span><br><span class="line">      },</span><br><span class="line">      "price":{</span><br><span class="line">        "type": "integer"</span><br><span class="line">      },</span><br><span class="line">      "score":{</span><br><span class="line">        "type": "integer"</span><br><span class="line">      },</span><br><span class="line">      "brand":{</span><br><span class="line">        "type": "keyword",</span><br><span class="line">        "copy_to": "all"</span><br><span class="line">      },</span><br><span class="line">      "city":{</span><br><span class="line">        "type": "keyword"</span><br><span class="line">      },</span><br><span class="line">      "starName":{</span><br><span class="line">        "type": "keyword"</span><br><span class="line">      },</span><br><span class="line">      "business":{</span><br><span class="line">        "type": "keyword",</span><br><span class="line">        "copy_to": "all"</span><br><span class="line">      },</span><br><span class="line">      "location":{</span><br><span class="line">        "type": "geo_point"</span><br><span class="line">      },</span><br><span class="line">      "pic":{</span><br><span class="line">        "type": "keyword",</span><br><span class="line">        "index": false</span><br><span class="line">      },</span><br><span class="line">      "all":{</span><br><span class="line">        "type": "text",</span><br><span class="line">        "analyzer": "ik_max_word"</span><br><span class="line">      }</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">GET /hotel/_doc/36934</span><br><span class="line"></span><br><span class="line">#查询所有</span><br><span class="line">GET /hotel/_search</span><br><span class="line">{</span><br><span class="line">  "query": {</span><br><span class="line">  "match_all": {}</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"># match查询</span><br><span class="line">GET /hotel/_search</span><br><span class="line">{</span><br><span class="line">  "query": {</span><br><span class="line">    "match": {</span><br><span class="line">      "all": "外滩如家"</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"># multi_match查询</span><br><span class="line">GET /hotel/_search</span><br><span class="line">{</span><br><span class="line">  "query": {</span><br><span class="line">    "multi_match": {</span><br><span class="line">      "query": "外滩如家",</span><br><span class="line">      "fields": ["brand","name","business"]</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#term 精确查询</span><br><span class="line">GET /hotel/_search</span><br><span class="line">{</span><br><span class="line">  "query": {</span><br><span class="line">    "term": {</span><br><span class="line">      "city": {</span><br><span class="line">        "value": "上海"</span><br><span class="line">      }</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">#range 范围查询</span><br><span class="line">GET /hotel/_search</span><br><span class="line">{</span><br><span class="line">  "query": {</span><br><span class="line">    "range": {</span><br><span class="line">      "price": {</span><br><span class="line">        "gte": 1000,</span><br><span class="line">        "lte": 3000</span><br><span class="line">      }</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># distance 地理查询</span><br><span class="line">GET /hotel/_search</span><br><span class="line">{</span><br><span class="line">  "query": {</span><br><span class="line">    "geo_distance":{</span><br><span class="line">      "distance":"15km",</span><br><span class="line">      "location":"31.21, 121.5"</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># function score查询</span><br><span class="line">GET /hotel/_search</span><br><span class="line">{</span><br><span class="line">  "query": {</span><br><span class="line">    "function_score": {</span><br><span class="line">      "query": {</span><br><span class="line">        "match": {</span><br><span class="line">          "all": "外滩"</span><br><span class="line">        }</span><br><span class="line">      },</span><br><span class="line">      "functions": [</span><br><span class="line">        {</span><br><span class="line">          "filter": {</span><br><span class="line">            "term": {</span><br><span class="line">              "brand": "如家"</span><br><span class="line">            }</span><br><span class="line">          },</span><br><span class="line">          "weight": 10</span><br><span class="line">        }</span><br><span class="line">      ],</span><br><span class="line">      "boost_mode": "multiply"</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;SpringCloud&quot;&gt;&lt;a href=&quot;#SpringCloud&quot; class=&quot;headerlink&quot; title=&quot;SpringCloud&quot;&gt;&lt;/a&gt;SpringCloud&lt;/h1&gt;&lt;p&gt;&lt;img src=&quot;/2022/08/19/SpringCloud%E7%AC%94%E8%AE%B0/%E4%B8%8D%E8%89%AF%E4%BA%BA.webp&quot; alt=&quot;不良人&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="学习笔记" scheme="https://henryxcy.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Spring" scheme="https://henryxcy.github.io/tags/Spring/"/>
    
    <category term="SpringCloud" scheme="https://henryxcy.github.io/tags/SpringCloud/"/>
    
  </entry>
  
</feed>
