<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://qianxunclub.com</id>
    <title>千寻啊千寻</title>
    <link href="https://qianxunclub.com" />
    <updated>2025-07-05T10:18:00.000Z</updated>
    <category term="AI" />
    <category term="ChatGPT" />
    <category term="Exception" />
    <category term="Kafka" />
    <category term="缓存" />
    <category term="Redis" />
    <category term="SpringBoot" />
    <category term="Elasticsearch" />
    <category term="Java" />
    <category term="Grpc" />
    <category term="Ansible" />
    <category term="Linux" />
    <category term="Mac" />
    <category term="Centos" />
    <category term="Yum" />
    <category term="Gcc" />
    <category term="Nginx" />
    <category term="Openresty" />
    <category term="Lua" />
    <category term="Nas" />
    <category term="视频" />
    <category term="公益广告" />
    <category term="工具" />
    <category term="分布式" />
    <category term="SpringCloud" />
    <category term="面试题" />
    <category term="github" />
    <category term="七牛云" />
    <category term="Http" />
    <category term="Maven" />
    <entry>
        <id>https://qianxunclub.com/nas/nai-wang-chuan-tou-edgeone/</id>
        <title>最好用的内网穿透，无需任何第三方工具，免费，速度快，支持 ipv4 和 ipv6，免费证书</title>
        <link rel="alternate" href="https://qianxunclub.com/nas/nai-wang-chuan-tou-edgeone/"/>
        <content type="html">&lt;h1 id=&#34;介绍&#34;&gt;&lt;a href=&#34;#介绍&#34; class=&#34;headerlink&#34; title=&#34;介绍&#34;&gt;&lt;/a&gt;介绍&lt;/h1&gt;&lt;p&gt;本文使用的是腾讯的&lt;code&gt;边缘安全加速平台 EO&lt;/code&gt;，简直良心的，完全免费，而且免费节点支持全球访问，速度快的一批。&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;h1 id=&#34;准备工作&#34;&gt;&lt;a href=&#34;#准备工作&#34; class=&#34;headerlink&#34; title=&#34;准备工作&#34;&gt;&lt;/a&gt;准备工作&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;Nas 配置好外网 ipv6 访问&lt;/li&gt;
&lt;li&gt;Nas 配置有 ipv6 域名解析&lt;/li&gt;
&lt;li&gt;有自己的域名，国内访问需要备案&lt;/li&gt;
&lt;li&gt;有腾讯云和&lt;code&gt;https://edgeone.ai/&lt;/code&gt;账号&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;获取免费套餐&#34;&gt;&lt;a href=&#34;#获取免费套餐&#34; class=&#34;headerlink&#34; title=&#34;获取免费套餐&#34;&gt;&lt;/a&gt;获取免费套餐&lt;/h1&gt;&lt;h2 id=&#34;申请edgeone免费名额&#34;&gt;&lt;a href=&#34;#申请edgeone免费名额&#34; class=&#34;headerlink&#34; title=&#34;申请edgeone免费名额&#34;&gt;&lt;/a&gt;申请&lt;code&gt;edgeone&lt;/code&gt;免费名额&lt;/h2&gt;&lt;p&gt;活动地址：&lt;a href=&#34;https://edgeone.ai/zh/redemption?from=recommend&#34;&gt;https://edgeone.ai/zh/redemption?from=recommend&lt;/a&gt;&lt;br&gt;&lt;img src=&#34;/img/edgeone-free.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;兑换码免费套餐&#34;&gt;&lt;a href=&#34;#兑换码免费套餐&#34; class=&#34;headerlink&#34; title=&#34;兑换码免费套餐&#34;&gt;&lt;/a&gt;兑换码免费套餐&lt;/h2&gt;&lt;p&gt;这里在&lt;code&gt;edgeone&lt;/code&gt;申请的兑换码，可以直接在腾讯云上面兑换，兑换地址：&lt;a href=&#34;https://console.cloud.tencent.com/edgeone/package&#34;&gt;https://console.cloud.tencent.com/edgeone/package&lt;/a&gt;&lt;br&gt;&lt;img src=&#34;/img/edgeone-exchange.png&#34;&gt;  &lt;/p&gt;
&lt;p&gt;兑换成功如下：&lt;br&gt;&lt;img src=&#34;/img/edgeone-exchange-success.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;配置内网穿透&#34;&gt;&lt;a href=&#34;#配置内网穿透&#34; class=&#34;headerlink&#34; title=&#34;配置内网穿透&#34;&gt;&lt;/a&gt;配置内网穿透&lt;/h1&gt;&lt;h2 id=&#34;添加自己的域名站点&#34;&gt;&lt;a href=&#34;#添加自己的域名站点&#34; class=&#34;headerlink&#34; title=&#34;添加自己的域名站点&#34;&gt;&lt;/a&gt;添加自己的域名站点&lt;/h2&gt;&lt;p&gt;这里是根域名，按照步骤添加就可以&lt;br&gt;&lt;img src=&#34;/img/edgeone-add-domain.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;配置自己的内网穿透&#34;&gt;&lt;a href=&#34;#配置自己的内网穿透&#34; class=&#34;headerlink&#34; title=&#34;配置自己的内网穿透&#34;&gt;&lt;/a&gt;配置自己的内网穿透&lt;/h2&gt;&lt;p&gt;添加一个子域名，指向自己的 Nas 服务：&lt;br&gt;&lt;img src=&#34;/img/edgeone-add-tunnel.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;配置映射关系，这里的&lt;code&gt;源站配置&lt;/code&gt;对应的域名，就是自己 Nas 解析的 ipv6 地址的域名，不懂的自行百度。&lt;br&gt;&lt;img src=&#34;/img/edgeone-add-mapping.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：回源协议一定要和 Nas 服务本身的协议一直，如果只支持http，那么回源协议就只能选择http，如果只支持https，那么回源协议就只能选择https，要按实际来，我这里就踩坑了，我的服务只支持 http 的，我选择了 http https，结果就一直报错，无法访问。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;最后配置https证书&#34;&gt;&lt;a href=&#34;#最后配置https证书&#34; class=&#34;headerlink&#34; title=&#34;最后配置https证书&#34;&gt;&lt;/a&gt;最后配置https证书&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;/img/edgeone-add-cert.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/img/edgeone-add-cert-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;等待部署完成，就可以愉快发访问了。&lt;/p&gt;
</content>
        <category term="Nas" />
        <updated>2025-07-05T10:18:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/nas/nas-nat1/</id>
        <title>Nas使用NAT1的ipv4做内网穿透，不解释，不啰嗦，直接开干</title>
        <link rel="alternate" href="https://qianxunclub.com/nas/nas-nat1/"/>
        <content type="html">&lt;h1 id=&#34;前言&#34;&gt;&lt;a href=&#34;#前言&#34; class=&#34;headerlink&#34; title=&#34;前言&#34;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;p&gt;我这里是做飞牛的内网穿透使用，目的是可以通过公网 IPV4 访问飞牛，当前也可以访问其他设备，再也不用担IPV6的不普及和其他内网穿透的龟速问题了。&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h1 id=&#34;前提&#34;&gt;&lt;a href=&#34;#前提&#34; class=&#34;headerlink&#34; title=&#34;前提&#34;&gt;&lt;/a&gt;前提&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;可以登录光猫并且设置桥接&lt;/li&gt;
&lt;li&gt;可以使用路由器拨号上网&lt;/li&gt;
&lt;li&gt;可以科学上网&lt;/li&gt;
&lt;li&gt;最好会使用 docker&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;检查当前网络NAT类型&#34;&gt;&lt;a href=&#34;#检查当前网络NAT类型&#34; class=&#34;headerlink&#34; title=&#34;检查当前网络NAT类型&#34;&gt;&lt;/a&gt;检查当前网络NAT类型&lt;/h1&gt;&lt;p&gt;使用 ssh 登录飞牛控制台，运行以下命令检查：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;# 登录飞牛&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ssh qianxunclub@192.168.1.100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;# 检查NAT类型&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo docker run --rm --net=host nattertool/check&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;# 会输出以下&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;gt; NatterCheck v2.1.1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Checking TCP NAT...                  [  FAIL  ] ... NAT Type: 3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Checking UDP NAT...                  [  FAIL  ] ... NAT Type: 3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;一般结果都是NAT3类型的，也是默认的，当然如果是&lt;code&gt;NAT Type: 1&lt;/code&gt;,那你本来就是 NAT1，就不需要往下看了。&lt;/p&gt;
&lt;h1 id=&#34;光猫配置&#34;&gt;&lt;a href=&#34;#光猫配置&#34; class=&#34;headerlink&#34; title=&#34;光猫配置&#34;&gt;&lt;/a&gt;光猫配置&lt;/h1&gt;&lt;p&gt;使用管理员登录光猫，并且设置为桥接，这里我就不多解释了，自行搜索，设置光猫为桥接模式。&lt;br&gt;注意的是，要关闭防火墙。&lt;/p&gt;
&lt;h1 id=&#34;路由器配置&#34;&gt;&lt;a href=&#34;#路由器配置&#34; class=&#34;headerlink&#34; title=&#34;路由器配置&#34;&gt;&lt;/a&gt;路由器配置&lt;/h1&gt;&lt;p&gt;我的路由器是华硕的，其他路由器配置方式一样。&lt;/p&gt;
&lt;h2 id=&#34;首先要路由器拨号上网&#34;&gt;&lt;a href=&#34;#首先要路由器拨号上网&#34; class=&#34;headerlink&#34; title=&#34;首先要路由器拨号上网&#34;&gt;&lt;/a&gt;首先要路由器拨号上网&lt;/h2&gt;&lt;h2 id=&#34;关闭路由器防火墙&#34;&gt;&lt;a href=&#34;#关闭路由器防火墙&#34; class=&#34;headerlink&#34; title=&#34;关闭路由器防火墙&#34;&gt;&lt;/a&gt;关闭路由器防火墙&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;/img/PixPin_2025-06-23_18-38-53.png?raw=true&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;DHCP设置静态IP绑定&#34;&gt;&lt;a href=&#34;#DHCP设置静态IP绑定&#34; class=&#34;headerlink&#34; title=&#34;DHCP设置静态IP绑定&#34;&gt;&lt;/a&gt;DHCP设置静态IP绑定&lt;/h2&gt;&lt;p&gt;首先要启用绑定功能，在DHCP设置中，找到飞牛的IP，然后应用即可。  &lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/img/PixPin_2025-06-23_18-05-41.png?raw=true&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;设置DMZ，指定IP暴漏在互联网上&#34;&gt;&lt;a href=&#34;#设置DMZ，指定IP暴漏在互联网上&#34; class=&#34;headerlink&#34; title=&#34;设置DMZ，指定IP暴漏在互联网上&#34;&gt;&lt;/a&gt;设置DMZ，指定IP暴漏在互联网上&lt;/h2&gt;&lt;p&gt;首先启用DMZ，然后设置飞牛IP暴露到公网，然后应用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/img/PixPin_2025-06-23_18-09-10.png?raw=true&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;暂时关闭飞牛防火墙&#34;&gt;&lt;a href=&#34;#暂时关闭飞牛防火墙&#34; class=&#34;headerlink&#34; title=&#34;暂时关闭飞牛防火墙&#34;&gt;&lt;/a&gt;暂时关闭飞牛防火墙&lt;/h1&gt;&lt;p&gt;自己在飞牛设置里面找，确保已经关闭。&lt;/p&gt;
&lt;h1 id=&#34;再次检查飞牛NAT类型&#34;&gt;&lt;a href=&#34;#再次检查飞牛NAT类型&#34; class=&#34;headerlink&#34; title=&#34;再次检查飞牛NAT类型&#34;&gt;&lt;/a&gt;再次检查飞牛NAT类型&lt;/h1&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;sudo docker run --rm --net=host nattertool/check&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;gt; NatterCheck v2.1.1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Checking TCP NAT...                  [   OK   ] ... NAT Type: 1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Checking UDP NAT...                  [   OK   ] ... NAT Type: 1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;显示&lt;code&gt;NAT Type: 1&lt;/code&gt;，代表已经成功了。&lt;/p&gt;
&lt;h1 id=&#34;使用Natter，做内网穿透连接&#34;&gt;&lt;a href=&#34;#使用Natter，做内网穿透连接&#34; class=&#34;headerlink&#34; title=&#34;使用Natter，做内网穿透连接&#34;&gt;&lt;/a&gt;使用&lt;code&gt;Natter&lt;/code&gt;，做内网穿透连接&lt;/h1&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;# 在ssh启用服务&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo docker run --net=host nattertool/natter:latest&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;# 在飞牛 docker 里面查看一下日志&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Please check [ http://xxx.xxx.xxx.xxx:xxx ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;LAN &amp;gt; xxx.xxx.xxx.xxx:xxx   [ OPEN ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;LAN &amp;gt; xxx.xxx.xxx.xxx:xxx   [ OPEN ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;LAN &amp;gt; xxx.xxx.xxx.xxx:xxx   [ OPEN ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;WAN &amp;gt; xxx.xxx.xxx.xxx:xxx   [ OPEN ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;当出现以上信息，基本上就没问题了，然后再其他设备访问&lt;code&gt;Please check [ http://xxx.xxx.xxx.xxx:xxx ]&lt;/code&gt;，里面的链接，如果正常访问，就是打洞成功了。&lt;/p&gt;
&lt;h1 id=&#34;更多飞牛自带服务映射&#34;&gt;&lt;a href=&#34;#更多飞牛自带服务映射&#34; class=&#34;headerlink&#34; title=&#34;更多飞牛自带服务映射&#34;&gt;&lt;/a&gt;更多飞牛自带服务映射&lt;/h1&gt;&lt;p&gt;这个也不多做解释了，可以使用 &lt;code&gt;1Panel&lt;/code&gt;，&lt;code&gt;Lucky&lt;/code&gt;，&lt;code&gt;Nginx Proxy Manager&lt;/code&gt;之类的代理工具，做二级域名加端口的方式，转发到对应的服务。&lt;/p&gt;
</content>
        <category term="Nas" />
        <updated>2025-06-23T09:51:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/ai/zhu-ce-chatgpt-account/</id>
        <title>手把手教你注册和使用ChatGPT</title>
        <link rel="alternate" href="https://qianxunclub.com/ai/zhu-ce-chatgpt-account/"/>
        <content type="html">&lt;h1 id=&#34;一、前提条件&#34;&gt;&lt;a href=&#34;#一、前提条件&#34; class=&#34;headerlink&#34; title=&#34;一、前提条件&#34;&gt;&lt;/a&gt;一、前提条件&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;你必须要能科学上网，并且节点不能是中国大陆和香港，我一般用美国或者台湾。&lt;/li&gt;
&lt;li&gt;注册谷歌、微软或者苹果邮箱账号，账号地址最好选择美国，或者台湾允，不然邮箱是不允许使用注册的。&lt;/li&gt;
&lt;li&gt;注册需要使用国外手机号码，使用 &lt;a href=&#34;https://sms-activate.org/&#34;&gt;https://sms-activate.org/&lt;/a&gt; ，注册账号，注册玩后，使用支付宝充值个几块钱，我冲了十块钱，可以用好几次。&lt;/li&gt;
&lt;/ol&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;p&gt;&lt;img src=&#34;/img/Xnip2023-08-12_23-15-17.jpg?raw=true&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;二、开始注册&#34;&gt;&lt;a href=&#34;#二、开始注册&#34; class=&#34;headerlink&#34; title=&#34;二、开始注册&#34;&gt;&lt;/a&gt;二、开始注册&lt;/h1&gt;&lt;p&gt;以上准备好，就可以往下走，开始注册。  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;打开科学上网后，打开链接 &lt;a href=&#34;https://platform.openai.com/signup?launch&#34;&gt;https://platform.openai.com/signup?launch&lt;/a&gt; ，使用准备好的邮箱，点击下面对应的登录按钮。&lt;br&gt;&lt;img src=&#34;/img/Xnip2023-08-12_22-59-06.jpg?raw=true&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;填写姓名和生日，公司可以不用填写&lt;br&gt;&lt;img src=&#34;/img/Xnip2023-08-12_23-09-23.jpg?raw=true&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;这一步就比较关键的一部，在上面&lt;code&gt;https://sms-activate.org&lt;/code&gt;注册的账号，购买虚拟号码等待短信。&lt;br&gt;&lt;img src=&#34;/img/Xnip2023-08-12_23-19-21.jpg?raw=true&#34;&gt;&lt;br&gt;选择国家，这里我使用的是巴西，比较便宜&lt;br&gt;&lt;img src=&#34;/img/Xnip2023-08-12_23-21-22.jpg?raw=true&#34;&gt;&lt;br&gt;购买成功后，会给你一个手机号码，并且等待手机验证码&lt;br&gt;&lt;img src=&#34;/img/Xnip2023-08-12_23-23-20.jpg?raw=true&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;填写手机号码&lt;br&gt;回到&lt;code&gt;openai&lt;/code&gt;网页，填写上面的手机号码，这里的手机号码，包含小括号里面的数字&lt;br&gt;&lt;img src=&#34;/img/Xnip2023-08-12_23-26-23.jpg?raw=true&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;这个时候，等个几秒钟，&lt;code&gt;https://sms-activate.org/&lt;/code&gt;苹果就会收到对应的验证码了。&lt;br&gt;&lt;img src=&#34;/img/Xnip2023-08-12_23-28-23.jpg?raw=true&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;不出意外的话，恭喜你，这个时候就注册成功了，&lt;a href=&#34;https://chat.openai.com/&#34;&gt;https://chat.openai.com/&lt;/a&gt; 这个就是聊天的地址了，接下来就开启ChatGPT的神秘之路吧&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content>
        <category term="AI" />
        <category term="ChatGPT" />
        <updated>2023-08-12T03:27:23.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/linux/centos8-Failed-to-synchronize-cache-for-repo%20-AppStream/</id>
        <title>Centos8使用yum提示Error: Failed to synchronize cache for repo &#39;AppStream&#39;</title>
        <link rel="alternate" href="https://qianxunclub.com/linux/centos8-Failed-to-synchronize-cache-for-repo%20-AppStream/"/>
        <content type="html">&lt;h1 id=&#34;原因&#34;&gt;&lt;a href=&#34;#原因&#34; class=&#34;headerlink&#34; title=&#34;原因&#34;&gt;&lt;/a&gt;原因&lt;/h1&gt;&lt;p&gt;自2022年1月31日起，CentOS团队从官方镜像中移除CentOS 8的所有包，但软件包仍在官方镜像上保留一段时间。&lt;br&gt;现在被转移到&lt;code&gt;https://vault.centos.org&lt;/code&gt;。如需继续运行旧CentOS 8，可以在&amp;#x2F;etc&amp;#x2F;yum.repos中更新repos.d，使用&lt;code&gt;vault.centos.org&lt;/code&gt;代替&lt;code&gt;mirror.centos.org&lt;/code&gt;&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;h1 id=&#34;修改文件&#34;&gt;&lt;a href=&#34;#修改文件&#34; class=&#34;headerlink&#34; title=&#34;修改文件&#34;&gt;&lt;/a&gt;修改文件&lt;/h1&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd /etc/yum.repos.d/&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;里面有很多源文件，打开文件，注释掉&lt;code&gt;mirrorlist&lt;/code&gt;一行，然后找到&lt;code&gt;baseurl&lt;/code&gt;一行解开注释，并且修改URL为最新地址。&lt;br&gt;例如：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;vim CentOS-Base.repo&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;[BaseOS]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;name=CentOS-$releasever - Base&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=BaseOS&amp;amp;infra=$infra&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;baseurl=http://vault.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;gpgcheck=1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;enabled=1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;可以用一下方法批量替换：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;sudo sed -i &amp;#x27;s/mirrorlist/#mirrorlist/g&amp;#x27; /etc/yum.repos.d/CentOS-*&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo sed -i &amp;#x27;s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g&amp;#x27; /etc/yum.repos.d/CentOS-*&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
</content>
        <category term="Linux" />
        <category term="Centos" />
        <category term="Yum" />
        <updated>2023-04-21T11:21:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/grpc/grpc2http-gateway/</id>
        <title>基于 Grpc 反射的一款 Grpc 转 Http 请求的工具 grpc2http-gateway 的使用</title>
        <link rel="alternate" href="https://qianxunclub.com/grpc/grpc2http-gateway/"/>
        <content type="html">&lt;blockquote&gt;
&lt;p&gt;码云：&lt;a href=&#34;https://gitee.com/qianxunclub/grpc2http-gateway&#34;&gt;https://gitee.com/qianxunclub/grpc2http-gateway&lt;/a&gt;&lt;br&gt;GITHUB：&lt;a href=&#34;https://github.com/qianxunclub/grpc2http-gateway&#34;&gt;https://github.com/qianxunclub/grpc2http-gateway&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;grpc2http-gateway&#34;&gt;&lt;a href=&#34;#grpc2http-gateway&#34; class=&#34;headerlink&#34; title=&#34;grpc2http-gateway&#34;&gt;&lt;/a&gt;grpc2http-gateway&lt;/h1&gt;&lt;h2 id=&#34;简介&#34;&gt;&lt;a href=&#34;#简介&#34; class=&#34;headerlink&#34; title=&#34;简介&#34;&gt;&lt;/a&gt;简介&lt;/h2&gt;&lt;p&gt;该服务是基于 &lt;a href=&#34;https://github.com/grpc/grpc/blob/master/doc/server-reflection.md&#34;&gt;Grpc 反射&lt;/a&gt; 开发的一款 Grpc 换为 Http 请求的工具。&lt;br&gt;因为是基于反射开发，所以使用时无需修改 proto 及相关的代码实现，只需在启动服务时开启反射功能。&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h2 id=&#34;使用方法&#34;&gt;&lt;a href=&#34;#使用方法&#34; class=&#34;headerlink&#34; title=&#34;使用方法&#34;&gt;&lt;/a&gt;使用方法&lt;/h2&gt;&lt;h3 id=&#34;服务端&#34;&gt;&lt;a href=&#34;#服务端&#34; class=&#34;headerlink&#34; title=&#34;服务端&#34;&gt;&lt;/a&gt;服务端&lt;/h3&gt;&lt;p&gt;因为是基于反射开发，需要服务端开启反射功能，开启方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;grpc-spring-boot-starter&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;grpc.server.reflection-service-enabled=true&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;原生开启&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;Server server = ServerBuilder.forPort(SERVER_PORT)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    .addService(new HelloServiceImpl())&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    // 这里开启反射&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    .addService(ProtoReflectionService.newInstance())&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    .build()&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    .start();&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;grpc2http-gateway-服务添加环境变量配置&#34;&gt;&lt;a href=&#34;#grpc2http-gateway-服务添加环境变量配置&#34; class=&#34;headerlink&#34; title=&#34;grpc2http-gateway 服务添加环境变量配置&#34;&gt;&lt;/a&gt;grpc2http-gateway 服务添加环境变量配置&lt;/h3&gt;&lt;h4 id=&#34;添加-GRPC-服务端应用&#34;&gt;&lt;a href=&#34;#添加-GRPC-服务端应用&#34; class=&#34;headerlink&#34; title=&#34;添加 GRPC 服务端应用&#34;&gt;&lt;/a&gt;添加 GRPC 服务端应用&lt;/h4&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;grpc.endpoint.服务名称=dev.coding.oa.com:9902&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;启动-grpc2http-gateway-服务&#34;&gt;&lt;a href=&#34;#启动-grpc2http-gateway-服务&#34; class=&#34;headerlink&#34; title=&#34;启动 grpc2http-gateway 服务&#34;&gt;&lt;/a&gt;启动 grpc2http-gateway 服务&lt;/h3&gt;&lt;p&gt;示例 proto&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;syntax = &amp;quot;proto3&amp;quot;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;package com.qianxunclub.proto;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;option java_outer_classname = &amp;quot;HelloProto&amp;quot;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;message HelloRequest &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    string fieldName = 1;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;message HelloResponse &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;service HelloService &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    rpc HelloWorld (HelloRequest) returns (HelloResponse);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;


&lt;h4 id=&#34;获取服务端-Grpc-接口列表&#34;&gt;&lt;a href=&#34;#获取服务端-Grpc-接口列表&#34; class=&#34;headerlink&#34; title=&#34;获取服务端 Grpc 接口列表&#34;&gt;&lt;/a&gt;获取服务端 Grpc 接口列表&lt;/h4&gt;&lt;p&gt;&lt;code&gt;GET&lt;/code&gt; 请求 &lt;code&gt;http://localhost:8080/api/服务名称/&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;调用-Grpc-接口&#34;&gt;&lt;a href=&#34;#调用-Grpc-接口&#34; class=&#34;headerlink&#34; title=&#34;调用 Grpc 接口&#34;&gt;&lt;/a&gt;调用 Grpc 接口&lt;/h4&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;curl \&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;--location \&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;--request POST &amp;#x27;http://localhost:8080/api/服务名称/Grpc方法名称[com.qianxunclub.proto.HelloService.HelloWorld]&amp;#x27; \&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;--header &amp;#x27;Content-Type: application/json&amp;#x27; \&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;--data-raw &amp;#x27;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;fieldName&amp;quot;:&amp;quot;value&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&amp;#x27;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;swagger-使用&#34;&gt;&lt;a href=&#34;#swagger-使用&#34; class=&#34;headerlink&#34; title=&#34;swagger 使用&#34;&gt;&lt;/a&gt;swagger 使用&lt;/h3&gt;&lt;h4 id=&#34;配置-grpc2http-gateway-的-swagger-服务地址&#34;&gt;&lt;a href=&#34;#配置-grpc2http-gateway-的-swagger-服务地址&#34; class=&#34;headerlink&#34; title=&#34;配置 grpc2http-gateway 的 swagger 服务地址&#34;&gt;&lt;/a&gt;配置 grpc2http-gateway 的 swagger 服务地址&lt;/h4&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;# 这个配置是所部署的服务器地址的 IP 或者 域名，为了 swagger 执行调用&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;swagger.serverUrl=http://localhost:8080&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;访问：&lt;a href=&#34;http://localhost:8080/swagger-ui/index.html&#34;&gt;http://localhost:8080/swagger-ui/index.html&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;OPENAPI 地址填写：&lt;code&gt;http://localhost:8080/api/v3/api-docs/服务名称&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;开发构建&#34;&gt;&lt;a href=&#34;#开发构建&#34; class=&#34;headerlink&#34; title=&#34;开发构建&#34;&gt;&lt;/a&gt;开发构建&lt;/h2&gt;&lt;h3 id=&#34;docker-构建镜像&#34;&gt;&lt;a href=&#34;#docker-构建镜像&#34; class=&#34;headerlink&#34; title=&#34;docker 构建镜像&#34;&gt;&lt;/a&gt;docker 构建镜像&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;./docker-build.sh&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;构建完镜像名称为：&lt;code&gt;grpc2http-gateway:latest&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;部署&#34;&gt;&lt;a href=&#34;#部署&#34; class=&#34;headerlink&#34; title=&#34;部署&#34;&gt;&lt;/a&gt;部署&lt;/h2&gt;&lt;h3 id=&#34;docker-compose-部署&#34;&gt;&lt;a href=&#34;#docker-compose-部署&#34; class=&#34;headerlink&#34; title=&#34;docker-compose 部署&#34;&gt;&lt;/a&gt;docker-compose 部署&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;编辑 &lt;a href=&#34;https://github.com/qianxunclub/grpc2http-gateway/blob/master/docker-compose/docker-compose.yml&#34;&gt;docker-compose.yml&lt;/a&gt; ，配置环境变量&lt;/li&gt;
&lt;li&gt;启动&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd docker-compose&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;docker-compose up -d&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;开发者讨论&#34;&gt;&lt;a href=&#34;#开发者讨论&#34; class=&#34;headerlink&#34; title=&#34;开发者讨论&#34;&gt;&lt;/a&gt;开发者讨论&lt;/h2&gt;&lt;p&gt;欢迎提交 PR 升级，有什么好建议或者想法的，可以添加QQ群一起讨论：852214454&lt;/p&gt;
</content>
        <category term="Java" />
        <category term="Grpc" />
        <updated>2022-01-18T18:41:37.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/java/bean/java-model-guifan/</id>
        <title>JAVA Model 中的 VO、BO、DO、DTO</title>
        <link rel="alternate" href="https://qianxunclub.com/java/bean/java-model-guifan/"/>
        <content type="html">&lt;ul&gt;
&lt;li&gt;VO：VO（View Object） 通常是请求处理层传输的对象，它通过 Spring 框架的转换后，往往是一个 JSON 对象。&lt;/li&gt;
&lt;/ul&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;ul&gt;
&lt;li&gt;BO：BO（Business Object），它是业务逻辑层封装业务逻辑的对象，一般情况下，它是聚合了多个数据源的复合对象。&lt;/li&gt;
&lt;li&gt;DO：DO（Data Object）与数据库表结构一一对应，通过 DAO 层向上传输数据源对象。&lt;/li&gt;
&lt;li&gt;DTO：DTO（Data Transfer Object）是远程调用对象，它是 RPC 服务提供的领域模型。&lt;/li&gt;
&lt;/ul&gt;
</content>
        <category term="Java" />
        <updated>2019-08-19T18:41:37.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/linux/centos7-shengji-gcc/</id>
        <title>Centos7 手动编译升级 gcc</title>
        <link rel="alternate" href="https://qianxunclub.com/linux/centos7-shengji-gcc/"/>
        <content type="html">&lt;h1 id=&#34;下载安装包&#34;&gt;&lt;a href=&#34;#下载安装包&#34; class=&#34;headerlink&#34; title=&#34;下载安装包&#34;&gt;&lt;/a&gt;下载安装包&lt;/h1&gt;&lt;p&gt;原地址：&lt;a href=&#34;http://ftp.gnu.org/gnu/gcc/&#34;&gt;http://ftp.gnu.org/gnu/gcc/&lt;/a&gt;&lt;br&gt;国内使用：&lt;a href=&#34;https://mirrors.ustc.edu.cn/gnu/gcc/&#34;&gt;https://mirrors.ustc.edu.cn/gnu/gcc/&lt;/a&gt;  &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;wget http://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc-9.1.0.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;tar  -zcvf gcc-9.1.0.tar.gz&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;到这里不要直接编译安装的，先把下面的依赖检查一下有没有装好。&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;h1 id=&#34;检查和安装依赖项&#34;&gt;&lt;a href=&#34;#检查和安装依赖项&#34; class=&#34;headerlink&#34; title=&#34;检查和安装依赖项&#34;&gt;&lt;/a&gt;检查和安装依赖项&lt;/h1&gt;&lt;h2 id=&#34;检查依赖&#34;&gt;&lt;a href=&#34;#检查依赖&#34; class=&#34;headerlink&#34; title=&#34;检查依赖&#34;&gt;&lt;/a&gt;检查依赖&lt;/h2&gt;&lt;p&gt;因为我这里都已经装好了，所以显示成功&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd gcc-9.1.0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;./contrib/download_prerequisites&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;gmp-6.1.0.tar.bz2: 确定&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;mpfr-3.1.4.tar.bz2: 确定&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;mpc-1.0.3.tar.gz: 确定&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;isl-0.18.tar.bz2: 确定&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;All prerequisites downloaded successfully.&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;安装依赖&#34;&gt;&lt;a href=&#34;#安装依赖&#34; class=&#34;headerlink&#34; title=&#34;安装依赖&#34;&gt;&lt;/a&gt;安装依赖&lt;/h2&gt;&lt;p&gt;如果上面依赖缺少的，就需要安装：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;yum install gmp-devel&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;yum install mpfr-devel&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;yum install libmpc-devel&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;安装 isl：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;tar -jxvf isl-0.18.tar.bz2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cd isl-0.18 &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;./configure   &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;make  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;make install   &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;安装完成，再检车一下：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;./contrib/download_prerequisites&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;编译安装gcc&#34;&gt;&lt;a href=&#34;#编译安装gcc&#34; class=&#34;headerlink&#34; title=&#34;编译安装gcc&#34;&gt;&lt;/a&gt;编译安装gcc&lt;/h1&gt;&lt;p&gt;安装开发环境依赖：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;yum groupinstall &amp;quot;Development Tools&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;yum install glibc-static libstdc++-static&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;安装gcc：  &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd gcc-9.1.0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;mkdir gcc-build-9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cd gcc-build-9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;../configure --prefix=/usr/local/gcc9 --enable-languages=c,c++,go  --disable-multilib&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;make -j4 (-j4选项是make对多核处理器的优化，如果不成功请使用 make，相关优化选项可以移步至参考文献[2]。建议不要使用make -j来编译，虽然可以缩短编译时间，但极大可能会编译失败)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;make install&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;替换旧的gcc&#34;&gt;&lt;a href=&#34;#替换旧的gcc&#34; class=&#34;headerlink&#34; title=&#34;替换旧的gcc&#34;&gt;&lt;/a&gt;替换旧的gcc&lt;/h1&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;rm -f /usr/bin/gcc&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;rm -f /usr/bin/g++&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ln -s /usr/local/gcc9/bin/gcc /usr/bin/gcc&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ln -s /usr/local/gcc9/bin/g++ /usr/bin/g++&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;更新libstdc&#34;&gt;&lt;a href=&#34;#更新libstdc&#34; class=&#34;headerlink&#34; title=&#34;更新libstdc++&#34;&gt;&lt;/a&gt;更新libstdc++&lt;/h1&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;# 找到现有的版本&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ls -lrt /usr/lib64/libstdc++.so.6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;lrwxrwxrwx. 1 root root 19 8月   8 08:39 /usr/lib64/libstdc++.so.6 -&amp;gt; libstdc++.so.6.0.19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;rm -f /usr/lib64/libstdc++.so.6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ln -s /usr/local/lib64/libstdc++.so.6.0.26 /usr/lib64/libstdc++.so.6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;


&lt;p&gt;完成！&lt;/p&gt;
</content>
        <category term="Linux" />
        <category term="Centos" />
        <category term="Gcc" />
        <updated>2019-08-07T21:39:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/java/spring-boot/springboot-shixian-12306-qiangpiao/</id>
        <title>SpringBoot实现12306自动抢票系统</title>
        <link rel="alternate" href="https://qianxunclub.com/java/spring-boot/springboot-shixian-12306-qiangpiao/"/>
        <content type="html">&lt;h1 id=&#34;写在前面&#34;&gt;&lt;a href=&#34;#写在前面&#34; class=&#34;headerlink&#34; title=&#34;写在前面&#34;&gt;&lt;/a&gt;写在前面&lt;/h1&gt;&lt;p&gt;前段时间在浏览开源社区的时候，不小心看到一个 &lt;code&gt;12306抢票&lt;/code&gt; 系统，一下就被吸引住了，然后就动力歪念头😏，过年终于不用找黄牛了，哇哈哈哈，写了差不多一个星期，终于可以全自动抢票了，中间遇到的坑也是挺多的，在这里分享一下，供大家参考学习。&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h1 id=&#34;如何分析12306接口&#34;&gt;&lt;a href=&#34;#如何分析12306接口&#34; class=&#34;headerlink&#34; title=&#34;如何分析12306接口&#34;&gt;&lt;/a&gt;如何分析12306接口&lt;/h1&gt;&lt;p&gt;使用 &lt;code&gt;Chrome&lt;/code&gt; 或者 &lt;code&gt;Firefox&lt;/code&gt; 浏览器，我这里用的是 &lt;code&gt;Firefox&lt;/code&gt;，打开12306官网，然后打开开发者选项，点击&lt;code&gt;网络&lt;/code&gt;选项卡，就可以观察到所有的请求接口情况了。&lt;br&gt;然后按照正常的流程，开始下单，没点击一部，然后看下面的控制台的请求情况，和分析接口的意义，这是一个很苦逼的过程😭。&lt;br&gt;&lt;img src=&#34;/img/Qianxunclub2019-06-12_15-38-57.jpg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;必要的接口&#34;&gt;&lt;a href=&#34;#必要的接口&#34; class=&#34;headerlink&#34; title=&#34;必要的接口&#34;&gt;&lt;/a&gt;必要的接口&lt;/h1&gt;&lt;p&gt;我这了整理了一些必要的一些接口，也是按照购票顺序写的。&lt;/p&gt;
&lt;h3 id=&#34;1-获取站点信息&#34;&gt;&lt;a href=&#34;#1-获取站点信息&#34; class=&#34;headerlink&#34; title=&#34;1.获取站点信息&#34;&gt;&lt;/a&gt;1.获取站点信息&lt;/h3&gt;&lt;p&gt;购票一部分站点参数使用的是编码，并不是汉字，需要使用这个接口获取对应的值&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;/https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9098&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-获取cookies&#34;&gt;&lt;a href=&#34;#2-获取cookies&#34; class=&#34;headerlink&#34; title=&#34;2.获取cookies&#34;&gt;&lt;/a&gt;2.获取cookies&lt;/h3&gt;&lt;p&gt;这个是为了获取必要的两个 cookie 的值的：&lt;code&gt;RAIL_EXPIRATION&lt;/code&gt; 和 &lt;code&gt;RAIL_EXPIRATION&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这个接口就比较吊了，有特么好神奇，至今没搞懂后面的参数哪里来的，目前的是这俩 cookie 都是手动写死的，等研究出来，补充一下。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/HttpZF/logdevice?algID=&amp;amp;hashCode=Ja4gW6Upz9XdOiA2-UBi5DjyNsB3Fmf3L0wxipiFro4&amp;amp;FMQw=0&amp;amp;q4f3=zh-CN&amp;amp;VySQ=FGEYxQuwmyAY0Gevguxv6Ch8vDiXELlH&amp;amp;VPIf=1&amp;amp;custID=133&amp;amp;VEek=unspecified&amp;amp;dzuS=32.0%20r0&amp;amp;yD16=0&amp;amp;EOQP=c227b88b01f5c513710d4b9f16a5ce52&amp;amp;lEnu=2886729839&amp;amp;jp76=b34839808806e7ff02df813671ec99b3&amp;amp;hAqN=MacIntel&amp;amp;platform=WEB&amp;amp;ks0Q=a103db222cd8296a50268c8f0355b741&amp;amp;TeRS=877x1440&amp;amp;tOHY=24xx900x1440&amp;amp;Fvje=i1l1s1&amp;amp;q5aJ=-8&amp;amp;wNLf=99115dfb07133750ba677d055874de87&amp;amp;0aew=Mozilla/5.0%20(Macintosh;%20Intel%20Mac%20OS%20X%2010.14;%20rv:67.0)%20Gecko/20100101%20Firefox/67.0&amp;amp;E3gR=6c9c3674a3e453e368c3a0cc46f30eb8&amp;amp;timestamp=1560399328000&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;3-车票查询&#34;&gt;&lt;a href=&#34;#3-车票查询&#34; class=&#34;headerlink&#34; title=&#34;3.车票查询&#34;&gt;&lt;/a&gt;3.车票查询&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=%s&amp;amp;leftTicketDTO.from_station=%s&amp;amp;leftTicketDTO.to_station=%s&amp;amp;purpose_codes=ADULT&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;4-登录配置查询&#34;&gt;&lt;a href=&#34;#4-登录配置查询&#34; class=&#34;headerlink&#34; title=&#34;4.登录配置查询&#34;&gt;&lt;/a&gt;4.登录配置查询&lt;/h3&gt;&lt;p&gt;这个接口就是为了查看登录是否需要验证码的&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/login/conf&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;5-读取验证码&#34;&gt;&lt;a href=&#34;#5-读取验证码&#34; class=&#34;headerlink&#34; title=&#34;5.读取验证码&#34;&gt;&lt;/a&gt;5.读取验证码&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&amp;amp;module=login&amp;amp;rand=sjrand&amp;amp;_=%s&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;6-校验验证码&#34;&gt;&lt;a href=&#34;#6-校验验证码&#34; class=&#34;headerlink&#34; title=&#34;6.校验验证码&#34;&gt;&lt;/a&gt;6.校验验证码&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/passport/captcha/captcha-check?answer=%s&amp;amp;rand=sjrand&amp;amp;login_site=E&amp;amp;_=%s&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;7-登录&#34;&gt;&lt;a href=&#34;#7-登录&#34; class=&#34;headerlink&#34; title=&#34;7.登录&#34;&gt;&lt;/a&gt;7.登录&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/passport/web/login&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;8-校验是否登录成功&#34;&gt;&lt;a href=&#34;#8-校验是否登录成功&#34; class=&#34;headerlink&#34; title=&#34;8.校验是否登录成功&#34;&gt;&lt;/a&gt;8.校验是否登录成功&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/passport/web/auth/uamtk-static?appid=otn&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;9-获取uamtk&#34;&gt;&lt;a href=&#34;#9-获取uamtk&#34; class=&#34;headerlink&#34; title=&#34;9.获取uamtk&#34;&gt;&lt;/a&gt;9.获取&lt;code&gt;uamtk&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;获取这个东西是为了后面获取用户 &lt;code&gt;tk&lt;/code&gt; 做准备的。&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/passport/web/auth/uamtk&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;10-获取当前登录的tk&#34;&gt;&lt;a href=&#34;#10-获取当前登录的tk&#34; class=&#34;headerlink&#34; title=&#34;10.获取当前登录的tk&#34;&gt;&lt;/a&gt;10.获取当前登录的&lt;code&gt;tk&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;这东西后面买票是必须使用的。&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/uamauthclient&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;11-买票前校验用户是否正常登录&#34;&gt;&lt;a href=&#34;#11-买票前校验用户是否正常登录&#34; class=&#34;headerlink&#34; title=&#34;11.买票前校验用户是否正常登录&#34;&gt;&lt;/a&gt;11.买票前校验用户是否正常登录&lt;/h3&gt;&lt;p&gt;这个接口只是为了校验，没有实际意义。&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/login/checkUser&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;12-点击预定按钮&#34;&gt;&lt;a href=&#34;#12-点击预定按钮&#34; class=&#34;headerlink&#34; title=&#34;12.点击预定按钮&#34;&gt;&lt;/a&gt;12.点击预定按钮&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;13-获取两个token&#34;&gt;&lt;a href=&#34;#13-获取两个token&#34; class=&#34;headerlink&#34; title=&#34;13.获取两个token&#34;&gt;&lt;/a&gt;13.获取两个&lt;code&gt;token&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;这个接口会获取两个 &lt;code&gt;token&lt;/code&gt;。&lt;br&gt;&lt;code&gt;globalRepeatSubmitToken&lt;/code&gt;:获取乘客信息、检查订单、获取排队情况、提交订单使用。&lt;br&gt;&lt;code&gt;key_check_isChange&lt;/code&gt;:提交订单使用。  &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/confirmPassenger/initDc&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;14-获取乘客信息&#34;&gt;&lt;a href=&#34;#14-获取乘客信息&#34; class=&#34;headerlink&#34; title=&#34;14.获取乘客信息&#34;&gt;&lt;/a&gt;14.获取乘客信息&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;15-提交前检查订单&#34;&gt;&lt;a href=&#34;#15-提交前检查订单&#34; class=&#34;headerlink&#34; title=&#34;15.提交前检查订单&#34;&gt;&lt;/a&gt;15.提交前检查订单&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;16-获取排队情况&#34;&gt;&lt;a href=&#34;#16-获取排队情况&#34; class=&#34;headerlink&#34; title=&#34;16. 获取排队情况&#34;&gt;&lt;/a&gt;16. 获取排队情况&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;17-提交订单&#34;&gt;&lt;a href=&#34;#17-提交订单&#34; class=&#34;headerlink&#34; title=&#34;17.提交订单&#34;&gt;&lt;/a&gt;17.提交订单&lt;/h3&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h3 id=&#34;18-获取订单&#34;&gt;&lt;a href=&#34;#18-获取订单&#34; class=&#34;headerlink&#34; title=&#34;18.获取订单&#34;&gt;&lt;/a&gt;18.获取订单&lt;/h3&gt;&lt;p&gt;这个获取订单接口必须成功，才能确定下单成功的。&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;源代码&#34;&gt;&lt;a href=&#34;#源代码&#34; class=&#34;headerlink&#34; title=&#34;源代码&#34;&gt;&lt;/a&gt;源代码&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;https://gitee.com/qianxunclub/ticket&#34;&gt;&lt;img src=&#34;https://gitee.com/qianxunclub/ticket/widgets/widget_6.svg&#34; alt=&#34;Fork me on Gitee&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;因为代码有部分敏感信息，所以我这就重新打包上传到QQ群了。&lt;br&gt;&lt;code&gt;加QQ群下载：852214454&lt;/code&gt;  &lt;/p&gt;
</content>
        <category term="SpringBoot" />
        <category term="Java" />
        <updated>2019-06-12T03:22:12.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/linux/ansible-de-an-zhuang-he-shi-yong-ssh-pass/</id>
        <title>ansible的安装配置和配合sshpass的使用</title>
        <link rel="alternate" href="https://qianxunclub.com/linux/ansible-de-an-zhuang-he-shi-yong-ssh-pass/"/>
        <content type="html">&lt;h1 id=&#34;ansible安装&#34;&gt;&lt;a href=&#34;#ansible安装&#34; class=&#34;headerlink&#34; title=&#34;ansible安装&#34;&gt;&lt;/a&gt;ansible安装&lt;/h1&gt;&lt;p&gt;官网安装文档：&lt;a href=&#34;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-the-control-machine&#34;&gt;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-the-control-machine&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;centos使用yum安装&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;sudo yum install ansible&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu使用apt-get安装&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;sudo apt-get install ansible&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;MAC使用pip安装&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;sudo pip install ansible&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;其他安装方式，参考官网安装文档吧。&lt;/p&gt;
&lt;h1 id=&#34;ansible配置&#34;&gt;&lt;a href=&#34;#ansible配置&#34; class=&#34;headerlink&#34; title=&#34;ansible配置&#34;&gt;&lt;/a&gt;ansible配置&lt;/h1&gt;&lt;p&gt;官网配置文件介绍：&lt;a href=&#34;https://docs.ansible.com/ansible/latest/installation_guide/intro_configuration.html&#34;&gt;https://docs.ansible.com/ansible/latest/installation_guide/intro_configuration.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我自己的配合文件：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;vim ~/.ansible.cfg&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;[defaults]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;hostfile=$HOME/.ansible/hosts&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;deprecation_warnings=False&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#host_key_checking=Falses&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;hostfile：host配置文件的目录，默认是在&lt;code&gt;/etc/ansible/hosts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;deprecation_warnings：不要警告信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;hosts配置&#34;&gt;&lt;a href=&#34;#hosts配置&#34; class=&#34;headerlink&#34; title=&#34;hosts配置&#34;&gt;&lt;/a&gt;hosts配置&lt;/h1&gt;&lt;p&gt;在上面配置信息&lt;code&gt;hostfile&lt;/code&gt;的路径找到&lt;code&gt;hosts&lt;/code&gt;文件编辑：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;vim ~/.ansible/hosts&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;[test]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;192.168.1.1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;192.168.1.2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;192.168.1.3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;上面这种配置方式，是需要添加&lt;code&gt;sshkey&lt;/code&gt;才可以使用的，这种使用方式更爽一些。&lt;/p&gt;
&lt;h1 id=&#34;使用sshpass&#34;&gt;&lt;a href=&#34;#使用sshpass&#34; class=&#34;headerlink&#34; title=&#34;使用sshpass&#34;&gt;&lt;/a&gt;使用sshpass&lt;/h1&gt;&lt;p&gt;如果想使用用户名密码来配置ansible，也是可以的，一样是需要在&lt;code&gt;hostfile&lt;/code&gt;的路径找到&lt;code&gt;hosts&lt;/code&gt;文件编辑：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;vim ~/.ansible/hosts&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;[test]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;192.168.1.1 ansible_ssh_user=用户名 ansible_ssh_pass=密码&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;192.168.1.2 ansible_ssh_user=用户名 ansible_ssh_pass=密码&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;192.168.1.3 ansible_ssh_user=用户名 ansible_ssh_pass=密码&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;测试一下&#34;&gt;&lt;a href=&#34;#测试一下&#34; class=&#34;headerlink&#34; title=&#34;测试一下&#34;&gt;&lt;/a&gt;测试一下&lt;/h1&gt;&lt;p&gt;无论是使用&lt;code&gt;sshkey&lt;/code&gt;还是使用&lt;code&gt;sshpass&lt;/code&gt;，都可以使用下面的测试：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;ansible test -m ping&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;192.168.1.1 | SUCCESS =&amp;gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;changed&amp;quot;: false,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;ping&amp;quot;: &amp;quot;pong&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;192.168.1.2 | SUCCESS =&amp;gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;changed&amp;quot;: false,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;ping&amp;quot;: &amp;quot;pong&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;192.168.1.3| SUCCESS =&amp;gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;changed&amp;quot;: false,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;ping&amp;quot;: &amp;quot;pong&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
</content>
        <category term="Ansible" />
        <category term="Linux" />
        <category term="Mac" />
        <updated>2018-11-21T04:39:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/tech/shi-yong-github-zuo-wen-jian-cun-chu/</id>
        <title>使用github做一个类似七牛云的云存储</title>
        <link rel="alternate" href="https://qianxunclub.com/tech/shi-yong-github-zuo-wen-jian-cun-chu/"/>
        <content type="html">&lt;h1 id=&#34;一、吐槽&#34;&gt;&lt;a href=&#34;#一、吐槽&#34; class=&#34;headerlink&#34; title=&#34;一、吐槽&#34;&gt;&lt;/a&gt;一、吐槽&lt;/h1&gt;&lt;p&gt;首先我想说一句“日了狗”了不知道过分不过分！&lt;br&gt;前段时间，七牛云发来下面的通知：&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;p&gt;&lt;img src=&#34;/img/yitian_2018-10-31_11-13-00.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;这意味着，我之前所有的使用七牛云的图片域名变了，要修改！要全部修改！！！算了，不说了。  &lt;/p&gt;
&lt;p&gt;消消气，接下来说怎么用抛弃七牛云，使用github吧。&lt;/p&gt;
&lt;h1 id=&#34;二、使用github做云存储服务&#34;&gt;&lt;a href=&#34;#二、使用github做云存储服务&#34; class=&#34;headerlink&#34; title=&#34;二、使用github做云存储服务&#34;&gt;&lt;/a&gt;二、使用github做云存储服务&lt;/h1&gt;&lt;h2 id=&#34;2-1-创建云存储的仓库&#34;&gt;&lt;a href=&#34;#2-1-创建云存储的仓库&#34; class=&#34;headerlink&#34; title=&#34;2.1 创建云存储的仓库&#34;&gt;&lt;/a&gt;2.1 创建云存储的仓库&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;/img/1540955860216-0974b4a3-b160-4a1b-bc30-e2b8f59a131b.png&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;项目名称为&lt;code&gt;xxx.io&lt;/code&gt;，貌似现在不加&lt;code&gt;.io&lt;/code&gt;也行了，之前是要加的，我只是习惯了&lt;/li&gt;
&lt;li&gt;下面创建&lt;code&gt;README.MD&lt;/code&gt;按钮最好点上去，不然空项目，不方便上传图片&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-2-域名设置&#34;&gt;&lt;a href=&#34;#2-2-域名设置&#34; class=&#34;headerlink&#34; title=&#34;2.2 域名设置&#34;&gt;&lt;/a&gt;2.2 域名设置&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;首先你得有一个域名，我的域名是在&lt;a href=&#34;https://aliyun.com/&#34;&gt;阿里云&lt;/a&gt;买的，要在阿里云域名解析设置正确的解析：&lt;br&gt;&lt;img src=&#34;/img/yitian_2018-10-31_11-30-57.png&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;要使用CNAME解析&lt;/li&gt;
&lt;li&gt;解析地址一般是&lt;code&gt;用户名.github.io&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;p&gt;设置github云存储域名，在github仓库创建一个文件名称为&lt;code&gt;CNAME&lt;/code&gt;的文件，内容就是自己在阿里云设置解析的域名，提交就可以了：&lt;br&gt;&lt;img src=&#34;/img/yitian_2018-10-31_11-33-48.png&#34;&gt;&lt;br&gt;&lt;img src=&#34;/img/yitian_2018-10-31_11-36-12.png&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;点击项目设置：&lt;br&gt;&lt;img src=&#34;/img/yitian_2018-10-31_11-24-37.png&#34;&gt;&lt;br&gt;找到下面&lt;code&gt;GitHub Pages&lt;/code&gt;设置，可以看到域名已经设置成功：&lt;br&gt;&lt;img src=&#34;/img/yitian_2018-10-31_11-26-59.png&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;2-3-测试和使用&#34;&gt;&lt;a href=&#34;#2-3-测试和使用&#34; class=&#34;headerlink&#34; title=&#34;2.3 测试和使用&#34;&gt;&lt;/a&gt;2.3 测试和使用&lt;/h2&gt;&lt;p&gt;接下来上传一张图片感觉一下效果：&lt;br&gt;&lt;img src=&#34;/img/yitian_2018-10-31_11-38-42.png&#34;&gt;&lt;br&gt;上传完成后，访问一下感觉感觉，访问地址是：&lt;code&gt;https://自己的域名.com/文件名称.jpg&lt;/code&gt;&lt;br&gt;&lt;img src=&#34;/img/yitian_2018-10-31_11-42-59.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;完美！&lt;/p&gt;
</content>
        <category term="github" />
        <category term="七牛云" />
        <updated>2018-10-31T03:44:46.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/tech/gao-zhi-liang-mian-shi-ti/</id>
        <title>一份高质量的JAVA高级开发面试题总结，没有答案</title>
        <link rel="alternate" href="https://qianxunclub.com/tech/gao-zhi-liang-mian-shi-ti/"/>
        <content type="html">&lt;blockquote&gt;
&lt;p&gt;一般面试官都是按照自己的简历面试的，下面的面试题当然也是依据我自己的简历的一些问题总结，我是对一些架构知识比较感兴趣，所以简历比较突出架构方面的。&lt;br&gt;别看人家问的问题很简单，但是你不能简单的回答的，依据自己的能力，能回答多深就多大多深。&lt;br&gt;然后就是看和面试官的缘分了，能碰触火花，那就恭喜了！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;p&gt;&lt;strong&gt;1、描述一下不同业务的架构方式和自己觉得比较牛逼的架构。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;2、在公司自己的角色，工作内容和负责的事项。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;3、自己觉得对自己提升最大的项目介绍一下，包括业务和技术和协调管理等各个方面。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;4、jvm内存怎么设置，怎么调优，依据都有哪些。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;5、threadlocal 介绍一下。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;6、kafka原理，为什么性能高并且还稳定。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;7、分布式使用集群的时候，其中一个节点断掉了，处理策略，比如 dubbo ，eureka，grpc等等，主要介绍处理原理。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;8、分布式事务怎么处理。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;9、服务器配置和数量怎么协调分配，部署的都是什么服务。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;10、如何协调项目或者服务之间的关系。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;11、服务崩溃的原因你都遇到过哪些。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;12、如何保证服务正常运行，出现错误，怎么修复，监控和快速修复排错方面。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;13、项目中，有没有遇到测试开发环境都是正常的，生产错误的情况？然后如何找到这个错误的问题，怎么解决这个问题。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;14、分库分表是用什么工具，如何分的，数据量多少。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;15、数据库单机还是主从，部署方案，如果宕机处理方式。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;16、很多后台管理列表查询，没有分库分表字段，怎么处理，全库全表查询太慢。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;17、读写分离的场景，读写分离不一定是mysql的读写分离，我回答的是mysql写，mongodb读。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;18、项目中接口最大并发能承受多少。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;19、如果你来规划淘宝双11，从哪些方面应对该活动。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;20、做为一个架构师，一套架构怎么产生，流程是什么。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;21、微服务优缺点，如何应对它的缺点。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;22、微服务数量庞大起来，如何管理这些服务。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;23、分布式配置中心的应用。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;24、说一个自己比较熟悉技术，说说原理，自己能不能开发一个这个产品。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;25、你的优点是什么，录用你的原因，优势是什么？缺点是什么。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;26、开发中，有咩有遇到比较奇葩的问题，为什么会有这个问题，如何解决的。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;27、你对简历上以外的技术还会哪些？对那些比较感兴趣，或者做过什么小demo之类的。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;28、你对技术方面是如何学习，途径是什么。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;29、自己觉得呆的这么几个公司，哪个对自己提升最大，为什么，为什么离职？再找工作的目标是什么。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br&gt;&lt;strong&gt;30、你给公司带来的最大利益有哪些，或者提供了哪些技术等。&lt;/strong&gt;  &lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
</content>
        <category term="Java" />
        <category term="面试题" />
        <updated>2018-10-20T01:05:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/linux/nginx-pei-zhi-nginx-conf-wen-jian/</id>
        <title>Nginx认识nginx.conf配置文件</title>
        <link rel="alternate" href="https://qianxunclub.com/linux/nginx-pei-zhi-nginx-conf-wen-jian/"/>
        <content type="html">&lt;p&gt;转载：&lt;a href=&#34;https://blog.csdn.net/rth362147773/article/details/78837971&#34;&gt;https://blog.csdn.net/rth362147773/article/details/78837971&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;前言&#34;&gt;&lt;a href=&#34;#前言&#34; class=&#34;headerlink&#34; title=&#34;前言&#34;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;p&gt;nginx.conf文件是放在conf目录下的一个配置文件。这个是Nginx服务器的主配置文件。通过指令来配置这个文件能达到控制nginx，实现反向代理，负载均衡，也是nginx入门的基础。读懂使用nginx.conf文件是这篇文章写作目的。&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h1 id=&#34;nginx-conf文件的结构&#34;&gt;&lt;a href=&#34;#nginx-conf文件的结构&#34; class=&#34;headerlink&#34; title=&#34;nginx.conf文件的结构&#34;&gt;&lt;/a&gt;nginx.conf文件的结构&lt;/h1&gt;&lt;p&gt;首先介绍文件的架构，整个conf文件分为 全局块、events块、http块、server块、location块。每个块有每个块的作用域，越外层的块作用域就包含内部块的作用域，如全局块作用域就包含events块、http块、server块和location块。而文件中的“#”代表注析，#后的代码是不会有效果的。修改nginx.conf后是必须重启nginx才会生效。这些要注意。&lt;br&gt;下面就看文件架构：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;...                 #全局块&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;event&amp;#123;              #events块&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;http&amp;#123;               #http块&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    server&amp;#123;         #server块&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ...         #server全局块&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        location&amp;#123;   #location块&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        location&amp;#123;   #location块&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    server&amp;#123;         #server块&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ...             #http全局块&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;大致的nginx.conf文件如上，而下面讲解各块的作用。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;全局块&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;全局块是默认配置文件从开始到events块之间的一部分内容，主要是设置一些影响Nginx服务器整体运行的配置指令。因此，这些指令的作用域是Nginx服务器全局。作用：配置Ngnix服务器的用户组、worker process数、Nginx进程PID存放路径、日志的存放路径和类型已经配置文件引入等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;events块&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;events块的指令主要影响Nginx服务器与用户的网络链接。 作用：是否开启多worker process下的网络连接进行序列化，是否允许同时接收多个网络连接，选取那种事件驱动模型处连接请求，每个worker process可以同时支持的最大连接数等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;http块&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;http块是Nginx服务器配置中的重要部分，代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这模块中。作用包括：文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;server块&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;server块，虚拟主机（虚拟服务器）。作用：使得Nginx服务器可以在同一台服务器上至运行一组Nginx进程，就可以运行多个网站。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;location块&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;location块是server块的一个指令。作用：基于Nginx服务器接收到的请求字符串，虚拟主机名称（ip，域名）、url匹配，对特定请求进行处理。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1 id=&#34;指令说明&#34;&gt;&lt;a href=&#34;#指令说明&#34; class=&#34;headerlink&#34; title=&#34;指令说明&#34;&gt;&lt;/a&gt;指令说明&lt;/h1&gt;&lt;p&gt;日常我们使用到的配置如下，这些都是常用的指令。&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;#### 全局块 开始 ####&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;user nobody nobody;                 #配置允许运行nginx服务器的用户和用户组&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;worker_processes 3;                 #配置允许nginx进程生产的worker process数&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;error_log logs/error.log;           #配置nginx服务器运行对错误日志存放路径&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;pid nginx.pid;                      #配置nginx服务器运行时的pid文件存放路径和名称&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#### 全局块 结束 ####&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#### events块 开始 ####&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;events&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ues epoll;                      #配置事件驱动模型&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    worker_connections 1024;        #配置最大连接数&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#### events块 结束 ####&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#### http块 开始 ####&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;http&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    include mime.types;             #定义MIME-Type&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    default_type application/octet-stream;   &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    sendfile on；                   #配置允许使用sendfile方式传输&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    keepalive_timeout 65;           #配置连接超时时间&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    log_format access.log &amp;#x27;$remote_addr-[$time_local]-&amp;quot;$request&amp;quot;-&amp;quot;$http_user_agent&amp;quot;&amp;#x27;;     #配置请求处理日志的格式&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    #### server块 开始 ####&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ##配置虚拟主机 myServerl&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    server&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        listen  8081;              #配置监听端口和主机名称&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        server_name myServer1;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        access_log  /myweb/server1/logaccess.log;#配置请求处理日志存放路径&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        error_page 404  /404.html;     #配置错误页面&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        location  /server1/location1 &amp;#123; #配置处理／server1/location1 请求的location&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            root  /myweb;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            index index.svr1-loc1.htm;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        location  /server1/location2 &amp;#123; #配置处理／server1/location2 请求的location&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            root  /myweb;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            index index.svr1-loc2.htm;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    server&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        listen  8082;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        server_name  192.168.1.3;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        access_log  /myweb/server2/log/access.log;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        error_log  404  /404.html;    #对错误页面404.html 做了定向配置&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        location  /server2/location1 &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            root  /myweb;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            index index.svr2-loc1.htm;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        location  /svr2/loc2 &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            alias  /myweb/server2/location2;       #对location的URL进行更改&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            index index.svr2-loc1.htm;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        location = ／404.html                  #配置错误页面转向&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            root  /myweb/;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            index 404.html;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    #### server块 结束 ####&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;### http块 结束 ####&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;user user [group]&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;用于配置允许Nginx服务器用户（组）。user,指可以运行Nginx服务器的用户。group，指可以运行Nginx服务器的用户组。通常设置：user nobody nobody&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;worker process number&amp;#x2F;auto&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Nginx服务器实现并发处理服务关键，设置值越大并发处理量也就越多，但也受到软硬件制约。number,指Nginx进程最多可以产生worker process数。auto,Nginx进程自动检测。默认设置为1。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pid file&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Nginx进程作为系统的守护进程运行，我们需要在某文件中保存当前运行程序的主进程号。Nginx支持对它的存放路径进行自定义配置，指令时pid。如pid sbin／web_nginx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;error_log file&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;配置错误日志存放路径，全局块、http块和server块中都可以对日志进行相关配置。如：error_log logs&amp;#x2F;error.log error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;incloud file&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;配置文件的引入，引入其他Nginx配置或者第三方模块的配置。如：include mime.types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accept_mutex on&amp;#x2F;off&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;设置网络连接的序列化，当某一个时刻只有一个网络连接来时，多个睡眠进程会被同时叫醒，但只有一个进程能接。如果每次呼醒的进程数目太多，会影响一部分系统性能。为了解决这个问题，Nginx配置accept_mutex，当开启的时候，对Nginx进程接收连接进行序列化，防止多个进程对连接的争强。只能在events块配置。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accept_accept on&amp;#x2F;off&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;设置是否允许同时接收多个网络连接，这个是配置worker process是否允许同时接收多个连接。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;use method&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;事件驱动模型选择，强制Nginx服务器选择那种事件驱动模型进行消息处理。method:select、poll、kqueue、epoll、rtsig、／dev／poll 以及eventport。此指令智能在events块中配置。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;woker_connections number&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;配置最大连接数，设置允许每一个worker process同时开启的最大连接数。默认为512。只能在events块中配置。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;default_type mime-type&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;在浏览器中，显示内容HTML、XML、GIF和Flash等种类繁多的文本、媒体等资源，浏览器为了区分这些资源，需要使用MIME Type。MIME Type是网络资源的媒体类型。Nginx服务器作为Web服务器，必须能够识别前端请求的资源类型。配置如：include mime.types; default_type application&amp;#x2F;octet-stream;在http块、server块或者location块进行配置。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;access_log path[format[buffer&amp;#x3D;size]]&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;服务日志定义，此处定义所指日志与常规的不同，记录Nginx服务器提供服务过程应答前端请求的日志。可以对服务日志进行格式定义。配置如：log_format exampleLog ‘remoteaddr−[remoteaddr−[remote_addr - [time_local] requestrequestrequest status bodybytessentbodybytessentbody_bytes_sent http_referer $http_user_agent’输出：192.168.1.102 - [31&amp;#x2F;Oct&amp;#x2F;2011:20:41:29 +0800] “GET&amp;#x2F;HTTP&amp;#x2F;1.1” 200 151 “-” “Mozilla&amp;#x2F;5.0(compatible;MSIE 10.0;Window NT 6.2; Trident&amp;#x2F;6.0)”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sendfile on&amp;#x2F;off&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;配置允许sendfile方式传输文件，在Apache、lighttd等Web服务器配置中，都有和sendfile相关的配置。用于开启或者关闭sendfile传输文件。默认为off。在http块、server块或者location块进行配置。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sendfile_max_chunk size&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;worker process每次调用sendfile传输的数据量最大不能超过这个值。默认为0。在http块、server块或location块中配置。和sendfile指令一起使用。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;keepalive_timeout timeout[header_timeout]&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;配置连接超时时间，与用户建立会话连接后，Nginx服务器保持这些连接打开一段时间。此指令设置时间。timeout,服务器端对连接的保持时间。默认值为75s。header_tiemout,可选项，在应答报文头部Keep-Alive域设置超时时间。该指令被Mozilla或者Konqueror识别。配置如：keepalive_timeout 120s 100s;此指令在http块、server块或location块中配置。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;keepalive_requests number&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;单连接请求数上限，用户端和服务端建立连接后，用于限制用户通过某一连接向Nginx服务器发送请求的次数。在server块和location块中，默认设置100。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;listen address[:port][default_server][setfib&amp;#x3D;number][backlog&amp;#x3D;number][rcvbuf&amp;#x3D;size][sndbuf&amp;#x3D;size][deferred]&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;配置监听使用指令listen。address,IP地址，如果有IPv6的地址，需要使用中括号“[]”括起来，比如[fe80::1]等port,端口号，如果只定义IP地址没有定义端口号，就使用80端口。path，socket文件路径，如／var&amp;#x2F;run&amp;#x2F;nginx.sock等default_server，标识符，将此虚拟主机设置为address:port的默认主机。配置如：listen :80 &amp;#x2F; :8000;listen 192.168.1.10:8000;listen 192.168.1.10;listen 8000;listen 192.168.1.10 default_server backlog&amp;#x3D;1024;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;server_name name…&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;基于名称的虚拟主机配置，主机指server块虚拟主机。设置主机名称并配置号DNS，用户就可以使用这个名词向此虚拟主机请求了。配置如：server_name myserver.com &lt;a href=&#34;http://www.myserver.com/&#34;&gt;www.myserver.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;location [ &amp;#x3D; &amp;#x2F; ~ &amp;#x2F; &lt;del&gt;* &amp;#x2F; ^&lt;/del&gt; ] url&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;配置location，匹配成功，就继续执行下面命令。”&amp;#x3D;”,用于标准url前,要求请求字符串与url严格匹配。”～”,用于表示URL包含正则表达式，并且区分大小写。”～*”,用于表示url包含正则表达式，并且不区分大小写。”^~”,用于标准url前，用于匹配请求最高location后，立即使用localtion处理请求。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;root path&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;配置请求的根目录，在服务端指定目录中请求资源。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alias path&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;更改location的URL，使用alias指令改变location接收的URL的请求路径。配置如：alias ／locationtest1&amp;#x2F;other／$1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;index file …&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;设置网站的默认首页，用于index设置为默认首页。配置如：index index.$1.html index.my.html index.html&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;error_page code … [&amp;#x3D;[response]] url&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;设置网站的错误页面，如果服务端错误需要错误页面来显示。这个设置错误页面。配置如：error_page 404 404&amp;#x2F;html&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;allow address&amp;#x2F;CIDR&amp;#x2F;all&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;基于IP配置Nginx的访问权限，通过IP来判断客户端是否拥有对Nginx的访问权限。address，允许访问的客户端的IP，不支持同时设置多个。需要重复使用allow指令。CIDR，允许访问的客户端CIDR地址，例如202.80.18.23&amp;#x2F;25。all，代表允许所有客户端访问。配置如：deny 192.168.1.1；allow 192.168.1.0&amp;#x2F;24  deny all；&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;auth_basic string&amp;#x2F;off&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;基于密码配置Nginx的访问权限，该给予HTTP Basic Authentication协议的认证。该协议是一种HTTP性质的认证办法，需要识别用户名和密码，认证失败的苦户端不拥有访问Nginx服务器权限。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;auth_basic_user_file file&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;用语设置包含用户名和密码信息的文件路径。file为密码文件的绝对路径。file配置如：name1:password1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1 id=&#34;结论&#34;&gt;&lt;a href=&#34;#结论&#34; class=&#34;headerlink&#34; title=&#34;结论&#34;&gt;&lt;/a&gt;结论&lt;/h1&gt;&lt;p&gt;通过指令的实例和指令的详细说明，可以学会看nginx.conf。nginx虽然容易使用，但想使用的好。需要了解指令的用法。最后才可以实现高性能服务器。&lt;/p&gt;
</content>
        <category term="Linux" />
        <category term="Nginx" />
        <updated>2018-10-10T04:39:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/exception/springboot-elasticsearch-yi-chang/</id>
        <title>SpringBoot启动使用elasticsearch启动异常：Received message from unsupported version:[2.0.0] minimal compatible version is:[5.6.0]</title>
        <link rel="alternate" href="https://qianxunclub.com/exception/springboot-elasticsearch-yi-chang/"/>
        <content type="html">&lt;h1 id=&#34;异常描述&#34;&gt;&lt;a href=&#34;#异常描述&#34; class=&#34;headerlink&#34; title=&#34;异常描述&#34;&gt;&lt;/a&gt;异常描述&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;使用的SpringBoot1.5.9版本&lt;/li&gt;
&lt;li&gt;JDK1.8&lt;/li&gt;
&lt;li&gt;使用了dubbo和zookeeper&lt;/li&gt;
&lt;li&gt;elasticsearch使用的6.3.2版本&lt;/li&gt;
&lt;li&gt;引入ES的jar包&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;groupId&amp;gt;org.springframework.data&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;artifactId&amp;gt;spring-data-elasticsearch&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt;ES详细报错信息：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;[2018-08-23T15:56:05,004][WARN ][o.e.x.s.t.n.SecurityNetty4ServerTransport] [node-1] exception caught on transport layer [NettyTcpChannel&amp;#123;localAddress=/192.168.1.40:9300, remoteAddress=/192.168.1.150:55594&amp;#125;], closing connection&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;java.lang.IllegalStateException: Received message from unsupported version: [2.0.0] minimal compatible version is: [5.6.0]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.elasticsearch.transport.TcpTransport.ensureVersionCompatibility(TcpTransport.java:1462) ~[elasticsearch-6.3.2.jar:6.3.2]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.elasticsearch.transport.TcpTransport.messageReceived(TcpTransport.java:1409) ~[elasticsearch-6.3.2.jar:6.3.2]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.elasticsearch.transport.netty4.Netty4MessageChannelHandler.channelRead(Netty4MessageChannelHandler.java:64) ~[transport-netty4-6.3.2.jar:6.3.2]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) [netty-codec-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:297) [netty-codec-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:413) [netty-codec-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) [netty-codec-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.handler.logging.LoggingHandler.channelRead(LoggingHandler.java:241) [netty-handler-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1359) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:935) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:134) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:545) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:499) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459) [netty-transport-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) [netty-common-4.1.16.Final.jar:4.1.16.Final]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;异常分析&#34;&gt;&lt;a href=&#34;#异常分析&#34; class=&#34;headerlink&#34; title=&#34;异常分析&#34;&gt;&lt;/a&gt;异常分析&lt;/h1&gt;&lt;p&gt;错误信息写的是因为版本不一致的原因导致的，客户端使用的2.0.0版本，要求最低是5.6.0版本的，然后各种百度各种查啊，原因如下：&lt;br&gt;springboot我用的版本是SpringBoot1.5.9，然后引入的&lt;code&gt;spring-data-elasticsearch&lt;/code&gt;里面包含的es版本是&lt;code&gt;2.4.0&lt;/code&gt;的。&lt;/p&gt;
&lt;h1 id=&#34;解决办法&#34;&gt;&lt;a href=&#34;#解决办法&#34; class=&#34;headerlink&#34; title=&#34;解决办法&#34;&gt;&lt;/a&gt;解决办法&lt;/h1&gt;&lt;p&gt;解决办法有两种，1：重新安装ES版本，安装2.0.0版本的。 2：升级自己的SpringBoot。&lt;br&gt;我这里因为是新系统，为了代码规范，所以就安装了ES2.0.0版本了，但是我感觉最好的解决办法应该要升级SpringBoot版本才对。&lt;/p&gt;
</content>
        <category term="Exception" />
        <category term="SpringBoot" />
        <category term="Elasticsearch" />
        <updated>2018-08-24T02:40:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/exception/springboot-elasticsearch-qi-dong-yi-chang/</id>
        <title>SpringBoot使用elasticsearch异常：NoSuchMethodError:org.jboss.netty.channel.socket.nio.NioWorker</title>
        <link rel="alternate" href="https://qianxunclub.com/exception/springboot-elasticsearch-qi-dong-yi-chang/"/>
        <content type="html">&lt;h1 id=&#34;异常描述&#34;&gt;&lt;a href=&#34;#异常描述&#34; class=&#34;headerlink&#34; title=&#34;异常描述&#34;&gt;&lt;/a&gt;异常描述&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;使用的SpringBoot1.5.9版本&lt;/li&gt;
&lt;li&gt;JDK1.8&lt;/li&gt;
&lt;li&gt;使用了dubbo和zookeeper&lt;/li&gt;
&lt;/ol&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt;详细报错信息：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &amp;#x27;elasticsearchTemplate&amp;#x27; defined in class path resource [org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfiguration.class]: Unsatisfied dependency expressed through method &amp;#x27;elasticsearchTemplate&amp;#x27; parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name &amp;#x27;elasticsearchClient&amp;#x27; defined in class path resource [org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.elasticsearch.client.Client]: Factory method &amp;#x27;elasticsearchClient&amp;#x27; threw exception; nested exception is java.lang.NoSuchMethodError: org.jboss.netty.channel.socket.nio.NioWorker.&amp;lt;init&amp;gt;(Ljava/util/concurrent/Executor;Lorg/jboss/netty/util/ThreadNameDeterminer;)V&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	... 33 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name &amp;#x27;elasticsearchClient&amp;#x27; defined in class path resource [org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.elasticsearch.client.Client]: Factory method &amp;#x27;elasticsearchClient&amp;#x27; threw exception; nested exception is java.lang.NoSuchMethodError: org.jboss.netty.channel.socket.nio.NioWorker.&amp;lt;init&amp;gt;(Ljava/util/concurrent/Executor;Lorg/jboss/netty/util/ThreadNameDeterminer;)V&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	... 43 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.elasticsearch.client.Client]: Factory method &amp;#x27;elasticsearchClient&amp;#x27; threw exception; nested exception is java.lang.NoSuchMethodError: org.jboss.netty.channel.socket.nio.NioWorker.&amp;lt;init&amp;gt;(Ljava/util/concurrent/Executor;Lorg/jboss/netty/util/ThreadNameDeterminer;)V&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	... 56 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: java.lang.NoSuchMethodError: org.jboss.netty.channel.socket.nio.NioWorker.&amp;lt;init&amp;gt;(Ljava/util/concurrent/Executor;Lorg/jboss/netty/util/ThreadNameDeterminer;)V&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.jboss.netty.channel.socket.nio.NioWorkerPool.newWorker(NioWorkerPool.java:44)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.jboss.netty.channel.socket.nio.NioWorkerPool.newWorker(NioWorkerPool.java:28)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.init(AbstractNioWorkerPool.java:80)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.jboss.netty.channel.socket.nio.NioWorkerPool.&amp;lt;init&amp;gt;(NioWorkerPool.java:39)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.jboss.netty.channel.socket.nio.NioWorkerPool.&amp;lt;init&amp;gt;(NioWorkerPool.java:33)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.elasticsearch.transport.netty.NettyTransport.createClientBootstrap(NettyTransport.java:354)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.elasticsearch.transport.netty.NettyTransport.doStart(NettyTransport.java:290)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.elasticsearch.common.component.AbstractLifecycleComponent.start(AbstractLifecycleComponent.java:68)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.elasticsearch.transport.TransportService.doStart(TransportService.java:182)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.elasticsearch.common.component.AbstractLifecycleComponent.start(AbstractLifecycleComponent.java:68)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.elasticsearch.client.transport.TransportClient$Builder.build(TransportClient.java:164)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.data.elasticsearch.client.TransportClientFactoryBean.buildClient(TransportClientFactoryBean.java:89)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.data.elasticsearch.client.TransportClientFactoryBean.afterPropertiesSet(TransportClientFactoryBean.java:85)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration.createTransportClient(ElasticsearchAutoConfiguration.java:116)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration.createClient(ElasticsearchAutoConfiguration.java:93)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration.elasticsearchClient(ElasticsearchAutoConfiguration.java:84)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration$$EnhancerBySpringCGLIB$$68f5928b.CGLIB$elasticsearchClient$1(&amp;lt;generated&amp;gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration$$EnhancerBySpringCGLIB$$68f5928b$$FastClassBySpringCGLIB$$5550a67a.invoke(&amp;lt;generated&amp;gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration$$EnhancerBySpringCGLIB$$68f5928b.elasticsearchClient(&amp;lt;generated&amp;gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at java.lang.reflect.Method.invoke(Method.java:498)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	... 57 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;异常分析&#34;&gt;&lt;a href=&#34;#异常分析&#34; class=&#34;headerlink&#34; title=&#34;异常分析&#34;&gt;&lt;/a&gt;异常分析&lt;/h1&gt;&lt;p&gt;从异常的信息看，有两种可能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;没有netty包的原因&lt;/li&gt;
&lt;li&gt;有多个netty包出现冲突&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;先找一下有没有netty包，找了一遍，发现有netty的&lt;br&gt;&lt;img src=&#34;http://p8wysinsm.bkt.clouddn.com/QQ%E6%88%AA%E5%9B%BE20180824092833.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;那只有第二种可能了，就是包冲入，又仔细看了一遍引入的JAR包，果然又出现了一个jar&lt;br&gt;&lt;img src=&#34;http://p8wysinsm.bkt.clouddn.com/QQ%E6%88%AA%E5%9B%BE20180824093129.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后挨个挨个查找，发现是dubbo和zookeeper里面已经有了netty包了，所以出现了包冲突。&lt;/p&gt;
&lt;h1 id=&#34;解决办法&#34;&gt;&lt;a href=&#34;#解决办法&#34; class=&#34;headerlink&#34; title=&#34;解决办法&#34;&gt;&lt;/a&gt;解决办法&lt;/h1&gt;&lt;p&gt;出错原因是Elasticsearch的netty包和dubbo、zookeeper里面的netty包冲突，我这里是排除了dubbo、zookeeper里面的netty包:&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;groupId&amp;gt;com.alibaba.spring.boot&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;artifactId&amp;gt;dubbo-spring-boot-starter&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;version&amp;gt;$&amp;#123;dubbo.version&amp;#125;&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;exclusions&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;lt;artifactId&amp;gt;spring&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;/exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&amp;lt;artifactId&amp;gt;netty&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&amp;lt;groupId&amp;gt;org.jboss.netty&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		&amp;lt;/exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;/exclusions&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;groupId&amp;gt;com.101tec&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;artifactId&amp;gt;zkclient&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;version&amp;gt;$&amp;#123;zkClient.version&amp;#125;&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;groupId&amp;gt;org.apache.zookeeper&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;artifactId&amp;gt;zookeeper&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;version&amp;gt;$&amp;#123;zookeeper.version&amp;#125;&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;exclusions&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;/exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;/exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;/exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;lt;groupId&amp;gt;io.netty&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;lt;artifactId&amp;gt;netty&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;lt;/exclusion&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;/exclusions&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;启动，成功！&lt;/p&gt;
</content>
        <category term="Exception" />
        <category term="SpringBoot" />
        <category term="Elasticsearch" />
        <updated>2018-08-24T02:40:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/tech/elasticsearch-install/</id>
        <title>centos系统的elasticsearch安装</title>
        <link rel="alternate" href="https://qianxunclub.com/tech/elasticsearch-install/"/>
        <content type="html">&lt;p&gt;安装2.0.0的elasticsearch服务，项目是依赖spring-boot&lt;code&gt;1.5.9.RELEASE&lt;/code&gt;版本，指定了elasticsearch版本，否则无法使用&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;spring data elasticsearch&lt;/th&gt;
&lt;th&gt;elasticsearch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;3.0.0.RC2&lt;/td&gt;
&lt;td&gt;5.5.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.0.0.M4&lt;/td&gt;
&lt;td&gt;5.4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0.4.RELEASE&lt;/td&gt;
&lt;td&gt;2.4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0.0.RELEASE&lt;/td&gt;
&lt;td&gt;2.2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.4.0.M1&lt;/td&gt;
&lt;td&gt;1.7.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.3.0.RELEASE&lt;/td&gt;
&lt;td&gt;1.5.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.2.0.RELEASE&lt;/td&gt;
&lt;td&gt;1.4.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.1.0.RELEASE&lt;/td&gt;
&lt;td&gt;1.3.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.0.0.RELEASE&lt;/td&gt;
&lt;td&gt;1.1.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1 id=&#34;基础环境&#34;&gt;&lt;a href=&#34;#基础环境&#34; class=&#34;headerlink&#34; title=&#34;基础环境&#34;&gt;&lt;/a&gt;基础环境&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;JDK1.8以上  &lt;/li&gt;
&lt;li&gt;创建elasticsearch用户&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;groupadd elsearch&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;useradd elsearch -g elsearch&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;提高系统线程数&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;vim /etc/security/limits.conf&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;* soft nofile 65536&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;* hard nofile 131072&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;* soft nproc 2048&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;* hard nproc 4096&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;vim /etc/security/limits.d/90-nproc.conf &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;* soft nproc 2048&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;否则会出现错误：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;提高系统变量数量&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;vim /etc/sysctl.conf&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;添加或者修改：&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;vm.max_map_count=655360&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;立即生效：&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sysctl -p&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;否则出现以下错误：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;elasticsearch安装&#34;&gt;&lt;a href=&#34;#elasticsearch安装&#34; class=&#34;headerlink&#34; title=&#34;elasticsearch安装&#34;&gt;&lt;/a&gt;elasticsearch安装&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;使用新创建的&lt;code&gt;elsearch&lt;/code&gt;用户&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;su elsearch&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;下载&lt;code&gt;2.0.0&lt;/code&gt;的elasticsearch包，因为程序使用的是spring-boot&lt;code&gt;1.5.9.RELEASE&lt;/code&gt;版本，所以使用elasticsearch的&lt;code&gt;2.0.0&lt;/code&gt;版本，否则无法启动&lt;br&gt;如果使用的是其他版本的springboot，需要按照代码版本使用不同版本的elasticsearch服务&lt;br&gt;下载地址：&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0&#34;&gt;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.0.0/elasticsearch-2.0.0.zip&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;unzip elasticsearch-2.0.0.zip&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;给目录授权&lt;br&gt;使用root用户给ES目录授权&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;chown -R elsearch:elsearch elasticsearch-2.0.0/ &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;修改ES配置&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd elasticsearch-2.0.0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;vim config/elasticsearch.yml&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;主要修改一下几项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cluster.name: my-application：集群名称&lt;/li&gt;
&lt;li&gt;node.name: node-1：当前节点名称&lt;/li&gt;
&lt;li&gt;path.data: &amp;#x2F;home&amp;#x2F;elsearch&amp;#x2F;data：数据存放目录&lt;/li&gt;
&lt;li&gt;path.logs: &amp;#x2F;home&amp;#x2F;elsearch&amp;#x2F;logs：日志存放目录&lt;/li&gt;
&lt;li&gt;bootstrap.mlockall: false：centos系统需要修改，否则报错如下&lt;/li&gt;
&lt;li&gt;bootstrap.system_call_filter: false：centos用户需要添加，否则报错如下&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;ERROR: bootstrap checks failed&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;因为Centos6不支持SecComp，而ES5.2.1默认bootstrap.system_call_filter为true进行检测，所以导致检测失败，失败后直接导致ES不能启动。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;network.host: 192.168.1.40：修改为当前服务器IP&lt;/li&gt;
&lt;li&gt;http.port: 9200：ES服务API端口号&lt;/li&gt;
&lt;li&gt;添加跨域请求：&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;http.cors.enabled: true&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;http.cors.allow-origin: /.*/&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;启动服务&#34;&gt;&lt;a href=&#34;#启动服务&#34; class=&#34;headerlink&#34; title=&#34;启动服务&#34;&gt;&lt;/a&gt;启动服务&lt;/h1&gt;&lt;p&gt;使用&lt;code&gt;elsearch&lt;/code&gt;用户启动一下  &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd elasticsearch-2.0.0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;./bin/elasticsearch&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;如果出现&lt;code&gt;started&lt;/code&gt;字样，说明启动成功  &lt;/p&gt;
&lt;p&gt;然后使用下面启动方式，为后台启动  &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;./bin/elasticsearch -d&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;测试&#34;&gt;&lt;a href=&#34;#测试&#34; class=&#34;headerlink&#34; title=&#34;测试&#34;&gt;&lt;/a&gt;测试&lt;/h1&gt;&lt;p&gt;浏览器访问：&lt;code&gt;http://192.168.1.40:9200&lt;/code&gt;，出现一下为成功：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    name: &amp;quot;node-1&amp;quot;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    cluster_name: &amp;quot;my-application&amp;quot;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    version: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        number: &amp;quot;2.0.0&amp;quot;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        build_hash: &amp;quot;de54438d6af8f9340d50c5c786151783ce7d6be5&amp;quot;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        build_timestamp: &amp;quot;2015-10-22T08:09:48Z&amp;quot;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        build_snapshot: false,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        lucene_version: &amp;quot;5.2.1&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    tagline: &amp;quot;You Know, for Search&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;


</content>
        <category term="SpringBoot" />
        <category term="Elasticsearch" />
        <category term="Linux" />
        <updated>2018-08-24T01:05:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/exception/fastdfs-recv-package-size/</id>
        <title>fastdfs第一次上传文件报错recv package size -1!=10</title>
        <link rel="alternate" href="https://qianxunclub.com/exception/fastdfs-recv-package-size/"/>
        <content type="html">&lt;h1 id=&#34;异常描述&#34;&gt;&lt;a href=&#34;#异常描述&#34; class=&#34;headerlink&#34; title=&#34;异常描述&#34;&gt;&lt;/a&gt;异常描述&lt;/h1&gt;&lt;p&gt; &lt;strong&gt;项目版本：&lt;/strong&gt;&lt;br&gt;项目是&lt;code&gt;SpringBoot&lt;/code&gt;的&lt;code&gt;1.5.9-release&lt;/code&gt;版本，fastdfs版本如下：  &lt;/p&gt;
&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;net.arccode&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;fastdfs-client-java&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;1.27.0&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt; &lt;strong&gt;调用方式如下：&lt;/strong&gt;&lt;br&gt;我的&lt;code&gt;fastdfs.conf&lt;/code&gt;配置：  &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;connect_timeout = 10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;network_timeout = 30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;charset = UTF-8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;tracker_service = xxx.xxx.xxx.xxx:xxx&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;java调用：  &lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Service&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;FileManage&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt; TrackerClient trackerClient;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt; TrackerService trackerService;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;//初始化dfs&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;FileManage&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;()&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ClientGlobal.init(&lt;span class=&#34;string&#34;&gt;&amp;quot;fastdfs.conf&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        trackerClient = &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;TrackerClient&lt;/span&gt;(ClientGlobal.g_tracker_group);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        trackerService = trackerClient.getConnection();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;//文件上传&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;upload&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;()&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;StorageClient&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;storageClient&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;StorageClient&lt;/span&gt;(trackerService,&lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        storageClient.upload_file(.....);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt; &lt;strong&gt;报错情况：&lt;/strong&gt;&lt;br&gt;每次刚启动服务，如果没有直接使用，过一段时间，再调用上传文件服务，会报错，但是再次上传，就没事了，又正常了，报错信息如下：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;java.io.IOException: recv package size -1 != 10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.csource.fastdfs.ProtoCommon.recvHeader(ProtoCommon.java:206)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.csource.fastdfs.ProtoCommon.recvPackage(ProtoCommon.java:242)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.csource.fastdfs.TrackerClient.getStoreStorage(TrackerClient.java:143)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.csource.fastdfs.StorageClient.newWritableStorageConnection(StorageClient.java:1912)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.csource.fastdfs.StorageClient.do_upload_file(StorageClient.java:702)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.csource.fastdfs.StorageClient.upload_file(StorageClient.java:207)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.csource.fastdfs.StorageClient.upload_file(StorageClient.java:225)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.csource.fastdfs.StorageClient1.upload_file1(StorageClient1.java:112)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;


&lt;h1 id=&#34;异常分析&#34;&gt;&lt;a href=&#34;#异常分析&#34; class=&#34;headerlink&#34; title=&#34;异常分析&#34;&gt;&lt;/a&gt;异常分析&lt;/h1&gt;&lt;p&gt;经过多次验证重现这个错误，发现刚启动，间隔时间30秒，就会报错，不能上传，目测和&lt;code&gt;fastdfs.conf&lt;/code&gt;配置的&lt;code&gt;network_timeout =30 &lt;/code&gt;有关系。&lt;br&gt;然后各种百度谷歌，发现有这么一句话：&lt;strong&gt;如果客户端服务启动，成功链接到dfs服务器，如果在network_timeout时间内，dfs服务没有接收到任何请求信息，会吧这个客户端踢掉！&lt;/strong&gt;&lt;br&gt;日了，为毛要踢掉，我还要用啊，看来每次启动链接成功都需要给dfs服务发送点什么才行！&lt;/p&gt;
&lt;p&gt;对dfs有研究了一波，发现&lt;code&gt;fastdfs-client-java&lt;/code&gt;包到&lt;a href=&#34;https://github.com/happyfish100/fastdfs-client-java/blob/master/src/main/java/org/csource/fastdfs/ProtoCommon.java&#34;&gt;ProtoCommon.java&lt;/a&gt;本来已经提供了一个发送信息到一个方法，如下：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;type&#34;&gt;boolean&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;activeTest&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(Socket sock)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;解决办法&#34;&gt;&lt;a href=&#34;#解决办法&#34; class=&#34;headerlink&#34; title=&#34;解决办法&#34;&gt;&lt;/a&gt;解决办法&lt;/h1&gt;&lt;p&gt;废话不多少，先试一波，修改上面dfs初始化代码如下：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Service&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;FileManage&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt; TrackerClient trackerClient;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt; TrackerService trackerService;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;//初始化dfs&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;FileManage&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;()&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ClientGlobal.init(&lt;span class=&#34;string&#34;&gt;&amp;quot;fastdfs.conf&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        trackerClient = &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;TrackerClient&lt;/span&gt;(ClientGlobal.g_tracker_group);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        trackerService = trackerClient.getConnection();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;//给dfs发送一个消息&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ProtoCommon.activeTest(trackerService.getSocket());&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;//文件上传&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;upload&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;()&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;StorageClient&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;storageClient&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;StorageClient&lt;/span&gt;(trackerService,&lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        storageClient.upload_file(.....);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;启动项目，等30秒以上，测试，成功！    &lt;/p&gt;
&lt;p&gt;&lt;em&gt;卧槽，终于记录完了，公司电脑不能上网，上面所有代码纯手工写的，累死！&lt;/em&gt;&lt;/p&gt;
</content>
        <category term="Exception" />
        <updated>2018-07-30T03:27:23.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/tech/cheng-xu-yuan-bi-bei-kai-fa-gong-ju-ti-gao-gong-zuo-xiao-lv/</id>
        <title>程序员必备开发工具，提高开发效率的神兵利器，大多都是免费的哦</title>
        <link rel="alternate" href="https://qianxunclub.com/tech/cheng-xu-yuan-bi-bei-kai-fa-gong-ju-ti-gao-gong-zuo-xiao-lv/"/>
        <content type="html">&lt;h1 id=&#34;1、IntelliJ-IDEA&#34;&gt;&lt;a href=&#34;#1、IntelliJ-IDEA&#34; class=&#34;headerlink&#34; title=&#34;1、IntelliJ IDEA&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://www.jetbrains.com/idea/&#34;&gt;1、IntelliJ IDEA&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;这个就不用多说了，地球人都在用，很好的开发工具，并且插件齐全，更牛逼的是支持各种语言开发。  &lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;http://www.jetbrains.com/idea/&#34;&gt;http://www.jetbrains.com/idea/&lt;/a&gt;&lt;br&gt;注册码地址：&lt;a href=&#34;http://idea.lanyus.com/&#34;&gt;http://idea.lanyus.com/&lt;/a&gt;  &lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h1 id=&#34;2、DataGrip数据库客户端管理&#34;&gt;&lt;a href=&#34;#2、DataGrip数据库客户端管理&#34; class=&#34;headerlink&#34; title=&#34;2、DataGrip数据库客户端管理&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://www.jetbrains.com/datagrip/&#34;&gt;2、DataGrip数据库客户端管理&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;/img/query-console.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.navicat.com.cn/&#34;&gt;Navicat&lt;/a&gt;其实是更好的一个数据库客户端管理工具，但是收费，很麻烦，就又找了一个，也是比较好用的，DataGrip也是&lt;a href=&#34;http://www.jetbrains.com/idea/&#34;&gt;IntelliJ IDEA&lt;/a&gt;中的一个工具。  &lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;https://www.jetbrains.com/datagrip/&#34;&gt;https://www.jetbrains.com/datagrip/&lt;/a&gt;&lt;br&gt;注册码地址：&lt;a href=&#34;http://idea.lanyus.com/&#34;&gt;http://idea.lanyus.com/&lt;/a&gt; &lt;/p&gt;
&lt;h1 id=&#34;3、Postman接口测试&#34;&gt;&lt;a href=&#34;#3、Postman接口测试&#34; class=&#34;headerlink&#34; title=&#34;3、Postman接口测试&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://www.getpostman.com/postman&#34;&gt;3、Postman接口测试&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;/img/Postman-most-complete-toolchain%20(1).png&#34;&gt;&lt;/p&gt;
&lt;p&gt;这个是在开发中，经常测试RestfulApi接口使用的，并非专业接口测试用具，开发阶段使用是一个特别好的工具,可以设置各种请求方式，并且大多已经提供下拉框了，不用手打了，必须推荐。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;https://www.getpostman.com/postman&#34;&gt;https://www.getpostman.com/postman&lt;/a&gt;  &lt;/p&gt;
&lt;h1 id=&#34;4、有道云笔记&#34;&gt;&lt;a href=&#34;#4、有道云笔记&#34; class=&#34;headerlink&#34; title=&#34;4、有道云笔记&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://note.youdao.com/noteintro.html&#34;&gt;4、有道云笔记&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;/img/banner3-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;云笔记各种产品很多，我比较钟爱有道云笔记，支持分类，加密，markdown，手机版等好多功能，并且初始内存也是比较大的，3G的，写笔记够写一辈子了。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;http://note.youdao.com/noteintro.html&#34;&gt;http://note.youdao.com/noteintro.html&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;5、Microsoft-VS-Code（vscode）&#34;&gt;&lt;a href=&#34;#5、Microsoft-VS-Code（vscode）&#34; class=&#34;headerlink&#34; title=&#34;5、Microsoft VS Code（vscode）&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;5、Microsoft VS Code（vscode）&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;/img/home-screenshot-win-lg.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;文本编辑器很重要，要选好，作为一名优秀的码农，&lt;a href=&#34;https://notepad-plus-plus.org/&#34;&gt;notepad&lt;/a&gt;显然已经满足不了，文本编辑器，一定要轻量级的，速度快的，还要功能多的，&lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;vscode&lt;/a&gt;是最好的选择了。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;https://code.visualstudio.com/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;6、cmder&#34;&gt;&lt;a href=&#34;#6、cmder&#34; class=&#34;headerlink&#34; title=&#34;6、cmder&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://cmder.net/&#34;&gt;6、cmder&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;/img/QQ%E6%88%AA%E5%9B%BE20180704155832.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;赶紧告别Windows自带的cmd把，&lt;a href=&#34;http://cmder.net/&#34;&gt;cmder&lt;/a&gt;是在是强大的一批，不要想别的了，赶紧下载使用把。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;http://cmder.net/&#34;&gt;http://cmder.net/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;7、MobaXterm&#34;&gt;&lt;a href=&#34;#7、MobaXterm&#34; class=&#34;headerlink&#34; title=&#34;7、MobaXterm&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://mobaxterm.mobatek.net/&#34;&gt;7、MobaXterm&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;/img/MobaXterm.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;这个玩意就厉害了，SSH、FTP等管理工具，重要的是免费已经足够使用了，功能齐全，不用在为其他工具收费烦恼了。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;https://mobaxterm.mobatek.net/&#34;&gt;https://mobaxterm.mobatek.net/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;8、WPS-Office&#34;&gt;&lt;a href=&#34;#8、WPS-Office&#34; class=&#34;headerlink&#34; title=&#34;8、WPS Office&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://2019.docer.com/&#34;&gt;8、WPS Office&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;/img/img1-bg.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;说真的，已经彻底放弃微软的Office了，谁用谁恶心，还是WPS比较良心，而且现在2019版本的更强大，支持各种画图，太漂亮了。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;http://2019.docer.com/&#34;&gt;http://2019.docer.com/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;9、Everything&#34;&gt;&lt;a href=&#34;#9、Everything&#34; class=&#34;headerlink&#34; title=&#34;9、Everything&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://www.voidtools.com/&#34;&gt;9、Everything&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;/img/Everything.Search.Window.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;这个是比较老牌的软件了，搜索电脑上各种文件，速度快的吓人。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;http://www.voidtools.com/&#34;&gt;http://www.voidtools.com/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;10、MAC下xnip截图工具&#34;&gt;&lt;a href=&#34;#10、MAC下xnip截图工具&#34; class=&#34;headerlink&#34; title=&#34;10、MAC下xnip截图工具&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://xnipapp.com/&#34;&gt;10、MAC下xnip截图工具&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;/img/ecDbxRr.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;找了好多好多截图软件，还是这个比较舒服，一直用QQ截图习惯了，就找了一个类似QQ截图方式的工具，还能滚动截图，实用。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;https://xnipapp.com/&#34;&gt;https://xnipapp.com/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;11、MAC自定义快捷键工具&#34;&gt;&lt;a href=&#34;#11、MAC自定义快捷键工具&#34; class=&#34;headerlink&#34; title=&#34;11、MAC自定义快捷键工具&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://manico.im/&#34;&gt;11、MAC自定义快捷键工具&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;/img/manico-homepage-banner@2x.5948f72d46dc.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;提高开发效率，各种软件切换和快速启动必不可缺啊，这个就特别适用，功能也算齐全。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&#34;https://manico.im/&#34;&gt;https://manico.im/&lt;/a&gt;&lt;/p&gt;
</content>
        <category term="工具" />
        <updated>2018-07-04T08:18:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/linux/zai-yuan-you-de-nginx-an-zhuang-openresty/</id>
        <title>在原有的nginx上面安装Openresty和lua相关的模块</title>
        <link rel="alternate" href="https://qianxunclub.com/linux/zai-yuan-you-de-nginx-an-zhuang-openresty/"/>
        <content type="html">&lt;h1 id=&#34;前言&#34;&gt;&lt;a href=&#34;#前言&#34; class=&#34;headerlink&#34; title=&#34;前言&#34;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;p&gt;突然有一天出了个需求，做文件防盗链的，而且需要通过nginx来做，这个时候必然想到了&lt;code&gt;Openresty&lt;/code&gt;，Openresty本身其实已经安装有nginx了，但是要求在公司原有的nginx上面装一些Openresty里面的模块，这个时候就有点复杂了，但是最终还是研究出来了，庆幸啊，这里做一个笔记，以便下次安装使用。&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h1 id=&#34;安装openresty&#34;&gt;&lt;a href=&#34;#安装openresty&#34; class=&#34;headerlink&#34; title=&#34;安装openresty&#34;&gt;&lt;/a&gt;安装openresty&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;下载openresty&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下载地址：&lt;a href=&#34;https://github.com/openresty/openresty/releases&#34;&gt;https://github.com/openresty/openresty/releases&lt;/a&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;wget https://github.com/openresty/openresty/releases/download/v1.13.6.1/openresty-1.13.6.1.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;编译安装&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;解压&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;tar -xvf openresty-1.13.6.1.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cd openresty-1.13.6.1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;编译安装&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;./configure -j2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;gmake&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;gmake install&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;安装lua&#34;&gt;&lt;a href=&#34;#安装lua&#34; class=&#34;headerlink&#34; title=&#34;安装lua&#34;&gt;&lt;/a&gt;安装lua&lt;/h1&gt;&lt;p&gt;在下载&lt;code&gt;openresty&lt;/code&gt;安装包的时候，里面其实已经依赖了&lt;code&gt;lua&lt;/code&gt;了，只需要安装就好了&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd openresty-1.13.6.1/bundle/LuaJIT-2.1-20171103/&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;make&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;make install&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;


&lt;h1 id=&#34;nginx添加相关模块&#34;&gt;&lt;a href=&#34;#nginx添加相关模块&#34; class=&#34;headerlink&#34; title=&#34;nginx添加相关模块&#34;&gt;&lt;/a&gt;nginx添加相关模块&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;配置lua位置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;找到以前&lt;code&gt;nginx&lt;/code&gt;的源码包，配置lua位置&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd nginx-1.15.0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;export LUAJIT_LIB=/usr/local/openresty/lualib/&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;export LUAJIT_INC=/usr/local/openresty/luajit/include/luajit-2.1/&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;重新编译nginx&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;./configure --prefix=/usr/local/nginx --with-cc-opt=-O2 --add-module=/root/openresty-1.13.6.1/bundle/ngx_devel_kit-0.3.0 --add-module=/root/openresty-1.13.6.1/bundle/echo-nginx-module-0.61 --add-module=/root/openresty-1.13.6.1/bundle/xss-nginx-module-0.05 --add-module=/root/openresty-1.13.6.1/bundle/ngx_coolkit-0.2rc3 --add-module=/root/openresty-1.13.6.1/bundle/set-misc-nginx-module-0.31 --add-module=/root/openresty-1.13.6.1/bundle/form-input-nginx-module-0.12 --add-module=/root/openresty-1.13.6.1/bundle/encrypted-session-nginx-module-0.07 --add-module=/root/openresty-1.13.6.1/bundle/srcache-nginx-module-0.31 --add-module=/root/openresty-1.13.6.1/bundle/ngx_lua-0.10.11 --add-module=/root/openresty-1.13.6.1/bundle/ngx_lua_upstream-0.07 --add-module=/root/openresty-1.13.6.1/bundle/headers-more-nginx-module-0.33 --add-module=/root/openresty-1.13.6.1/bundle/array-var-nginx-module-0.05 --add-module=/root/openresty-1.13.6.1/bundle/memc-nginx-module-0.18 --add-module=/root/openresty-1.13.6.1/bundle/redis2-nginx-module-0.14 --add-module=/root/openresty-1.13.6.1/bundle/redis-nginx-module-0.3.7 --add-module=/root/openresty-1.13.6.1/bundle/rds-json-nginx-module-0.15 --add-module=/root/openresty-1.13.6.1/bundle/rds-csv-nginx-module-0.08 --add-module=/root/openresty-1.13.6.1/bundle/ngx_stream_lua-0.0.3 --with-ld-opt=-Wl,-rpath,/usr/local/lib/ --with-stream --with-stream_ssl_module --with-http_ssl_module&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;编译完成了，执行&lt;code&gt;make&lt;/code&gt;，记住，这里不要执行&lt;code&gt;make install&lt;/code&gt;，不然会把以前安装的会覆盖的&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;make&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;这里有几个参数说明一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;–prefix&amp;#x3D;&amp;#x2F;usr&amp;#x2F;local&amp;#x2F;nginx：nginx安装目录&lt;/li&gt;
&lt;li&gt;–add-module&amp;#x3D;&amp;#x2F;root&amp;#x2F;openresty-1.13.6.1&amp;#x2F;bundle：这个是刚刚下载的openresty安装包&lt;/li&gt;
&lt;li&gt;–with-ld-opt&amp;#x3D;-Wl,-rpath,&amp;#x2F;usr&amp;#x2F;local&amp;#x2F;lib&amp;#x2F;：lua安装的路径，上面lua安装的时候，默认是这个位置的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;编译完成后，会新生成一个nginx执行文件，在nginx-1.15.0&amp;#x2F;objs目录下，测试一下对应的依赖有没有装上&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd nginx-1.15.0/objs&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;./nginx -V&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;显示以下，说明完美&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;nginx version: nginx/1.15.0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;built with OpenSSL 1.0.2k-fips  26 Jan 2017&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;TLS SNI support enabled&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;configure arguments: --prefix=/usr/local/nginx --with-cc-opt=-O2 --add-module=/root/openresty-1.13.6.1/bundle/ngx_devel_kit-0.3.0 --add-module=/root/openresty-1.13.6.1/bundle/echo-nginx-module-0.61 --add-module=/root/openresty-1.13.6.1/bundle/xss-nginx-module-0.05 --add-module=/root/openresty-1.13.6.1/bundle/ngx_coolkit-0.2rc3 --add-module=/root/openresty-1.13.6.1/bundle/set-misc-nginx-module-0.31 --add-module=/root/openresty-1.13.6.1/bundle/form-input-nginx-module-0.12 --add-module=/root/openresty-1.13.6.1/bundle/encrypted-session-nginx-module-0.07 --add-module=/root/openresty-1.13.6.1/bundle/srcache-nginx-module-0.31 --add-module=/root/openresty-1.13.6.1/bundle/ngx_lua-0.10.11 --add-module=/root/openresty-1.13.6.1/bundle/ngx_lua_upstream-0.07 --add-module=/root/openresty-1.13.6.1/bundle/headers-more-nginx-module-0.33 --add-module=/root/openresty-1.13.6.1/bundle/array-var-nginx-module-0.05 --add-module=/root/openresty-1.13.6.1/bundle/memc-nginx-module-0.18 --add-module=/root/openresty-1.13.6.1/bundle/redis2-nginx-module-0.14 --add-module=/root/openresty-1.13.6.1/bundle/redis-nginx-module-0.3.7 --add-module=/root/openresty-1.13.6.1/bundle/rds-json-nginx-module-0.15 --add-module=/root/openresty-1.13.6.1/bundle/rds-csv-nginx-module-0.08 --add-module=/root/openresty-1.13.6.1/bundle/ngx_stream_lua-0.0.3 --with-ld-opt=-Wl,-rpath,/usr/local/lib/ --with-stream --with-stream_ssl_module --with-http_ssl_module&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;复制nginx命令覆盖以前的nginx&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;复制前，最好把之前的nginx备份一下，以防不测&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd /usr/local/nginx/sbin/&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cp nginx nginx.old&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;赢新的覆盖,覆盖之前，最好停掉nginx&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd nginx-1.15.0/&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cp objs/nginx /usr/local/nginx/sbin/&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;这里会提示是否覆盖，输入y，然后回车就好了&lt;/p&gt;
&lt;h1 id=&#34;测试&#34;&gt;&lt;a href=&#34;#测试&#34; class=&#34;headerlink&#34; title=&#34;测试&#34;&gt;&lt;/a&gt;测试&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;先测试nginx有没有被玩坏，先检查一下&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd /usr/local/nginx&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;./sbin/nginx -t&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;./sbin/nginx&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;启动完成，访问下以前的站点还能不能正常打开，目测是没问题的&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;测试lua模块&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;创建一个专门存放lua文件的文件夹,我习惯创建在nginx目录下&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd /usr/local/nginx&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;mkdir lua&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;创建一个lua文件&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;vim hello.lua&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ngx.log(ngx.ERR,&amp;quot;hello&amp;quot;);&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;把这个lua文件依赖到nginx里面试试&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;location / &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        root /workspace/hexo/public/;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        index index.html index.htm;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        access_by_lua_file lua/hello.lua;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;老规矩，先检查下有没问题没，然后重启&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd /usr/local/nginx&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;./sbin/nginx -t&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;./sbin/nginx -s reload&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;然后打开日志，准备看有没有打印对应的日志信息&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;tail -f logs/error.log&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;正常会看到以下日志&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;2018/07/04 11:58:38 [error] 15646#0: *52 [lua] hello.lua:2: hello,&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;完美！&lt;/p&gt;
</content>
        <category term="Linux" />
        <category term="Nginx" />
        <category term="Openresty" />
        <category term="Lua" />
        <updated>2018-07-04T04:39:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/tech/apollo-pei-zhi-zhong-xin-an-zhuang-bu-shu/</id>
        <title>Apollo分布式配置中心部署以及使用</title>
        <link rel="alternate" href="https://qianxunclub.com/tech/apollo-pei-zhi-zhong-xin-an-zhuang-bu-shu/"/>
        <content type="html">&lt;h1 id=&#34;一、简介&#34;&gt;&lt;a href=&#34;#一、简介&#34; class=&#34;headerlink&#34; title=&#34;一、简介&#34;&gt;&lt;/a&gt;一、简介&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;Apollo（阿波罗）是携程框架部门研发的分布式配置中心，能够集中化管理应用不同环境、不同集群的配置，配置修改后能够实时推送到应用端，并且具备规范的权限、流程治理等特性，适用于微服务配置管理场景。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;官方github：&lt;a href=&#34;https://github.com/ctripcorp/apollo&#34;&gt;https://github.com/ctripcorp/apollo&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;作者对Apollo对介绍：&lt;a href=&#34;https://github.com/ctripcorp/apollo/wiki/Apollo%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83%E4%BB%8B%E7%BB%8D&#34;&gt;https://github.com/ctripcorp/apollo/wiki/Apollo%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83%E4%BB%8B%E7%BB%8D&lt;/a&gt;  &lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;h1 id=&#34;二、安装部署&#34;&gt;&lt;a href=&#34;#二、安装部署&#34; class=&#34;headerlink&#34; title=&#34;二、安装部署&#34;&gt;&lt;/a&gt;二、安装部署&lt;/h1&gt;&lt;h2 id=&#34;基础设施&#34;&gt;&lt;a href=&#34;#基础设施&#34; class=&#34;headerlink&#34; title=&#34;基础设施&#34;&gt;&lt;/a&gt;基础设施&lt;/h2&gt;&lt;p&gt;本次部署环境为DEV（开发环境）、FAT（测试环境）、UAT（预生产）、PRO（生产）  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;应用服务器：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&#34;center&#34;&gt;环境&lt;/th&gt;
&lt;th&gt;服务器&lt;/th&gt;
&lt;th&gt;服务&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;端口&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&amp;#x2F;&lt;/td&gt;
&lt;td&gt;192.168.35.206&lt;/td&gt;
&lt;td&gt;apollo-portal&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;9102&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;DEV&lt;/td&gt;
&lt;td&gt;192.168.35.207&lt;/td&gt;
&lt;td&gt;apollo-configservice&lt;br/&gt;apollo-adminservice&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;9100&lt;br/&gt;9101&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;FAT&lt;/td&gt;
&lt;td&gt;192.168.35.208&lt;/td&gt;
&lt;td&gt;apollo-configservice&lt;br/&gt;apollo-adminservice&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;9100&lt;br/&gt;9101&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;UAT&lt;/td&gt;
&lt;td&gt;192.168.35.209&lt;/td&gt;
&lt;td&gt;apollo-configservice&lt;br/&gt;apollo-adminservice&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;9100&lt;br/&gt;9101&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;PRO&lt;/td&gt;
&lt;td&gt;192.168.35.210&lt;/td&gt;
&lt;td&gt;apollo-configservice&lt;br/&gt;apollo-adminservice&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;9100&lt;br/&gt;9101&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;数据库服务器：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&#34;center&#34;&gt;环境&lt;/th&gt;
&lt;th&gt;服务器&lt;/th&gt;
&lt;th&gt;服务&lt;/th&gt;
&lt;th&gt;数据库&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;端口&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&amp;#x2F;&lt;/td&gt;
&lt;td&gt;192.168.35.226&lt;/td&gt;
&lt;td&gt;apollo-portal&lt;/td&gt;
&lt;td&gt;ApolloPortalDB&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;3306&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;DEV&lt;/td&gt;
&lt;td&gt;192.168.35.227&lt;/td&gt;
&lt;td&gt;apollo-configservice&lt;br/&gt;apollo-adminservice&lt;/td&gt;
&lt;td&gt;ApolloConfigDB&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;3306&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;FAT&lt;/td&gt;
&lt;td&gt;192.168.35.228&lt;/td&gt;
&lt;td&gt;apollo-configservice&lt;br/&gt;apollo-adminservice&lt;/td&gt;
&lt;td&gt;ApolloConfigDB&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;3306&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;UAT&lt;/td&gt;
&lt;td&gt;192.168.35.229&lt;/td&gt;
&lt;td&gt;apollo-configservice&lt;br/&gt;apollo-adminservice&lt;/td&gt;
&lt;td&gt;ApolloConfigDB&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;3306&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;PRO&lt;/td&gt;
&lt;td&gt;192.168.35.230&lt;/td&gt;
&lt;td&gt;apollo-configservice&lt;br/&gt;apollo-adminservice&lt;/td&gt;
&lt;td&gt;ApolloConfigDB&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;3306&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&#34;配置&#34;&gt;&lt;a href=&#34;#配置&#34; class=&#34;headerlink&#34; title=&#34;配置&#34;&gt;&lt;/a&gt;配置&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;下载代码：&lt;/strong&gt;  &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;git clone https://github.com/ctripcorp/apollo.git&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;比较重要的几个项目：  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;apollo-configservice：提供配置获取接口，提供配置更新推送接口，接口服务对象为Apollo客户端  &lt;/li&gt;
&lt;li&gt;apollo-adminservice：提供配置管理接口，提供配置修改、发布等接口，接口服务对象为Portal，以及Eureka  &lt;/li&gt;
&lt;li&gt;apollo-portal：提供Web界面供用户管理配置  &lt;/li&gt;
&lt;li&gt;apollo-client：Apollo提供的客户端程序，为应用提供配置获取、实时更新等功能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;/img/release-message-notification-design.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;上图简要描述了配置发布的大致过程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户在Portal操作配置发布&lt;/li&gt;
&lt;li&gt;Portal调用Admin Service的接口操作发布&lt;/li&gt;
&lt;li&gt;Admin Service发布配置后，发送ReleaseMessage给各个Config Service&lt;/li&gt;
&lt;li&gt;Config Service收到ReleaseMessage后，通知对应的客户端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;数据库初始化：&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;em&gt;下面的sql为大写格式，注意数据库的大小写敏感设置&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ApolloPortalDB：执行&lt;code&gt;apollo\scripts\sql\apolloportaldb.sql&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ApolloConfigDB：DEV FAT UAT PRO 环境执行&lt;code&gt;apollo\scripts\sql\apolloconfigdb.sql&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;调整配置并打包：&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;在&lt;code&gt;Apollo&lt;/code&gt;项目中找到目录&lt;code&gt;apollo\scripts\&lt;/code&gt;的配置文件&lt;code&gt;build.sh&lt;/code&gt;或者&lt;code&gt;build.bat&lt;/code&gt;  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据库配置&lt;br&gt;修改数据库配置，上面的是&lt;code&gt;ApolloConfigDB&lt;/code&gt;配置，下面的是&lt;code&gt;ApolloPortalDB&lt;/code&gt;配置：&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;# apollo config db info  该数据库配置只需要配置一次，不同环境无需修改&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;apollo_config_db_url=jdbc:mysql://192.168.35.227:3306/ApolloConfigDB?characterEncoding=utf8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;apollo_config_db_username=XXXX&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;apollo_config_db_password=XXXX&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;# apollo portal db info  该数据库依据不同环境配置对应的数据库连接，并且需要多次打对应环境的JAR包&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;apollo_portal_db_url=jdbc:mysql://192.168.35.226:3306/ApolloPortalDB?characterEncoding=utf8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;apollo_portal_db_username=XXXX&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;apollo_portal_db_password=XXXX&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;apollo config db info  该数据库配置只需要配置一次，不同环境无需修改&lt;/li&gt;
&lt;li&gt;apollo portal db info  该数据库依据不同环境配置对应的数据库连接，并且需要多次打&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;修改环境调用地址&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;# meta server url, different environments should have different meta server addresses&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;dev_meta=http://192.168.35.207:9100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;fat_meta=http://192.168.35.208:9100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;uat_meta=http://192.168.35.209:9100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;pro_meta=http://192.168.35.210:9100&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;修改数据库数据&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在DEV FAT UAT PRO 对应的&lt;code&gt;ApolloConfigDB&lt;/code&gt;数据库中,找到表&lt;code&gt;ServerConfig&lt;/code&gt;中的&lt;code&gt;eureka.service.url&lt;/code&gt;配置项：&lt;/p&gt;
&lt;figure class=&#34;highlight sql&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;UPDATE&lt;/span&gt; apolloconfigdb.ServerConfig &lt;span class=&#34;keyword&#34;&gt;SET&lt;/span&gt; ServerConfig.`&lt;span class=&#34;keyword&#34;&gt;Value&lt;/span&gt;`&lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;http://localhost:9100/eureka/&amp;#x27;&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;WHERE&lt;/span&gt; `Key`&lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;eureka.service.url&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;修改环境配置，在&lt;code&gt;ApolloPortalDB&lt;/code&gt;数据库修改表&lt;code&gt;ServerConfig&lt;/code&gt;中的&lt;code&gt;apollo.portal.envs&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&#34;highlight sql&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;UPDATE&lt;/span&gt; apolloportaldb.serverconfig &lt;span class=&#34;keyword&#34;&gt;SET&lt;/span&gt; serverconfig.`&lt;span class=&#34;keyword&#34;&gt;Value&lt;/span&gt;`&lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;dev,fat,uat,pro&amp;#x27;&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;WHERE&lt;/span&gt; `Key`&lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;apollo.portal.envs&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;具体&lt;code&gt;eureka&lt;/code&gt;配置，可以查看官网：&lt;a href=&#34;https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97&#34;&gt;https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;编译、打包&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;./build.sh&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;该脚本会依次打包&lt;code&gt;apollo-configservice&lt;/code&gt;, &lt;code&gt;apollo-adminservice&lt;/code&gt;, &lt;code&gt;apollo-portal&lt;/code&gt;和&lt;code&gt;apollo-client&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;由于&lt;code&gt;ApolloConfigDB&lt;/code&gt;在每个环境都有部署，所以对不同环境的&lt;code&gt;config-service&lt;/code&gt;和&lt;code&gt;admin-service&lt;/code&gt;需要使用不同的数据库连接信息打不同的包，&lt;code&gt;portal&lt;/code&gt;和&lt;code&gt;client&lt;/code&gt;只需要打一次包即可&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;开始部署&#34;&gt;&lt;a href=&#34;#开始部署&#34; class=&#34;headerlink&#34; title=&#34;开始部署&#34;&gt;&lt;/a&gt;开始部署&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;部署程序到对应的服务器&lt;/strong&gt;  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;部署apollo-configservice&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;将&lt;code&gt;apollo-configservice/target/&lt;/code&gt;目录下的&lt;code&gt;apollo-configservice-x.x.x-github.zip&lt;/code&gt;上传到服务器上，解压&lt;br&gt;修改&lt;code&gt;scripts/startup.sh&lt;/code&gt; ： &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;LOG_DIR=/opt/logs/100003171&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;SERVER_PORT=9100&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;执行&lt;code&gt;scripts/startup.sh&lt;/code&gt;即可&lt;br&gt;如需停止服务，执行&lt;code&gt;scripts/shutdown.sh.&lt;/code&gt;  &lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;部署apollo-adminservice&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;将&lt;code&gt;apollo-adminservice/target/&lt;/code&gt;目录下的&lt;code&gt;apollo-adminservice-x.x.x-github.zip&lt;/code&gt;上传到服务器上，解压&lt;br&gt;修改&lt;code&gt;scripts/startup.sh&lt;/code&gt;：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;LOG_DIR=/opt/logs/100003172&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;SERVER_PORT=9101&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;执行&lt;code&gt;scripts/startup.sh&lt;/code&gt;即可&lt;br&gt;如需停止服务，执行&lt;code&gt;scripts/shutdown.sh.&lt;/code&gt;  &lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;部署apollo-portal&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;将&lt;code&gt;apollo-portal/target/&lt;/code&gt;目录下的&lt;code&gt;apollo-portal-x.x.x-github.zip&lt;/code&gt;上传到服务器上，解压&lt;br&gt;修改&lt;code&gt;scripts/startup.sh&lt;/code&gt;：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;LOG_DIR=/opt/logs/100003173&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;SERVER_PORT=9102&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;执行&lt;code&gt;scripts/startup.sh&lt;/code&gt;即可&lt;br&gt;如需停止服务，执行&lt;code&gt;scripts/shutdown.sh.&lt;/code&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;访问测试&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;上面部署完成，可以测试&lt;/p&gt;
&lt;p&gt;访问不同环境的&lt;code&gt;eureka&lt;/code&gt;，查看服务注册情况是否正确：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;http://192.168.35.207:9100/&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;如果可以看到:&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;192.168.35.207:apollo-adminservice:9101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;192.168.35.207:apollo-configservice:9100&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;两个服务都为UP，正常！&lt;/p&gt;
&lt;p&gt;访问客户端：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;http://192.168.35.206:9102/&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;登录，默认用户名密码为：&lt;code&gt;apollo/admin&lt;/code&gt;  &lt;/p&gt;
&lt;p&gt;新建项目测试。&lt;/p&gt;
&lt;h1 id=&#34;三、使用配置中心配置信息&#34;&gt;&lt;a href=&#34;#三、使用配置中心配置信息&#34; class=&#34;headerlink&#34; title=&#34;三、使用配置中心配置信息&#34;&gt;&lt;/a&gt;三、使用配置中心配置信息&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;maven引入上面步骤编译打包成功的&lt;code&gt;apollo-core&lt;/code&gt;和&lt;code&gt;apollo-client&lt;/code&gt;包：&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.ctrip.framework.apollo&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;apollo-core&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;0.11.0-SNAPSHOT&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.ctrip.framework.apollo&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;apollo-client&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;0.11.0-SNAPSHOT&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;创建app.properties&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;请确保classpath:&amp;#x2F;META-INF&amp;#x2F;app.properties文件存在，并且其中内容为自己的项目名称，而且要保持唯一：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;app.id=demo&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;环境变量配置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;本地开发&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;如果是本地开发，可以在开发工具添加Environment：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;env=DEV&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;线上环境配置方式：&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用Java启动参数添加&lt;code&gt;java -Denv=YOUR-ENVIRONMENT -jar xxx.jar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;通过操作系统的System Environment&lt;/li&gt;
&lt;li&gt;通过配置文件：&lt;br&gt;对于Mac&amp;#x2F;Linux，文件位置为&amp;#x2F;opt&amp;#x2F;settings&amp;#x2F;server.properties&lt;br&gt;对于Windows，文件位置为C:\opt\settings\server.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;配置apollo-env.properties&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在项目中引用&lt;code&gt;apollo-core&lt;/code&gt;和&lt;code&gt;apollo-client&lt;/code&gt;包，在&lt;code&gt;apollo-core&lt;/code&gt;包中可以看到&lt;code&gt;apollo-env.properties&lt;/code&gt;配置文件，默认配置为打包前配置的信息：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;local.meta=http://localhost:8080&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;dev.meta=http://192.168.35.207:9100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;fat.meta=http://192.168.35.208:9100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;uat.meta=http://192.168.35.209:9100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;lpt.meta=$&amp;#123;lpt_meta&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;pro.meta=http://192.168.35.210:9100&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;如果需要修改或者覆盖的话，在项目的&lt;code&gt;resources&lt;/code&gt;从上面复制一个&lt;code&gt;apollo-env.properties&lt;/code&gt;文件，修改对应环境信息就可以了&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;启用配置&lt;br&gt;在启动类添加&lt;code&gt;@EnableApolloConfig&lt;/code&gt;注解即可：&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.springframework.boot.SpringApplication;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.springframework.boot.autoconfigure.SpringBootApplication;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * &lt;span class=&#34;doctag&#34;&gt;@author&lt;/span&gt; chihiro.zhang&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@EnableApolloConfig&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@SpringBootApplication&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;Application&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(String[] args)&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		SpringApplication.run(Application.class, args);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;测试&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;添加一个测试的类&lt;code&gt;DemoConfiguration&lt;/code&gt;，当然配置中心要有下面配置的配置信息:&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;@Configuration&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;@EnableAutoConfiguration&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;public class DemoConfiguration &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    @Value(&amp;quot;$&amp;#123;demo&amp;#125;&amp;quot;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    private String demo;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;完成！&lt;/p&gt;
&lt;h1 id=&#34;四、部署方案&#34;&gt;&lt;a href=&#34;#四、部署方案&#34; class=&#34;headerlink&#34; title=&#34;四、部署方案&#34;&gt;&lt;/a&gt;四、部署方案&lt;/h1&gt;&lt;p&gt;这个图是计划部署的方案，并不是上面写的例子的方案&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/img/Apollo%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E4%B8%AD%E5%BF%83.png&#34;&gt;&lt;/p&gt;
</content>
        <category term="SpringBoot" />
        <category term="Java" />
        <category term="分布式" />
        <category term="SpringCloud" />
        <updated>2018-06-12T03:18:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/java/spring-cloud/spring-cloud-config-fen-bu-shi-pei-zhi-zhong-xin/</id>
        <title>Spring Cloud Config分布式配置中心的使用和遇到的坑</title>
        <link rel="alternate" href="https://qianxunclub.com/java/spring-cloud/spring-cloud-config-fen-bu-shi-pei-zhi-zhong-xin/"/>
        <content type="html">&lt;h1 id=&#34;分布式配置中心&#34;&gt;&lt;a href=&#34;#分布式配置中心&#34; class=&#34;headerlink&#34; title=&#34;分布式配置中心&#34;&gt;&lt;/a&gt;分布式配置中心&lt;/h1&gt;&lt;p&gt;为什么要有用分布式配置中心这玩意儿？现在这微服务大军已经覆盖了各种大小型企业，每个服务的粒度相对较小，因此系统中会出现大量的服务，每个服务都要有自己都一些配置信息，或者相同的配置信息，可能不同环境每个服务也有单独的一套配置，这种情况配置文件数量比较庞大，维护起来相当费劲，举个栗子：&lt;br&gt;在开发的过程中，一般数据库是开发环境数据库，所有服务DB的IP配置为：92.168.0.1，突然老大说，开发环境换了，DB的IP要修改，这下可不好受了，所有模块挨个修改DB的配置，就问你难受不难受？&lt;br&gt;这个时候分布式配置中心就发挥了很大的优势，只需要修改配置中心配置，所有服务即可自动生效，爽不爽！  &lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;h1 id=&#34;Spring-Cloud-Config&#34;&gt;&lt;a href=&#34;#Spring-Cloud-Config&#34; class=&#34;headerlink&#34; title=&#34;Spring Cloud Config&#34;&gt;&lt;/a&gt;Spring Cloud Config&lt;/h1&gt;&lt;p&gt;官网地址：&lt;a href=&#34;http://cloud.spring.io/spring-cloud-config/&#34;&gt;http://cloud.spring.io/spring-cloud-config/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;简介&#34;&gt;&lt;a href=&#34;#简介&#34; class=&#34;headerlink&#34; title=&#34;简介&#34;&gt;&lt;/a&gt;简介&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Spring Cloud Config&lt;/code&gt;为服务端和客户端提供了分布式系统的外部化配置支持。配置服务器为各应用的所有环境提供了一个中心化的外部配置。它实现了对服务端和客户端对&lt;code&gt;Spring Environment&lt;/code&gt;和&lt;code&gt;PropertySource&lt;/code&gt;抽象的映射，所以它除了适用于Spring构建的应用程序，也可以在任何其他语言运行的应用程序中使用。作为一个应用可以通过部署管道来进行测试或者投入生产，我们可以分别为这些环境创建配置，并且在需要迁移环境的时候获取对应环境的配置来运行。  &lt;/p&gt;
&lt;p&gt;置服务器默认采用git来存储配置信息，这样就有助于对环境配置进行版本管理，并且可以通过git客户端工具来方便的管理和访问配置内容。当然他也提供本地化文件系统的存储方式。  &lt;/p&gt;
&lt;p&gt;使用 spring Cloud 进行集中式配置管理，将以往的配置文件从项目中摘除后放到Git 或svn中集中管理，并在需要变更的时候，可以通知到各应用程序，应用程序刷新配置不需要重启。  &lt;/p&gt;
&lt;h2 id=&#34;实现原理&#34;&gt;&lt;a href=&#34;#实现原理&#34; class=&#34;headerlink&#34; title=&#34;实现原理&#34;&gt;&lt;/a&gt;实现原理&lt;/h2&gt;&lt;p&gt;其实这个实现原理相对比较简单一些，基于git的交互操作。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;我们把配置文件存放到git上面&lt;/li&gt;
&lt;li&gt;Spring Cloud Config配置中心服务连接git&lt;/li&gt;
&lt;li&gt;客户端需要配置配置信息从配置中心服务获取&lt;/li&gt;
&lt;li&gt;当客户端启动，会从配置中心获取git上面的配置信息&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;配置中心服务端&#34;&gt;&lt;a href=&#34;#配置中心服务端&#34; class=&#34;headerlink&#34; title=&#34;配置中心服务端&#34;&gt;&lt;/a&gt;配置中心服务端&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;pom.xml添加依赖&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;org.springframework.cloud&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;spring-cloud-config-server&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependencyManagement&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;&amp;lt;!-- spring cloud --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;org.springframework.cloud&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;spring-cloud-dependencies&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;Edgware.SR3&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;type&lt;/span&gt;&amp;gt;&lt;/span&gt;pom&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;type&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;scope&lt;/span&gt;&amp;gt;&lt;/span&gt;import&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;scope&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependencyManagement&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;Application启动类添加注解&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;添加&lt;code&gt;@EnableConfigServer&lt;/code&gt;注解，启用配置中心：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;package&lt;/span&gt; com.qianxunclub;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.springframework.boot.SpringApplication;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.springframework.boot.autoconfigure.SpringBootApplication;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.springframework.cloud.config.server.EnableConfigServer;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;* &lt;span class=&#34;doctag&#34;&gt;@author&lt;/span&gt; chihiro.zhang&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@SpringBootApplication&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@EnableConfigServer&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;Application&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(String[] args)&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        SpringApplication.run(Application.class, args);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;配置文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;application.yml&lt;/code&gt;或者&lt;code&gt;application.properties&lt;/code&gt;添加配置信息：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;cloud:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;config:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;server:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;attr&#34;&gt;git:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;          &lt;span class=&#34;attr&#34;&gt;uri:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;https://gitee.com/qianxunclub/spring-boot-config-repo&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;          &lt;span class=&#34;attr&#34;&gt;default-label:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;master&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;          &lt;span class=&#34;attr&#34;&gt;search-paths:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;          &lt;span class=&#34;attr&#34;&gt;basedir:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;target/config&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;spring.cloud.config.server.git.uri：配置git仓库地址&lt;/li&gt;
&lt;li&gt;spring.cloud.config.server.git.search-paths：仓库文件夹目录，如果是&lt;code&gt;/**&lt;/code&gt;，就是所有目录所有文件&lt;/li&gt;
&lt;li&gt;spring.cloud.config.server.git.default-label：配置仓库的分支&lt;/li&gt;
&lt;li&gt;spring.cloud.config.server.git.basedir：配置文件拉去到本地的目录位置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;启动测试&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先在git里面添加一个&lt;code&gt;application-dev.yml&lt;/code&gt;配置文件，内容如此下：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;test:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;我是配置中心配置信息&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;已经配置完成了，启动一波试试，看效果咋样，正常情况下是可以正常启动的，然后获取配置文件试试&lt;br&gt;访问地址：&lt;a href=&#34;http://localhost:8888/test/dev&#34;&gt;http://localhost:8888/test/dev&lt;/a&gt;&lt;br&gt;如果返回如下，就是成功了：&lt;/p&gt;
&lt;figure class=&#34;highlight json&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;&amp;quot;profiles&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;[&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;quot;dev&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;&amp;quot;label&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;literal&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;null&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;&amp;quot;64e7882a8f280641724e454a2db5a3da7b44d3d4&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;&amp;quot;state&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;literal&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;null&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;&amp;quot;propertySources&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;[&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;attr&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;&amp;quot;https://gitee.com/qianxunclub/spring-boot-config-repo/application-dev.yml&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;attr&#34;&gt;&amp;quot;source&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;attr&#34;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class=&#34;punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;&amp;quot;配置中心的配置信息&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;punctuation&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;http请求地址和资源文件映射如下:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;#x2F;{application}&amp;#x2F;{profile}[&amp;#x2F;{label}]&lt;/li&gt;
&lt;li&gt;&amp;#x2F;{application}-{profile}.yml&lt;/li&gt;
&lt;li&gt;&amp;#x2F;{label}&amp;#x2F;{application}-{profile}.yml&lt;/li&gt;
&lt;li&gt;&amp;#x2F;{application}-{profile}.properties&lt;/li&gt;
&lt;li&gt;&amp;#x2F;{label}&amp;#x2F;{application}-{profile}.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;配置中心客户端使用&#34;&gt;&lt;a href=&#34;#配置中心客户端使用&#34; class=&#34;headerlink&#34; title=&#34;配置中心客户端使用&#34;&gt;&lt;/a&gt;配置中心客户端使用&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;pom.xml添加依赖&lt;/strong&gt;  &lt;/p&gt;
&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;org.springframework.cloud&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;spring-cloud-starter-config&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependencyManagement&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;&amp;lt;!-- spring cloud --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;org.springframework.cloud&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;spring-cloud-dependencies&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;Edgware.SR3&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;type&lt;/span&gt;&amp;gt;&lt;/span&gt;pom&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;type&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;scope&lt;/span&gt;&amp;gt;&lt;/span&gt;import&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;scope&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependencyManagement&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;配置文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;创建&lt;code&gt;bootstrap.yml&lt;/code&gt;文件，切记，是&lt;code&gt;bootstrap.yml&lt;/code&gt;文件&lt;code&gt;bootstrap.yml&lt;/code&gt;文件，我就因为写到了&lt;code&gt;application.yml&lt;/code&gt;这个里面，各种出现问题啊，添加如下配置：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;cloud:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;config:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;name:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;application&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;profile:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;dev&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;label:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;master&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;uri:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;http://localhost:8888/&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;spring.cloud.config.label：指明远程仓库的分支&lt;/li&gt;
&lt;li&gt;spring.cloud.config.profile：指定不同环境配置文件，和git仓库的 &lt;code&gt;application-dev.yml&lt;/code&gt;对应  &lt;/li&gt;
&lt;li&gt;spring.cloud.config.name：配置名称，一般和git仓库的&lt;code&gt;application-dev.yml&lt;/code&gt;对应&lt;/li&gt;
&lt;li&gt;spring.cloud.config.uri：上面的配置中心服务地址&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;启动测试&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先添加一个获取配置信息的类:  &lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * &lt;span class=&#34;doctag&#34;&gt;@author&lt;/span&gt; chihiro.zhang&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Configuration&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@EnableAutoConfiguration&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;DemoConfiguration&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;meta&#34;&gt;@Value(&amp;quot;$&amp;#123;test&amp;#125;&amp;quot;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt;  String test;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;找个地方随便调用一下，输出这个test，就会打印上面git里面配置的信息了，爽不！&lt;/p&gt;
&lt;h1 id=&#34;说说中间遇到的坑&#34;&gt;&lt;a href=&#34;#说说中间遇到的坑&#34; class=&#34;headerlink&#34; title=&#34;说说中间遇到的坑&#34;&gt;&lt;/a&gt;说说中间遇到的坑&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;服务端git配置死活获取不了git仓库配置文件&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;cloud:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;attr&#34;&gt;config:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;attr&#34;&gt;server:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;attr&#34;&gt;git:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;attr&#34;&gt;uri:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;https://gitee.com/qianxunclub/spring-boot-config-repo&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;attr&#34;&gt;default-label:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;master&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;attr&#34;&gt;search-paths:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;attr&#34;&gt;basedir:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;target/config&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;当时这个&lt;code&gt;uri&lt;/code&gt;配置的是公司的git仓库，公司的git仓库访问是需要开代理才能有权限访问的，代理也开了，可是一直报错：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;Whitelabel Error Page&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;This application has no explicit mapping for /error, so you are seeing this as a fallback.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Wed Jun 06 11:10:56 CST 2018&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;There was an unexpected error (type=Not Found, status=404).&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Cannot clone or checkout repository: http://xxx.com:5080/framework/config-repo&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;很郁闷，不知道为啥，可是就在刚刚，就刚刚，写博客的时候，有测试了一下，通了。。。。日了狗了，不知道啥原因，等研究出来了再来补充。&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;客户端配置一定要配置在&lt;code&gt;bootstrap.yml&lt;/code&gt;里面&lt;br&gt;&lt;code&gt;uri&lt;/code&gt;默认会调用端口为&lt;code&gt;8888&lt;/code&gt;的地址&lt;code&gt;http://localhost:8888/&lt;/code&gt;&lt;br&gt;启动的时候，会加载&lt;code&gt;label&lt;/code&gt;和&lt;code&gt;uri&lt;/code&gt;,&lt;code&gt;profile&lt;/code&gt;配置，&lt;code&gt;profile&lt;/code&gt;可以在启动参数添加，&lt;code&gt;profile&lt;/code&gt;也可以加在&lt;code&gt;application.yml&lt;/code&gt;添加&lt;br&gt;&lt;code&gt;name&lt;/code&gt;也可以加在&lt;code&gt;application.yml&lt;/code&gt;添加&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;demo&#34;&gt;&lt;a href=&#34;#demo&#34; class=&#34;headerlink&#34; title=&#34;demo&#34;&gt;&lt;/a&gt;demo&lt;/h1&gt;&lt;p&gt;配置中心服务端：&lt;a href=&#34;https://gitee.com/qianxunclub/qianxunclub-springboot-config&#34;&gt;https://gitee.com/qianxunclub/qianxunclub-springboot-config&lt;/a&gt;&lt;br&gt;配置git仓库：&lt;a href=&#34;https://gitee.com/qianxunclub/qianxunclub-springboot-config&#34;&gt;https://gitee.com/qianxunclub/qianxunclub-springboot-config&lt;/a&gt;&lt;br&gt;配置客户端使用：&lt;a href=&#34;https://gitee.com/qianxunclub/qianxunclub-starter-demo&#34;&gt;https://gitee.com/qianxunclub/qianxunclub-starter-demo&lt;/a&gt;&lt;br&gt;客户端主要配置在：&lt;a href=&#34;https://gitee.com/qianxunclub/qianxunclub-starter-parent/tree/master/qianxunclub-starter-config&#34;&gt;https://gitee.com/qianxunclub/qianxunclub-starter-parent/tree/master/qianxunclub-starter-config&lt;/a&gt;&lt;/p&gt;
</content>
        <category term="Java" />
        <category term="分布式" />
        <category term="SpringCloud" />
        <updated>2018-06-06T02:09:55.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/exception/redis-qi-dong-bao-cuo-cluster-support-disabled/</id>
        <title>SpringBoot的redis启动报错：ERR This instance has cluster support disabled</title>
        <link rel="alternate" href="https://qianxunclub.com/exception/redis-qi-dong-bao-cuo-cluster-support-disabled/"/>
        <content type="html">&lt;h1 id=&#34;异常描述&#34;&gt;&lt;a href=&#34;#异常描述&#34; class=&#34;headerlink&#34; title=&#34;异常描述&#34;&gt;&lt;/a&gt;异常描述&lt;/h1&gt;&lt;p&gt;新建了一个项目，我自己的服务器安装了一个redis，安装的时候，基本上都是默认参数，然后SpringBoot配置如下：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;redis:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;cluster:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;nodes:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;qianxunclub.com:6666&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;p&gt;在项目启动的时候，报错：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &amp;#x27;redisTemplate&amp;#x27; defined in class path resource [com/qianxunclub/starter/redis/autoconfigure/RedisConfig.class]: Unsatisfied dependency expressed through method &amp;#x27;redisTemplate&amp;#x27; parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name &amp;#x27;redisConnectionFactory&amp;#x27; defined in class path resource [org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration$RedisConnectionConfiguration.class]: Invocation of init method failed; nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR This instance has cluster support disabled&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	... 33 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name &amp;#x27;redisConnectionFactory&amp;#x27; defined in class path resource [org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration$RedisConnectionConfiguration.class]: Invocation of init method failed; nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR This instance has cluster support disabled&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	... 47 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR This instance has cluster support disabled&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.Protocol.processError(Protocol.java:127)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.Protocol.process(Protocol.java:161)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.Protocol.read(Protocol.java:215)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.Connection.getRawObjectMultiBulkReply(Connection.java:285)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.Connection.getObjectMultiBulkReply(Connection.java:291)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.Jedis.clusterSlots(Jedis.java:3376)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.JedisClusterInfoCache.discoverClusterNodesAndSlots(JedisClusterInfoCache.java:54)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.JedisClusterConnectionHandler.initializeSlotsCache(JedisClusterConnectionHandler.java:39)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.JedisClusterConnectionHandler.&amp;lt;init&amp;gt;(JedisClusterConnectionHandler.java:17)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.JedisSlotBasedConnectionHandler.&amp;lt;init&amp;gt;(JedisSlotBasedConnectionHandler.java:20)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.JedisSlotBasedConnectionHandler.&amp;lt;init&amp;gt;(JedisSlotBasedConnectionHandler.java:15)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.BinaryJedisCluster.&amp;lt;init&amp;gt;(BinaryJedisCluster.java:41)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at redis.clients.jedis.JedisCluster.&amp;lt;init&amp;gt;(JedisCluster.java:83)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.createCluster(JedisConnectionFactory.java:306)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.createCluster(JedisConnectionFactory.java:280)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.afterPropertiesSet(JedisConnectionFactory.java:241)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	... 58 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Disconnected from the target VM, address: &amp;#x27;127.0.0.1:52157&amp;#x27;, transport: &amp;#x27;socket&amp;#x27;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Process finished with exit code 1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;异常分析&#34;&gt;&lt;a href=&#34;#异常分析&#34; class=&#34;headerlink&#34; title=&#34;异常分析&#34;&gt;&lt;/a&gt;异常分析&lt;/h1&gt;&lt;p&gt;从报错误的信息&lt;code&gt;ERR This instance has cluster support disabled&lt;/code&gt;很明显看得出来，是没有启动redis集群功能，可是我项目配置的集群的配置方式，要么修改代码为单机配置，要么修改redis为集群方式。&lt;/p&gt;
&lt;h1 id=&#34;解决办法&#34;&gt;&lt;a href=&#34;#解决办法&#34; class=&#34;headerlink&#34; title=&#34;解决办法&#34;&gt;&lt;/a&gt;解决办法&lt;/h1&gt;&lt;p&gt;1、可以修改配置为单机redis配置：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;redis:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;host:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;qianxunclub.com&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;port:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;6666&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;2、在安装redis的目录找到redis配置文件&lt;code&gt;redis.conf&lt;/code&gt;，里面会找到配置：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;# cluster-enabled yes&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;把注释去掉就可以了&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cluster-enabled yes&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</content>
        <category term="Exception" />
        <category term="Redis" />
        <category term="SpringBoot" />
        <updated>2018-05-28T06:27:23.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/java/spring-boot/zi-ding-yi-springboot-starter-parent-tongyi-kaifa-guifan-tigao-kaifa-xiaolv/</id>
        <title>自定义SpringBoot的starter-parent，制定开发规范，和提高开发效率</title>
        <link rel="alternate" href="https://qianxunclub.com/java/spring-boot/zi-ding-yi-springboot-starter-parent-tongyi-kaifa-guifan-tigao-kaifa-xiaolv/"/>
        <content type="html">&lt;h1 id=&#34;写在前面&#34;&gt;&lt;a href=&#34;#写在前面&#34; class=&#34;headerlink&#34; title=&#34;写在前面&#34;&gt;&lt;/a&gt;写在前面&lt;/h1&gt;&lt;p&gt;SpringBoot咱们开发一般&lt;code&gt;pom.xml&lt;/code&gt;是都集成&lt;code&gt;spring-boot-starter-parent&lt;/code&gt;的，这里为什么要自定义一个starter-parent呢，主要以下几个理由：  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;定义开发规范：自定义parent可以制定统一配置和依赖规范  &lt;/li&gt;
&lt;li&gt;提高开发效率 &lt;/li&gt;
&lt;li&gt;统一模块插件化管理：可以在parent实现需要的插件配置，如：redis、mysql、日志、参数校验等  &lt;/li&gt;
&lt;li&gt;项目版本升级和依赖包升级更加方便统一  &lt;/li&gt;
&lt;li&gt;日志收集等可以从切面获取各个项目数据和日志等&lt;/li&gt;
&lt;li&gt;项目持续集成部署交付方便处理&lt;/li&gt;
&lt;/ol&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt; 其实好处挺多的，谁用谁知道。&lt;/p&gt;
&lt;p&gt; 源码地址：&lt;a href=&#34;https://gitee.com/qianxunclub/qianxunclub-starter-parent&#34;&gt;https://gitee.com/qianxunclub/qianxunclub-starter-parent&lt;/a&gt;&lt;br&gt; 源码依赖公用包：&lt;a href=&#34;https://gitee.com/qianxunclub/framework-common&#34;&gt;https://gitee.com/qianxunclub/framework-common&lt;/a&gt;  &lt;/p&gt;
&lt;h1 id=&#34;一、准备&#34;&gt;&lt;a href=&#34;#一、准备&#34; class=&#34;headerlink&#34; title=&#34;一、准备&#34;&gt;&lt;/a&gt;一、准备&lt;/h1&gt;&lt;p&gt;&lt;em&gt;&lt;code&gt;qianxunclub-starter-parent&lt;/code&gt;里面已经开发好的几个插件，需要依据公司真实环境修改配置&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;源码地址：  &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;git clone https://gitee.com/qianxunclub/qianxunclub-starter-parent.git&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;因为&lt;code&gt;qianxunclub-starter-parent&lt;/code&gt;依赖了另一个&lt;code&gt;framework-common&lt;/code&gt;工具包，所以要下载该包源码并且编译：  &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;git clone https://gitee.com/qianxunclub/framework-common.git&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

 &lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd framework-common&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;mvn clean install&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;二、starter-parent插件功能列表&#34;&gt;&lt;a href=&#34;#二、starter-parent插件功能列表&#34; class=&#34;headerlink&#34; title=&#34;二、starter-parent插件功能列表&#34;&gt;&lt;/a&gt;二、starter-parent插件功能列表&lt;/h1&gt;&lt;p&gt;本starter已包含一下功能：  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://projectlombok.org/features/all&#34;&gt;lombok插件添加&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#qianxunclub-starter-logging&#34;&gt;日志输出：qianxunclub-starter-logging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#qianxunclub-starter-swagger&#34;&gt;swagger接口文档：qianxunclub-starter-swagger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#qianxunclub-starter-web&#34;&gt;跨域请求、http编码配置入参校验等：qianxunclub-starter-web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#qianxunclub-starter-mysql&#34;&gt;mysql以及MybatisPlus引用：qianxunclub-starter-mysql&lt;/a&gt;（如果不使用，禁止引入该包，否则项目启动出错）&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#qianxunclub-starter-redis&#34;&gt;redis支持：qianxunclub-starter-redis&lt;/a&gt;（如果不使用，禁止引入该包，否则项目启动出错）&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;三、开发配置&#34;&gt;&lt;a href=&#34;#三、开发配置&#34; class=&#34;headerlink&#34; title=&#34;三、开发配置&#34;&gt;&lt;/a&gt;三、开发配置&lt;/h1&gt;&lt;h2 id=&#34;pom-xml编辑&#34;&gt;&lt;a href=&#34;#pom-xml编辑&#34; class=&#34;headerlink&#34; title=&#34;pom.xml编辑&#34;&gt;&lt;/a&gt;pom.xml编辑&lt;/h2&gt;&lt;p&gt;POM需要依赖父级&lt;code&gt;qianxunclub-starter-parent&lt;/code&gt;：  &lt;/p&gt;
&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;parent&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-starter-parent&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;0.0.1-SNAPSHOT&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;parent&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;继承该依赖，无需再引用&lt;code&gt;spring-boot-starter-parent&lt;/code&gt;,本项目已经继承的&lt;code&gt;spring-boot-starter-parent&lt;/code&gt;版本为&lt;code&gt;1.5.9.RELEASE&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;项目目录结构&#34;&gt;&lt;a href=&#34;#项目目录结构&#34; class=&#34;headerlink&#34; title=&#34;项目目录结构&#34;&gt;&lt;/a&gt;项目目录结构&lt;/h2&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;qianxunclub-demo&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;├── pom.xml&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;├── qianxunclub-demo.iml&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;└── src&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ├── main&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    │   ├── java&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    │   │   └── com&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    │   │       └── qianxunclub&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    │   │           ├── Application.java&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    │   │           └── demo&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    │   │               └── web&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    │   └── resources&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    │       └── application.yml&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    └── test&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        └── java&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol&gt;
&lt;li&gt;com.qianxunclub：项目根包名，必须以该名称命名，并且SpringBoot启动类必须在该目录&lt;/li&gt;
&lt;li&gt;group：项目分组名称，通常依据项目在GIT分组名称命名&lt;/li&gt;
&lt;li&gt;demo：项目名称，通常依据GIT名称命名&lt;/li&gt;
&lt;li&gt;web：controller控制器，，必须以该名称命名&lt;/li&gt;
&lt;li&gt;resources：资源目录&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;application-yml基础配置信息&#34;&gt;&lt;a href=&#34;#application-yml基础配置信息&#34; class=&#34;headerlink&#34; title=&#34;application.yml基础配置信息&#34;&gt;&lt;/a&gt;application.yml基础配置信息&lt;/h2&gt;&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;app:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;group:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;group&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;name:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;demo&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;descriptions:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;项目描述&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;author:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;千寻啊千寻&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;email:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;960339491&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;@qq.com&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;profiles:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;include:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;web&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;swagger&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;logging&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;mysql&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol&gt;
&lt;li&gt;group：项目分组名称，和包结构中的分组名称必须一致  &lt;/li&gt;
&lt;li&gt;name：项目名称。和包结构中项目名称必须一致  &lt;/li&gt;
&lt;li&gt;descriptions：项目描述信息  &lt;/li&gt;
&lt;li&gt;author：项目负责人名称  &lt;/li&gt;
&lt;li&gt;email：项目负责人邮箱  &lt;/li&gt;
&lt;li&gt;spring.profiles.include：使用已经定义的starter功能,项目参考本文第三章&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;四、starter使用说明&#34;&gt;&lt;a href=&#34;#四、starter使用说明&#34; class=&#34;headerlink&#34; title=&#34;四、starter使用说明&#34;&gt;&lt;/a&gt;四、starter使用说明&lt;/h1&gt;&lt;h2 id=&#34;日志输出：qianxunclub-starter-logging&#34;&gt;&lt;a href=&#34;#日志输出：qianxunclub-starter-logging&#34; class=&#34;headerlink&#34; title=&#34;日志输出：qianxunclub-starter-logging&#34;&gt;&lt;/a&gt;日志输出：qianxunclub-starter-logging&lt;/h2&gt;&lt;p&gt;&lt;span id = &#34;qianxunclub-starter-logging&#34;&gt;　&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&#34;配置方式&#34;&gt;&lt;a href=&#34;#配置方式&#34; class=&#34;headerlink&#34; title=&#34;配置方式&#34;&gt;&lt;/a&gt;配置方式&lt;/h3&gt;&lt;h4 id=&#34;pom-xml引入包：&#34;&gt;&lt;a href=&#34;#pom-xml引入包：&#34; class=&#34;headerlink&#34; title=&#34;pom.xml引入包：&#34;&gt;&lt;/a&gt;pom.xml引入包：&lt;/h4&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;!-- 日志配置信息 --&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;groupId&amp;gt;com.qianxunclub&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;lt;artifactId&amp;gt;qianxunclub-starter-logging&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h4 id=&#34;application-yml配置&#34;&gt;&lt;a href=&#34;#application-yml配置&#34; class=&#34;headerlink&#34; title=&#34;application.yml配置&#34;&gt;&lt;/a&gt;application.yml配置&lt;/h4&gt;&lt;p&gt;profiles需要引入配置：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;profiles:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;include:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;logging&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;自定义配置：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;logging:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;level:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;com.qianxunclub:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;debug&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;以下为缺省配置：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;logging:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;level:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;org.springframework:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;info&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;com.qianxunclub:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;info&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;pattern:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;console:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;&amp;quot;%date&amp;#123;yyyy-MM-dd HH:mm:ss.SSS&amp;#125; [%thread] %highlight(%-5level) %cyan(%logger&amp;#123;64&amp;#125;)  - %msg%n&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;file:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;/logs/$&amp;#123;app.group:&amp;#125;/$&amp;#123;app.name:$&amp;#123;spring.application.name:application&amp;#125;&amp;#125;/$&amp;#123;spring.application.name:application&amp;#125;.log&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;**&lt;br&gt;日志默认存放目录：&amp;#x2F;logs&amp;#x2F;项目分组&amp;#x2F;项目名称&amp;#x2F;日志文件&lt;br&gt;如果没有项目分组：&amp;#x2F;logs&amp;#x2F;项目名称&amp;#x2F;日志文件&lt;br&gt;**&lt;/p&gt;
&lt;h3 id=&#34;使用方式&#34;&gt;&lt;a href=&#34;#使用方式&#34; class=&#34;headerlink&#34; title=&#34;使用方式&#34;&gt;&lt;/a&gt;使用方式&lt;/h3&gt;&lt;p&gt;只需要在类上面添加&lt;code&gt;@Slf4j&lt;/code&gt;注解，即可使用&lt;code&gt;log&lt;/code&gt;对象打印日志&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Slf4j&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@SpringBootApplication&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;Application&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(String[] args)&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		SpringApplication.run(Application.class, args);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		log.info(&lt;span class=&#34;string&#34;&gt;&amp;quot;日志信息&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;swagger接口文档：qianxunclub-starter-swagger&#34;&gt;&lt;a href=&#34;#swagger接口文档：qianxunclub-starter-swagger&#34; class=&#34;headerlink&#34; title=&#34;swagger接口文档：qianxunclub-starter-swagger&#34;&gt;&lt;/a&gt;swagger接口文档：qianxunclub-starter-swagger&lt;/h2&gt;&lt;p&gt;官网：&lt;a href=&#34;https://swagger.io/&#34;&gt;https://swagger.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id = &#34;qianxunclub-starter-swagger&#34;&gt;　&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&#34;配置方式-1&#34;&gt;&lt;a href=&#34;#配置方式-1&#34; class=&#34;headerlink&#34; title=&#34;配置方式&#34;&gt;&lt;/a&gt;配置方式&lt;/h3&gt;&lt;h4 id=&#34;pom-xml引入包：-1&#34;&gt;&lt;a href=&#34;#pom-xml引入包：-1&#34; class=&#34;headerlink&#34; title=&#34;pom.xml引入包：&#34;&gt;&lt;/a&gt;pom.xml引入包：&lt;/h4&gt;&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;&amp;lt;!-- 自动生成接口文档 --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-starter-swagger&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h4 id=&#34;application-yml配置-1&#34;&gt;&lt;a href=&#34;#application-yml配置-1&#34; class=&#34;headerlink&#34; title=&#34;application.yml配置&#34;&gt;&lt;/a&gt;application.yml配置&lt;/h4&gt;&lt;p&gt;swagger默认是不启用的，必须添加一下配置，才可以开启配置&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;app:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;swagger:&lt;/span&gt; &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;profiles:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;include:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;swagger&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h4 id=&#34;启动类添加-EnableSBCSwagger注解，开启接口&#34;&gt;&lt;a href=&#34;#启动类添加-EnableSBCSwagger注解，开启接口&#34; class=&#34;headerlink&#34; title=&#34;启动类添加@EnableSBCSwagger注解，开启接口&#34;&gt;&lt;/a&gt;启动类添加&lt;code&gt;@EnableSBCSwagger&lt;/code&gt;注解，开启接口&lt;/h4&gt;&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@EnableSBCSwagger&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@SpringBootApplication&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;Application&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(String[] args)&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		SpringApplication.run(Application.class, args);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;使用方式-1&#34;&gt;&lt;a href=&#34;#使用方式-1&#34; class=&#34;headerlink&#34; title=&#34;使用方式&#34;&gt;&lt;/a&gt;使用方式&lt;/h3&gt;&lt;p&gt;启动项目成功后,访问API接口地址，例如：&lt;a href=&#34;http://localhost:8080/swagger-ui.html%E3%80%82&#34;&gt;http://localhost:8080/swagger-ui.html。&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;mysql以及MybatisPlus引用：qianxunclub-starter-mysql&#34;&gt;&lt;a href=&#34;#mysql以及MybatisPlus引用：qianxunclub-starter-mysql&#34; class=&#34;headerlink&#34; title=&#34;mysql以及MybatisPlus引用：qianxunclub-starter-mysql&#34;&gt;&lt;/a&gt;mysql以及MybatisPlus引用：qianxunclub-starter-mysql&lt;/h2&gt;&lt;p&gt;&lt;span id = &#34;qianxunclub-starter-mysql&#34;&gt;　&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-4-1配置方式&#34;&gt;&lt;a href=&#34;#3-4-1配置方式&#34; class=&#34;headerlink&#34; title=&#34;3.4.1配置方式&#34;&gt;&lt;/a&gt;3.4.1配置方式&lt;/h3&gt;&lt;h4 id=&#34;pom-xml引入包：-2&#34;&gt;&lt;a href=&#34;#pom-xml引入包：-2&#34; class=&#34;headerlink&#34; title=&#34;pom.xml引入包：&#34;&gt;&lt;/a&gt;pom.xml引入包：&lt;/h4&gt;&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;&amp;lt;!-- MYSQL配置信息 --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-starter-mysql&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h4 id=&#34;application-yml配置-2&#34;&gt;&lt;a href=&#34;#application-yml配置-2&#34; class=&#34;headerlink&#34; title=&#34;application.yml配置&#34;&gt;&lt;/a&gt;application.yml配置&lt;/h4&gt;&lt;p&gt;引入mysql配置：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;profiles:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;include:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;mysql&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;添加数据源信息：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;app:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;group:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;group&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;name:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;oneway&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;description:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;demo&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;author:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;千寻啊千寻&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;email:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;960339491&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;@qq.com&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;datasource:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;host:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;xxx.xxx.xxx.xxx&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;username:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;root&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;password:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;xxx&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;druid:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;public-key:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;xxx&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;端口默认为：3306&lt;br&gt;数据库密码加密：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;java -cp druid-1.1.6.jar com.alibaba.druid.filter.config.ConfigTools your_password&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;使用方式-2&#34;&gt;&lt;a href=&#34;#使用方式-2&#34; class=&#34;headerlink&#34; title=&#34;使用方式&#34;&gt;&lt;/a&gt;使用方式&lt;/h3&gt;&lt;p&gt;以上配置完成后即可使用mysql以及MybatisPlus，该starter已封装部分常用数据库操作，方法如下：&lt;br&gt;MybatisPlus使用说明：&lt;a href=&#34;http://mp.baomidou.com/#/?id=%e7%ae%80%e4%bb%8b&#34;&gt;http://mp.baomidou.com/#/?id=%e7%ae%80%e4%bb%8b&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1、Entity规范&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;数据库对应的Entity需要继承&lt;code&gt;BaseEntity&lt;/code&gt;，如下：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Data&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@TableName(&amp;quot;t_app&amp;quot;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;AppEntity&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;BaseEntity&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;2、Param规范&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;Param为入参查询常用发放，Param需要继承&lt;code&gt;BaseParam&lt;/code&gt;,如下：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Data&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;AppParam&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;BaseParam&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;3、Mapper规范&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;需要添加&lt;code&gt;@Mapper&lt;/code&gt;注解，继承&lt;code&gt;BaseMapper&lt;/code&gt;，并且要指定Entity泛型，如下：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Mapper&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;AppMapper&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;BaseMapper&lt;/span&gt;&amp;lt;AppEntity&amp;gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;4、Dao规范&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;需要继承&lt;code&gt;BaseDao&lt;/code&gt;,并且指定泛型，如下：  &lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Component&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;AppDao&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;BaseDao&lt;/span&gt;&amp;lt;AppMapper,AppEntity,AppParam&amp;gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;5、mapper.xml规范&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;默认可以不添加mapper.xml，如果遇到特定的SQL，可在&lt;code&gt;resources&lt;/code&gt;资源目录添加mapper文件夹，并添加对应的XML即可&lt;/p&gt;
&lt;h2 id=&#34;redis支持：qianxunclub-starter-redis&#34;&gt;&lt;a href=&#34;#redis支持：qianxunclub-starter-redis&#34; class=&#34;headerlink&#34; title=&#34;redis支持：qianxunclub-starter-redis&#34;&gt;&lt;/a&gt;redis支持：qianxunclub-starter-redis&lt;/h2&gt;&lt;p&gt;&lt;span id = &#34;qianxunclub-starter-redis&#34;&gt;　&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&#34;配置方式-2&#34;&gt;&lt;a href=&#34;#配置方式-2&#34; class=&#34;headerlink&#34; title=&#34;配置方式&#34;&gt;&lt;/a&gt;配置方式&lt;/h3&gt;&lt;h4 id=&#34;pom-xml引入包：-3&#34;&gt;&lt;a href=&#34;#pom-xml引入包：-3&#34; class=&#34;headerlink&#34; title=&#34;pom.xml引入包：&#34;&gt;&lt;/a&gt;pom.xml引入包：&lt;/h4&gt;&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;&amp;lt;!-- MYSQL配置信息 --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-starter-redis&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h4 id=&#34;application-yml配置-3&#34;&gt;&lt;a href=&#34;#application-yml配置-3&#34; class=&#34;headerlink&#34; title=&#34;application.yml配置&#34;&gt;&lt;/a&gt;application.yml配置&lt;/h4&gt;&lt;p&gt;引入mysql配置：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;profiles:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;include:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;redis&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;添加redis配置信息：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;redis:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;host:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;120.25&lt;/span&gt;&lt;span class=&#34;number&#34;&gt;.173&lt;/span&gt;&lt;span class=&#34;number&#34;&gt;.32&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;password:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;123456&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;端口默认为：6379  &lt;/p&gt;
&lt;p&gt;下面为缺省配置：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;redis:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;database:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;host:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;localhost&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;port:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;6379&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;password:&lt;/span&gt; &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;pool:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;comment&#34;&gt;# 连接池最大连接数（使用负值表示没有限制）&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;max-active:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;comment&#34;&gt;# 连接池最大阻塞等待时间（使用负值表示没有限制）&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;max-wait:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;-1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;comment&#34;&gt;# 连接池中的最大空闲连接&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;max-idle:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;comment&#34;&gt;# 连接池中的最小空闲连接&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;min-idle:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;comment&#34;&gt;# 连接超时时间（毫秒）&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;timeout:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;使用方式-3&#34;&gt;&lt;a href=&#34;#使用方式-3&#34; class=&#34;headerlink&#34; title=&#34;使用方式&#34;&gt;&lt;/a&gt;使用方式&lt;/h3&gt;&lt;p&gt;在类中可直接注入&lt;code&gt;RedisTemplate&lt;/code&gt;或&lt;code&gt;StringRedisTemplate&lt;/code&gt;即可使用，例如：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Slf4j&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@RestController&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@RequestMapping(value = &amp;quot;/redis&amp;quot;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@AllArgsConstructor&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Api(description = &amp;quot;redis&amp;quot;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;RedisController&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt; RedisTemplate redisTemplate;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt; StringRedisTemplate stringRedisTemplate;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;meta&#34;&gt;@ApiOperation(&amp;quot;add&amp;quot;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;meta&#34;&gt;@ResponseBody&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;meta&#34;&gt;@RequestMapping(value=&amp;quot;add&amp;quot;,method = RequestMethod.GET)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;()&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		ValueOperations&amp;lt;String, String&amp;gt; operations=redisTemplate.opsForValue();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		operations.set(&lt;span class=&#34;string&#34;&gt;&amp;quot;ValueOperations&amp;quot;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;quot;1&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		log.info(operations.get(&lt;span class=&#34;string&#34;&gt;&amp;quot;ValueOperations&amp;quot;&lt;/span&gt;));&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		stringRedisTemplate.opsForValue().set(&lt;span class=&#34;string&#34;&gt;&amp;quot;aaa&amp;quot;&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;quot;111&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		log.info(stringRedisTemplate.opsForValue().get(&lt;span class=&#34;string&#34;&gt;&amp;quot;aaa&amp;quot;&lt;/span&gt;));&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;


&lt;h2 id=&#34;跨域请求、http编码配置入参校验等：qianxunclub-starter-web&#34;&gt;&lt;a href=&#34;#跨域请求、http编码配置入参校验等：qianxunclub-starter-web&#34; class=&#34;headerlink&#34; title=&#34;跨域请求、http编码配置入参校验等：qianxunclub-starter-web&#34;&gt;&lt;/a&gt;跨域请求、http编码配置入参校验等：qianxunclub-starter-web&lt;/h2&gt;&lt;p&gt;&lt;span id = &#34;qianxunclub-starter-web&#34;&gt;　&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&#34;配置方式-3&#34;&gt;&lt;a href=&#34;#配置方式-3&#34; class=&#34;headerlink&#34; title=&#34;配置方式&#34;&gt;&lt;/a&gt;配置方式&lt;/h3&gt;&lt;h4 id=&#34;pom-xml引入包：-4&#34;&gt;&lt;a href=&#34;#pom-xml引入包：-4&#34; class=&#34;headerlink&#34; title=&#34;pom.xml引入包：&#34;&gt;&lt;/a&gt;pom.xml引入包：&lt;/h4&gt;&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;&amp;lt;!-- 支持跨域请求 --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-starter-web&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h4 id=&#34;application-yml配置-4&#34;&gt;&lt;a href=&#34;#application-yml配置-4&#34; class=&#34;headerlink&#34; title=&#34;application.yml配置&#34;&gt;&lt;/a&gt;application.yml配置&lt;/h4&gt;&lt;p&gt;profiles需要引入配置：&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;profiles:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;include:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;web&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;五、配置最终效果如下&#34;&gt;&lt;a href=&#34;#五、配置最终效果如下&#34; class=&#34;headerlink&#34; title=&#34;五、配置最终效果如下&#34;&gt;&lt;/a&gt;五、配置最终效果如下&lt;/h1&gt;&lt;p&gt;pom.xml：&lt;/p&gt;
&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;modelVersion&lt;/span&gt;&amp;gt;&lt;/span&gt;4.0.0&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;modelVersion&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-demo&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;parent&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-starter-parent&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;0.0.1-SNAPSHOT&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;parent&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;&amp;lt;!-- 自动生成接口文档 --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-starter-swagger&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;&amp;lt;!-- web配置信息 --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-starter-web&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;&amp;lt;!-- 日志配置信息 --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-starter-logging&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;&amp;lt;!-- MYSQL配置信息 --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.qianxunclub&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;qianxunclub-starter-mysql&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;application.yml:&lt;/p&gt;
&lt;figure class=&#34;highlight yml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;app:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;group:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;group&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;name:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;demo&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;description:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;demo服务&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;author:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;千寻啊千寻&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;email:&lt;/span&gt; &lt;span class=&#34;number&#34;&gt;960339491&lt;/span&gt;&lt;span class=&#34;string&#34;&gt;@qq.com&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;swagger:&lt;/span&gt; &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;datasource:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;host:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;xxx.xxx.xxx.xxx&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;username:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;root&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;password:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;xxx&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;druid:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;attr&#34;&gt;public-key:&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;xxx&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;attr&#34;&gt;spring:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;profiles:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;attr&#34;&gt;include:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;web&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;swagger&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;logging&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;bullet&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;mysql&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;


&lt;p&gt;完！&lt;/p&gt;
</content>
        <category term="SpringBoot" />
        <category term="Java" />
        <updated>2018-05-25T02:40:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/exception/spring-boot-tomcat-qi-dong-shi-bai/</id>
        <title>SpringBoot启动Tomcat失败：Unable to start embedded Tomcat</title>
        <link rel="alternate" href="https://qianxunclub.com/exception/spring-boot-tomcat-qi-dong-shi-bai/"/>
        <content type="html">&lt;h1 id=&#34;异常描述&#34;&gt;&lt;a href=&#34;#异常描述&#34; class=&#34;headerlink&#34; title=&#34;异常描述&#34;&gt;&lt;/a&gt;异常描述&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;之前项目是dubbo的，分为两个服务，service数据层和web请求控制，使用dubbo互相调用的，现在要把dubbo去掉，使用SpringCloud的eureka了，要把两个合并成一个项目，这里并不是要把所有代码复制过去，而是把service使用maven引用到web项目里面，然后修改对应的配置和包路劲，启动的时候，竟然报错了，编译是没有任何问题的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;120&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;121&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;122&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;123&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;124&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;125&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;126&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;127&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;128&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;129&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;130&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;131&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;10:02:26.349 logback [main] INFO  o.a.catalina.core.StandardEngine - Starting Servlet Engine: Apache Tomcat/8.5.23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10:02:26.463 logback [Tomcat-startStop-1] ERROR o.apache.catalina.core.ContainerBase - A child container failed during start&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.util.concurrent.FutureTask.report(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.util.concurrent.FutureTask.get(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.util.concurrent.FutureTask.run(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.lang.Thread.run(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ... 6 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.apache.catalina.LifecycleException: Failed to start component [Pipeline[StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5117)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ... 6 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.authenticator.NonLoginAuthenticator[]]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:182)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ... 8 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1141)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ... 10 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10:02:26.464 logback [main] ERROR o.apache.catalina.core.ContainerBase - A child container failed during start&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost]]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.util.concurrent.FutureTask.report(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.util.concurrent.FutureTask.get(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.startup.Tomcat.start(Tomcat.java:367)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:99)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.&amp;lt;init&amp;gt;(TomcatEmbeddedServletContainer.java:84)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:554)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:179)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at com.gwghk.base.platform.dfs.Application.main(Application.java:22)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.lang.reflect.Method.invoke(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost]]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.util.concurrent.FutureTask.run(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.lang.Thread.run(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.apache.catalina.LifecycleException: A child container failed during start&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:948)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ... 6 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10:02:26.465 logback [main] WARN  o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start embedded conta&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;iner; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10:02:26.485 logback [main] INFO  o.s.b.a.l.AutoConfigurationReportLoggingInitializer -&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Error starting ApplicationContext. To display the auto-configuration report re-run your application with &amp;#x27;debug&amp;#x27; enabled.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10:02:26.492 logback [main] ERROR o.s.boot.SpringApplication - Application startup failed&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at com.gwghk.base.platform.dfs.Application.main(Application.java:22)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at java.lang.reflect.Method.invoke(Unknown Source)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:123)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.&amp;lt;init&amp;gt;(TomcatEmbeddedServletContainer.java:84)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:554)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:179)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ... 16 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardServer[-1]]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.startup.Tomcat.start(Tomcat.java:367)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:99)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ... 21 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Tomcat]]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ... 23 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat]]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ... 25 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Caused by: org.apache.catalina.LifecycleException: A child container failed during start&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:948)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ... 27 common frames omitted&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;异常分析&#34;&gt;&lt;a href=&#34;#异常分析&#34; class=&#34;headerlink&#34; title=&#34;异常分析&#34;&gt;&lt;/a&gt;异常分析&lt;/h1&gt;&lt;p&gt;刚开始有点蒙蔽，之前项目一直可以运行，怎么就报错了呢，日了狗了，于是乎各种百度谷歌的，一顿查，基本上两个答案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;servlet-api-xxx.jar包冲突&lt;/li&gt;
&lt;li&gt;servlet-api-xxx.jar版本问题&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;各种修改了以后，根本解决不了，看来只能靠自己了，有开始检查pom.xml，目前只能从pom.xml入手了检查了:&lt;/p&gt;
&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;&amp;lt;?xml version=&lt;span class=&#34;string&#34;&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; encoding=&lt;span class=&#34;string&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;project&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;xmlns&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;xmlns:xsi&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;  &lt;span class=&#34;attr&#34;&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;parent&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;dfs-parent&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.gwghk.base.platform&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;relativePath&lt;/span&gt;&amp;gt;&lt;/span&gt;../parent/pom.xml&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;relativePath&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;parent&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;modelVersion&lt;/span&gt;&amp;gt;&lt;/span&gt;4.0.0&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;modelVersion&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;dfs-api&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;$&amp;#123;spring.boot.version&amp;#125;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ......&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;build&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;plugins&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;plugin&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;maven-compiler-plugin&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;plugin&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;plugin&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;spring-boot-maven-plugin&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;plugin&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;plugins&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;resources&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;resource&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;directory&lt;/span&gt;&amp;gt;&lt;/span&gt;src/main/resources/&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;directory&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;filtering&lt;/span&gt;&amp;gt;&lt;/span&gt;true&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;filtering&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;includes&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;          &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;include&lt;/span&gt;&amp;gt;&lt;/span&gt;**/*.*&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;include&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;includes&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;resource&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;resources&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;build&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;project&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;我家pom是这样的，发现缺少两个属性配置的,没有&lt;code&gt;&amp;lt;groupId&amp;gt;xxx&amp;lt;/groupId&amp;gt;&lt;/code&gt;和&lt;code&gt;&amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;&lt;/code&gt;。&lt;br&gt;其实之前都看到这个问题了，因为这项目是我修改别人的代码，就没在乎这个，以为没关系，然后我就加上试试看，是不是这个问题：&lt;/p&gt;
&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;dfs-api&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.gwghk.base.platform&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;packaging&lt;/span&gt;&amp;gt;&lt;/span&gt;jar&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;packaging&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;再重新编译一次启动试试看，卧槽，竟然成功了，就这个破问题，解决了一天！！！&lt;/p&gt;
&lt;h1 id=&#34;解决办法&#34;&gt;&lt;a href=&#34;#解决办法&#34; class=&#34;headerlink&#34; title=&#34;解决办法&#34;&gt;&lt;/a&gt;解决办法&lt;/h1&gt;&lt;p&gt;问题就出现在pom配置不严谨，该有的还是要有的，不要瞎JB省略。&lt;br&gt;在pom中添加&lt;code&gt;&amp;lt;groupId&amp;gt;xxx&amp;lt;/groupId&amp;gt;&lt;/code&gt;和&lt;code&gt;&amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;&lt;/code&gt;就可以正常启动了：&lt;/p&gt;
&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;dfs-api&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;com.gwghk.base.platform&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;packaging&lt;/span&gt;&amp;gt;&lt;/span&gt;jar&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;packaging&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</content>
        <category term="Exception" />
        <category term="SpringBoot" />
        <updated>2018-05-22T02:40:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/java/maven/apidocde-mavencha-jian-zi-dong-sheng-cheng-apidoc-json/</id>
        <title>apidoc的maven插件，自动生成apidoc.json</title>
        <link rel="alternate" href="https://qianxunclub.com/java/maven/apidocde-mavencha-jian-zi-dong-sheng-cheng-apidoc-json/"/>
        <content type="html">&lt;p&gt;插件是用apidoc插件生成文档的，具体使用方式可查看官网：&lt;a href=&#34;http://apidocjs.com/&#34;&gt;http://apidocjs.com/&lt;/a&gt;&lt;br&gt;该插件不会直接生成APIDOC文档，只会自动生成apidoc.json文件，需要执行&lt;code&gt;apidoc&lt;/code&gt;命令才可以生成&lt;br&gt;apidoc.json文件会生成在项目根目录apidoc文件夹下&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h1 id=&#34;下载依赖包&#34;&gt;&lt;a href=&#34;#下载依赖包&#34; class=&#34;headerlink&#34; title=&#34;下载依赖包&#34;&gt;&lt;/a&gt;下载依赖包&lt;/h1&gt;&lt;p&gt;可配置MAVEN仓库&lt;code&gt;https://oss.sonatype.org/content/groups/public&lt;/code&gt;&lt;br&gt;或者&lt;br&gt;下载源码包进行编译打包:&lt;a href=&#34;https://gitee.com/qianxunclub/qianxunclub-maven-plugin&#34;&gt;https://gitee.com/qianxunclub/qianxunclub-maven-plugin&lt;/a&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;git clone https://gitee.com/qianxunclub/qianxunclub-maven-plugin.git&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;cd qianxunclub-maven-plugin&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;mvn clean install&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;


&lt;h1 id=&#34;编辑pom-xml，引入maven-plugin&#34;&gt;&lt;a href=&#34;#编辑pom-xml，引入maven-plugin&#34; class=&#34;headerlink&#34; title=&#34;编辑pom.xml，引入maven plugin&#34;&gt;&lt;/a&gt;编辑pom.xml，引入maven plugin&lt;/h1&gt;&lt;p&gt;在项目的pom文件中引入以下：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;groupId&amp;gt;com.qianxunclub&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;artifactId&amp;gt;qianxunclub-plugin-apidoc&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;executions&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		&amp;lt;execution&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&amp;lt;goals&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;				&amp;lt;goal&amp;gt;apidoc&amp;lt;/goal&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&amp;lt;/goals&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		&amp;lt;/execution&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;/executions&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;在&lt;code&gt;properties&lt;/code&gt;定义API的生成规范：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;apidoc.skip&amp;gt;false/&amp;lt;/apidoc.skip&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;apidoc.gen&amp;gt;false&amp;lt;/apidoc.gen&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;apidoc.url&amp;gt;http://ip:port/&amp;lt;/apidoc.url&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;lt;apidoc.sampleUrl&amp;gt;http://ip:port/&amp;lt;/apidoc.sampleUrl&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;apidoc.skip：编译代码是否跳过生成apidoc.json&lt;br&gt;apidoc.gen：是否覆盖更新apidoc.json&lt;br&gt;apidoc.url：实例接口前缀&lt;br&gt;apidoc.sampleUrl：生成测试方法的请求地址  &lt;/p&gt;
&lt;h1 id=&#34;开始生成&#34;&gt;&lt;a href=&#34;#开始生成&#34; class=&#34;headerlink&#34; title=&#34;开始生成&#34;&gt;&lt;/a&gt;开始生成&lt;/h1&gt;&lt;p&gt;执行命令：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;mvn clean package&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;可以添加以下参数：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;mvn clean package -Dapidoc.skip=true&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;-Dapidoc.skip&amp;#x3D;true：编译代码是否跳过生成apidoc.json&lt;br&gt;-Dapidoc.gen&amp;#x3D;true：是否覆盖更新apidoc.json&lt;br&gt;-Dapidoc.url&amp;#x3D;xxx：实例接口前缀&lt;br&gt;-Dapidoc.sampleUrl&amp;#x3D;xxx：生成测试方法的请求地址  &lt;/p&gt;
&lt;p&gt;如果出现以下字样，说明生成完成：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;apidoc.json完成&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;生成api文档&#34;&gt;&lt;a href=&#34;#生成api文档&#34; class=&#34;headerlink&#34; title=&#34;生成api文档&#34;&gt;&lt;/a&gt;生成api文档&lt;/h1&gt;&lt;p&gt;在项目跟目录执行：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;apidoc -i apidoc/ -o API文档存放目录/&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;打开API文档存放目录中的&lt;code&gt;index.html&lt;/code&gt;即可查看文档。&lt;/p&gt;
</content>
        <category term="Java" />
        <category term="Maven" />
        <updated>2018-05-15T18:41:37.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/video/zhe-ge-shi-jie-zong-you-ren-tou-tou-ai-zhao-ni/</id>
        <title>这个世界，总有人偷偷爱着你</title>
        <link rel="alternate" href="https://qianxunclub.com/video/zhe-ge-shi-jie-zong-you-ren-tou-tou-ai-zhao-ni/"/>
        <content type="html">&lt;p&gt;这是999感冒灵推出的感恩节短片视频&lt;br&gt;广告片选取真人事件改编&lt;br&gt;以一段网络问答为线&lt;br&gt;串联5个反转故事  &lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;iframe frameborder=&#34;0&#34; width=&#34;800&#34; height=&#34;450&#34; src=&#34;https://v.qq.com/iframe/player.html?vid=g0508voeofz&amp;tiny=0&amp;auto=0&#34; allowfullscreen&gt;&lt;/iframe&gt;  

&lt;p&gt;这是999感冒灵推出的感恩节短片视频&lt;br&gt;广告片选取真人事件改编&lt;br&gt;以一段网络问答为线&lt;br&gt;串联5个反转故事&lt;br&gt;反转前的文案非常直接无情地揭开了生活冷漠的一面&lt;br&gt;每个人都自顾不暇&lt;br&gt;没有人会在意你的感受&lt;br&gt;每个人都小心翼翼地活着&lt;br&gt;没有人在乎你的境遇&lt;br&gt;行色匆匆的人群里&lt;br&gt;你并不特别也不会有优待&lt;br&gt;你的苦楚&lt;br&gt;不过是别人眼里的笑话&lt;br&gt;人心冷漠的世界里&lt;br&gt;每个人都无处可逃&lt;br&gt;即使已经听惯了毒鸡汤&lt;br&gt;还是被这些话呕出一口血&lt;br&gt;大概是因为事实如此无法反驳吧&lt;br&gt;可是&lt;br&gt;这个世界不会好了吗？&lt;br&gt;故事总是有反转的&lt;/p&gt;
</content>
        <category term="视频" />
        <category term="公益广告" />
        <updated>2018-05-07T17:44:27.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/tech/httqing-qiu-fan-hui-bian-ma-da-quan-yi-ji-jie-shi-fen-lei/</id>
        <title>HTTP请求返回编码大全以及解释分类</title>
        <link rel="alternate" href="https://qianxunclub.com/tech/httqing-qiu-fan-hui-bian-ma-da-quan-yi-ji-jie-shi-fen-lei/"/>
        <content type="html">&lt;blockquote&gt;
&lt;p&gt;原文地址：&lt;a href=&#34;https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html&#34;&gt;https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;Status-Code-Definitions&#34;&gt;&lt;a href=&#34;#Status-Code-Definitions&#34; class=&#34;headerlink&#34; title=&#34;Status Code Definitions&#34;&gt;&lt;/a&gt;Status Code Definitions&lt;/h1&gt;&lt;p&gt;Each Status-Code is described below, including a description of which method(s) it can follow and any metainformation required in the response.&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h1 id=&#34;Informational-1xx&#34;&gt;&lt;a href=&#34;#Informational-1xx&#34; class=&#34;headerlink&#34; title=&#34;Informational 1xx&#34;&gt;&lt;/a&gt;Informational 1xx&lt;/h1&gt;&lt;p&gt;This class of status code indicates a provisional response, consisting only of the Status-Line and optional headers, and is terminated by an empty line. There are no required headers for this class of status code. Since HTTP&amp;#x2F;1.0 did not define any 1xx status codes, servers MUST NOT send a 1xx response to an HTTP&amp;#x2F;1.0 client except under experimental conditions.&lt;/p&gt;
&lt;p&gt;A client MUST be prepared to accept one or more 1xx status responses prior to a regular response, even if the client does not expect a 100 (Continue) status message. Unexpected 1xx status responses MAY be ignored by a user agent.&lt;/p&gt;
&lt;p&gt;Proxies MUST forward 1xx responses, unless the connection between the proxy and its client has been closed, or unless the proxy itself requested the generation of the 1xx response. (For example, if a&lt;/p&gt;
&lt;p&gt;proxy adds a “Expect: 100-continue” field when it forwards a request, then it need not forward the corresponding 100 (Continue) response(s).)&lt;/p&gt;
&lt;h2 id=&#34;100-Continue&#34;&gt;&lt;a href=&#34;#100-Continue&#34; class=&#34;headerlink&#34; title=&#34;100 Continue&#34;&gt;&lt;/a&gt;100 Continue&lt;/h2&gt;&lt;p&gt;The client SHOULD continue with its request. This interim response is used to inform the client that the initial part of the request has been received and has not yet been rejected by the server. The client SHOULD continue by sending the remainder of the request or, if the request has already been completed, ignore this response. The server MUST send a final response after the request has been completed. See section 8.2.3 for detailed discussion of the use and handling of this status code.&lt;/p&gt;
&lt;h2 id=&#34;101-Switching-Protocols&#34;&gt;&lt;a href=&#34;#101-Switching-Protocols&#34; class=&#34;headerlink&#34; title=&#34;101 Switching Protocols&#34;&gt;&lt;/a&gt;101 Switching Protocols&lt;/h2&gt;&lt;p&gt;The server understands and is willing to comply with the client’s request, via the Upgrade message header field (section 14.42), for a change in the application protocol being used on this connection. The server will switch protocols to those defined by the response’s Upgrade header field immediately after the empty line which terminates the 101 response.&lt;/p&gt;
&lt;p&gt;The protocol SHOULD be switched only when it is advantageous to do so. For example, switching to a newer version of HTTP is advantageous over older versions, and switching to a real-time, synchronous protocol might be advantageous when delivering resources that use such features.&lt;/p&gt;
&lt;h1 id=&#34;Successful-2xx&#34;&gt;&lt;a href=&#34;#Successful-2xx&#34; class=&#34;headerlink&#34; title=&#34;Successful 2xx&#34;&gt;&lt;/a&gt;Successful 2xx&lt;/h1&gt;&lt;p&gt;This class of status code indicates that the client’s request was successfully received, understood, and accepted.&lt;/p&gt;
&lt;h2 id=&#34;200-OK&#34;&gt;&lt;a href=&#34;#200-OK&#34; class=&#34;headerlink&#34; title=&#34;200 OK&#34;&gt;&lt;/a&gt;200 OK&lt;/h2&gt;&lt;p&gt;The request has succeeded. The information returned with the response is dependent on the method used in the request, for example:&lt;/p&gt;
&lt;p&gt;GET an entity corresponding to the requested resource is sent in the response;&lt;/p&gt;
&lt;p&gt;HEAD the entity-header fields corresponding to the requested resource are sent in the response without any message-body;&lt;/p&gt;
&lt;p&gt;POST an entity describing or containing the result of the action;&lt;/p&gt;
&lt;p&gt;TRACE an entity containing the request message as received by the end server.&lt;/p&gt;
&lt;h2 id=&#34;201-Created&#34;&gt;&lt;a href=&#34;#201-Created&#34; class=&#34;headerlink&#34; title=&#34;201 Created&#34;&gt;&lt;/a&gt;201 Created&lt;/h2&gt;&lt;p&gt;The request has been fulfilled and resulted in a new resource being created. The newly created resource can be referenced by the URI(s) returned in the entity of the response, with the most specific URI for the resource given by a Location header field. The response SHOULD include an entity containing a list of resource characteristics and location(s) from which the user or user agent can choose the one most appropriate. The entity format is specified by the media type given in the Content-Type header field. The origin server MUST create the resource before returning the 201 status code. If the action cannot be carried out immediately, the server SHOULD respond with 202 (Accepted) response instead.&lt;/p&gt;
&lt;p&gt;A 201 response MAY contain an ETag response header field indicating the current value of the entity tag for the requested variant just created, see section 14.19.&lt;/p&gt;
&lt;h2 id=&#34;202-Accepted&#34;&gt;&lt;a href=&#34;#202-Accepted&#34; class=&#34;headerlink&#34; title=&#34;202 Accepted&#34;&gt;&lt;/a&gt;202 Accepted&lt;/h2&gt;&lt;p&gt;The request has been accepted for processing, but the processing has not been completed. The request might or might not eventually be acted upon, as it might be disallowed when processing actually takes place. There is no facility for re-sending a status code from an asynchronous operation such as this.&lt;/p&gt;
&lt;p&gt;The 202 response is intentionally non-committal. Its purpose is to allow a server to accept a request for some other process (perhaps a batch-oriented process that is only run once per day) without requiring that the user agent’s connection to the server persist until the process is completed. The entity returned with this response SHOULD include an indication of the request’s current status and either a pointer to a status monitor or some estimate of when the user can expect the request to be fulfilled.&lt;/p&gt;
&lt;h2 id=&#34;203-Non-Authoritative-Information&#34;&gt;&lt;a href=&#34;#203-Non-Authoritative-Information&#34; class=&#34;headerlink&#34; title=&#34;203 Non-Authoritative Information&#34;&gt;&lt;/a&gt;203 Non-Authoritative Information&lt;/h2&gt;&lt;p&gt;The returned metainformation in the entity-header is not the definitive set as available from the origin server, but is gathered from a local or a third-party copy. The set presented MAY be a subset or superset of the original version. For example, including local annotation information about the resource might result in a superset of the metainformation known by the origin server. Use of this response code is not required and is only appropriate when the response would otherwise be 200 (OK).&lt;/p&gt;
&lt;h2 id=&#34;204-No-Content&#34;&gt;&lt;a href=&#34;#204-No-Content&#34; class=&#34;headerlink&#34; title=&#34;204 No Content&#34;&gt;&lt;/a&gt;204 No Content&lt;/h2&gt;&lt;p&gt;The server has fulfilled the request but does not need to return an entity-body, and might want to return updated metainformation. The response MAY include new or updated metainformation in the form of entity-headers, which if present SHOULD be associated with the requested variant.&lt;/p&gt;
&lt;p&gt;If the client is a user agent, it SHOULD NOT change its document view from that which caused the request to be sent. This response is primarily intended to allow input for actions to take place without causing a change to the user agent’s active document view, although any new or updated metainformation SHOULD be applied to the document currently in the user agent’s active view.&lt;/p&gt;
&lt;p&gt;The 204 response MUST NOT include a message-body, and thus is always terminated by the first empty line after the header fields.&lt;/p&gt;
&lt;h2 id=&#34;205-Reset-Content&#34;&gt;&lt;a href=&#34;#205-Reset-Content&#34; class=&#34;headerlink&#34; title=&#34;205 Reset Content&#34;&gt;&lt;/a&gt;205 Reset Content&lt;/h2&gt;&lt;p&gt;The server has fulfilled the request and the user agent SHOULD reset the document view which caused the request to be sent. This response is primarily intended to allow input for actions to take place via user input, followed by a clearing of the form in which the input is given so that the user can easily initiate another input action. The response MUST NOT include an entity.&lt;/p&gt;
&lt;h2 id=&#34;206-Partial-Content&#34;&gt;&lt;a href=&#34;#206-Partial-Content&#34; class=&#34;headerlink&#34; title=&#34;206 Partial Content&#34;&gt;&lt;/a&gt;206 Partial Content&lt;/h2&gt;&lt;p&gt;The server has fulfilled the partial GET request for the resource. The request MUST have included a Range header field (section 14.35) indicating the desired range, and MAY have included an If-Range header field (section 14.27) to make the request conditional.&lt;/p&gt;
&lt;p&gt;The response MUST include the following header fields:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  - Either a Content-Range header field (section 14.16) indicating
    the range included with this response, or a multipart/byteranges
    Content-Type including Content-Range fields for each part. If a
    Content-Length header field is present in the response, its
    value MUST match the actual number of OCTETs transmitted in the
    message-body.
  - Date
  - ETag and/or Content-Location, if the header would have been sent
    in a 200 response to the same request
  - Expires, Cache-Control, and/or Vary, if the field-value might
    differ from that sent in any previous response for the same
    variant
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the 206 response is the result of an If-Range request that used a strong cache validator (see section 13.3.3), the response SHOULD NOT include other entity-headers. If the response is the result of an If-Range request that used a weak validator, the response MUST NOT include other entity-headers; this prevents inconsistencies between cached entity-bodies and updated headers. Otherwise, the response MUST include all of the entity-headers that would have been returned with a 200 (OK) response to the same request.&lt;/p&gt;
&lt;p&gt;A cache MUST NOT combine a 206 response with other previously cached content if the ETag or Last-Modified headers do not match exactly, see 13.5.4.&lt;/p&gt;
&lt;p&gt;A cache that does not support the Range and Content-Range headers MUST NOT cache 206 (Partial) responses.&lt;/p&gt;
&lt;h1 id=&#34;Redirection-3xx&#34;&gt;&lt;a href=&#34;#Redirection-3xx&#34; class=&#34;headerlink&#34; title=&#34;Redirection 3xx&#34;&gt;&lt;/a&gt;Redirection 3xx&lt;/h1&gt;&lt;p&gt;This class of status code indicates that further action needs to be taken by the user agent in order to fulfill the request. The action required MAY be carried out by the user agent without interaction with the user if and only if the method used in the second request is GET or HEAD. A client SHOULD detect infinite redirection loops, since such loops generate network traffic for each redirection.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  Note: previous versions of this specification recommended a
  maximum of five redirections. Content developers should be aware
  that there might be clients that implement such a fixed
  limitation.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;300-Multiple-Choices&#34;&gt;&lt;a href=&#34;#300-Multiple-Choices&#34; class=&#34;headerlink&#34; title=&#34;300 Multiple Choices&#34;&gt;&lt;/a&gt;300 Multiple Choices&lt;/h2&gt;&lt;p&gt;The requested resource corresponds to any one of a set of representations, each with its own specific location, and agent- driven negotiation information (section 12) is being provided so that the user (or user agent) can select a preferred representation and redirect its request to that location.&lt;/p&gt;
&lt;p&gt;Unless it was a HEAD request, the response SHOULD include an entity containing a list of resource characteristics and location(s) from which the user or user agent can choose the one most appropriate. The entity format is specified by the media type given in the Content- Type header field. Depending upon the format and the capabilities of&lt;/p&gt;
&lt;p&gt;the user agent, selection of the most appropriate choice MAY be performed automatically. However, this specification does not define any standard for such automatic selection.&lt;/p&gt;
&lt;p&gt;If the server has a preferred choice of representation, it SHOULD include the specific URI for that representation in the Location field; user agents MAY use the Location field value for automatic redirection. This response is cacheable unless indicated otherwise.&lt;/p&gt;
&lt;h2 id=&#34;301-Moved-Permanently&#34;&gt;&lt;a href=&#34;#301-Moved-Permanently&#34; class=&#34;headerlink&#34; title=&#34;301 Moved Permanently&#34;&gt;&lt;/a&gt;301 Moved Permanently&lt;/h2&gt;&lt;p&gt;The requested resource has been assigned a new permanent URI and any future references to this resource SHOULD use one of the returned URIs. Clients with link editing capabilities ought to automatically re-link references to the Request-URI to one or more of the new references returned by the server, where possible. This response is cacheable unless indicated otherwise.&lt;/p&gt;
&lt;p&gt;The new permanent URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s).&lt;/p&gt;
&lt;p&gt;If the 301 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  Note: When automatically redirecting a POST request after
  receiving a 301 status code, some existing HTTP/1.0 user agents
  will erroneously change it into a GET request.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;302-Found&#34;&gt;&lt;a href=&#34;#302-Found&#34; class=&#34;headerlink&#34; title=&#34;302 Found&#34;&gt;&lt;/a&gt;302 Found&lt;/h2&gt;&lt;p&gt;The requested resource resides temporarily under a different URI. Since the redirection might be altered on occasion, the client SHOULD continue to use the Request-URI for future requests. This response is only cacheable if indicated by a Cache-Control or Expires header field.&lt;/p&gt;
&lt;p&gt;The temporary URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s).&lt;/p&gt;
&lt;p&gt;If the 302 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it were a 303
  response, performing a GET on the Location field-value regardless
  of the original request method. The status codes 303 and 307 have
  been added for servers that wish to make unambiguously clear which
  kind of reaction is expected of the client.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;303-See-Other&#34;&gt;&lt;a href=&#34;#303-See-Other&#34; class=&#34;headerlink&#34; title=&#34;303 See Other&#34;&gt;&lt;/a&gt;303 See Other&lt;/h2&gt;&lt;p&gt;The response to the request can be found under a different URI and SHOULD be retrieved using a GET method on that resource. This method exists primarily to allow the output of a POST-activated script to redirect the user agent to a selected resource. The new URI is not a substitute reference for the originally requested resource. The 303 response MUST NOT be cached, but the response to the second (redirected) request might be cacheable.&lt;/p&gt;
&lt;p&gt;The different URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  Note: Many pre-HTTP/1.1 user agents do not understand the 303
  status. When interoperability with such clients is a concern, the
  302 status code may be used instead, since most user agents react
  to a 302 response as described here for 303.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;304-Not-Modified&#34;&gt;&lt;a href=&#34;#304-Not-Modified&#34; class=&#34;headerlink&#34; title=&#34;304 Not Modified&#34;&gt;&lt;/a&gt;304 Not Modified&lt;/h2&gt;&lt;p&gt;If the client has performed a conditional GET request and access is allowed, but the document has not been modified, the server SHOULD respond with this status code. The 304 response MUST NOT contain a message-body, and thus is always terminated by the first empty line after the header fields.&lt;/p&gt;
&lt;p&gt;The response MUST include the following header fields:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  - Date, unless its omission is required by section 14.18.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If a clockless origin server obeys these rules, and proxies and clients add their own Date to any response received without one (as already specified by [RFC 2068], section 14.19), caches will operate correctly.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  - ETag and/or Content-Location, if the header would have been sent
    in a 200 response to the same request
  - Expires, Cache-Control, and/or Vary, if the field-value might
    differ from that sent in any previous response for the same
    variant
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the conditional GET used a strong cache validator (see section 13.3.3), the response SHOULD NOT include other entity-headers. Otherwise (i.e., the conditional GET used a weak validator), the response MUST NOT include other entity-headers; this prevents inconsistencies between cached entity-bodies and updated headers.&lt;/p&gt;
&lt;p&gt;If a 304 response indicates an entity not currently cached, then the cache MUST disregard the response and repeat the request without the conditional.&lt;/p&gt;
&lt;p&gt;If a cache uses a received 304 response to update a cache entry, the cache MUST update the entry to reflect any new field values given in the response.&lt;/p&gt;
&lt;h2 id=&#34;305-Use-Proxy&#34;&gt;&lt;a href=&#34;#305-Use-Proxy&#34; class=&#34;headerlink&#34; title=&#34;305 Use Proxy&#34;&gt;&lt;/a&gt;305 Use Proxy&lt;/h2&gt;&lt;p&gt;The requested resource MUST be accessed through the proxy given by the Location field. The Location field gives the URI of the proxy. The recipient is expected to repeat this single request via the proxy. 305 responses MUST only be generated by origin servers.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  Note: RFC 2068 was not clear that 305 was intended to redirect a
  single request, and to be generated by origin servers only.  Not
  observing these limitations has significant security consequences.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;306-Unused&#34;&gt;&lt;a href=&#34;#306-Unused&#34; class=&#34;headerlink&#34; title=&#34;306 (Unused)&#34;&gt;&lt;/a&gt;306 (Unused)&lt;/h2&gt;&lt;p&gt;The 306 status code was used in a previous version of the specification, is no longer used, and the code is reserved.&lt;/p&gt;
&lt;h2 id=&#34;307-Temporary-Redirect&#34;&gt;&lt;a href=&#34;#307-Temporary-Redirect&#34; class=&#34;headerlink&#34; title=&#34;307 Temporary Redirect&#34;&gt;&lt;/a&gt;307 Temporary Redirect&lt;/h2&gt;&lt;p&gt;The requested resource resides temporarily under a different URI. Since the redirection MAY be altered on occasion, the client SHOULD continue to use the Request-URI for future requests. This response is only cacheable if indicated by a Cache-Control or Expires header field.&lt;/p&gt;
&lt;p&gt;The temporary URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s) , since many pre-HTTP&amp;#x2F;1.1 user agents do not understand the 307 status. Therefore, the note SHOULD contain the information necessary for a user to repeat the original request on the new URI.&lt;/p&gt;
&lt;p&gt;If the 307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.&lt;/p&gt;
&lt;h1 id=&#34;Client-Error-4xx&#34;&gt;&lt;a href=&#34;#Client-Error-4xx&#34; class=&#34;headerlink&#34; title=&#34;Client Error 4xx&#34;&gt;&lt;/a&gt;Client Error 4xx&lt;/h1&gt;&lt;p&gt;The 4xx class of status code is intended for cases in which the client seems to have erred. Except when responding to a HEAD request, the server SHOULD include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition. These status codes are applicable to any request method. User agents SHOULD display any included entity to the user.&lt;/p&gt;
&lt;p&gt;If the client is sending data, a server implementation using TCP SHOULD be careful to ensure that the client acknowledges receipt of the packet(s) containing the response, before the server closes the input connection. If the client continues sending data to the server after the close, the server’s TCP stack will send a reset packet to the client, which may erase the client’s unacknowledged input buffers before they can be read and interpreted by the HTTP application.&lt;/p&gt;
&lt;h2 id=&#34;400-Bad-Request&#34;&gt;&lt;a href=&#34;#400-Bad-Request&#34; class=&#34;headerlink&#34; title=&#34;400 Bad Request&#34;&gt;&lt;/a&gt;400 Bad Request&lt;/h2&gt;&lt;p&gt;The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.&lt;/p&gt;
&lt;h2 id=&#34;401-Unauthorized&#34;&gt;&lt;a href=&#34;#401-Unauthorized&#34; class=&#34;headerlink&#34; title=&#34;401 Unauthorized&#34;&gt;&lt;/a&gt;401 Unauthorized&lt;/h2&gt;&lt;p&gt;The request requires user authentication. The response MUST include a WWW-Authenticate header field (section 14.47) containing a challenge applicable to the requested resource. The client MAY repeat the request with a suitable Authorization header field (section 14.8). If the request already included Authorization credentials, then the 401 response indicates that authorization has been refused for those credentials. If the 401 response contains the same challenge as the prior response, and the user agent has already attempted authentication at least once, then the user SHOULD be presented the entity that was given in the response, since that entity might include relevant diagnostic information. HTTP access authentication is explained in “HTTP Authentication: Basic and Digest Access Authentication” [43].&lt;/p&gt;
&lt;h2 id=&#34;402-Payment-Required&#34;&gt;&lt;a href=&#34;#402-Payment-Required&#34; class=&#34;headerlink&#34; title=&#34;402 Payment Required&#34;&gt;&lt;/a&gt;402 Payment Required&lt;/h2&gt;&lt;p&gt;This code is reserved for future use.&lt;/p&gt;
&lt;h2 id=&#34;403-Forbidden&#34;&gt;&lt;a href=&#34;#403-Forbidden&#34; class=&#34;headerlink&#34; title=&#34;403 Forbidden&#34;&gt;&lt;/a&gt;403 Forbidden&lt;/h2&gt;&lt;p&gt;The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information available to the client, the status code 404 (Not Found) can be used instead.&lt;/p&gt;
&lt;h2 id=&#34;404-Not-Found&#34;&gt;&lt;a href=&#34;#404-Not-Found&#34; class=&#34;headerlink&#34; title=&#34;404 Not Found&#34;&gt;&lt;/a&gt;404 Not Found&lt;/h2&gt;&lt;p&gt;The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent. The 410 (Gone) status code SHOULD be used if the server knows, through some internally configurable mechanism, that an old resource is permanently unavailable and has no forwarding address. This status code is commonly used when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable.&lt;/p&gt;
&lt;h2 id=&#34;405-Method-Not-Allowed&#34;&gt;&lt;a href=&#34;#405-Method-Not-Allowed&#34; class=&#34;headerlink&#34; title=&#34;405 Method Not Allowed&#34;&gt;&lt;/a&gt;405 Method Not Allowed&lt;/h2&gt;&lt;p&gt;The method specified in the Request-Line is not allowed for the resource identified by the Request-URI. The response MUST include an Allow header containing a list of valid methods for the requested resource.&lt;/p&gt;
&lt;h2 id=&#34;406-Not-Acceptable&#34;&gt;&lt;a href=&#34;#406-Not-Acceptable&#34; class=&#34;headerlink&#34; title=&#34;406 Not Acceptable&#34;&gt;&lt;/a&gt;406 Not Acceptable&lt;/h2&gt;&lt;p&gt;The resource identified by the request is only capable of generating response entities which have content characteristics not acceptable according to the accept headers sent in the request.&lt;/p&gt;
&lt;p&gt;Unless it was a HEAD request, the response SHOULD include an entity containing a list of available entity characteristics and location(s) from which the user or user agent can choose the one most appropriate. The entity format is specified by the media type given in the Content-Type header field. Depending upon the format and the capabilities of the user agent, selection of the most appropriate choice MAY be performed automatically. However, this specification does not define any standard for such automatic selection.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  Note: HTTP/1.1 servers are allowed to return responses which are
  not acceptable according to the accept headers sent in the
  request. In some cases, this may even be preferable to sending a
  406 response. User agents are encouraged to inspect the headers of
  an incoming response to determine if it is acceptable.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the response could be unacceptable, a user agent SHOULD temporarily stop receipt of more data and query the user for a decision on further actions.&lt;/p&gt;
&lt;h2 id=&#34;407-Proxy-Authentication-Required&#34;&gt;&lt;a href=&#34;#407-Proxy-Authentication-Required&#34; class=&#34;headerlink&#34; title=&#34;407 Proxy Authentication Required&#34;&gt;&lt;/a&gt;407 Proxy Authentication Required&lt;/h2&gt;&lt;p&gt;This code is similar to 401 (Unauthorized), but indicates that the client must first authenticate itself with the proxy. The proxy MUST return a Proxy-Authenticate header field (section 14.33) containing a challenge applicable to the proxy for the requested resource. The client MAY repeat the request with a suitable Proxy-Authorization header field (section 14.34). HTTP access authentication is explained in “HTTP Authentication: Basic and Digest Access Authentication” [43].&lt;/p&gt;
&lt;h2 id=&#34;408-Request-Timeout&#34;&gt;&lt;a href=&#34;#408-Request-Timeout&#34; class=&#34;headerlink&#34; title=&#34;408 Request Timeout&#34;&gt;&lt;/a&gt;408 Request Timeout&lt;/h2&gt;&lt;p&gt;The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time.&lt;/p&gt;
&lt;h2 id=&#34;409-Conflict&#34;&gt;&lt;a href=&#34;#409-Conflict&#34; class=&#34;headerlink&#34; title=&#34;409 Conflict&#34;&gt;&lt;/a&gt;409 Conflict&lt;/h2&gt;&lt;p&gt;The request could not be completed due to a conflict with the current state of the resource. This code is only allowed in situations where it is expected that the user might be able to resolve the conflict and resubmit the request. The response body SHOULD include enough&lt;/p&gt;
&lt;p&gt;information for the user to recognize the source of the conflict. Ideally, the response entity would include enough information for the user or user agent to fix the problem; however, that might not be possible and is not required.&lt;/p&gt;
&lt;p&gt;Conflicts are most likely to occur in response to a PUT request. For example, if versioning were being used and the entity being PUT included changes to a resource which conflict with those made by an earlier (third-party) request, the server might use the 409 response to indicate that it can’t complete the request. In this case, the response entity would likely contain a list of the differences between the two versions in a format defined by the response Content-Type.&lt;/p&gt;
&lt;h2 id=&#34;410-Gone&#34;&gt;&lt;a href=&#34;#410-Gone&#34; class=&#34;headerlink&#34; title=&#34;410 Gone&#34;&gt;&lt;/a&gt;410 Gone&lt;/h2&gt;&lt;p&gt;The requested resource is no longer available at the server and no forwarding address is known. This condition is expected to be considered permanent. Clients with link editing capabilities SHOULD delete references to the Request-URI after user approval. If the server does not know, or has no facility to determine, whether or not the condition is permanent, the status code 404 (Not Found) SHOULD be used instead. This response is cacheable unless indicated otherwise.&lt;/p&gt;
&lt;p&gt;The 410 response is primarily intended to assist the task of web maintenance by notifying the recipient that the resource is intentionally unavailable and that the server owners desire that remote links to that resource be removed. Such an event is common for limited-time, promotional services and for resources belonging to individuals no longer working at the server’s site. It is not necessary to mark all permanently unavailable resources as “gone” or to keep the mark for any length of time – that is left to the discretion of the server owner.&lt;/p&gt;
&lt;h2 id=&#34;411-Length-Required&#34;&gt;&lt;a href=&#34;#411-Length-Required&#34; class=&#34;headerlink&#34; title=&#34;411 Length Required&#34;&gt;&lt;/a&gt;411 Length Required&lt;/h2&gt;&lt;p&gt;The server refuses to accept the request without a defined Content- Length. The client MAY repeat the request if it adds a valid Content-Length header field containing the length of the message-body in the request message.&lt;/p&gt;
&lt;h2 id=&#34;412-Precondition-Failed&#34;&gt;&lt;a href=&#34;#412-Precondition-Failed&#34; class=&#34;headerlink&#34; title=&#34;412 Precondition Failed&#34;&gt;&lt;/a&gt;412 Precondition Failed&lt;/h2&gt;&lt;p&gt;The precondition given in one or more of the request-header fields evaluated to false when it was tested on the server. This response code allows the client to place preconditions on the current resource metainformation (header field data) and thus prevent the requested method from being applied to a resource other than the one intended.&lt;/p&gt;
&lt;h2 id=&#34;413-Request-Entity-Too-Large&#34;&gt;&lt;a href=&#34;#413-Request-Entity-Too-Large&#34; class=&#34;headerlink&#34; title=&#34;413 Request Entity Too Large&#34;&gt;&lt;/a&gt;413 Request Entity Too Large&lt;/h2&gt;&lt;p&gt;The server is refusing to process a request because the request entity is larger than the server is willing or able to process. The server MAY close the connection to prevent the client from continuing the request.&lt;/p&gt;
&lt;p&gt;If the condition is temporary, the server SHOULD include a Retry- After header field to indicate that it is temporary and after what time the client MAY try again.&lt;/p&gt;
&lt;h2 id=&#34;414-Request-URI-Too-Long&#34;&gt;&lt;a href=&#34;#414-Request-URI-Too-Long&#34; class=&#34;headerlink&#34; title=&#34;414 Request-URI Too Long&#34;&gt;&lt;/a&gt;414 Request-URI Too Long&lt;/h2&gt;&lt;p&gt;The server is refusing to service the request because the Request-URI is longer than the server is willing to interpret. This rare condition is only likely to occur when a client has improperly converted a POST request to a GET request with long query information, when the client has descended into a URI “black hole” of redirection (e.g., a redirected URI prefix that points to a suffix of itself), or when the server is under attack by a client attempting to exploit security holes present in some servers using fixed-length buffers for reading or manipulating the Request-URI.&lt;/p&gt;
&lt;h2 id=&#34;415-Unsupported-Media-Type&#34;&gt;&lt;a href=&#34;#415-Unsupported-Media-Type&#34; class=&#34;headerlink&#34; title=&#34;415 Unsupported Media Type&#34;&gt;&lt;/a&gt;415 Unsupported Media Type&lt;/h2&gt;&lt;p&gt;The server is refusing to service the request because the entity of the request is in a format not supported by the requested resource for the requested method.&lt;/p&gt;
&lt;h2 id=&#34;416-Requested-Range-Not-Satisfiable&#34;&gt;&lt;a href=&#34;#416-Requested-Range-Not-Satisfiable&#34; class=&#34;headerlink&#34; title=&#34;416 Requested Range Not Satisfiable&#34;&gt;&lt;/a&gt;416 Requested Range Not Satisfiable&lt;/h2&gt;&lt;p&gt;A server SHOULD return a response with this status code if a request included a Range request-header field (section 14.35), and none of the range-specifier values in this field overlap the current extent of the selected resource, and the request did not include an If-Range request-header field. (For byte-ranges, this means that the first- byte-pos of all of the byte-range-spec values were greater than the current length of the selected resource.)&lt;/p&gt;
&lt;p&gt;When this status code is returned for a byte-range request, the response SHOULD include a Content-Range entity-header field specifying the current length of the selected resource (see section 14.16). This response MUST NOT use the multipart&amp;#x2F;byteranges content- type.&lt;/p&gt;
&lt;h2 id=&#34;417-Expectation-Failed&#34;&gt;&lt;a href=&#34;#417-Expectation-Failed&#34; class=&#34;headerlink&#34; title=&#34;417 Expectation Failed&#34;&gt;&lt;/a&gt;417 Expectation Failed&lt;/h2&gt;&lt;p&gt;The expectation given in an Expect request-header field (see section 14.20) could not be met by this server, or, if the server is a proxy, the server has unambiguous evidence that the request could not be met by the next-hop server.&lt;/p&gt;
&lt;h1 id=&#34;Server-Error-5xx&#34;&gt;&lt;a href=&#34;#Server-Error-5xx&#34; class=&#34;headerlink&#34; title=&#34;Server Error 5xx&#34;&gt;&lt;/a&gt;Server Error 5xx&lt;/h1&gt;&lt;p&gt;Response status codes beginning with the digit “5” indicate cases in which the server is aware that it has erred or is incapable of performing the request. Except when responding to a HEAD request, the server SHOULD include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition. User agents SHOULD display any included entity to the user. These response codes are applicable to any request method.&lt;/p&gt;
&lt;h2 id=&#34;500-Internal-Server-Error&#34;&gt;&lt;a href=&#34;#500-Internal-Server-Error&#34; class=&#34;headerlink&#34; title=&#34;500 Internal Server Error&#34;&gt;&lt;/a&gt;500 Internal Server Error&lt;/h2&gt;&lt;p&gt;The server encountered an unexpected condition which prevented it from fulfilling the request.&lt;/p&gt;
&lt;h2 id=&#34;501-Not-Implemented&#34;&gt;&lt;a href=&#34;#501-Not-Implemented&#34; class=&#34;headerlink&#34; title=&#34;501 Not Implemented&#34;&gt;&lt;/a&gt;501 Not Implemented&lt;/h2&gt;&lt;p&gt;The server does not support the functionality required to fulfill the request. This is the appropriate response when the server does not recognize the request method and is not capable of supporting it for any resource.&lt;/p&gt;
&lt;h2 id=&#34;502-Bad-Gateway&#34;&gt;&lt;a href=&#34;#502-Bad-Gateway&#34; class=&#34;headerlink&#34; title=&#34;502 Bad Gateway&#34;&gt;&lt;/a&gt;502 Bad Gateway&lt;/h2&gt;&lt;p&gt;The server, while acting as a gateway or proxy, received an invalid response from the upstream server it accessed in attempting to fulfill the request.&lt;/p&gt;
&lt;h2 id=&#34;503-Service-Unavailable&#34;&gt;&lt;a href=&#34;#503-Service-Unavailable&#34; class=&#34;headerlink&#34; title=&#34;503 Service Unavailable&#34;&gt;&lt;/a&gt;503 Service Unavailable&lt;/h2&gt;&lt;p&gt;The server is currently unable to handle the request due to a temporary overloading or maintenance of the server. The implication is that this is a temporary condition which will be alleviated after some delay. If known, the length of the delay MAY be indicated in a Retry-After header. If no Retry-After is given, the client SHOULD handle the response as it would for a 500 response.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  Note: The existence of the 503 status code does not imply that a
  server must use it when becoming overloaded. Some servers may wish
  to simply refuse the connection.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;504-Gateway-Timeout&#34;&gt;&lt;a href=&#34;#504-Gateway-Timeout&#34; class=&#34;headerlink&#34; title=&#34;504 Gateway Timeout&#34;&gt;&lt;/a&gt;504 Gateway Timeout&lt;/h2&gt;&lt;p&gt;The server, while acting as a gateway or proxy, did not receive a timely response from the upstream server specified by the URI (e.g. HTTP, FTP, LDAP) or some other auxiliary server (e.g. DNS) it needed to access in attempting to complete the request.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  Note: Note to implementors: some deployed proxies are known to
  return 400 or 500 when DNS lookups time out.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;505-HTTP-Version-Not-Supported&#34;&gt;&lt;a href=&#34;#505-HTTP-Version-Not-Supported&#34; class=&#34;headerlink&#34; title=&#34;505 HTTP Version Not Supported&#34;&gt;&lt;/a&gt;505 HTTP Version Not Supported&lt;/h2&gt;&lt;p&gt;The server does not support, or refuses to support, the HTTP protocol version that was used in the request message. The server is indicating that it is unable or unwilling to complete the request using the same major version as the client, as described in section 3.1, other than with this error message. The response SHOULD contain an entity describing why that version is not supported and what other protocols are supported by that server.&lt;/p&gt;
</content>
        <category term="Http" />
        <updated>2018-05-06T18:08:46.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/java/spring-boot/springbootshi-yong-hibernate-validatorli-yong-aop/</id>
        <title>SpringBoot使用hibernate-validator利用AOP实现统一参数校验</title>
        <link rel="alternate" href="https://qianxunclub.com/java/spring-boot/springbootshi-yong-hibernate-validatorli-yong-aop/"/>
        <content type="html">&lt;h1 id=&#34;引入maven包&#34;&gt;&lt;a href=&#34;#引入maven包&#34; class=&#34;headerlink&#34; title=&#34;引入maven包&#34;&gt;&lt;/a&gt;引入maven包&lt;/h1&gt;&lt;figure class=&#34;highlight xml&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;1.5.9.RELEASE&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;spring-boot-starter-aop&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;2.0.1.RELEASE&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;org.glassfish&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;groupId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;javax.el&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;artifactId&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;3.0.1-b08&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;version&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;dependency&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h1 id=&#34;注入Validator的bean&#34;&gt;&lt;a href=&#34;#注入Validator的bean&#34; class=&#34;headerlink&#34; title=&#34;注入Validator的bean&#34;&gt;&lt;/a&gt;注入Validator的bean&lt;/h1&gt;&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;package&lt;/span&gt; com.qianxunclub.starter.web.autoconfigure;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; lombok.extern.slf4j.Slf4j;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.hibernate.validator.HibernateValidator;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.springframework.context.annotation.Bean;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.springframework.context.annotation.Configuration;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; javax.validation.Validation;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; javax.validation.Validator;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; javax.validation.ValidatorFactory;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * &lt;span class=&#34;doctag&#34;&gt;@author&lt;/span&gt; chihiro.zhang&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Slf4j&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Configuration&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;ValidatorConfiguration&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;meta&#34;&gt;@Bean&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; Validator &lt;span class=&#34;title function_&#34;&gt;getValidatorFactory&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;()&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;ValidatorFactory&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;validatorFactory&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; Validation.byProvider(HibernateValidator.class).configure().failFast(&lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;).buildValidatorFactory();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; validatorFactory.getValidator();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;添加参数校验的AOP&#34;&gt;&lt;a href=&#34;#添加参数校验的AOP&#34; class=&#34;headerlink&#34; title=&#34;添加参数校验的AOP&#34;&gt;&lt;/a&gt;添加参数校验的AOP&lt;/h1&gt;&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;package&lt;/span&gt; com.qianxunclub.starter.web.validator;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; com.qianxunclub.common.framework.constant.CommonReturnCode;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; com.qianxunclub.common.framework.response.Result;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; com.qianxunclub.utils.HttpResponseUtil;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; com.qianxunclub.utils.JsonUtil;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; lombok.AllArgsConstructor;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; lombok.extern.slf4j.Slf4j;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.aspectj.lang.ProceedingJoinPoint;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.aspectj.lang.Signature;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.aspectj.lang.annotation.Around;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.aspectj.lang.annotation.Aspect;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.aspectj.lang.annotation.Pointcut;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.aspectj.lang.reflect.MethodSignature;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.springframework.stereotype.Component;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.springframework.web.context.request.RequestContextHolder;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; org.springframework.web.context.request.ServletRequestAttributes;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; javax.servlet.http.HttpServletResponse;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; javax.validation.ConstraintViolation;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; javax.validation.Path;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; javax.validation.Validator;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; java.lang.reflect.Method;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; java.util.Set;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * &lt;span class=&#34;doctag&#34;&gt;@author&lt;/span&gt; chihiro.zhang&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Slf4j&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Aspect&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Component&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@AllArgsConstructor&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;ValidatorAspect&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt; Validator validator;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;comment&#34;&gt;//定义校验的包位置&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;meta&#34;&gt;@Pointcut(&amp;quot;execution(* com.qianxunclub..*.web.*.*(..))&amp;quot;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;pointcut&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;()&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * 入参校验&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@param&lt;/span&gt; joinPoint&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@throws&lt;/span&gt; Throwable&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;meta&#34;&gt;@Around(&amp;quot;pointcut()&amp;quot;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; Object &lt;span class=&#34;title function_&#34;&gt;execute&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(ProceedingJoinPoint joinPoint)&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;throws&lt;/span&gt; Throwable &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;Result&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; Result.newBuilder().build();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;methodName&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;try&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;type&#34;&gt;Signature&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;sig&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; joinPoint.getSignature();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;type&#34;&gt;MethodSignature&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;msig&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; (MethodSignature) sig;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;type&#34;&gt;Object&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;target&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; joinPoint.getTarget();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;type&#34;&gt;Method&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;currentMethod&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; target.getClass().getMethod(msig.getName(), msig.getParameterTypes());&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            methodName = currentMethod.getName();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125; &lt;span class=&#34;keyword&#34;&gt;catch&lt;/span&gt; (Exception e)&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            log.debug(&lt;span class=&#34;string&#34;&gt;&amp;quot;无法获取方法名称&amp;quot;&lt;/span&gt; ,e);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        Object[] args = joinPoint.getArgs();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;for&lt;/span&gt; (Object arg : args)&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            log.debug(&lt;span class=&#34;string&#34;&gt;&amp;quot;→→→→→&amp;quot;&lt;/span&gt; + methodName + &lt;span class=&#34;string&#34;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt;Into parameter :&amp;quot;&lt;/span&gt; + JsonUtil.objectToJson(arg));&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt;(arg != &lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;)&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                Set&amp;lt;ConstraintViolation&amp;lt;Object&amp;gt;&amp;gt; constraintViolations = validator.validate(arg);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt;(constraintViolations.size() &amp;gt; &lt;span class=&#34;number&#34;&gt;0&lt;/span&gt;)&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    &lt;span class=&#34;keyword&#34;&gt;for&lt;/span&gt; (ConstraintViolation&amp;lt;Object&amp;gt; constraintViolation : constraintViolations) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                        &lt;span class=&#34;type&#34;&gt;Path&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;property&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; constraintViolation.getPropertyPath();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                        &lt;span class=&#34;type&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; property.iterator().next().getName();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                        result = Result.newBuilder().fail().code(CommonReturnCode.PARAM_ERROR).message(&lt;span class=&#34;string&#34;&gt;&amp;quot;[&amp;quot;&lt;/span&gt; + name + &lt;span class=&#34;string&#34;&gt;&amp;quot;]&amp;quot;&lt;/span&gt; + constraintViolation.getMessage()).build();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                        &lt;span class=&#34;keyword&#34;&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    &lt;span class=&#34;type&#34;&gt;ServletRequestAttributes&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;attributes&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    &lt;span class=&#34;type&#34;&gt;HttpServletResponse&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; attributes.getResponse();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    &lt;span class=&#34;type&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;responseStr&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; JsonUtil.objectToJson(result);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    log.error(responseStr);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    log.debug(&lt;span class=&#34;string&#34;&gt;&amp;quot;→→→→→&amp;quot;&lt;/span&gt; + methodName + &lt;span class=&#34;string&#34;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt;Return to the result :&amp;quot;&lt;/span&gt; + responseStr);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    HttpResponseUtil.setResponseJsonBody(response,responseStr);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;Object&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; joinPoint.proceed();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        log.debug(&lt;span class=&#34;string&#34;&gt;&amp;quot;→→→→→&amp;quot;&lt;/span&gt; + methodName + &lt;span class=&#34;string&#34;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt;Return to the result :&amp;quot;&lt;/span&gt; + JsonUtil.objectToJson(object));&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; object;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;上面&lt;code&gt;@Pointcut(&amp;quot;execution(* com.gwghk..*.web.*.*(..))&amp;quot;)为Controller&lt;/code&gt;切点位置&lt;br&gt;BaseResponse为一个统一返回对象，这个可以自定义&lt;/p&gt;
&lt;h1 id=&#34;使用&#34;&gt;&lt;a href=&#34;#使用&#34; class=&#34;headerlink&#34; title=&#34;使用&#34;&gt;&lt;/a&gt;使用&lt;/h1&gt;&lt;p&gt;使用是需要再Controller入参对象添加校验注解即可：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;@Data&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;RegisteProxyParam&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;meta&#34;&gt;@NotEmpty&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt; String appId;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

</content>
        <category term="SpringBoot" />
        <category term="Java" />
        <updated>2018-04-25T18:22:12.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/exception/kafka-exception-could-not-be-resolved/</id>
        <title>kafka发送消息问题，could not be resolved</title>
        <link rel="alternate" href="https://qianxunclub.com/exception/kafka-exception-could-not-be-resolved/"/>
        <content type="html">&lt;h1 id=&#34;异常描述&#34;&gt;&lt;a href=&#34;#异常描述&#34; class=&#34;headerlink&#34; title=&#34;异常描述&#34;&gt;&lt;/a&gt;异常描述&lt;/h1&gt;&lt;p&gt;我用的阿里云服务器，我在服务器上面安装了一个kafka&lt;br&gt;为啥不能发送的，百度了好多 说啥DNS不对.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2016/09/18 11:11:46 [error] 5720#0: [lua] producer.lua:258: buffered messages send to kafka err: iz9405kumw9z could not be resolved (3: Host not found), retryable: true, topic: lualog, partition_id: 0, length: 1, context: ngx.timer, clie  nt: 183.12.65.116, server: 0.0.0.0:80&lt;/code&gt;&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;p&gt;kafka配置文件（config&amp;#x2F;server.properties）： &lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://img.ask.csdn.net/upload/201609/18/1474168727_238864.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;nginx日志：&lt;br&gt;&lt;img src=&#34;http://img.ask.csdn.net/upload/201609/18/1474168585_423649.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;异常分析&#34;&gt;&lt;a href=&#34;#异常分析&#34; class=&#34;headerlink&#34; title=&#34;异常分析&#34;&gt;&lt;/a&gt;异常分析&lt;/h1&gt;&lt;p&gt;从异常看，很明显是HOST访问不了，于是乎，要从Kfka网络配置入手了。&lt;/p&gt;
&lt;h1 id=&#34;解决办法&#34;&gt;&lt;a href=&#34;#解决办法&#34; class=&#34;headerlink&#34; title=&#34;解决办法&#34;&gt;&lt;/a&gt;解决办法&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;http://img.ask.csdn.net/upload/201609/18/1474186554_681266.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;使用下面这个地址 我写的是内网IP地址，换成外网的就可以正常使用了！&lt;/p&gt;
</content>
        <category term="Exception" />
        <category term="Kafka" />
        <updated>2017-04-18T03:27:23.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/cache/huan-cun-chuan-tou-huan-cun-ji-chuan-huan-cun-xue-beng-jie-jue-fang-an-fen-xi/</id>
        <title>缓存穿透，缓存击穿，缓存雪崩解决方案分析</title>
        <link rel="alternate" href="https://qianxunclub.com/cache/huan-cun-chuan-tou-huan-cun-ji-chuan-huan-cun-xue-beng-jie-jue-fang-an-fen-xi/"/>
        <content type="html">&lt;h1 id=&#34;前言&#34;&gt;&lt;a href=&#34;#前言&#34; class=&#34;headerlink&#34; title=&#34;前言&#34;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;p&gt;设计一个缓存系统，不得不要考虑的问题就是：缓存穿透、缓存击穿与失效时的雪崩效应。&lt;/p&gt;
&lt;h1 id=&#34;缓存穿透&#34;&gt;&lt;a href=&#34;#缓存穿透&#34; class=&#34;headerlink&#34; title=&#34;缓存穿透&#34;&gt;&lt;/a&gt;缓存穿透&lt;/h1&gt;&lt;p&gt;缓存穿透是指查询一个一定不存在的数据，由于缓存是不命中时被动写的，并且出于容错考虑，如果从存储层查不到数据则不写入缓存，这将导致这个不存在的数据每次请求都要到存储层去查询，失去了缓存的意义。在流量大时，可能DB就挂掉了，要是有人利用不存在的key频繁攻击我们的应用，这就是漏洞。&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h2 id=&#34;解决方案&#34;&gt;&lt;a href=&#34;#解决方案&#34; class=&#34;headerlink&#34; title=&#34;解决方案&#34;&gt;&lt;/a&gt;解决方案&lt;/h2&gt;&lt;p&gt;有很多种方法可以有效地解决缓存穿透问题，最常见的则是采用布隆过滤器，将所有可能存在的数据哈希到一个足够大的bitmap中，一个一定不存在的数据会被 这个bitmap拦截掉，从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法（我们采用的就是这种），如果一个查询返回的数据为空（不管是数 据不存在，还是系统故障），我们仍然把这个空结果进行缓存，但它的过期时间会很短，最长不超过五分钟。&lt;/p&gt;
&lt;h1 id=&#34;缓存雪崩&#34;&gt;&lt;a href=&#34;#缓存雪崩&#34; class=&#34;headerlink&#34; title=&#34;缓存雪崩&#34;&gt;&lt;/a&gt;缓存雪崩&lt;/h1&gt;&lt;p&gt;缓存雪崩是指在我们设置缓存时采用了相同的过期时间，导致缓存在某一时刻同时失效，请求全部转发到DB，DB瞬时压力过重雪崩。&lt;/p&gt;
&lt;h2 id=&#34;解决方案-1&#34;&gt;&lt;a href=&#34;#解决方案-1&#34; class=&#34;headerlink&#34; title=&#34;解决方案&#34;&gt;&lt;/a&gt;解决方案&lt;/h2&gt;&lt;p&gt;缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程（进程）写，从而避免失效时大量的并发请求落到底层存储系统上。这里分享一个简单方案就时讲缓存失效时间分散开，比如我们可以在原有的失效时间基础上增加一个随机值，比如1-5分钟随机，这样每一个缓存的过期时间的重复率就会降低，就很难引发集体失效的事件。&lt;/p&gt;
&lt;h1 id=&#34;缓存击穿&#34;&gt;&lt;a href=&#34;#缓存击穿&#34; class=&#34;headerlink&#34; title=&#34;缓存击穿&#34;&gt;&lt;/a&gt;缓存击穿&lt;/h1&gt;&lt;p&gt;对于一些设置了过期时间的key，如果这些key可能会在某些时间点被超高并发地访问，是一种非常“热点”的数据。这个时候，需要考虑一个问题：缓存被“击穿”的问题，这个和缓存雪崩的区别在于这里针对某一key缓存，前者则是很多key。&lt;/p&gt;
&lt;p&gt;缓存在某个时间点过期的时候，恰好在这个时间点对这个Key有大量的并发请求过来，这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存，这个时候大并发的请求可能会瞬间把后端DB压垮。&lt;/p&gt;
&lt;h2 id=&#34;解决方案-2&#34;&gt;&lt;a href=&#34;#解决方案-2&#34; class=&#34;headerlink&#34; title=&#34;解决方案&#34;&gt;&lt;/a&gt;解决方案&lt;/h2&gt;&lt;h3 id=&#34;1-使用互斥锁-mutex-key&#34;&gt;&lt;a href=&#34;#1-使用互斥锁-mutex-key&#34; class=&#34;headerlink&#34; title=&#34;1.使用互斥锁(mutex key)&#34;&gt;&lt;/a&gt;1.使用互斥锁(mutex key)&lt;/h3&gt;&lt;p&gt;业界比较常用的做法，是使用mutex。简单地来说，就是在缓存失效的时候（判断拿出来的值为空），不是立即去load db，而是先使用缓存工具的某些带成功操作返回值的操作（比如Redis的SETNX或者Memcache的ADD）去set一个mutex key，当操作返回成功时，再进行load db的操作并回设缓存；否则，就重试整个get缓存的方法。&lt;/p&gt;
&lt;p&gt;SETNX，是「SET if Not eXists」的缩写，也就是只有不存在的时候才设置，可以利用它来实现锁的效果。在redis2.6.1之前版本未实现setnx的过期时间，所以这里给出两种版本代码参考：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//2.6.1前单机版本锁  &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;String &lt;span class=&#34;title function_&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(String key)&lt;/span&gt; &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;   &lt;span class=&#34;type&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; redis.get(key);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;   &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (value  == &lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;) &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (redis.setnx(key_mutex, &lt;span class=&#34;string&#34;&gt;&amp;quot;1&amp;quot;&lt;/span&gt;)) &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;// 3 min timeout to avoid mutex holder crash    &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        redis.expire(key_mutex, &lt;span class=&#34;number&#34;&gt;3&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;60&lt;/span&gt;)    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        value = db.get(key);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        redis.set(key, value);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        redis.delete(key_mutex);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125; &lt;span class=&#34;keyword&#34;&gt;else&lt;/span&gt; &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;//其他线程休息50毫秒后重试    &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        Thread.sleep(&lt;span class=&#34;number&#34;&gt;50&lt;/span&gt;);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        get(key);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &amp;#125;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;  &lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;最新版本代码：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; String &lt;span class=&#34;title function_&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(key)&lt;/span&gt; &amp;#123;  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;type&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; redis.get(key);  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (value == &lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;) &amp;#123; &lt;span class=&#34;comment&#34;&gt;//代表缓存值过期  &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;          &lt;span class=&#34;comment&#34;&gt;//设置3min的超时，防止del操作失败的时候，下次缓存过期一直不能load db  &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;          &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (redis.setnx(key_mutex, &lt;span class=&#34;number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;number&#34;&gt;3&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;60&lt;/span&gt;) == &lt;span class=&#34;number&#34;&gt;1&lt;/span&gt;) &amp;#123;  &lt;span class=&#34;comment&#34;&gt;//代表设置成功  &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;               value = db.get(key);  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                      redis.set(key, value, expire_secs);  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                      redis.del(key_mutex);  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;              &amp;#125; &lt;span class=&#34;keyword&#34;&gt;else&lt;/span&gt; &amp;#123;  &lt;span class=&#34;comment&#34;&gt;//这个时候代表同时候的其他线程已经load db并回设到缓存了，这时候重试获取缓存值即可  &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                      sleep(&lt;span class=&#34;number&#34;&gt;50&lt;/span&gt;);  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                      get(key);  &lt;span class=&#34;comment&#34;&gt;//重试  &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;              &amp;#125;  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;          &amp;#125; &lt;span class=&#34;keyword&#34;&gt;else&lt;/span&gt; &amp;#123;  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;              &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; value;        &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;          &amp;#125;  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt; &amp;#125;  &lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;memcache代码：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (memcache.get(key) == &lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;) &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 3 min timeout to avoid mutex holder crash    &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (memcache.add(key_mutex, &lt;span class=&#34;number&#34;&gt;3&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;60&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;1000&lt;/span&gt;) == &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;) &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        value = db.get(key);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        memcache.set(key, value);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        memcache.delete(key_mutex);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125; &lt;span class=&#34;keyword&#34;&gt;else&lt;/span&gt; &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        sleep(&lt;span class=&#34;number&#34;&gt;50&lt;/span&gt;);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        retry();    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;   &lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;2-“提前”使用互斥锁-mutex-key-：&#34;&gt;&lt;a href=&#34;#2-“提前”使用互斥锁-mutex-key-：&#34; class=&#34;headerlink&#34; title=&#34;2. “提前”使用互斥锁(mutex key)：&#34;&gt;&lt;/a&gt;2. “提前”使用互斥锁(mutex key)：&lt;/h3&gt;&lt;p&gt;在value内部设置1个超时值(timeout1), timeout1比实际的memcache timeout(timeout2)小。当从cache读取到timeout1发现它已经过期时候，马上延长timeout1并重新设置到cache。然后再从数据库加载数据并设置到cache中。伪代码如下：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;v = memcache.get(key);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (v == &lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;) &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (memcache.add(key_mutex, &lt;span class=&#34;number&#34;&gt;3&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;60&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;1000&lt;/span&gt;) == &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;) &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        value = db.get(key);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        memcache.set(key, value);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        memcache.delete(key_mutex);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125; &lt;span class=&#34;keyword&#34;&gt;else&lt;/span&gt; &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        sleep(&lt;span class=&#34;number&#34;&gt;50&lt;/span&gt;);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        retry();    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125; &lt;span class=&#34;keyword&#34;&gt;else&lt;/span&gt; &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (v.timeout &amp;lt;= now()) &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (memcache.add(key_mutex, &lt;span class=&#34;number&#34;&gt;3&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;60&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;1000&lt;/span&gt;) == &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;) &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;comment&#34;&gt;// extend the timeout for other threads    &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            v.timeout += &lt;span class=&#34;number&#34;&gt;3&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;60&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;1000&lt;/span&gt;;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            memcache.set(key, v, KEY_TIMEOUT * &lt;span class=&#34;number&#34;&gt;2&lt;/span&gt;);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;comment&#34;&gt;// load the latest value from db    &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            v = db.get(key);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            v.timeout = KEY_TIMEOUT;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            memcache.set(key, value, KEY_TIMEOUT * &lt;span class=&#34;number&#34;&gt;2&lt;/span&gt;);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            memcache.delete(key_mutex);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125; &lt;span class=&#34;keyword&#34;&gt;else&lt;/span&gt; &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            sleep(&lt;span class=&#34;number&#34;&gt;50&lt;/span&gt;);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            retry();    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125; &lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;3-“永远不过期”：&#34;&gt;&lt;a href=&#34;#3-“永远不过期”：&#34; class=&#34;headerlink&#34; title=&#34;3. “永远不过期”：&#34;&gt;&lt;/a&gt;3. “永远不过期”：&lt;/h3&gt;&lt;p&gt;这里的“永远不过期”包含两层意思：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) 从redis上看，确实没有设置过期时间，这就保证了，不会出现热点key过期问题，也就是“物理”不过期。&lt;/li&gt;
&lt;li&gt;(2) 从功能上看，如果不过期，那不就成静态的了吗？所以我们把过期时间存在key对应的value里，如果发现要过期了，通过一个后台的异步线程进行缓存的构建，也就是“逻辑”过期&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;从实战看，这种方法对于性能非常友好，唯一不足的就是构建缓存时候，其余线程(非构建缓存的线程)可能访问的是老数据，但是对于一般的互联网功能来说这个还是可以忍受。&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;String &lt;span class=&#34;title function_&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(&lt;span class=&#34;keyword&#34;&gt;final&lt;/span&gt; String key)&lt;/span&gt; &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;V&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; redis.get(key);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; v.getValue();    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;long&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;timeout&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; v.getTimeout();    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (v.timeout &amp;lt;= System.currentTimeMillis()) &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;comment&#34;&gt;// 异步更新后台异常执行    &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            threadPool.execute(&lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;Runnable&lt;/span&gt;() &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;()&lt;/span&gt; &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    &lt;span class=&#34;type&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;keyMutex&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;&amp;quot;mutex:&amp;quot;&lt;/span&gt; + key;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (redis.setnx(keyMutex, &lt;span class=&#34;string&#34;&gt;&amp;quot;1&amp;quot;&lt;/span&gt;)) &amp;#123;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                        &lt;span class=&#34;comment&#34;&gt;// 3 min timeout to avoid mutex holder crash    &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                        redis.expire(keyMutex, &lt;span class=&#34;number&#34;&gt;3&lt;/span&gt; * &lt;span class=&#34;number&#34;&gt;60&lt;/span&gt;);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                        &lt;span class=&#34;type&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;dbValue&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; db.get(key);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                        redis.set(key, dbValue);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                        redis.delete(keyMutex);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                    &amp;#125;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &amp;#125;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;#125;);    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; value;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;  &lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;4-资源保护：&#34;&gt;&lt;a href=&#34;#4-资源保护：&#34; class=&#34;headerlink&#34; title=&#34;4. 资源保护：&#34;&gt;&lt;/a&gt;4. 资源保护：&lt;/h3&gt;&lt;p&gt;采用netflix的hystrix，可以做资源的隔离保护主线程池，如果把这个应用到缓存的构建也未尝不可。&lt;/p&gt;
&lt;p&gt;四种解决方案：没有最佳只有最合适&lt;/p&gt;
&lt;h4 id=&#34;一、简单分布式互斥锁（mutex-key）&#34;&gt;&lt;a href=&#34;#一、简单分布式互斥锁（mutex-key）&#34; class=&#34;headerlink&#34; title=&#34;一、简单分布式互斥锁（mutex key）&#34;&gt;&lt;/a&gt;一、简单分布式互斥锁（mutex key）&lt;/h4&gt;&lt;p&gt; 优点：1. 思路简单，2. 保证一致性&lt;/p&gt;
&lt;p&gt; 缺点：1. 代码复杂度增大，2. 存在死锁的风险，3. 存在线程池阻塞的风险&lt;/p&gt;
&lt;h4 id=&#34;二、“提前”使用互斥锁&#34;&gt;&lt;a href=&#34;#二、“提前”使用互斥锁&#34; class=&#34;headerlink&#34; title=&#34;二、“提前”使用互斥锁&#34;&gt;&lt;/a&gt;二、“提前”使用互斥锁&lt;/h4&gt;&lt;p&gt; 优点：1. 保证一致性&lt;/p&gt;
&lt;p&gt; 缺点：1. 代码复杂度增大，2. 存在死锁的风险，3. 存在线程池阻塞的风险&lt;/p&gt;
&lt;h4 id=&#34;三、不过期-本文&#34;&gt;&lt;a href=&#34;#三、不过期-本文&#34; class=&#34;headerlink&#34; title=&#34;三、不过期(本文)&#34;&gt;&lt;/a&gt;三、不过期(本文)&lt;/h4&gt;&lt;p&gt; 优点：1. 异步构建缓存，不会阻塞线程池&lt;/p&gt;
&lt;p&gt; 缺点：1. 不保证一致性。2. 代码复杂度增大(每个value都要维护一个timekey)。3. 占用一定的内存空间(每个value都要维护一个timekey)。&lt;/p&gt;
&lt;h4 id=&#34;四、资源隔离组件hystrix-本文&#34;&gt;&lt;a href=&#34;#四、资源隔离组件hystrix-本文&#34; class=&#34;headerlink&#34; title=&#34;四、资源隔离组件hystrix(本文)&#34;&gt;&lt;/a&gt;四、资源隔离组件hystrix(本文)&lt;/h4&gt;&lt;p&gt; 优点：1. hystrix技术成熟，有效保证后端。2. hystrix监控强大。&lt;/p&gt;
&lt;p&gt; 缺点：1. 部分访问存在降级策略。&lt;/p&gt;
&lt;h1 id=&#34;总结&#34;&gt;&lt;a href=&#34;#总结&#34; class=&#34;headerlink&#34; title=&#34;总结&#34;&gt;&lt;/a&gt;总结&lt;/h1&gt;&lt;p&gt;针对业务系统，永远都是具体情况具体分析，没有最好，只有最合适。&lt;/p&gt;
&lt;p&gt;最后，对于缓存系统常见的缓存满了和数据丢失问题，需要根据具体业务分析，通常我们采用LRU策略处理溢出，Redis的RDB和AOF持久化策略来保证一定情况下的数据安全。&lt;/p&gt;
</content>
        <category term="缓存" />
        <category term="Redis" />
        <updated>2017-04-18T03:27:23.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/video/my-father-is-liar/</id>
        <title>《我的爸爸是个骗子》风靡全球</title>
        <link rel="alternate" href="https://qianxunclub.com/video/my-father-is-liar/"/>
        <content type="html">&lt;p&gt;网上一则泰国公益视频《我的爸爸是个骗子》爆红网络。这让看完视频的网友们不禁潸然泪下，直接泪目。&lt;/p&gt;
&lt;p&gt;视频中这样一段字幕却感动了无数网友。&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;iframe frameborder=&#34;0&#34; width=&#34;640&#34; height=&#34;498&#34; src=&#34;https://v.qq.com/iframe/player.html?vid=e0155jhqy91&amp;tiny=0&amp;auto=0&#34; allowfullscreen&gt;&lt;/iframe&gt;  


&lt;p&gt;Daddy is the sweetest daddy in the world;&lt;br&gt;爸爸是世界上最好的爸爸；  &lt;/p&gt;
&lt;p&gt;Daddy is the most handsome, the smartest;the most clever, the kindest;&lt;br&gt;爸爸最帅，最机智；最聪明，最善良；  &lt;/p&gt;
&lt;p&gt;He is my superman;&lt;br&gt;他就是我的超人；  &lt;/p&gt;
&lt;p&gt;Daddy wants me to do well at school;&lt;br&gt;爸爸希望我学习好；  &lt;/p&gt;
&lt;p&gt;Daddy is just great;&lt;br&gt;爸爸很好，  &lt;/p&gt;
&lt;p&gt;but he lies……&lt;br&gt;但是，他撒谎！  &lt;/p&gt;
&lt;p&gt;He lies about having a job;&lt;br&gt;他撒谎说他有工作；  &lt;/p&gt;
&lt;p&gt;He lies about having money;&lt;br&gt;他撒谎说他有钱；  &lt;/p&gt;
&lt;p&gt;He lies that he’s not tired;&lt;br&gt;他撒谎说他不累；  &lt;/p&gt;
&lt;p&gt;He lies that he’s not hungry;&lt;br&gt;他撒谎说他不饿；  &lt;/p&gt;
&lt;p&gt;He lies that we have everything;&lt;br&gt;他撒谎说我们什么都不缺；  &lt;/p&gt;
&lt;p&gt;He lies about his happiness;&lt;br&gt;他撒谎说他很幸福；  &lt;/p&gt;
&lt;p&gt;He lies because of me…&lt;br&gt;我知道，他撒谎是为了我幸福……  &lt;/p&gt;
</content>
        <category term="视频" />
        <category term="公益广告" />
        <updated>2016-11-27T16:00:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/linux/zi-dong-hua-gong-ju-ansiblewan-zheng-an-zhuang-pi-liang-de-zai-yuan-cheng-fu-wu-qi-shang-zhi-xing-ming-ling/</id>
        <title>自动化工具 ansible完整安装</title>
        <link rel="alternate" href="https://qianxunclub.com/linux/zi-dong-hua-gong-ju-ansiblewan-zheng-an-zhuang-pi-liang-de-zai-yuan-cheng-fu-wu-qi-shang-zhi-xing-ming-ling/"/>
        <content type="html">&lt;p&gt;批量的在远程服务器上执行命令&lt;/p&gt;
&lt;h1 id=&#34;1-什么是ansible&#34;&gt;&lt;a href=&#34;#1-什么是ansible&#34; class=&#34;headerlink&#34; title=&#34;1.什么是ansible&#34;&gt;&lt;/a&gt;1.什么是ansible&lt;/h1&gt;&lt;p&gt;ansible是个什么东西呢？官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项：让我们自动化部署APP；自动化管理配置项；自动化的持续交付；自动化的（AWS）云服务管理。&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;

&lt;p&gt;所有的这几个目标本质上来说都是在一个台或者几台服务器上，执行一系列的命令而已。就像我之前有介绍过的Fabric，以及我们基于Fabric开发的自动化应用部署的工具： Essay 。都是做了这么个事——批量的在远程服务器上执行命令 。&lt;/p&gt;
&lt;p&gt;那么fabric和ansible有什么差别呢？简单来说fabric像是一个工具箱，提供了很多好用的工具，用来在Remote执行命令，而Ansible则是提供了一套简单的流程，你要按照它的流程来做，就能轻松完成任务。这就像是库和框架的关系一样。&lt;/p&gt;
&lt;p&gt;当然，它们之间也是有共同点的——都是基于 paramiko 开发的。这个paramiko是什么呢？它是一个纯Python实现的ssh协议库。因此fabric和ansible还有一个共同点就是不需要在远程主机上安装client&amp;#x2F;agents，因为它们是基于ssh来和远程主机通讯的。&lt;/p&gt;
&lt;h1 id=&#34;2-快速安装&#34;&gt;&lt;a href=&#34;#2-快速安装&#34; class=&#34;headerlink&#34; title=&#34;2.快速安装&#34;&gt;&lt;/a&gt;2.快速安装&lt;/h1&gt;&lt;p&gt;上面简单介绍了下这是个什么东西，怎么安装呢？也很简单，因为ansible是python开发的，因此可以这么安装:&lt;/p&gt;
&lt;p&gt;使用yum安装&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;yum install epel-release -y  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;yum install ansible -y  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;3-配置&#34;&gt;&lt;a href=&#34;#3-配置&#34; class=&#34;headerlink&#34; title=&#34;3.配置&#34;&gt;&lt;/a&gt;3.配置&lt;/h1&gt;&lt;p&gt;ansible通过文件来定义你要管理的主机,也就是说把你需要的管理的主机ip写到一个文件中即可。&lt;br&gt;这个文件一般名为hosts，它可以放在多个路径下，也可以自定义名称和路径。 默认我们用&amp;#x2F;etc&amp;#x2F;ansible&amp;#x2F;hosts这个文件即可&lt;/p&gt;
&lt;p&gt;hosts文件的格式为：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;[node]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10.2.2.121  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10.2.2.122  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;默认ssh端口是22，如果主机端口号是其他的，在ip后加:端口号即可，如10.2.1.203的端口是2211，属于test组，格式如下：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;[test]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10.2.1.201  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10.2.1.202  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10.2.1.203:2211  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;4-使用ssh-keygen产生ssh密钥&#34;&gt;&lt;a href=&#34;#4-使用ssh-keygen产生ssh密钥&#34; class=&#34;headerlink&#34; title=&#34;4.使用ssh-keygen产生ssh密钥&#34;&gt;&lt;/a&gt;4.使用ssh-keygen产生ssh密钥&lt;/h1&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;[root@test-201 ~]# ssh-keygen &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Generating public/private rsa key pair.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Enter file in which to save the key (/root/.ssh/id_rsa):  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Enter passphrase (empty for no passphrase):  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Enter same passphrase again:  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Your identification has been saved in /root/.ssh/id_rsa.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Your public key has been saved in /root/.ssh/id_rsa.pub.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;The key fingerprint is:  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;dd:20:23:7c:1a:2e:01:bf:b1:67:7a:08:87:5f:e6:7e root@test-201  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;The key’s randomart image is:  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;+–[ RSA 2048]—-+ &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;| . | &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;| o . | &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;| + + + . | &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;| . * = + o | &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;| o = B S . . | &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;| + X | &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;| + o | &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;| o E | &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;| .. | &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;+—————–+&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;将公钥发送到要管理的服务器 使用ssh-copy-id命令&lt;/p&gt;
&lt;p&gt;比如要发送到10.2.31.202，使用如下命令：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;[root@test-201 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 10.2.31.202 &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;root@10.2.31.202’s password:  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;Now try logging into the machine, with “ssh ‘10.2.31.202’”, and check in:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;.ssh/authorized_keys&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;to make sure we haven’t added extra keys that you weren’t expecting.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;5-使用ansible&#34;&gt;&lt;a href=&#34;#5-使用ansible&#34; class=&#34;headerlink&#34; title=&#34;5.使用ansible&#34;&gt;&lt;/a&gt;5.使用ansible&lt;/h1&gt;&lt;p&gt;命令格式如下： &lt;code&gt;ansible + 主机组名称 + -m + 模块名称 + -a + 参数&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;主机组名称，即hosts中定义的主机组名称&lt;/p&gt;
&lt;p&gt;-m 指使用模块，后加指定的模块名称&lt;br&gt;-a 指传给模块的参数&lt;/p&gt;
&lt;p&gt;在不指定模块时，默认调用command模块。&lt;/p&gt;
&lt;p&gt;如我们想看下test组上的服务器的&amp;#x2F;tmp下面有哪些文件，可以使用如下命令&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ansible test -a “ls /tmp”&lt;/code&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;[root@test-201 ~]# ansible test -a &amp;quot;ls /tmp&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10.2.31.203 | SUCCESS | rc=0 &amp;gt;&amp;gt;  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ansible_EMEGZI  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;testabcdefg  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;我们可以使用copy模块，将本地文件发送到目标服务器上，如：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ansible test -m copy -a “src=/root/install.log dest=/tmp”&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个命令是将本地的&amp;#x2F;root&amp;#x2F;install.log发送到test组的&amp;#x2F;tmp下，执行的效果如下：&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;[root@test-201 ~]# ansible test -m copy -a &amp;quot;src=/root/install.log dest=/tmp&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10.2.31.203 | SUCCESS =&amp;gt; &amp;#123;  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;changed&amp;quot;: true, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;checksum&amp;quot;: &amp;quot;114ee153946d9cd2e690c405e5796a4fcc400542&amp;quot;, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;dest&amp;quot;: &amp;quot;/tmp/install.log&amp;quot;, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;gid&amp;quot;: 0, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;group&amp;quot;: &amp;quot;root&amp;quot;, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;md5sum&amp;quot;: &amp;quot;17b18780156a31a65d62a324110d686e&amp;quot;, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;mode&amp;quot;: &amp;quot;0644&amp;quot;, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;owner&amp;quot;: &amp;quot;root&amp;quot;, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;secontext&amp;quot;: &amp;quot;unconfined_u:object_r:admin_home_t:s0&amp;quot;, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;size&amp;quot;: 43688, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;src&amp;quot;: &amp;quot;/root/.ansible/tmp/ansible-tmp-1466157410.68-191787255687953/source&amp;quot;, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;state&amp;quot;: &amp;quot;file&amp;quot;, &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;quot;uid&amp;quot;: 0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;你可以使用ansible-doc –list查看当前的所有模块&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;[root@test-201 ~]# ansible-doc  --list                       &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;….&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;….                                                        &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;authorized_key                     Adds or removes an SSH authorized key  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;azure                              create or terminate a virtual machine in azure  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;azure_rm_deployment                Create or destroy Azure Resource Manager template deployments  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;azure_rm_networkinterface          Manage Azure network interfaces.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;azure_rm_networkinterface_facts    Get network interface facts.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;azure_rm_publicipaddress           Manage Azure Public IP Addresses.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;azure_rm_publicipaddress_facts     Get public IP facts.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;azure_rm_resourcegroup             Manage Azure resource groups.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;azure_rm_resourcegroup_facts       Get resource group facts.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;azure_rm_securitygroup             Manage Azure network security groups.  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;….&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;…&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;ansible自带了很多丰富的模块，详细请看：&lt;br&gt;&lt;a href=&#34;http://docs.ansible.com/ansible/list_of_all_modules.html&#34;&gt;http://docs.ansible.com/ansible/list_of_all_modules.html&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;6-小技巧&#34;&gt;&lt;a href=&#34;#6-小技巧&#34; class=&#34;headerlink&#34; title=&#34;6.小技巧:&#34;&gt;&lt;/a&gt;6.小技巧:&lt;/h1&gt;&lt;p&gt;有时候如果想直接操作某台服务器,但又没有在hosts里定义这台服务器时,可以使用如下命令:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ansible all -i ‘服务器ip,’&lt;/code&gt;&lt;br&gt;注意服务器ip后面要加个,&lt;/p&gt;
&lt;p&gt;如 &lt;code&gt;ansible all -i ‘10.2.31.201,’ -u test -k -a ‘uptime’&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;BUG?&lt;/p&gt;
&lt;p&gt;目前遇到两个bug(也可能是我的使用方式不对,正在关注中) 1.在中文路径下无法使用.&lt;br&gt;如果在一个含中文的路径下面使用ansible,会无法执行,提示:   UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 14&lt;br&gt;所以不要跑到中文路径下面去执行ansible&lt;/p&gt;
&lt;p&gt;2.su命令不能用.&lt;br&gt;使用su命令不成功,无在目标机器上通过一个普通用户su切换为root执行相关命令 错误如下: &lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;ansible Timeout (12s) waiting for privilege escalation prompt&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</content>
        <category term="Linux" />
        <updated>2016-11-15T16:00:00.000Z</updated>
    </entry>
    <entry>
        <id>https://qianxunclub.com/about/</id>
        <title>关于</title>
        <link rel="alternate" href="https://qianxunclub.com/about/"/>
        <content type="html">&lt;h2 id=&#34;About&#34;&gt;&lt;a href=&#34;#About&#34; class=&#34;headerlink&#34; title=&#34;About&#34;&gt;&lt;/a&gt;About&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;👨‍💻 关于我：90 后 10 年老程序员、曾就业与腾讯、阿里、中兴。&lt;/li&gt;
&lt;li&gt;🛠 语言：Java、Python、Nodejs、Golang。&lt;/li&gt;
&lt;li&gt;✒️ 博客：16年开始写文章，曾经使用 Ghost、Hexo、Wordpress，最终以静态稳定简洁特性，使用 Hexo。&lt;/li&gt;
&lt;li&gt;📧 联系我：&lt;a href=&#34;mailto:&amp;#57;&amp;#x36;&amp;#x30;&amp;#x33;&amp;#51;&amp;#x39;&amp;#x34;&amp;#57;&amp;#49;&amp;#x40;&amp;#113;&amp;#x71;&amp;#46;&amp;#x63;&amp;#111;&amp;#109;&#34;&gt;960339491@qq.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        <updated>2015-12-12T00:00:00.000Z</updated>
    </entry>
</feed>
