-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathatom.xml
234 lines (124 loc) · 137 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>低调小熊猫</title>
<link href="http://example.com/atom.xml" rel="self"/>
<link href="http://example.com/"/>
<updated>2024-05-19T04:31:33.863Z</updated>
<id>http://example.com/</id>
<author>
<name>低调小熊猫</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>使用Java-Netty实现长连接</title>
<link href="http://example.com/2022/08/14/netty-java/"/>
<id>http://example.com/2022/08/14/netty-java/</id>
<published>2022-08-14T02:29:35.000Z</published>
<updated>2024-05-19T04:31:33.863Z</updated>
<content type="html"><![CDATA[<h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>使用Netty与硬件设备通讯,优点,达到百万连接没有任何难度</p><h3 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h3><h4 id="1-maven依赖"><a href="#1-maven依赖" class="headerlink" title="1.maven依赖"></a>1.maven依赖</h4><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs xml"><span class="hljs-comment"><!--netty所需--></span><br><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>io.netty<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>netty-all<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>4.1.46.Final<span class="hljs-tag"></<span class="hljs-name">version</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br></code></pre></td></tr></table></figure><h4 id="2-配置启动服务"><a href="#2-配置启动服务" class="headerlink" title="2.配置启动服务"></a>2.配置启动服务</h4><p>在application.yml添加配置</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-comment">#netty配置</span><br><span class="hljs-attr">netty:</span><br> <span class="hljs-attr">enable:</span> <span class="hljs-literal">true</span><br> <span class="hljs-attr">server:</span><br> <span class="hljs-attr">port:</span> <span class="hljs-number">8543</span><br></code></pre></td></tr></table></figure><p>创建启动服务类</p><figure class="highlight reasonml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><code class="hljs reasonml"><span class="hljs-comment">/**</span><br><span class="hljs-comment"> * @author AoDeng</span><br><span class="hljs-comment"> * @date 2022/8/12</span><br><span class="hljs-comment"> */</span><br>@Component<br>public <span class="hljs-keyword">class</span> NettyServer {<br><br> <span class="hljs-keyword">private</span> static final Logger log = <span class="hljs-module-access"><span class="hljs-module"><span class="hljs-identifier">LoggerFactory</span>.</span></span>get<span class="hljs-constructor">Logger(NettyServer.<span class="hljs-params">class</span>)</span>;<br><br> @<span class="hljs-constructor">Value(<span class="hljs-string">"${netty.server.port}"</span>)</span><br> <span class="hljs-keyword">private</span> Integer nettyPort;<br><br> @<span class="hljs-constructor">Value(<span class="hljs-string">"${netty.enable}"</span>)</span><br> <span class="hljs-keyword">private</span> boolean enable;<br><br> @Autowired<br> <span class="hljs-keyword">private</span> NettyServerEventHandle nettyEventHandle;<br><br> <span class="hljs-keyword">private</span> EventLoopGroup boss = <span class="hljs-keyword">new</span> <span class="hljs-constructor">NioEventLoopGroup()</span>;<br><br> <span class="hljs-keyword">private</span> EventLoopGroup work = <span class="hljs-keyword">new</span> <span class="hljs-constructor">NioEventLoopGroup()</span>;<br><br> <span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 启动 Netty</span><br><span class="hljs-comment"> */</span><br> @PostConstruct<br> public void start<span class="hljs-literal">()</span> {<br> <span class="hljs-keyword">if</span> (enable) {<br> <span class="hljs-keyword">try</span> {<br> ServerBootstrap bootstrap = <span class="hljs-keyword">new</span> <span class="hljs-constructor">ServerBootstrap()</span><br> .group(boss, work)<br> .channel(<span class="hljs-module-access"><span class="hljs-module"><span class="hljs-identifier">NioServerSocketChannel</span>.</span></span><span class="hljs-keyword">class</span>)<br> .local<span class="hljs-constructor">Address(<span class="hljs-params">new</span> InetSocketAddress(<span class="hljs-params">nettyPort</span>)</span>)<br> <span class="hljs-comment">//服务端接受连接的队列长度,如果队列已满,客户端连接将被拒绝</span><br> .option(ChannelOption.SO_BACKLOG, <span class="hljs-number">128</span>)<br> <span class="hljs-comment">//Socket参数,连接保活,默认值为False。启用该功能时,TCP会主动探测空闲连接的有效性。</span><br> <span class="hljs-comment">//可以将此功能视为TCP的心跳机制,需要注意的是:默认的心跳间隔是7200s即2小时。Netty默认关闭该功能。</span><br> .child<span class="hljs-constructor">Option(ChannelOption.SO_KEEPALIVE, <span class="hljs-params">true</span>)</span><br> .child<span class="hljs-constructor">Handler(<span class="hljs-params">new</span> ChannelInitializer<SocketChannel>()</span> {<br> @Override<br> protected void init<span class="hljs-constructor">Channel(SocketChannel <span class="hljs-params">ch</span>)</span> {<br> ch.pipeline<span class="hljs-literal">()</span><br> .add<span class="hljs-constructor">Last(<span class="hljs-params">new</span> IdleStateHandler(60, 60, 20, TimeUnit.SECONDS)</span>)<br> .add<span class="hljs-constructor">Last(<span class="hljs-params">nettyEventHandle</span>)</span>;<br> }<br> });<br> <span class="hljs-comment">//绑定并开始接受传入的连接。</span><br> ChannelFuture future = bootstrap.bind<span class="hljs-literal">()</span>.sync<span class="hljs-literal">()</span>;<br> <span class="hljs-keyword">if</span> (future.is<span class="hljs-constructor">Success()</span>) {<br> log.info(<span class="hljs-string">"Start Netty Serve Success.."</span>);<br> }<br> } catch (Exception e) {<br> log.error(<span class="hljs-string">"启动Netty服务异常,异常原因:{}"</span>, e.get<span class="hljs-constructor">Message()</span>);<br> }<br> }<br> }<br><br> <span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 销毁</span><br><span class="hljs-comment"> */</span><br> @PreDestroy<br> public void destroy<span class="hljs-literal">()</span> {<br> boss.shutdown<span class="hljs-constructor">Gracefully()</span>.sync<span class="hljs-constructor">Uninterruptibly()</span>;<br> work.shutdown<span class="hljs-constructor">Gracefully()</span>.sync<span class="hljs-constructor">Uninterruptibly()</span>;<br> log.info(<span class="hljs-string">"Close Netty Serve Success.."</span>);<br> }<br>}<br><br></code></pre></td></tr></table></figure><h4 id="3-事件监听,业务处理"><a href="#3-事件监听,业务处理" class="headerlink" title="3.事件监听,业务处理"></a>3.事件监听,业务处理</h4><p>在channelRead方法中,接收消息,处理相关业务即可</p><figure class="highlight reasonml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br></pre></td><td class="code"><pre><code class="hljs reasonml"><span class="hljs-comment">/**</span><br><span class="hljs-comment"> * @author AoDeng</span><br><span class="hljs-comment"> * @date 2022/8/12</span><br><span class="hljs-comment"> */</span><br>@Component<br>@ChannelHandler.Sharable<br>public <span class="hljs-keyword">class</span> NettyServerEventHandle extends ChannelInboundHandlerAdapter {<br><br> <span class="hljs-keyword">private</span> static final Logger log = <span class="hljs-module-access"><span class="hljs-module"><span class="hljs-identifier">LoggerFactory</span>.</span></span>get<span class="hljs-constructor">Logger(NettyServerEventHandle.<span class="hljs-params">class</span>)</span>;<br><br> <span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 事件监听</span><br><span class="hljs-comment"> */</span><br> @Override<br> public void user<span class="hljs-constructor">EventTriggered(ChannelHandlerContext <span class="hljs-params">ctx</span>, Object <span class="hljs-params">evt</span>)</span> throws Exception {<br> <span class="hljs-comment">//获取当前信道状态</span><br> IdleStateEvent event = (IdleStateEvent) evt;<br> <span class="hljs-comment">//连接客户端ID</span><br> String channelId = ctx.channel<span class="hljs-literal">()</span>.id<span class="hljs-literal">()</span>.<span class="hljs-keyword">to</span><span class="hljs-constructor">String()</span>;<br> switch (event.state<span class="hljs-literal">()</span>) {<br> <span class="hljs-comment">//读空闲</span><br> case READER_IDLE:<br> break;<br> <span class="hljs-comment">//写空闲</span><br> case WRITER_IDLE:<br> break;<br> <span class="hljs-comment">//读写空闲</span><br> case ALL_IDLE:<br> log.info(<span class="hljs-string">"服务端向客户端ID:{}发送心跳数据.."</span>, channelId);<br> ctx.write<span class="hljs-constructor">AndFlush(MessageUtil.<span class="hljs-params">sendMessage</span>(JSONObject.<span class="hljs-params">toJSONString</span>(NettyConfig.SEND_HEAR_MESSAGE)</span>));<br> break;<br> default:<br> break;<br> }<br> super.user<span class="hljs-constructor">EventTriggered(<span class="hljs-params">ctx</span>, <span class="hljs-params">evt</span>)</span>;<br> }<br><br> <span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 接收到消息的时候触发</span><br><span class="hljs-comment"> */</span><br> @Override<br> public void channel<span class="hljs-constructor">Read(ChannelHandlerContext <span class="hljs-params">ctx</span>, Object <span class="hljs-params">msg</span>)</span> {<br> <span class="hljs-keyword">try</span> {<br> <span class="hljs-comment">//消息体</span><br> String info = <span class="hljs-module-access"><span class="hljs-module"><span class="hljs-identifier">MessageUtil</span>.</span></span>get<span class="hljs-constructor">Message(<span class="hljs-params">msg</span>)</span>;<br> <span class="hljs-comment">//连接客户端ID</span><br> String channelId = ctx.channel<span class="hljs-literal">()</span>.id<span class="hljs-literal">()</span>.<span class="hljs-keyword">to</span><span class="hljs-constructor">String()</span>;<br> log.info(<span class="hljs-string">"(处理前)收到ID:{}发来的消息:{}"</span>, channelId, info+<span class="hljs-string">" : "</span>+info.length<span class="hljs-literal">()</span>);<br><br> <span class="hljs-comment">//TODO 消息体根据具体业务处理转换...</span><br><br> log.info(<span class="hljs-string">"(处理后)收到客户端ID:{}发来的消息:{}"</span>, channelId, info+<span class="hljs-string">" : "</span>+info.length<span class="hljs-literal">()</span>);<br> <span class="hljs-comment">//处理业务开始...</span><br><br> <span class="hljs-comment">//TODO 收到消息后处理具体业务...</span><br><br> } catch (Exception e) {<br> log.error(e.get<span class="hljs-constructor">Message()</span>,e);<br> ctx.write<span class="hljs-constructor">AndFlush(MessageUtil.<span class="hljs-params">sendMessage</span>(JSONObject.<span class="hljs-params">toJSONString</span>(NettyConfig.RESPONSE_ERROR_MESSAGE)</span>));<br> }<br> }<br><br><br> <span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 绑定</span><br><span class="hljs-comment"> */</span><br> @Override<br> public void channel<span class="hljs-constructor">Active(ChannelHandlerContext <span class="hljs-params">ctx</span>)</span> {<br> <span class="hljs-comment">//获取客户端IP地址进行身份验证</span><br> String ipAddress = ctx.channel<span class="hljs-literal">()</span>.remote<span class="hljs-constructor">Address()</span>.<span class="hljs-keyword">to</span><span class="hljs-constructor">String()</span>;<br> String channelId = ctx.channel<span class="hljs-literal">()</span>.id<span class="hljs-literal">()</span>.<span class="hljs-keyword">to</span><span class="hljs-constructor">String()</span>;<br> log.info(<span class="hljs-string">"客户端ID:{},IP地址:{}已经成功连接...."</span>, channelId, ipAddress);<br> }<br><br> <span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 取消绑定</span><br><span class="hljs-comment"> */</span><br> @Override<br> public void channel<span class="hljs-constructor">Inactive(ChannelHandlerContext <span class="hljs-params">ctx</span>)</span> {<br><br> }<br><br> <span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 抛出异常的时候触发</span><br><span class="hljs-comment"> */</span><br> @Override<br> public void <span class="hljs-keyword">exception</span><span class="hljs-constructor">Caught(ChannelHandlerContext <span class="hljs-params">ctx</span>, Throwable <span class="hljs-params">cause</span>)</span> throws Exception {<br> String channelId = ctx.channel<span class="hljs-literal">()</span>.id<span class="hljs-literal">()</span>.<span class="hljs-keyword">to</span><span class="hljs-constructor">String()</span>;<br> String ipAddress = ctx.channel<span class="hljs-literal">()</span>.remote<span class="hljs-constructor">Address()</span>.<span class="hljs-keyword">to</span><span class="hljs-constructor">String()</span>;<br> log.error(<span class="hljs-string">"客户端ID:{},IP地址:{}发生了异常...."</span>, channelId, ipAddress);<br> super.<span class="hljs-keyword">exception</span><span class="hljs-constructor">Caught(<span class="hljs-params">ctx</span>, <span class="hljs-params">cause</span>)</span>;<br> }<br>}<br><br></code></pre></td></tr></table></figure><h4 id="消息编码工具"><a href="#消息编码工具" class="headerlink" title="消息编码工具"></a>消息编码工具</h4><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs typescript"><span class="hljs-comment">/**</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@author <span class="hljs-variable">AoDeng</span></span></span><br><span class="hljs-comment"> * <span class="hljs-doctag">@date </span>2022/8/12</span><br><span class="hljs-comment"> */</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MessageUtil</span> </span>{<br> <span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 发送消息编码</span><br><span class="hljs-comment"> *</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@param </span>message 消息体</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@return </span>编码之后的消息</span><br><span class="hljs-comment"> */</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> ByteBuf <span class="hljs-function"><span class="hljs-title">sendMessage</span>(<span class="hljs-params"><span class="hljs-built_in">String</span> message</span>)</span> {<br> <span class="hljs-keyword">return</span> Unpooled.wrappedBuffer((message).getBytes((CharsetUtil.UTF_8)));<br> }<br><br> <span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 接收消息编码</span><br><span class="hljs-comment"> *</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@param </span>message 消息体</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@return </span>解码之后的消息</span><br><span class="hljs-comment"> */</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> <span class="hljs-function"><span class="hljs-title">getMessage</span>(<span class="hljs-params"><span class="hljs-built_in">Object</span> message</span>)</span> {<br> <span class="hljs-keyword">return</span> ((ByteBuf) message).toString(CharsetUtil.UTF_8);<br> }<br>}<br></code></pre></td></tr></table></figure><h4 id="常量"><a href="#常量" class="headerlink" title="常量"></a>常量</h4><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs php"><span class="hljs-comment">/**</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@author</span> AoDeng</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@date</span> 2022/8/12</span><br><span class="hljs-comment"> */</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NettyConfig</span> </span>{<br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">String</span> SEND_HEAR_MESSAGE = <span class="hljs-string">"服务器发送心跳数据.."</span>;<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">String</span> RESPONSE_HEAR_MESSAGE = <span class="hljs-string">"服务器收到客户端响应数据.."</span>;<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">String</span> RESPONSE_ERROR_MESSAGE = <span class="hljs-string">"服务器处理消息错误,请稍等重试.."</span>;<br>}<br></code></pre></td></tr></table></figure><h4 id="测试运行"><a href="#测试运行" class="headerlink" title="测试运行"></a>测试运行</h4><p>启动项目,下载个tcp工具,访问127.0.0.1:8543 即可模拟通讯</p><h3 id="源码"><a href="#源码" class="headerlink" title="源码"></a>源码</h3><p><a href="https://github.com/java-aodeng/demo-netty-20220812">https://github.com/java-aodeng/demo-netty-20220812</a></p>]]></content>
<summary type="html">使用Netty与硬件设备通讯,优点,达到百万连接没有任何难度</summary>
<category term="开源" scheme="http://example.com/tags/%E5%BC%80%E6%BA%90/"/>
<category term="后端" scheme="http://example.com/tags/%E5%90%8E%E7%AB%AF/"/>
<category term="Netty" scheme="http://example.com/tags/Netty/"/>
</entry>
<entry>
<title>Go语言从入门到精通</title>
<link href="http://example.com/2022/04/02/golang-example/"/>
<id>http://example.com/2022/04/02/golang-example/</id>
<published>2022-04-02T11:45:41.000Z</published>
<updated>2024-05-19T04:31:04.951Z</updated>
<content type="html"><![CDATA[<h2 id="序"><a href="#序" class="headerlink" title="序"></a>序</h2><p>开源协议:GPL-3.0</p><p>作者:[<a href="https://github.com/java-aodeng">低调小熊猫</a>]</p><p>地址:<a href="https://github.com/java-aodeng/golang-examples">https://github.com/java-aodeng/golang-examples</a></p><p>意义:分享知识,提高自己</p><p>ps:白天上班,晚上更新,尽量日更,比心</p><h1><a href="https://github.com/java-aodeng/golang-examples">Go语言从入门到精通</a></h1><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-01/1.md">第01章 关于 Go 语言的介绍</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-02/1.md">第02章 变量,常量以及与其他语言的差异</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-03/1.md">第03章 数据类型</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-04/1.md">第04章 运算符</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-05/1.md">第05章 条件和循环</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-06/1.md">第06章 数组和切片</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-07/1.md">第07章 Map 声明、元素访问及遍历</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-08/map_ext_test.go">第08章 Map与工厂模式,在Go语言中实现Set</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-09/string_test.go">第09章 字符串</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-10-11/func_test.go">第10章 Go与语言的函数 第11章 可变参数和defer</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-12/encap_test.go">第12章 行为的定义和实现</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-13/interface_test.go">第13章 Go语言的相关接口</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-14/extension_test.go">第14章 扩展与复用</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-15/empty_interface_test.go">第15章 不一样的接口类型,一样的多态</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-16/err_test.go">第16章 编写好的错误处理</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-17/panic_recover_test.go">第17章 panic和recover</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-18/client/package_test.go">第18章 构建可复用的模块(包)</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/src/go-19/module_package/get_remote_pack_test.go">第19章 依赖管理</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-20/groutine_test.go">第20章 协程机制</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-21/share_mem_test.go">第21章 共享内存并发机制</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-22/async_service_test.go">第22章 CSP并发机制</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-23/select_test.go">第23章 多路由选择和超时</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-24/channel_close_test.go">第24章 channel的关闭和广播</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-25/cancel_test.go">第25章 任务的取消</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-26/cancel_by_context_test.go">第26章 Context与任务取消</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-27/once_test.go">第27章 只运行一次</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-28/first_response_test.go">第28章 仅需任意任务完成</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-29/all_done_test.go">第29章 所有任务完成</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-30/obj_pool_test.go">第30章 对象池</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-31/sync_pool_test.go">第31章 sync.pool对象缓存</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-32/function_test.go">第32章 单元测试</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-33/benchmark_test.go">第33章 Benchmark</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-34/bdd_test.go">第34章 BDD</a> </p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-35/reflect_test.go">第35章 反射编程</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-36/flexible_reflect_test.go">第36章 万能程序</a></p><p><a href="https://github.com/java-aodeng/golang-examples/blob/master/go-37/unsafe_test.go">第37章 不安全编程</a></p><p>第38章 实现pipe-filter framework</p><p>第39章 实现micro-kernel framework</p><p>第40章 内置JSON解析 </p><p>第41章 easyjson</p><p>第42章 构建Restful </p><p>第43章 性能分析工具</p><p>第44章 性能调优示例</p><p>第45章 别让性能被锁住 </p><p>第46章 GC友好的代码</p><p>第47章 高效字符串连接</p><p>第48章 面向错误的设计 </p><p>第49章 面向恢复的设计</p><p>第50章 Chaos Engineering </p><p>结束 <a href="https://t.zsxq.com/meIqVzj">星球链接</a></p>]]></content>
<summary type="html">作者:[<a href="https://github.com/java-aodeng">低调小熊猫</a>] 意义:分享知识,提高自己</summary>
<category term="Go" scheme="http://example.com/categories/Go/"/>
<category term="后端" scheme="http://example.com/tags/%E5%90%8E%E7%AB%AF/"/>
<category term="Go" scheme="http://example.com/tags/Go/"/>
<category term="golang" scheme="http://example.com/tags/golang/"/>
</entry>
<entry>
<title>Spring Cloud 2020版本最佳实践方案(一)</title>
<link href="http://example.com/2021/09/26/springcloud2020/"/>
<id>http://example.com/2021/09/26/springcloud2020/</id>
<published>2021-09-26T03:08:59.000Z</published>
<updated>2024-05-19T04:31:58.594Z</updated>
<content type="html"><![CDATA[<h3 id="Spring-Cloud2020版本最佳实践方案(一)"><a href="#Spring-Cloud2020版本最佳实践方案(一)" class="headerlink" title="Spring Cloud2020版本最佳实践方案(一)"></a>Spring Cloud2020版本最佳实践方案(一)</h3><p>Spring Cloud 从H版本之后命名方式改为2020.x.x,话说为毛最新版本不是2021命名,来自强迫症的难受</p><h4 id="使用组件列表:"><a href="#使用组件列表:" class="headerlink" title="使用组件列表:"></a>使用组件列表:</h4><ul><li>注册中心:nacos,替代方案eureka、consul、zookeeper</li><li>配置中心: nacos ,替代方案sc config、consul config</li><li>调用:feign,替代方案:resttempate</li><li>熔断:sentinel、,替代方案:Resilience4j</li><li>熔断监控:sentinel dashboard</li><li>负载均衡:sc loadbalancer</li><li>网关:spring cloud gateway</li><li>链路:spring cloud sleuth+zipkin,替代方案:skywalking等</li></ul><h4 id="总体架构图"><a href="#总体架构图" class="headerlink" title="总体架构图"></a>总体架构图</h4><p><img src="/img/posts/springcloud2020-%E6%9E%B6%E6%9E%84%E5%9B%BE.png"></p><h4 id="版本关系"><a href="#版本关系" class="headerlink" title="版本关系"></a>版本关系</h4><p><img src="/img/posts/springcloud-version.png"></p><h3 id="使用nacos作为注册中心和配置中心"><a href="#使用nacos作为注册中心和配置中心" class="headerlink" title="使用nacos作为注册中心和配置中心"></a>使用nacos作为注册中心和配置中心</h3><h4 id="下载nacos"><a href="#下载nacos" class="headerlink" title="下载nacos"></a>下载nacos</h4><p>下载地址:<a href="https://github.com/alibaba/nacos">https://github.com/alibaba/nacos</a> </p><h4 id="导入数据库"><a href="#导入数据库" class="headerlink" title="导入数据库"></a>导入数据库</h4><p>创建mysql数据库nacos,导入 conf/nacos-mysql.sql</p><h4 id="配置数据库"><a href="#配置数据库" class="headerlink" title="配置数据库"></a>配置数据库</h4><p>修改 conf/application.properties</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-comment">#*************** Config Module Related Configurations ***************#</span><br><span class="hljs-comment">### If use MySQL as datasource:</span><br><span class="hljs-attr">spring.datasource.platform</span>=mysql<br><br><span class="hljs-comment">### Count of DB:</span><br><span class="hljs-attr">db.num</span>=<span class="hljs-number">1</span><br><br><span class="hljs-comment">### Connect URL of DB:</span><br><span class="hljs-attr">db.url.0</span>=jdbc:mysql://<span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">3306</span>/nacos?characterEncoding=utf8&connectTimeout=<span class="hljs-number">1000</span>&socketTimeout=<span class="hljs-number">3000</span>&autoReconnect=<span class="hljs-literal">true</span>&useUnicode=<span class="hljs-literal">true</span>&useSSL=<span class="hljs-literal">false</span>&serverTimezone=UTC<br><span class="hljs-attr">db.user.0</span>=root<br><span class="hljs-attr">db.password.0</span>=<span class="hljs-number">123456</span><br></code></pre></td></tr></table></figure><h4 id="配置启动模式"><a href="#配置启动模式" class="headerlink" title="配置启动模式"></a>配置启动模式</h4><p>将nacos设为单机模式启动,编辑 bin/startup.cmd 将MODE<br>修改为:</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-builtin-name">set</span> <span class="hljs-attribute">MODE</span>=<span class="hljs-string">"standalone"</span><br></code></pre></td></tr></table></figure><h4 id="启动运行"><a href="#启动运行" class="headerlink" title="启动运行"></a>启动运行</h4><p>登陆页面:<a href="http://localhost:8848/nacos/%EF%BC%8C%E7%99%BB%E9%99%86%E7%94%A8%E6%88%B7nacos%EF%BC%8C%E7%99%BB%E9%99%86%E5%AF%86%E7%A0%81%E4%B8%BAnacos">http://localhost:8848/nacos/,登陆用户nacos,登陆密码为nacos</a></p><h4 id="工程案例"><a href="#工程案例" class="headerlink" title="工程案例"></a>工程案例</h4><p>工程案例源码:<a href="https://github.com/java-aodeng/springcloud2020-demo-1">https://github.com/java-aodeng/springcloud2020-demo-1</a></p><blockquote><p>工程案例包括2个,一个服务提供者provider 、服务消费者consumer</p></blockquote><p>在父pom文件引入相关的依赖,如下:</p><figure class="highlight dust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><code class="hljs dust"><span class="xml"><span class="hljs-tag"><<span class="hljs-name">properties</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">java.version</span>></span>1.8<span class="hljs-tag"></<span class="hljs-name">java.version</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">spring-boot.version</span>></span>2.4.4<span class="hljs-tag"></<span class="hljs-name">spring-boot.version</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">spring-cloud.version</span>></span>2020.0.2<span class="hljs-tag"></<span class="hljs-name">spring-cloud.version</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">spring-cloud-alibaba.version</span>></span>2021.1<span class="hljs-tag"></<span class="hljs-name">spring-cloud-alibaba.version</span>></span></span><br><span class="xml"><span class="hljs-tag"></<span class="hljs-name">properties</span>></span></span><br><span class="xml"></span><br><span class="xml"><span class="hljs-tag"><<span class="hljs-name">dependencyManagement</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">dependencies</span>></span></span><br><span class="xml"> <span class="hljs-comment"><!-- spring boot 依赖 --></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-dependencies<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>$</span><span class="hljs-template-variable">{spring-boot.version}</span><span class="xml"><span class="hljs-tag"></<span class="hljs-name">version</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">type</span>></span>pom<span class="hljs-tag"></<span class="hljs-name">type</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">scope</span>></span>import<span class="hljs-tag"></<span class="hljs-name">scope</span>></span></span><br><span class="xml"> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span><br><span class="xml"> <span class="hljs-comment"><!-- spring cloud 依赖 --></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-cloud-dependencies<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>$</span><span class="hljs-template-variable">{spring-cloud.version}</span><span class="xml"><span class="hljs-tag"></<span class="hljs-name">version</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">type</span>></span>pom<span class="hljs-tag"></<span class="hljs-name">type</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">scope</span>></span>import<span class="hljs-tag"></<span class="hljs-name">scope</span>></span></span><br><span class="xml"> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span><br><span class="xml"> <span class="hljs-comment"><!-- spring cloud alibaba 依赖 --></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>com.alibaba.cloud<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-cloud-alibaba-dependencies<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>$</span><span class="hljs-template-variable">{spring-cloud-alibaba.version}</span><span class="xml"><span class="hljs-tag"></<span class="hljs-name">version</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">type</span>></span>pom<span class="hljs-tag"></<span class="hljs-name">type</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">scope</span>></span>import<span class="hljs-tag"></<span class="hljs-name">scope</span>></span></span><br><span class="xml"> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span><br><span class="xml"> <span class="hljs-tag"></<span class="hljs-name">dependencies</span>></span></span><br><span class="xml"><span class="hljs-tag"></<span class="hljs-name">dependencyManagement</span>></span></span><br></code></pre></td></tr></table></figure><h4 id="服务提供者provider"><a href="#服务提供者provider" class="headerlink" title="服务提供者provider"></a>服务提供者provider</h4><p>在pom文件引入以下依赖:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>com.alibaba.cloud<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-discovery<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br></code></pre></td></tr></table></figure><p>配置文件:</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">server:</span><br> <span class="hljs-attr">port:</span> <span class="hljs-number">8762</span><br><br><span class="hljs-attr">spring:</span><br> <span class="hljs-attr">application:</span><br> <span class="hljs-attr">name:</span> <span class="hljs-string">provider</span><br><br> <span class="hljs-attr">cloud:</span><br> <span class="hljs-attr">nacos:</span><br> <span class="hljs-attr">discovery:</span><br> <span class="hljs-attr">server-addr:</span> <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><span class="hljs-string">:8848</span><br></code></pre></td></tr></table></figure><p>启动入口添加注解:</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs less"><span class="hljs-variable">@SpringBootApplication</span><br><span class="hljs-variable">@EnableDiscoveryClient</span><br>public class ProviderApplication {<br> <span class="hljs-selector-tag">public</span> <span class="hljs-selector-tag">static</span> <span class="hljs-selector-tag">void</span> <span class="hljs-selector-tag">main</span>(String[] args) {<br> <span class="hljs-selector-tag">SpringApplication</span><span class="hljs-selector-class">.run</span>(ProviderApplication.class,args);<br> }<br>}<br></code></pre></td></tr></table></figure><p>写个接口:</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs typescript"><span class="hljs-meta">@RestController</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoController</span> </span>{<br> <span class="hljs-meta">@Value</span>(<span class="hljs-string">"${server.port}"</span>)<br> <span class="hljs-built_in">String</span> port;<br><br> <span class="hljs-meta">@GetMapping</span>(<span class="hljs-string">"getInfo"</span>)<br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">String</span> <span class="hljs-function"><span class="hljs-title">getInfo</span>(<span class="hljs-params"><span class="hljs-meta">@RequestParam</span>(value = <span class="hljs-string">"name"</span>,defaultValue = <span class="hljs-string">"nacosConfig"</span>,required = <span class="hljs-literal">false</span>)<span class="hljs-built_in">String</span> name</span>)</span>{<br> <span class="hljs-keyword">return</span> <span class="hljs-string">"my name is "</span>+name+<span class="hljs-string">",my port is "</span>+port;<br> }<br>}<br></code></pre></td></tr></table></figure><h4 id="服务消费者consumer"><a href="#服务消费者consumer" class="headerlink" title="服务消费者consumer"></a>服务消费者consumer</h4><p>在pom文件引入以下依赖:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>com.alibaba.cloud<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-discovery<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-cloud-starter-openfeign<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br><span class="hljs-comment"><!--引入openfeign,必须要引入loadbalancer,否则无法启动--></span><br><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-cloud-starter-loadbalancer<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br></code></pre></td></tr></table></figure><p>配置文件</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">server:</span><br> <span class="hljs-attr">port:</span> <span class="hljs-number">8763</span><br><br><span class="hljs-attr">spring:</span><br> <span class="hljs-attr">application:</span><br> <span class="hljs-attr">name:</span> <span class="hljs-string">consumer</span><br><br> <span class="hljs-attr">cloud:</span><br> <span class="hljs-attr">nacos:</span><br> <span class="hljs-attr">discovery:</span><br> <span class="hljs-attr">server-addr:</span> <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><span class="hljs-string">:8848</span><br></code></pre></td></tr></table></figure><p>在工程的启动入口开启FeignClient的功能</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs less"><span class="hljs-variable">@SpringBootApplication</span><br><span class="hljs-variable">@EnableDiscoveryClient</span><br><span class="hljs-variable">@EnableFeignClients</span><br>public class ConsumerApplication {<br> <span class="hljs-selector-tag">public</span> <span class="hljs-selector-tag">static</span> <span class="hljs-selector-tag">void</span> <span class="hljs-selector-tag">main</span>(String[] args) {<br> <span class="hljs-selector-tag">SpringApplication</span><span class="hljs-selector-class">.run</span>(ConsumerApplication.class,args);<br> }<br>}<br></code></pre></td></tr></table></figure><p>写一个FeignClient,去调用provider服务的接口:</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs less"><span class="hljs-variable">@FeignClient</span>(value = <span class="hljs-string">"provider"</span>)<br>public interface ProviderClient {<br><br> <span class="hljs-variable">@GetMapping</span>(<span class="hljs-string">"getInfo"</span>)<br> String getInfo(<span class="hljs-variable">@RequestParam</span>(value = <span class="hljs-string">"name"</span>,defaultValue = <span class="hljs-string">"nacosConfig"</span>,required = false)String name);<br>}<br></code></pre></td></tr></table></figure><p>写一个接口,让consumer去调用provider服务的接口:</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs typescript"><span class="hljs-meta">@RestController</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoController</span> </span>{<br> <span class="hljs-meta">@Autowired</span><br> ProviderClient providerClient;<br><br> <span class="hljs-meta">@GetMapping</span>(<span class="hljs-string">"getInfoByFeign"</span>)<br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">String</span> <span class="hljs-function"><span class="hljs-title">getInfoByFeign</span>(<span class="hljs-params"></span>)</span>{<br> <span class="hljs-keyword">return</span> providerClient.getInfo(<span class="hljs-string">"consumer feign"</span>);<br> }<br>}<br></code></pre></td></tr></table></figure><p>启动两个工程,在nacos服务列表页面出现,consumer,provider2个服务表示都已经注册成功</p><h4 id="服务调用"><a href="#服务调用" class="headerlink" title="服务调用"></a>服务调用</h4><p>在浏览器上输入<a href="http://localhost:8763/getInfoByFeign%EF%BC%8C%E6%B5%8F%E8%A7%88%E5%99%A8%E8%BF%94%E5%9B%9E%E5%93%8D%E5%BA%94">http://localhost:8763/getInfoByFeign,浏览器返回响应</a></p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript"><span class="hljs-keyword">my</span> <span class="hljs-built_in">name</span> <span class="hljs-keyword">is</span> consumer feign,<span class="hljs-keyword">my</span> port <span class="hljs-keyword">is</span> <span class="hljs-number">8761</span><br></code></pre></td></tr></table></figure><p>可见浏览器的请求成功调用了consumer服务的接口,consumer服务也成功地通过feign成功的调用了provider服务的接口。</p><h4 id="使用sc-loadbanlancer作为负载均衡"><a href="#使用sc-loadbanlancer作为负载均衡" class="headerlink" title="使用sc loadbanlancer作为负载均衡"></a>使用sc loadbanlancer作为负载均衡</h4><p>使用spring cloud loadbanlancer作为负载均衡器。 通过修改provider的端口,再在本地启动一个新的provider服务,那么本地有2个provider 服务,端口分别为8761 和8762。在浏览器上多次调用<a href="http://localhost:8763/getInfoByFeign%EF%BC%8C%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BC%9A%E4%BA%A4%E6%9B%BF%E6%98%BE%E7%A4%BA%EF%BC%9A">http://localhost:8763/getInfoByFeign,浏览器会交替显示:</a></p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs applescript"><span class="hljs-keyword">my</span> <span class="hljs-built_in">name</span> <span class="hljs-keyword">is</span> consumer feign,<span class="hljs-keyword">my</span> port <span class="hljs-keyword">is</span> <span class="hljs-number">8761</span><br><span class="hljs-keyword">my</span> <span class="hljs-built_in">name</span> <span class="hljs-keyword">is</span> consumer feign,<span class="hljs-keyword">my</span> port <span class="hljs-keyword">is</span> <span class="hljs-number">8762</span><br></code></pre></td></tr></table></figure><p>注册中心provider服务也会显示两个示例</p><h4 id="使用nacos作为配置中心"><a href="#使用nacos作为配置中心" class="headerlink" title="使用nacos作为配置中心"></a>使用nacos作为配置中心</h4><p>父工程添加nacos配置版本,另一个是用来解决最新版本导致的问题:</p><figure class="highlight dust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs dust"><span class="xml"><span class="hljs-tag"><<span class="hljs-name">alibaba.nacos.version</span>></span>2.0.3<span class="hljs-tag"></<span class="hljs-name">alibaba.nacos.version</span>></span></span><br><span class="xml"><span class="hljs-tag"><<span class="hljs-name">spring-cloud.bootstrap.version</span>></span>3.0.4<span class="hljs-tag"></<span class="hljs-name">spring-cloud.bootstrap.version</span>></span></span><br><span class="xml"></span><br><span class="xml"> <span class="hljs-comment"><!--Alibaba Nacos 配置--></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>com.alibaba.cloud<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-config<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>$</span><span class="hljs-template-variable">{spring-cloud-alibaba.version}</span><span class="xml"><span class="hljs-tag"></<span class="hljs-name">version</span>></span></span><br><span class="xml"> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span><br><span class="xml"> <span class="hljs-comment"><!--引入这个依赖解决SpringCloud2020整合Nacos-Bootstrap配置不生效的问题--></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-cloud-starter-bootstrap<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span><br><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>$</span><span class="hljs-template-variable">{spring-cloud.bootstrap.version}</span><span class="xml"><span class="hljs-tag"></<span class="hljs-name">version</span>></span></span><br><span class="xml"> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span><br></code></pre></td></tr></table></figure><p>服务提供者provider添加依赖:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>com.alibaba.cloud<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-config<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.cloud<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-cloud-starter-bootstrap<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br></code></pre></td></tr></table></figure><p>在bootstrap.yml(一定是bootstrap.yml文件,不是application.yml文件)文件配置以下内容:</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">server:</span><br> <span class="hljs-attr">port:</span> <span class="hljs-number">8762</span><br><span class="hljs-attr">spring:</span><br> <span class="hljs-attr">application:</span><br> <span class="hljs-attr">name:</span> <span class="hljs-string">provider</span><br> <span class="hljs-attr">cloud:</span><br> <span class="hljs-attr">nacos:</span><br> <span class="hljs-attr">config:</span><br> <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span><br> <span class="hljs-attr">server-addr:</span> <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><span class="hljs-string">:8848</span><br> <span class="hljs-attr">file-extension:</span> <span class="hljs-string">yml</span><br> <span class="hljs-attr">prefix:</span> <span class="hljs-string">provider</span><br> <span class="hljs-attr">profiles:</span><br> <span class="hljs-attr">active:</span> <span class="hljs-string">dev</span><br></code></pre></td></tr></table></figure><p>在上面的配置中,配置了nacos config server的地址,配置的扩展名是ymal(目前仅支持yml和properties)。注意是没有配置server.port的,sever.port的属性在nacos中配置。上面的配置是和Nacos中的dataId 的格式是对应的,nacos的完整格式如下:</p><figure class="highlight gams"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gams"><span class="hljs-symbol">$</span>{prefix}-<span class="hljs-symbol">$</span>{spring.profile.active}.<span class="hljs-symbol">$</span>{<span class="hljs-keyword">file</span>-extension}<br></code></pre></td></tr></table></figure><ul><li>prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。</li><li>spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}</li><li>file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。<br>启动nacos,登陆localhost:8848/nacos,创建一个data id ,完整的配置如图所示:</li></ul><p><img src="/img/posts/nacos%E9%85%8D%E7%BD%AE.png"></p><h4 id="源码下载:"><a href="#源码下载:" class="headerlink" title="源码下载:"></a>源码下载:</h4><p><a href="https://github.com/java-aodeng/springcloud2020-demo-1">https://github.com/java-aodeng/springcloud2020-demo-1</a></p><h4 id="参考资料:"><a href="#参考资料:" class="headerlink" title="参考资料:"></a>参考资料:</h4><p><a href="https://www.fangzhipeng.com/spring-cloud.html">https://www.fangzhipeng.com/spring-cloud.html</a><br><a href="https://spring.io/projects/spring-cloud">https://spring.io/projects/spring-cloud</a><br><a href="https://www.springcloud.cc/">https://www.springcloud.cc/</a><br><a href="https://blog.csdn.net/llllllllll4er5ty/article/details/104425284">https://blog.csdn.net/llllllllll4er5ty/article/details/104425284</a></p>]]></content>
<summary type="html">springcloud 2020版本概述,nacos的具体使用,工程案例</summary>
<category term="SpringCloud" scheme="http://example.com/categories/SpringCloud/"/>
<category term="后端" scheme="http://example.com/tags/%E5%90%8E%E7%AB%AF/"/>
<category term="Springcloud" scheme="http://example.com/tags/Springcloud/"/>
<category term="Springboot" scheme="http://example.com/tags/Springboot/"/>
<category term="nacos" scheme="http://example.com/tags/nacos/"/>
<category term="feign" scheme="http://example.com/tags/feign/"/>
</entry>
<entry>
<title>云原生微服务网关Kong和可视化工具Konga安装配置</title>
<link href="http://example.com/2021/09/24/kong/"/>
<id>http://example.com/2021/09/24/kong/</id>
<published>2021-09-24T08:25:03.000Z</published>
<updated>2024-05-19T04:35:03.275Z</updated>
<content type="html"><![CDATA[<h3 id="Kong安装配置"><a href="#Kong安装配置" class="headerlink" title="Kong安装配置"></a>Kong安装配置</h3><h4 id="资料"><a href="#资料" class="headerlink" title="资料"></a>资料</h4><p>Kong或Kong API Gateway是一种云原生、平台无关、可扩展的 API 网关,以其高性能和插件可扩展性而著称。</p><p>通过为代理提供的功能,路由,负载平衡,健康检查,验证(和更多),孔用作用于编排微服务或常规API流量容易中心层。</p><p>开源地址:<br><a href="https://github.com/Kong/kong">https://github.com/Kong/kong</a><br><a href="https://github.com/pantsel/konga">https://github.com/pantsel/konga</a></p><h4 id="创建Docker-network-用于容器通讯"><a href="#创建Docker-network-用于容器通讯" class="headerlink" title="创建Docker network 用于容器通讯"></a>创建Docker network 用于容器通讯</h4><figure class="highlight dos"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dos">docker network create kong-<span class="hljs-built_in">net</span><br></code></pre></td></tr></table></figure><h4 id="启动PostgreSQL数据库容器"><a href="#启动PostgreSQL数据库容器" class="headerlink" title="启动PostgreSQL数据库容器"></a>启动PostgreSQL数据库容器</h4><figure class="highlight accesslog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs accesslog">docker run -d --name kong-database \<br> --network=kong-net \<br> -p <span class="hljs-number">5432</span>:<span class="hljs-number">5432</span> \<br> -e <span class="hljs-string">"POSTGRES_USER=kong"</span> \<br> -e <span class="hljs-string">"POSTGRES_DB=kong"</span> \<br> -e <span class="hljs-string">"POSTGRES_PASSWORD=kong"</span> \<br> postgres:<span class="hljs-number">9</span>.<span class="hljs-number">6</span><br></code></pre></td></tr></table></figure><h4 id="初始化kong数据库,使用临时-Kong-容器运行迁移"><a href="#初始化kong数据库,使用临时-Kong-容器运行迁移" class="headerlink" title="初始化kong数据库,使用临时 Kong 容器运行迁移"></a>初始化kong数据库,使用临时 Kong 容器运行迁移</h4><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs livescript">docker run --rm <span class="hljs-string">\</span><br> --network=kong-net <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_DATABASE=postgres"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_PG_HOST=kong-database"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_PG_USER=kong"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_PG_PASSWORD=kong"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_CASSANDRA_CONTACT_POINTS=kong-database"</span> <span class="hljs-string">\</span><br> kong:latest kong migrations bootstrap<br></code></pre></td></tr></table></figure><h4 id="启动Kong"><a href="#启动Kong" class="headerlink" title="启动Kong"></a>启动Kong</h4><p>这里替换宿主机端口8000为8002,服务器端口被占用的解决方案<br>参数-p 0.0.0.0:8001:8001 是为了能外网访问8001端口</p><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs livescript">docker run -d --name kong <span class="hljs-string">\</span><br> --network=kong-net <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_DATABASE=postgres"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_PG_HOST=kong-database"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_PG_USER=kong"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_PG_PASSWORD=kong"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_CASSANDRA_CONTACT_POINTS=kong-database"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_PROXY_ACCESS_LOG=/dev/stdout"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_ADMIN_ACCESS_LOG=/dev/stdout"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_PROXY_ERROR_LOG=/dev/stderr"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_ADMIN_ERROR_LOG=/dev/stderr"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl"</span> <span class="hljs-string">\</span><br> -p <span class="hljs-number">8002</span>:<span class="hljs-number">8000</span> <span class="hljs-string">\</span><br> -p <span class="hljs-number">8443</span>:<span class="hljs-number">8443</span> <span class="hljs-string">\</span><br> -p <span class="hljs-number">0.0</span>.<span class="hljs-number">0.0</span>:<span class="hljs-number">8001</span>:<span class="hljs-number">8001</span> <span class="hljs-string">\</span><br> -p <span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">8444</span>:<span class="hljs-number">8444</span> <span class="hljs-string">\</span><br> kong:latest<br></code></pre></td></tr></table></figure><h4 id="使用kong"><a href="#使用kong" class="headerlink" title="使用kong"></a>使用kong</h4><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">$ curl -i http:<span class="hljs-regexp">//</span>localhost:<span class="hljs-number">8001</span>/<br></code></pre></td></tr></table></figure><h3 id="konga安装和配置"><a href="#konga安装和配置" class="headerlink" title="konga安装和配置"></a>konga安装和配置</h3><h4 id="初始化数据konga数据库,使用临时-Konga-容器运行迁移"><a href="#初始化数据konga数据库,使用临时-Konga-容器运行迁移" class="headerlink" title="初始化数据konga数据库,使用临时 Konga 容器运行迁移"></a>初始化数据konga数据库,使用临时 Konga 容器运行迁移</h4><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs livescript">docker run --rm <span class="hljs-string">\</span><br> --network=kong-net <span class="hljs-string">\</span><br> pantsel/konga:latest <span class="hljs-string">\</span><br> -c prepare <span class="hljs-string">\</span><br> -a <span class="hljs-string">"postgres"</span> <span class="hljs-string">\</span><br> -u <span class="hljs-string">"postgres://kong:kong@kong-database:5432/konga"</span><br></code></pre></td></tr></table></figure><h4 id="启动Konga"><a href="#启动Konga" class="headerlink" title="启动Konga"></a>启动Konga</h4><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs livescript">docker run -d --name konga <span class="hljs-string">\</span><br> --network kong-net <span class="hljs-string">\</span><br> -e <span class="hljs-string">"TOKEN_SECRET=secret123"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"DB_ADAPTER=postgres"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"DB_URI=postgres://kong:kong@kong-database:5432/konga"</span> <span class="hljs-string">\</span><br> -e <span class="hljs-string">"NODE_ENV=development"</span> <span class="hljs-string">\</span><br> -p <span class="hljs-number">1337</span>:<span class="hljs-number">1337</span> <span class="hljs-string">\</span><br> pantsel/konga<br></code></pre></td></tr></table></figure><h4 id="使用Konga"><a href="#使用Konga" class="headerlink" title="使用Konga"></a>使用Konga</h4><p>访问<a href="http://localhost:1337/">http://localhost:1337</a> 来访问Konga:</p><p><img src="/img/posts/konga-weicome.png"></p><p>在Konga上配置<br>注册admin用户<br>初次使用Konga前,需要先注册一个Admin用户。</p><p>配置Kong连接<br>在Konga上,打开Connections,选择新建一个Kong连接<br>然<br>选择连接类型为key Auth,输入连接名称、Loopback API URL和API Key。</p><p>更多内容可以参考官方资料:<a href="https://docs.konghq.com/">https://docs.konghq.com</a></p>]]></content>
<summary type="html">一种云原生、平台无关、可扩展的 API 网关</summary>
<category term="后端" scheme="http://example.com/tags/%E5%90%8E%E7%AB%AF/"/>
<category term="Docker" scheme="http://example.com/tags/Docker/"/>
<category term="Linux" scheme="http://example.com/tags/Linux/"/>
<category term="Kong" scheme="http://example.com/tags/Kong/"/>
<category term="Konga" scheme="http://example.com/tags/Konga/"/>
</entry>
<entry>
<title>nginx-config 常用配置,避坑记录</title>
<link href="http://example.com/2021/09/09/nginx-config/"/>
<id>http://example.com/2021/09/09/nginx-config/</id>
<published>2021-09-09T07:42:11.000Z</published>
<updated>2024-05-19T04:31:43.269Z</updated>
<content type="html"><![CDATA[<h3 id="Nginx常用配置,避坑记录"><a href="#Nginx常用配置,避坑记录" class="headerlink" title="Nginx常用配置,避坑记录"></a>Nginx常用配置,避坑记录</h3><h4 id="安装-Nginx"><a href="#安装-Nginx" class="headerlink" title="安装 Nginx"></a>安装 Nginx</h4><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs awk"><span class="hljs-comment"># 更新软件包,请确保服务器的软件包已经是最新的。</span><br>sudo yum update -y<br><br><span class="hljs-comment"># 添加 Nginx 源</span><br>sudo rpm -Uvh http:<span class="hljs-regexp">//</span>nginx.org<span class="hljs-regexp">/packages/</span>centos<span class="hljs-regexp">/7/</span>noarch<span class="hljs-regexp">/RPMS/</span>nginx-release-centos-<span class="hljs-number">7</span>-<span class="hljs-number">0</span>.el7.ngx.noarch.rpm<br><br><span class="hljs-comment"># 安装 Nginx</span><br>sudo yum install -y nginx<br><br><span class="hljs-comment"># 启动 Nginx</span><br>sudo systemctl start nginx.service<br><br><span class="hljs-comment"># 设置开机自启 Nginx</span><br>sudo systemctl enable nginx.service<br></code></pre></td></tr></table></figure><h4 id="配置-Nginx"><a href="#配置-Nginx" class="headerlink" title="配置 Nginx"></a>配置 Nginx</h4><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><code class="hljs awk"><span class="hljs-comment"># 使用 vim 编辑创建 文件名.conf</span><br>vim <span class="hljs-regexp">/etc/</span>nginx<span class="hljs-regexp">/conf.d/</span>文件名.conf<br><br>添加配置<span class="hljs-number">1</span>(配置<span class="hljs-number">1</span>和<span class="hljs-number">2</span>可以同事监听<span class="hljs-number">80</span>端口,绑定不同域名,实现一台服务器nginx同时配置多个前端网站,多个域名空格隔开)<br>server {<br> listen <span class="hljs-number">80</span>;<br> server_name 域名<span class="hljs-number">1</span> 域名<span class="hljs-number">2</span> localhost;<br><br> location / {<br> proxy_set_header HOST <span class="hljs-variable">$host</span>;<br> proxy_set_header X-Forwarded-Proto <span class="hljs-variable">$scheme</span>;<br> proxy_set_header X-Real-IP <span class="hljs-variable">$remote_addr</span>;<br> proxy_set_header X-Forwarded-For <span class="hljs-variable">$proxy_add_x_forwarded_for</span>;<br><br> proxy_pass http:<span class="hljs-regexp">//</span><span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:端口/;<br> }<br>}<br><br>添加配置<span class="hljs-number">2</span><br>server {<br> listen <span class="hljs-number">80</span>;<br> server_name 域名<span class="hljs-number">1</span> 域名<span class="hljs-number">2</span> localhost;<br><br> location / {<br> proxy_set_header HOST <span class="hljs-variable">$host</span>;<br> proxy_set_header X-Forwarded-Proto <span class="hljs-variable">$scheme</span>;<br> proxy_set_header X-Real-IP <span class="hljs-variable">$remote_addr</span>;<br> proxy_set_header X-Forwarded-For <span class="hljs-variable">$proxy_add_x_forwarded_for</span>;<br><br> proxy_pass http:<span class="hljs-regexp">//</span><span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:端口/;<br> }<br><br>}<br><br>代理静态网站 root指定磁盘目录<br>server {<br> listen <span class="hljs-number">80</span>;<br> server_name 域名<span class="hljs-number">1</span> 域名<span class="hljs-number">2</span> 多个域名空格隔开 localhost;<br> location / {<br> try_files <span class="hljs-variable">$uri</span> <span class="hljs-variable">$uri</span><span class="hljs-regexp">/ /i</span>ndex.html;<br> root D:\test-web;<br> }<br>}<br><br></code></pre></td></tr></table></figure><h4 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h4><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs vim">检查配置是否有误<br>sudo nginx -t<br><br>重载/重启 Nginx 配置<br>sudo nginx -s reload<br><br>查看nginx安装目录<br><span class="hljs-keyword">ps</span> -ef | <span class="hljs-keyword">grep</span> nginx<br></code></pre></td></tr></table></figure><h4 id="错误及解决办法"><a href="#错误及解决办法" class="headerlink" title="错误及解决办法"></a>错误及解决办法</h4><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs awk">不能访问子路径错误:<br>location /flow {<br> proxy_pass http:<span class="hljs-regexp">//</span><span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">9083</span>/;<br>}<br>修改:<br>location <span class="hljs-regexp">/flow/</span> {<br> proxy_pass http:<span class="hljs-regexp">//</span><span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">9083</span>/;<br>}<br>解决:<span class="hljs-regexp">/flow 后面加个/</span><br><br>配置多个前端代码<span class="hljs-regexp">/a/</span> <span class="hljs-regexp">/b/</span>不能访问<br>解决:把<span class="hljs-regexp">/a/</span> <span class="hljs-regexp">/b/</span>放在根目录下面 (就是只有一个根目录,不过根目录里面可以放很多项目文件夹)<br><br>去掉请求后面的斜杠 添加在location节点里面 解决浏览器请求拼接到接口前面的诡异问题<br>rewrite ^<span class="hljs-regexp">/(.*)/</span>$ /<span class="hljs-variable">$1</span> permanent;<br><br></code></pre></td></tr></table></figure><h4 id="前后端分离项目部署"><a href="#前后端分离项目部署" class="headerlink" title="前后端分离项目部署"></a>前后端分离项目部署</h4><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><code class="hljs awk"><span class="hljs-comment">##前端配置</span><br>location /gov_flow {<br> <span class="hljs-comment">##放再nginx下的/content/gov_flow目录</span><br> alias <span class="hljs-regexp">/var/</span>html/gov_flow;<br> try_files <span class="hljs-variable">$uri</span> <span class="hljs-variable">$uri</span><span class="hljs-regexp">/ /i</span>ndex.html;<br> index index.html;<br> }<br> <br><span class="hljs-comment">##后端接口配置 </span><br>location <span class="hljs-regexp">/stage-prod-api/</span> {<br> proxy_set_header Host <span class="hljs-variable">$http_host</span>;<br> proxy_set_header X-Real-IP <span class="hljs-variable">$remote_addr</span>;<br> proxy_set_header REMOTE-HOST <span class="hljs-variable">$remote_addr</span>;<br> proxy_set_header X-Forwarded-For <span class="hljs-variable">$proxy_add_x_forwarded_for</span>;<br> proxy_pass http:<span class="hljs-regexp">//</span>flow:<span class="hljs-number">9083</span>/;<br> }<br>location <span class="hljs-regexp">/stage-test-api/</span>{<br> proxy_set_header Host <span class="hljs-variable">$http_host</span>;<br> proxy_set_header X-Real-IP <span class="hljs-variable">$remote_addr</span>;<br> proxy_set_header REMOTE-HOST <span class="hljs-variable">$remote_addr</span>;<br> proxy_set_header X-Forwarded-For <span class="hljs-variable">$proxy_add_x_forwarded_for</span>;<br> proxy_pass http:<span class="hljs-regexp">//</span>localhost:<span class="hljs-number">8080</span>/;<br>}<br> <br><span class="hljs-comment">#两个后端项目接口合并成一个 给前端访问9991</span><br>server {<br> listen <span class="hljs-number">9991</span>;<br> server_name localhost;<br> location <span class="hljs-regexp">/yqt/</span>{<br> proxy_pass http:<span class="hljs-regexp">//</span><span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">8888</span><span class="hljs-regexp">/yqt/</span>;<br> }<br><br> location <span class="hljs-regexp">/ad/</span>{<br> proxy_pass http:<span class="hljs-regexp">//</span><span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">8090</span><span class="hljs-regexp">/ad/</span>;<br> }<br>} <br></code></pre></td></tr></table></figure><h4 id="nginx配置ssl证书示例1"><a href="#nginx配置ssl证书示例1" class="headerlink" title="nginx配置ssl证书示例1"></a>nginx配置ssl证书示例1</h4><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><code class="hljs awk">http{<br><span class="hljs-comment">#http节点中可以添加多个server节点</span><br>server{<br> <span class="hljs-comment">#ssl 需要监听443端口</span><br> listen <span class="hljs-number">443</span>;<br> <span class="hljs-comment"># CA证书对应的域名</span><br> server_name www.ilovey.live;<br> <span class="hljs-comment"># 开启ssl</span><br> ssl on;<br> <span class="hljs-comment"># 服务器证书绝对路径</span><br> ssl_certificate <span class="hljs-regexp">/www/</span>server<span class="hljs-regexp">/nginx/</span>conf.d/<span class="hljs-number">4467149</span>_www.ilovey.live.pem;<br> <span class="hljs-comment"># 服务器端证书key绝对路径 </span><br> ssl_certificate_key <span class="hljs-regexp">/www/</span>server<span class="hljs-regexp">/nginx/</span>conf.d/<span class="hljs-number">4467149</span>_www.ilovey.live.key;<br> <span class="hljs-comment"># session超时</span><br> ssl_session_timeout <span class="hljs-number">5</span>m;<br> <span class="hljs-comment"># 协议类型</span><br> ssl_protocols TLSv1 TLSv1.<span class="hljs-number">1</span> TLSv1.<span class="hljs-number">2</span>;<br> <span class="hljs-comment"># ssl算法列表 </span><br> ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;<br> <span class="hljs-comment"># 是否 服务器决定使用哪种算法 on/off TLSv1.1 的话需要开启</span><br> ssl_prefer_server_ciphers on;<br> <br> location ^~ <span class="hljs-regexp">/zhihao/</span> {<br> proxy_set_header Host <span class="hljs-variable">$host</span>;<br> proxy_pass http:<span class="hljs-regexp">//</span><span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">8080</span>/;<br> }<br>}<br><span class="hljs-comment"># 如果用户通过 http 访问 直接重写 跳转到 https 这个是一个很有必要的操作</span><br>server{<br> listen <span class="hljs-number">80</span>;<br> server_name www.ilovey.live;<br> rewrite ^<span class="hljs-regexp">/(.*)$ https:/</span><span class="hljs-regexp">/www.ilovey.live:443/</span><span class="hljs-variable">$1</span> permanent;<br>}<br>}<br></code></pre></td></tr></table></figure><h4 id="nginx配置ssl证书示例2"><a href="#nginx配置ssl证书示例2" class="headerlink" title="nginx配置ssl证书示例2"></a>nginx配置ssl证书示例2</h4><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-section">server</span><br>{<br><span class="hljs-attribute">listen</span> <span class="hljs-number">80</span>;<br><span class="hljs-attribute">listen</span> <span class="hljs-number">443</span> ssl http2;<br><span class="hljs-attribute">server_name</span> ilovey.live;<br><span class="hljs-attribute">index</span> index.php index.html index.htm default.php default.htm default.html;<br><span class="hljs-attribute">root</span> /www/wwwroot/网站目录;<br><br><span class="hljs-comment">#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则</span><br><span class="hljs-comment">#error_page 404/404.html;</span><br><span class="hljs-attribute">ssl_certificate</span> /www/server/nginx/conf.d/4467149_www.ilovey.live.pem;<br><span class="hljs-attribute">ssl_certificate_key</span> /www/server/nginx/conf.d/4467149_www.ilovey.live.key;<br><span class="hljs-attribute">ssl_protocols</span> TLSv1 TLSv1.<span class="hljs-number">1</span> TLSv1.<span class="hljs-number">2</span>;<br><span class="hljs-attribute">ssl_ciphers</span> ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;<br><span class="hljs-attribute">ssl_prefer_server_ciphers</span> <span class="hljs-literal">on</span>;<br><span class="hljs-attribute">ssl_session_cache</span> shared:SSL:<span class="hljs-number">10m</span>;<br><span class="hljs-attribute">ssl_session_timeout</span> <span class="hljs-number">10m</span>;<br><span class="hljs-attribute">error_page</span> <span class="hljs-number">497</span> https://$host$request_uri;<br><br><br><span class="hljs-comment">#SSL-END</span><br><br><span class="hljs-comment">#ERROR-PAGE-START 错误页配置,可以注释、删除或修改</span><br><span class="hljs-comment">#error_page 404 /404.html;</span><br><span class="hljs-comment">#error_page 502 /502.html;</span><br><span class="hljs-comment">#ERROR-PAGE-END</span><br><br><span class="hljs-comment">#PHP-INFO-START PHP引用配置,可以注释或修改</span><br><br><span class="hljs-comment">#PROXY-START</span><br><span class="hljs-attribute">location</span> /<br>{<br> <span class="hljs-attribute">proxy_pass</span> http://localhost:8886;<br> <span class="hljs-attribute">proxy_set_header</span> Host $host;<br> <span class="hljs-attribute">proxy_set_header</span> X-Real-IP $remote_addr;<br> <span class="hljs-attribute">proxy_set_header</span> X-Forwarded-For $proxy_add_x_forwarded_for;<br> <span class="hljs-attribute">proxy_set_header</span> REMOTE-HOST $remote_addr;<br><br> <span class="hljs-comment">#持久化连接相关配置</span><br> <span class="hljs-comment">#proxy_connect_timeout 30s;</span><br> <span class="hljs-comment">#proxy_read_timeout 86400s;</span><br> <span class="hljs-comment">#proxy_send_timeout 30s;</span><br> <span class="hljs-comment">#proxy_http_version 1.1;</span><br> <span class="hljs-comment">#proxy_set_header Upgrade $http_upgrade;</span><br> <span class="hljs-comment">#proxy_set_header Connection "upgrade";</span><br> <span class="hljs-comment">##expires 12h;</span><br>}<br><br><span class="hljs-comment">#PHP-INFO-END</span><br><br><br><br><span class="hljs-comment">#禁止访问的文件或目录</span><br><span class="hljs-attribute">location</span> <span class="hljs-regexp">~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)</span><br>{<br> <span class="hljs-attribute">return</span> <span class="hljs-number">404</span>;<br>}<br><br><span class="hljs-comment">#一键申请SSL证书验证目录相关设置</span><br><span class="hljs-attribute">location</span> <span class="hljs-regexp">~ \.well-known</span>{<br> <span class="hljs-attribute">allow</span> all;<br>}<br>}<br></code></pre></td></tr></table></figure>]]></content>
<summary type="html">常用配置,避坑记录</summary>
<category term="后端" scheme="http://example.com/tags/%E5%90%8E%E7%AB%AF/"/>
<category term="Linux" scheme="http://example.com/tags/Linux/"/>
<category term="Nginx" scheme="http://example.com/tags/Nginx/"/>
</entry>
<entry>
<title>搭建ELK日志分析平台</title>
<link href="http://example.com/2021/09/08/ELK/"/>
<id>http://example.com/2021/09/08/ELK/</id>
<published>2021-09-08T09:29:35.000Z</published>
<updated>2024-05-19T04:30:50.021Z</updated>
<content type="html"><![CDATA[<p>使用资料</p><blockquote><ul><li>开源项目 <a href="https://github.com/deviantony/docker-elk.git">https://github.com/deviantony/docker-elk.git</a></li></ul></blockquote><p>目标主机设定</p><blockquote><ul><li>Docker Engine版本17.05+</li><li>Docker Compose版本1.12.0+</li><li>1.5 GB的RAM</li></ul></blockquote><p>默认端口号</p><blockquote><ul><li>5000: Logstash TCP input</li><li>9200: Elasticsearch HTTP</li><li>9300: Elasticsearch TCP transport</li><li>5601: Kibana</li></ul></blockquote><h3 id="一、安装-Docker-Engine"><a href="#一、安装-Docker-Engine" class="headerlink" title="一、安装 Docker Engine"></a>一、安装 Docker Engine</h3><p>因为我服务器没有docker engine,所以我要先安装docker engine</p><h4 id="1-设置仓库"><a href="#1-设置仓库" class="headerlink" title="1.设置仓库"></a>1.设置仓库</h4><p>使用 Docker 仓库进行安装<br>在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。</p><p>安装所需的软件包</p><figure class="highlight haskell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs haskell">$ sudo yum install -y yum-utils \<br> device-mapper-persistent-<span class="hljs-class"><span class="hljs-keyword">data</span> \</span><br> lvm2<br></code></pre></td></tr></table></figure><p>使用以下命令来设置稳定的仓库</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs awk">$ sudo yum-config-manager \<br> --add-repo \<br> https:<span class="hljs-regexp">//</span>download.docker.com<span class="hljs-regexp">/linux/</span>centos/docker-ce.repo<br></code></pre></td></tr></table></figure><h4 id="2-安装-Docker-Engine-Community"><a href="#2-安装-Docker-Engine-Community" class="headerlink" title="2.安装 Docker Engine-Community"></a>2.安装 Docker Engine-Community</h4><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs vim">$ sudo yum install docker-<span class="hljs-keyword">ce</span> docker-<span class="hljs-keyword">ce</span>-cli containerd.io<br></code></pre></td></tr></table></figure><p>安装特定版本的 Docker Engine-Community,在存储库中列出可用版本:<br> <figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs vim"> $ yum <span class="hljs-keyword">list</span> docker-<span class="hljs-keyword">ce</span> --showduplicates | <span class="hljs-keyword">sort</span> -r<br> <br>docker-<span class="hljs-keyword">ce</span>.x86_64 <span class="hljs-number">3</span>:<span class="hljs-number">18.09</span>.<span class="hljs-number">1</span>-<span class="hljs-number">3</span>.el7 docker-<span class="hljs-keyword">ce</span>-stable<br>docker-<span class="hljs-keyword">ce</span>.x86_64 <span class="hljs-number">3</span>:<span class="hljs-number">18.09</span>.<span class="hljs-number">0</span>-<span class="hljs-number">3</span>.el7 docker-<span class="hljs-keyword">ce</span>-stable<br>docker-<span class="hljs-keyword">ce</span>.x86_64 <span class="hljs-number">18.06</span>.<span class="hljs-number">1</span>.<span class="hljs-keyword">ce</span>-<span class="hljs-number">3</span>.el7 docker-<span class="hljs-keyword">ce</span>-stable<br>docker-<span class="hljs-keyword">ce</span>.x86_64 <span class="hljs-number">18.06</span>.<span class="hljs-number">0</span>.<span class="hljs-keyword">ce</span>-<span class="hljs-number">3</span>.el7 docker-<span class="hljs-keyword">ce</span>-stable<br></code></pre></td></tr></table></figure><br> 通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。<br> <figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs vim">$ sudo yum install docker-<span class="hljs-keyword">ce</span>-<span class="hljs-symbol"><VERSION_STRING></span> docker-<span class="hljs-keyword">ce</span>-cli-<span class="hljs-symbol"><VERSION_STRING></span> containerd.io<br></code></pre></td></tr></table></figure></p><h4 id="3-启动-Docker。"><a href="#3-启动-Docker。" class="headerlink" title="3.启动 Docker。"></a>3.启动 Docker。</h4> <figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs powershell"><span class="hljs-variable">$</span> sudo systemctl <span class="hljs-built_in">start</span> docker<br></code></pre></td></tr></table></figure><h4 id="4-安装依赖:"><a href="#4-安装依赖:" class="headerlink" title="4.安装依赖:"></a>4.安装依赖:</h4><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cmake">$ yum <span class="hljs-keyword">install</span> libseccomp-devel<br></code></pre></td></tr></table></figure><h4 id="5-运行docker-hello-world-测试安装结果"><a href="#5-运行docker-hello-world-测试安装结果" class="headerlink" title="5.运行docker hello-world 测试安装结果"></a>5.运行docker hello-world 测试安装结果</h4><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">$ sudo docker <span class="hljs-builtin-name">run</span> hello-world<br></code></pre></td></tr></table></figure><h3 id="二、安装Docker-Compose"><a href="#二、安装Docker-Compose" class="headerlink" title="二、安装Docker Compose"></a>二、安装Docker Compose</h3><p>因为我服务器没有docker compose,所以我要先安装docker compose</p><h4 id="1-下载-Docker-Compose-的当前稳定版本"><a href="#1-下载-Docker-Compose-的当前稳定版本" class="headerlink" title="1.下载 Docker Compose 的当前稳定版本"></a>1.下载 Docker Compose 的当前稳定版本</h4><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">$ sudo curl -L <span class="hljs-string">"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)"</span> -o <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>docker-compose<br></code></pre></td></tr></table></figure><h4 id="2-将可执行权限应用于二进制文件"><a href="#2-将可执行权限应用于二进制文件" class="headerlink" title="2.将可执行权限应用于二进制文件"></a>2.将可执行权限应用于二进制文件</h4><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">$ sudo chmod +x <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>docker-compose<br></code></pre></td></tr></table></figure><h4 id="3-创建软链:"><a href="#3-创建软链:" class="headerlink" title="3.创建软链:"></a>3.创建软链:</h4><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">$ sudo ln -s <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>docker-compose <span class="hljs-regexp">/usr/</span>bin/docker-compose<br></code></pre></td></tr></table></figure><h4 id="4-测试是否安装成功:"><a href="#4-测试是否安装成功:" class="headerlink" title="4.测试是否安装成功:"></a>4.测试是否安装成功:</h4><figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ada">$ docker-compose <span class="hljs-comment">--version</span><br></code></pre></td></tr></table></figure><blockquote><p>遇到问题,原因,解决方案</p></blockquote><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs awk">a.报错:运行docker-compose --version出现:<br><br>Cannot open self <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>docker-compose or archive <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>docker-compose.pkg<br><br><br>b.原因:使用官方文档中所描述的方法:<br><br>curl -L https:<span class="hljs-regexp">//gi</span>thub.com<span class="hljs-regexp">/docker/</span>compose<span class="hljs-regexp">/releases/</span>download<span class="hljs-regexp">/1.14.0-rc2/</span>docker-compose-`uname -s`-`uname -m` <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>docker-compose<br>chmod +x <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>docker-compose<br>安装时,curl下载下来的文件是不完整的<br><br>c.解决方法:<br><br>手动下载:https:<span class="hljs-regexp">//gi</span>thub.com<span class="hljs-regexp">/docker/</span>compose<span class="hljs-regexp">/releases/</span>download<span class="hljs-regexp">/1.14.0-rc2/</span>docker-compose-Linux-x86_64<br>然后将文件上传到 <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span> 文件夹下,然后将其重命名为docker-compose,修改此文件的权限,增加可执行:<br><br>chmod +x <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>docker-compose<br><br>然后再运行$ docker-compose --version 即可<br></code></pre></td></tr></table></figure><h3 id="三、安装Git"><a href="#三、安装Git" class="headerlink" title="三、安装Git"></a>三、安装Git</h3><p>因为我服务器没有git,所以我要先安装git</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs powershell"><span class="hljs-variable">$</span> yum install <span class="hljs-built_in">curl</span><span class="hljs-literal">-devel</span> expat<span class="hljs-literal">-devel</span> gettext<span class="hljs-literal">-devel</span> \<br> openssl<span class="hljs-literal">-devel</span> zlib<span class="hljs-literal">-devel</span><br><br><span class="hljs-variable">$</span> yum <span class="hljs-literal">-y</span> install git<span class="hljs-literal">-core</span><br><br><span class="hljs-variable">$</span> git -<span class="hljs-literal">-version</span><br></code></pre></td></tr></table></figure><h3 id="四、用Docker上安装ELK"><a href="#四、用Docker上安装ELK" class="headerlink" title="四、用Docker上安装ELK"></a>四、用Docker上安装ELK</h3><h4 id="1-创建一个目录"><a href="#1-创建一个目录" class="headerlink" title="1.创建一个目录"></a>1.创建一个目录</h4><p>个人习惯,随意</p><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">mkdir elk<br></code></pre></td></tr></table></figure><h4 id="2-git命令拉取部署elk所需资料"><a href="#2-git命令拉取部署elk所需资料" class="headerlink" title="2.git命令拉取部署elk所需资料"></a>2.git命令拉取部署elk所需资料</h4><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">$ git clone https:<span class="hljs-regexp">//gi</span>thub.com<span class="hljs-regexp">/deviantony/</span>docker-elk.git<br></code></pre></td></tr></table></figure><h4 id="3-进入刚下载的文件夹内"><a href="#3-进入刚下载的文件夹内" class="headerlink" title="3.进入刚下载的文件夹内"></a>3.进入刚下载的文件夹内</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs powershell"><span class="hljs-variable">$</span> <span class="hljs-built_in">cd</span> docker<span class="hljs-literal">-elk</span><br></code></pre></td></tr></table></figure><h4 id="4-通过docker-compose创建并启动容器"><a href="#4-通过docker-compose创建并启动容器" class="headerlink" title="4.通过docker-compose创建并启动容器"></a>4.通过docker-compose创建并启动容器</h4><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs elixir"><span class="hljs-variable">$ </span>docker-compose up -d<br></code></pre></td></tr></table></figure><h4 id="5-通过docker-ps可以看到logstash、elasticsearch、kibana容器已经创建并且启动。"><a href="#5-通过docker-ps可以看到logstash、elasticsearch、kibana容器已经创建并且启动。" class="headerlink" title="5.通过docker ps可以看到logstash、elasticsearch、kibana容器已经创建并且启动。"></a>5.通过docker ps可以看到logstash、elasticsearch、kibana容器已经创建并且启动。</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs powershell"><span class="hljs-variable">$</span> docker <span class="hljs-built_in">ps</span><br></code></pre></td></tr></table></figure><h4 id="6-关于elasticsearch、logstash、kibana的配置都在对应目录下的config文件夹中的-yml文件中"><a href="#6-关于elasticsearch、logstash、kibana的配置都在对应目录下的config文件夹中的-yml文件中" class="headerlink" title="6.关于elasticsearch、logstash、kibana的配置都在对应目录下的config文件夹中的.yml文件中"></a>6.关于elasticsearch、logstash、kibana的配置都在对应目录下的config文件夹中的.yml文件中</h4>]]></content>
<summary type="html">Elastic stack (ELK) on Docker</summary>
<category term="开源" scheme="http://example.com/tags/%E5%BC%80%E6%BA%90/"/>
<category term="后端" scheme="http://example.com/tags/%E5%90%8E%E7%AB%AF/"/>
<category term="ELK" scheme="http://example.com/tags/ELK/"/>
<category term="Docker" scheme="http://example.com/tags/Docker/"/>
</entry>
<entry>
<title>Alibaba Cloud Toolkit使用IntelliJ IDEA部署应用到Win服务器</title>
<link href="http://example.com/2021/08/17/article-init/"/>
<id>http://example.com/2021/08/17/article-init/</id>
<published>2021-08-17T08:39:22.000Z</published>
<updated>2024-05-19T04:30:31.271Z</updated>
<content type="html"><![CDATA[<h3 id="安装需要的工具"><a href="#安装需要的工具" class="headerlink" title="安装需要的工具"></a>安装需要的工具</h3><p>部署linux服务器按照官方文档即可 <a href="https://help.aliyun.com/document_detail/98763.html">https://help.aliyun.com/document_detail/98763.html</a></p><p>教程是win服务器操作</p><h3 id="1-window服务器上安装OpenSSH"><a href="#1-window服务器上安装OpenSSH" class="headerlink" title="1.window服务器上安装OpenSSH"></a>1.window服务器上安装OpenSSH</h3><p><a href="https://github.com/PowerShell/Win32-OpenSSH/releases">https://github.com/PowerShell/Win32-OpenSSH/releases</a></p><p>解压目录下执行官网的步骤</p><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs arduino"><span class="hljs-comment">//a.安装命令</span><br>powershell.exe -ExecutionPolicy Bypass -<span class="hljs-built_in">File</span> install-sshd.ps1<br><br><span class="hljs-comment">//b.设置为自启动模式</span><br>sc config sshd start= <span class="hljs-keyword">auto</span><br><br><span class="hljs-comment">//c.启动服务</span><br>net start sshd<br></code></pre></td></tr></table></figure><h3 id="2-安装插件Alibaba-Cloud-Toolkit-配置"><a href="#2-安装插件Alibaba-Cloud-Toolkit-配置" class="headerlink" title="2.安装插件Alibaba Cloud Toolkit 配置"></a>2.安装插件Alibaba Cloud Toolkit 配置</h3><p>run.bat 脚本 项目端口-需替换,包名-需替换</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs routeros">@echo off & setlocal EnableDelayedExpansion<br> <br><span class="hljs-builtin-name">set</span> obj[0]=项目端口-需替换<br> <br> <br><span class="hljs-builtin-name">set</span> <span class="hljs-attribute">port</span>=0<br><span class="hljs-builtin-name">set</span> <span class="hljs-attribute">pid</span>=0<br> <br><span class="hljs-keyword">for</span> /f <span class="hljs-string">"usebackq delims== tokens=1-2"</span> %%a <span class="hljs-keyword">in</span> (`<span class="hljs-builtin-name">set</span> obj`) <span class="hljs-keyword">do</span> (<br> <span class="hljs-builtin-name">set</span> <span class="hljs-attribute">port</span>=%%b<br> <span class="hljs-keyword">for</span> /f <span class="hljs-string">"tokens=5"</span> %%m <span class="hljs-keyword">in</span> (<span class="hljs-string">'netstat -aon ^| findstr ":%%b"'</span>) <span class="hljs-keyword">do</span> (<br> <span class="hljs-builtin-name">set</span> <span class="hljs-attribute">pid</span>=%%m<br> )<br> <span class="hljs-keyword">if</span> <span class="hljs-string">"!pid!"</span>==<span class="hljs-string">"0"</span> (<br> echo 端口号【!port!】没有占用<br> ) <span class="hljs-keyword">else</span> (<br> echo 端口号【!port!】相关进程以杀死<br> taskkill /f /pid !pid!<br> )<br> <span class="hljs-builtin-name">set</span> <span class="hljs-attribute">pid</span>=0<br>)<br> <br>java -jar -Xms1024m -Xmx1536m -XX:<span class="hljs-attribute">PermSize</span>=128M -XX:<span class="hljs-attribute">MaxPermSize</span>=256M 包名-需替换.jar &<br> <br>pause<br></code></pre></td></tr></table></figure><h3 id="3-执行注意事项"><a href="#3-执行注意事项" class="headerlink" title="3.执行注意事项"></a>3.执行注意事项</h3><p>问题:多模块工程打包出现找不到符号的问题<br>原因:聚合工程下的子工程必须依次执行 clean install,再具体模块package<br>解决:父模块clean install,具体子模块package</p><h3 id="4-操作截图…"><a href="#4-操作截图…" class="headerlink" title="4.操作截图…"></a>4.操作截图…</h3><p><img src="/img/act/img1.png"><br><img src="/img/act/img2.png"><br><img src="/img/act/img3.png"><br><img src="/img/act/img4.png"><br><img src="/img/act/img5.png"></p>]]></content>
<summary type="html">轻量级一键部署,化繁为简</summary>
<category term="Java" scheme="http://example.com/categories/Java/"/>
<category term="开源" scheme="http://example.com/tags/%E5%BC%80%E6%BA%90/"/>
<category term="后端" scheme="http://example.com/tags/%E5%90%8E%E7%AB%AF/"/>
</entry>
<entry>
<title>Hello World</title>
<link href="http://example.com/2021/08/05/hello-world/"/>
<id>http://example.com/2021/08/05/hello-world/</id>
<published>2021-08-05T14:39:22.000Z</published>
<updated>2024-05-19T04:31:13.911Z</updated>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo new <span class="hljs-string">"My New Post"</span><br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo server<br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo generate<br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo deploy<br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
<summary type="html">Quick Start</summary>
<category term="开源" scheme="http://example.com/tags/%E5%BC%80%E6%BA%90/"/>
</entry>
<entry>
<title>🎨 Java 学习笔记</title>
<link href="http://example.com/2018/08/17/old-context/"/>
<id>http://example.com/2018/08/17/old-context/</id>
<published>2018-08-17T13:45:01.000Z</published>
<updated>2024-05-19T04:31:51.500Z</updated>
<content type="html"><![CDATA[<p>🎨 Java 学习笔记</p><h2 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h2><h3 id="面试题"><a href="#面试题" class="headerlink" title="面试题"></a>面试题</h3><ul><li><a href="https://github.com/java-aodeng/JavaGuide/blob/master/README.md">网上看到写得好的文章收集</a></li></ul><h3 id="自动化部署"><a href="#自动化部署" class="headerlink" title="自动化部署"></a>自动化部署</h3><ul><li><a href="https://gitbook.cn/gitchat/activity/5daac87dd39d6a72d183b52c?utm_source=weixinNotification">CI/CD流程以及原理说明</a></li></ul><h3 id="设计模式"><a href="#设计模式" class="headerlink" title="设计模式"></a>设计模式</h3><ul><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/design-pattern/design-pattern1">策略模式</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/design-pattern/design-pattern2">单例模式</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/design-pattern/design-pattern3">工厂模式</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/design-pattern/design-pattern4/learn/DecoratorMode.md">装饰器模式</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/design-pattern/design-pattern5/src/1.md">观察者模式</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/design-pattern/20190717/src/1.md">适配器模式</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/design-pattern/20190718/src/1.md">模板方法模式</a></li></ul><h3 id="SpringBoot"><a href="#SpringBoot" class="headerlink" title="SpringBoot"></a>SpringBoot</h3><ul><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot1-public-pom">SpringBoot(1):公共配置</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot2-generator">SpringBoot(2):generator</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot3-docker">SpringBoot(3):docker部署项目</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot4-file-upload">SpringBoot(4):单一,base64文件上传</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot5-mapper-pagehelper">SpringBoot(5):通用mapper,分页插件</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot6-redis-session">SpringBoot(6):redis缓存数据,session</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot7-timed-task">SpringBoot(7):定时任务</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot8-date-format">SpringBoot(8):格式化日期</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot9-exception-manager">SpringBoot(9):全局异常处理</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot10-email">SpringBoot(10):JavaMailSender邮件服务</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot11-CommandLineRunner">SpringBoot(11):CommandLineRunner-初始化资源</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot12-shiro-redis">SpringBoot(12):redis保存session-shiro登录认证</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot13-starter-test">SpringBoot(13):MockMVC-web单元测试</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot14-thymeleaf">SpringBoot(14):Thymeleaf使用</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot15-quartz">SpringBoot(15):集成 Quartz</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot16-rabbitmq">SpringBoot(16):集成 rabbitmq</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot17-mybatis-plus">SpringBoot(17):集成 mybatis-plus</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot18-jwt-shiro">SpringBoot(18):整合jwt-shiro</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springboot/springboot19-redisson-distributed-locks">SpringBoot(19):集成redisson实现分布式锁</a></li></ul><h3 id="SpringCloud"><a href="#SpringCloud" class="headerlink" title="SpringCloud"></a>SpringCloud</h3><ul><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springcloud/micro-service1-eureka-server">SpringCloud(1):服务注册中心server和服务客户端client</a> / <a href="https://github.com/java-aodeng/hope/tree/master/docs/micro-service1-eureka-client">Eureka client代码</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springcloud/micro-service2-eureka-provider">SpringCloud(2):服务提供者provider</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springcloud/micro-service3-eureka-ribbon">SpringCloud(3):服务消费者ribbon</a></li><li><a href="https://aodeng.cc/archives/khdfzjhs">SpringCloud(4):客户端负载均衡</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springcloud/micro-service5-feign">SpringCloud(5):服务消费者feign与Hystrix断路器容错机制</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/springcloud/micro-service6-hystrixdashboard">SpringCloud(6):Hystrix Dashboard熔断监控面板</a></li></ul><h3 id="服务器运维-工具安装配置"><a href="#服务器运维-工具安装配置" class="headerlink" title="服务器运维-工具安装配置"></a>服务器运维-工具安装配置</h3><ul><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/ubuntu/es.md">Ubuntu下Elasticsearch安装配置</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/ubuntu/Elasticsearch-kibana.md">Ubuntu下搭建Elasticsearch和kibana</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/good-code/%E7%93%A6%E5%8A%9Bwalle2.0-docker%E5%AE%89%E8%A3%85.md">瓦力walle2.0-docker安装</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/Avoid-pit-notes-2021/Yapi%20%E5%86%85%E7%BD%91%E9%83%A8%E7%BD%B2-%E9%81%BF%E5%9D%91.md">Yapi 内网部署-避坑</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/Avoid-pit-notes-2021/win10%E5%AE%89%E8%A3%85mysql-%E9%81%BF%E5%9D%91%E7%AC%94%E8%AE%B02021.md">win10安装mysql-避坑</a></li></ul><h3 id="服务器运维-常用命令、常见问题"><a href="#服务器运维-常用命令、常见问题" class="headerlink" title="服务器运维-常用命令、常见问题"></a>服务器运维-常用命令、常见问题</h3><ul><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/linux/linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.md">Linux常用命令</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/linux/dos2unix.md">dos2unix的使用:对文件进行转换</a></li></ul><h3 id="开发工具"><a href="#开发工具" class="headerlink" title="开发工具"></a>开发工具</h3><ul><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/nginx/nginx1.md">Java 程序员应掌握的 Nginx 实战应用(一)</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/nginx/nginx2.md">Java 程序员应掌握的 Nginx 实战应用(二)</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/git/git1.md">Git常用命令</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/mvn.md">Maven常用(一)</a></li></ul><h3 id="Java-code"><a href="#Java-code" class="headerlink" title="Java code"></a>Java code</h3><ul><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/java/java1.md">Java常用方法(一)</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/json/json1.md">Json返回结果为null属性不显示解决</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/ie/ieExcel1.md">设置ie导出Excel乱码问题</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/Annotation/annotation1.md">常用注解(一)</a></li><li><a href="https://github.com/java-aodeng/hope/blob/master/docs/spring/spring1.md">Spring异步方法</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/good-code/%E5%A4%9A%E7%BA%A7%E8%8F%9C%E5%8D%95%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86%E6%88%90%E6%A0%91.md">多级菜单递归遍历成树</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/good-code/%E5%BE%AE%E4%BF%A1%E8%AE%A4%E8%AF%81.md">微信认证</a></li><li><a href="https://github.com/java-aodeng/hope/tree/master/docs/good-code/%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95.md">雪花算法</a></li></ul>]]></content>
<summary type="html">面试题,自动化部署,设计模式,SpringBoot,SpringCloud,常见问题,工具安装配置笔记</summary>
<category term="Java" scheme="http://example.com/categories/Java/"/>
<category term="后端" scheme="http://example.com/tags/%E5%90%8E%E7%AB%AF/"/>
</entry>
</feed>