-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
381 lines (228 loc) · 192 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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>沫离</title>
<subtitle>凋零那一刹那间的美</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://mroldx.xyz/"/>
<updated>2020-10-15T15:49:02.124Z</updated>
<id>http://mroldx.xyz/</id>
<author>
<name>沫离</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Java 代理模式实现方式</title>
<link href="http://mroldx.xyz/2020/10/04/java/%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/"/>
<id>http://mroldx.xyz/2020/10/04/java/动态代理/</id>
<published>2020-10-04T14:08:10.000Z</published>
<updated>2020-10-15T15:49:02.124Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h1 id="Java-代理模式实现方式,主要有如下五种方法"><a href="#Java-代理模式实现方式,主要有如下五种方法" class="headerlink" title="Java 代理模式实现方式,主要有如下五种方法"></a>Java 代理模式实现方式,主要有如下五种方法</h1><ul><li>静态代理,工程师编辑代理类代码,实现代理模式;在编译期就生成了代理类。</li><li>基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.newProxyInstance动态构建全新的代理类(继承Proxy类,并持有InvocationHandler接口引用 )字节码文件并实例化对象返回。(jdk动态代理是由java内部的反射机制来实例化代理对象,并代理的调用委托类方法)</li><li>基于CGlib 动态代理模式 基于继承被代理类生成代理子类,不用实现接口。只需要被代理类是非final 类即可。(cglib动态代理底层是借助asm字节码技术</li><li>基于 Aspectj 实现动态代理(修改目标类的字节,织入代理的字节,在程序编译的时候 插入动态代理的字节码,不会生成全新的Class )</li><li>基于 instrumentation 实现动态代理(修改目标类的字节码、类装载的时候动态拦截去修改,基于javaagent) <code>-javaagent:spring-instrument-4.3.8.RELEASE.jar</code> (类装载的时候 插入动态代理的字节码,不会生成全新的Class )</li></ul><h2 id="Notes"><a href="#Notes" class="headerlink" title="Notes"></a>Notes</h2><ul><li>委托类 即指的是代理模式中的被代理对象</li><li>代理类 指的是生成的代表委托类的一个角色</li></ul><h2 id="静态代理实现"><a href="#静态代理实现" class="headerlink" title="静态代理实现"></a>静态代理实现</h2><p>静态代理是代理类在编译期间就创建好了,不是编译器生成的代理类,而是手动创建的类。在编译时就已经将接口,被代理类,代理类等确定下来。,软件设计中所指的代理一般是指静态代理,也就是在代码中显式指定的代理。</p><h2 id="动态代理类-基于接口实现"><a href="#动态代理类-基于接口实现" class="headerlink" title="动态代理类(基于接口实现)"></a>动态代理类(基于接口实现)</h2><p>静态代理是代理类在代码运行前已经创建好,并生成class文件;动态代理类 是代理类在程序运行时创建的代理模式。</p><p>动态代理类的代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。 想想你有100个静态代理类,现在有一个需求,每个代理类都需要新增一个处理逻辑,你需要打开100个代理类在每个代理方法里面新增处理逻辑吗? 有或者代理类有5个方法,每个方法都需要新增一个处理逻辑, 你需要在每个方法都手动新增处理逻辑吗? 想想就挺无趣的。动态代理类帮你一键搞定。</p><h3 id="基于JDK技术-动态代理类技术核心-Proxy类和一个-InvocationHandler-接口"><a href="#基于JDK技术-动态代理类技术核心-Proxy类和一个-InvocationHandler-接口" class="headerlink" title="基于JDK技术 动态代理类技术核心 Proxy类和一个 InvocationHandler 接口"></a>基于JDK技术 动态代理类技术核心 Proxy类和一个 InvocationHandler 接口</h3><p>java的java.lang.reflect包下提供了Proxy类和一个 InvocationHandler 接口,这个类Proxy定义了生成JDK动态代理类的方法 <code>getProxyClass(ClassLoader loader,Class... interfaces)</code>生成动态代理类,返回class实例代表一个class文件。可以保存该 class 文件查看jdk生成的代理类文件长什么样</p><p>该生成的动态代理类继承Proxy类,(重要特性) ,并实现公共接口。</p><p>InvocationHandler这个接口 是被动态代理类回调的接口,我们所有需要增加的针对委托类的统一处理逻辑都增加到invoke 方法里面在调用委托类接口方法之前或之后 结束战斗。</p><p>我们可以对 InvocationHandler 看做一个中介类,中介类持有一个被代理对象,被Proxy类回调。在invoke方法中调用了被代理对象的相应方法。通过聚合方式持有被代理对象的引用,把客户端对invoke的调用最终都转为对被代理对象的调用。</p><p>客户端代码通过代理类引用调用接口方法时,通过代理类关联的中介类对象引用来调用中介类对象的invoke方法,从而达到代理执行被代理对象的方法。也就是说,动态代理Proxy类提供了模板实现,对外提供扩展点,外部通过实现InvocationHandler接口将被代理类纳入JDK代理类Proxy。</p><h4 id="一个典型的基于JDK动态代理创建对象过程可分为以下四个步骤:"><a href="#一个典型的基于JDK动态代理创建对象过程可分为以下四个步骤:" class="headerlink" title="一个典型的基于JDK动态代理创建对象过程可分为以下四个步骤:"></a>一个典型的基于JDK动态代理创建对象过程可分为以下四个步骤:</h4><p>1、通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(…);</p><p>2、通过为Proxy类指定ClassLoader对象和一组interface代理类需要实现的接口,创建动态代理类类文件,默认JDK并不会保存这个文件到文件中;可以保存起来观察生成的代理类结构<code>Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});</code></p><p>3、通过上面新建的代理clazz的反射机制获取动态代理类的一个构造函数,其构造函数入参类型是调用处理器接口(<code>IvocationHandler</code>)类型 <code>Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});</code></p><p>4、通过构造函数实例创建代理类实例,此时需将调用处理器对象作为参数被传入 Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler)); 为了简化对象创建过程,Proxy类中的newInstance工具方法封装了2~4,只需两步即可完成代理对象的创建。</p><h4 id="JDK动态代理特点总结"><a href="#JDK动态代理特点总结" class="headerlink" title="JDK动态代理特点总结"></a>JDK动态代理特点总结</h4><ul><li>生成的代理类:$Proxy0 extends Proxy implements Person,我们看到代理类继承了Proxy类,Java的继承机制决定了JDK动态代理类们无法实现对 类 的动态代理。所以也就决定了java动态代理只能对接口进行代理,</li><li>每个生成的动态代理实例都会关联一个调用处理器对象,可以通过 Proxy 提供的静态方法 getInvocationHandler 去获得代理类实例的调用处理器对象。在代理类实例上调用其代理的接口中所声明的方法时,这些方法最终都会由调用处理器的 invoke 方法执行</li><li>代理类的根类 java.lang.Object 中有三个方法也同样会被分派到调用处理器的 invoke 方法执行,它们是 hashCode,equals 和 toString,可能的原因有:一是因为这些方法为 public 且非 final 类型,能够被代理类覆盖; 二是因为这些方法往往呈现出一个类的某种特征属性,具有一定的区分度,所以为了保证代理类与委托类对外的一致性,这三个方法也应该被调用处理器分派到委托类执行。</li></ul><h4 id="JDK动态代理不足"><a href="#JDK动态代理不足" class="headerlink" title="JDK动态代理不足"></a>JDK动态代理不足</h4><p>JDK动态代理的代理类字节码在创建时,需要实现业务实现类所实现的接口作为参数。如果业务实现类是没有实现接口而是直接定义业务方法的话,就无法使用JDK动态代理了。(JDK动态代理重要特点是代理接口) 并且,如果业务实现类中新增了接口中没有的方法,这些方法是无法被代理的(因为无法被调用)。</p><p>动态代理只能对接口产生代理,不能对类产生代理</p><h3 id="基于CGlib-技术动态代理代理类实现-基于继承"><a href="#基于CGlib-技术动态代理代理类实现-基于继承" class="headerlink" title="基于CGlib 技术动态代理代理类实现 (基于继承)"></a>基于CGlib 技术动态代理代理类实现 (基于继承)</h3><p>Cglib是针对类来实现代理的,他的原理是对代理的目标类生成一个子类,并覆盖其中方法实现增强,因为底层是基于创建被代理类的一个子类,所以它避免了JDK动态代理类的缺陷。</p><p>但因为采用的是继承,所以不能对final修饰的类进行代理。final修饰的类不可继承。</p><h4 id="Cglib-总结"><a href="#Cglib-总结" class="headerlink" title="Cglib 总结"></a>Cglib 总结</h4><ul><li>CGlib可以传入接口也可以传入普通的类,接口使用实现的方式,普通类使用会使用继承的方式生成代理类.</li><li>由于是继承方式,如果是 static方法,private方法,final方法等描述的方法是不能被代理的</li><li>做了方法访问优化,使用建立方法索引的方式避免了传统JDK动态代理需要通过Method方法反射调用.</li><li>提供callback 和filter设计,可以灵活地给不同的方法绑定不同的callback。编码更方便灵活。</li><li>CGLIB会默认代理Object中equals,toString,hashCode,clone等方法。比JDK代理多了clone。</li></ul><h2 id="静态代理-基于JDK动态代理-基于Cglib-动态代理"><a href="#静态代理-基于JDK动态代理-基于Cglib-动态代理" class="headerlink" title="静态代理 基于JDK动态代理 基于Cglib 动态代理"></a>静态代理 基于JDK动态代理 基于Cglib 动态代理</h2><p>静态代理是通过在代码中显式编码定义一个业务实现类的代理类,在代理类中对同名的业务方法进行包装,用户通过代理类调用被包装过的业务方法;</p><p>JDK动态代理是通过接口中的方法名,在动态生成的代理类中调用业务实现类的同名方法;</p><p>CGlib动态代理是通过继承业务类,生成的动态代理类是业务类的子类,通过重写业务方法进行代理;</p><p>静态代理在编译时产生class字节码文件,可以直接使用,效率高。动态代理必须实现InvocationHandler接口,通过invoke调用被委托类接口方法是通过反射方式,比较消耗系统性能,但可以减少代理类的数量,使用更灵活。 cglib代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但cglib会继承目标对象,需要重写方法,所以目标对象不能为final类。</p><h3 id="AspectJ-实现-AOP-效果"><a href="#AspectJ-实现-AOP-效果" class="headerlink" title="AspectJ 实现 AOP 效果"></a>AspectJ 实现 AOP 效果</h3><p>AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类:</p><ul><li>静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段通过AOP框架指令生成 AOP 代理类,因此也称为编译时增强;还有一种静态代理是编写代码实现不用工具;这种方式一般是代理模式会使用。</li><li>动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。</li></ul><h2 id="AOP-实现案例"><a href="#AOP-实现案例" class="headerlink" title="AOP 实现案例"></a>AOP 实现案例</h2><p>AOP的源码中用到了两种动态代理来实现拦截切入功能:</p><p><strong>- jdk动态代理</strong></p><ul><li>jdk动态代理是由java内部的反射机制来实现的,</li></ul><p><strong>cglib动态代理。</strong></p><ul><li>cglib动态代理底层则是借助asm来实现的。</li></ul><p>两种方法同时存在,各有优劣。</p><p> 总的来说,反射机制在生成类的过程中比较高效,执行时候通过反射调用委托类接口方法比较慢;而asm在生成类之后的相关代理类执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。 </p><p>还有一点必须注意:<strong>jdk动态代理的应用前提,必须是委托类基于统一的接口。</strong>如果没有上述前提,jdk动态代理不能应用。 由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。</p><p>实现AOP关键特点是定义好两个角色 切点 和 切面 。 </p><p>代理模式中被代理类 委托类处于切点角色,需要添加的其他比如 校验逻辑,事务,审计逻辑 属于非功能实现逻辑通过 切面类定义的方法插入进去。</p><h2 id="动态代理-使用场景"><a href="#动态代理-使用场景" class="headerlink" title="动态代理 使用场景"></a>动态代理 使用场景</h2><ul><li>日志集中打印</li><li>事务</li><li>权限管理</li><li>AOP</li></ul>]]></content>
<summary type="html">
Java 代理模式实现方式
</summary>
<category term="工具" scheme="http://mroldx.xyz/tags/%E5%B7%A5%E5%85%B7/"/>
</entry>
<entry>
<title>centos7使用Minikube"快速搭建"出Kubernetes本地实验环境(踩坑集锦及解决方案)</title>
<link href="http://mroldx.xyz/2020/09/04/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/kub/"/>
<id>http://mroldx.xyz/2020/09/04/持续集成/kub/</id>
<published>2020-09-04T11:08:10.000Z</published>
<updated>2020-09-13T14:10:57.479Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><p>先决条件(先假设你做完这两步骤)</p><ul><li>检查Linux是否支持虚拟化,验证输出是否为非空<a href="https://www.cnblogs.com/zhouhaibing/p/8207410.html" target="_blank" rel="noopener">如何开启虚拟化</a></li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -E --color <span class="string">'vmx|svm'</span> /proc/cpuinfo</span><br></pre></td></tr></table></figure><ul><li>安装 <a href="https://kubernetes.io/docs/tasks/kubectl/install/?spm=a2c6h.12873639.0.0.ab202043sZMeE5" target="_blank" rel="noopener">kubectl</a></li></ul><p>判断是否成功安装kubectl</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubectl version</span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/20200913214509575.png#pic_center" alt="在这里插入图片描述"></p><h4 id="安装Minikube"><a href="#安装Minikube" class="headerlink" title="安装Minikube"></a>安装Minikube</h4><p> <strong>Linux</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -Lo minikube https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.13.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/</span><br></pre></td></tr></table></figure><h3 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">minikube start</span><br></pre></td></tr></table></figure><p>当你执行minkube start会出现这个错误,大概意思是需要加个 –driver=none的参数</p><h3 id="错误一"><a href="#错误一" class="headerlink" title="错误一:"></a>错误一:</h3><ul><li><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">* The "docker" driver should not be used with root privileges.</span><br><span class="line">* If you are running minikube within a VM, consider using --driver=none:</span><br><span class="line">* https://minikube.sigs.k8s.io/docs/reference/drivers/none/</span><br><span class="line"></span><br><span class="line">X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.</span><br></pre></td></tr></table></figure></li></ul><p>加了参数以后那就恐怖了</p><pre><code>[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/1.[WARNING Swap]: running with swap on is not supported. Please disable swap2.[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service' 71489 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`</code></pre><h3 id="警告1-关闭Swap缓冲区-running-with-swap-on-is-not-supported-Please-disable-swap"><a href="#警告1-关闭Swap缓冲区-running-with-swap-on-is-not-supported-Please-disable-swap" class="headerlink" title="警告1.关闭Swap缓冲区(running with swap on is not supported. Please disable swap)"></a>警告1.关闭Swap缓冲区(running with swap on is not supported. Please disable swap)</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"># 关闭Swap,机器重启后不生效</span><br><span class="line"></span><br><span class="line">swapoff -a</span><br><span class="line"></span><br><span class="line"># 修改/etc/fstab永久关闭Swap</span><br><span class="line"></span><br><span class="line">cp -p /etc/fstab /etc/fstab.bak$(date '+%Y%m%d%H%M%S')</span><br><span class="line"></span><br><span class="line"># Redhat</span><br><span class="line"></span><br><span class="line">sed -i "s/\/dev\/mapper\/rhel-swap/\#\/dev\/mapper\/rhel-swap/g" /etc/fstab</span><br><span class="line"></span><br><span class="line"># CentOS</span><br><span class="line"></span><br><span class="line">sed -i "s/\/dev\/mapper\/centos-swap/\#\/dev\/mapper\/centos-swap/g" /etc/fstab</span><br><span class="line"></span><br><span class="line"># 修改后重新挂载全部挂载点</span><br><span class="line"></span><br><span class="line">mount -a</span><br><span class="line"></span><br><span class="line"># 查看Swap</span><br><span class="line"></span><br><span class="line">free -m</span><br><span class="line">cat /proc/swaps</span><br><span class="line">systemctl daemon-reload</span><br><span class="line">systemctl restart kubelet</span><br></pre></td></tr></table></figure><h3 id="警告2-kubelet-service-is-not-enabled-please-run-‘systemctl-enable-kubelet-service’"><a href="#警告2-kubelet-service-is-not-enabled-please-run-‘systemctl-enable-kubelet-service’" class="headerlink" title="警告2.kubelet service is not enabled, please run ‘systemctl enable kubelet.service’"></a>警告2.kubelet service is not enabled, please run ‘systemctl enable kubelet.service’</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">//启动kubelet服务</span><br><span class="line">systemctl enable kubelet.service</span><br></pre></td></tr></table></figure><h3 id="错误3-FileContent–proc-sys-net-bridge-bridge-nf-call-iptables-proc-sys-net-bridge-bridge-nf-call-iptables-contents-are-not-set-to-1"><a href="#错误3-FileContent–proc-sys-net-bridge-bridge-nf-call-iptables-proc-sys-net-bridge-bridge-nf-call-iptables-contents-are-not-set-to-1" class="headerlink" title="错误3. FileContent–proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1"></a>错误3. FileContent–proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables</span><br></pre></td></tr></table></figure><p>现在终于没啥错了</p><h2 id="启动minikube"><a href="#启动minikube" class="headerlink" title="启动minikube"></a><strong>启动minikube</strong></h2><p>为了访问海外的资源,阿里云提供了一系列基础设施,请按照如下参数进行配置。其中常见参数</p><ul><li><code>--driver=***</code> 从1.5.0版本开始,Minikube缺省使用本地最好的驱动来创建Kubernetes本地环境,测试过的版本 <code>docker</code>, <code>kvm</code></li><li><code>--image-mirror-country cn</code> 将缺省利用 registry.cn-hangzhou.aliyuncs.com/google_containers 作为安装Kubernetes的容器镜像仓库 (阿里云版本可选)</li><li><code>--iso-url=***</code> 利用阿里云的镜像地址下载相应的 .iso 文件 (阿里云版本可选)</li><li><code>--registry-mirror=***</code>为了拉取Docker Hub镜像,需要为 Docker daemon 配置镜像加速,参考<a href="https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors" target="_blank" rel="noopener">阿里云镜像服务</a></li><li><code>--cpus=2</code>: 为minikube虚拟机分配CPU核数</li><li><code>--memory=2048mb</code>: 为minikube虚拟机分配内存数</li><li><code>--kubernetes-version=***</code>: minikube 虚拟机将使用的 kubernetes 版本</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">minikube start --image-mirror-country cn --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.5.0.iso --registrymirror=https://pe3ox7bd.mirror.aliyuncs.com --driver="none" --memory=2048</span><br></pre></td></tr></table></figure><p>不出意外应该是这样的</p><p><img src="https://img-blog.csdnimg.cn/20200913214553676.png" alt="在这里插入图片描述"></p><h2 id="启动minikube-dashboard"><a href="#启动minikube-dashboard" class="headerlink" title="启动minikube dashboard"></a>启动minikube dashboard</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">minikube dashboard</span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/20200913214649542.png#pic_center" alt="在这里插入图片描述"></p><p>dashboard 给出了一个访问地址,可以看出这个地址和端口只是k8s的虚拟地址,只能本机访问如果要想从电脑上访问服务器上虚拟机上的dashboard 你应该</p><h3 id="添加集群对外访问代理:"><a href="#添加集群对外访问代理:" class="headerlink" title="添加集群对外访问代理:"></a>添加集群对外访问代理:</h3><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nohub kubectl proxy --port=[需要暴露的端口号] --address=<span class="string">'[服务器IP]'</span> --accept-hosts=<span class="string">'^[外部访问服务器的IP]$'</span> ><span class="regexp">/dev/</span><span class="literal">null</span> <span class="number">2</span>>&<span class="number">1</span>&</span><br></pre></td></tr></table></figure><p>例如:</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nohup kubectl proxy --port=<span class="number">41111</span> --address=<span class="string">'192.168.56.165'</span> --accept-hosts=<span class="string">'^192.168.56.165$'</span> ><span class="regexp">/dev/</span><span class="literal">null</span> <span class="number">2</span>>&<span class="number">1</span>&</span><br></pre></td></tr></table></figure><p>访问地址为:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://192.168.56.165:41111/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/overview?namespace=default</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
centos7使用Minikube"快速搭建"出Kubernetes本地实验环境(踩坑集锦及解决方案)
</summary>
<category term="工具" scheme="http://mroldx.xyz/tags/%E5%B7%A5%E5%85%B7/"/>
</entry>
<entry>
<title>零基础使用小米球ngrok来快速实现内网穿透</title>
<link href="http://mroldx.xyz/2020/08/04/commons/%E5%B0%8F%E7%B1%B3%E7%90%83%E5%BF%AB%E9%80%9F%E5%AE%9E%E7%8E%B0%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/"/>
<id>http://mroldx.xyz/2020/08/04/commons/小米球快速实现内网穿透/</id>
<published>2020-08-04T11:08:10.000Z</published>
<updated>2020-08-16T02:46:43.575Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h1 id="零基础使用小米球ngrok来快速实现内网穿透"><a href="#零基础使用小米球ngrok来快速实现内网穿透" class="headerlink" title="零基础使用小米球ngrok来快速实现内网穿透"></a>零基础使用小米球ngrok来快速实现内网穿透</h1><h3 id="关于ngrok及小米球ngrok"><a href="#关于ngrok及小米球ngrok" class="headerlink" title="关于ngrok及小米球ngrok"></a>关于ngrok及小米球ngrok</h3><p> ngrok 服务可以分配给你一个域名让你本地的web项目提供给外网访问,特别适合向别人展示你本机的web demo 以及调试一些远程的API (比如微信公众号,企业号的开发) </p><p>注意:本服务旨在给程序猿们调试本地的web项目,免去部署环节。切不可用于生产环境以及作为非法服务!</p><p>官网:<a href="http://ngrok.ciqiuwl.cn/" target="_blank" rel="noopener">http://ngrok.ciqiuwl.cn/</a></p><p>1.注册小米球ngrok获取token(免费)</p><p>前往小米球官网注册一下账号</p><p><a href="https://manager.xiaomiqiu.com/reg(注册地址)" target="_blank" rel="noopener">https://manager.xiaomiqiu.com/reg(注册地址)</a><br><img src="https://img-blog.csdnimg.cn/20200805223428459.jpg" alt="在这里插入图片描述"></p><p>注册完登录</p><p>登录地址</p><p><a href="https://manager.xiaomiqiu.com/login" target="_blank" rel="noopener">https://manager.xiaomiqiu.com/login</a></p><p><img src="https://img-blog.csdnimg.cn/20200805223453972.png" alt="在这里插入图片描述"></p><p>登录完成后是这个界面,点击账号管理—-》我的账户,复制一下这个小米球token,注册这一步就算完成。</p><p><img src="https://img-blog.csdnimg.cn/20200805223519955.png" alt="在这里插入图片描述"></p><p>接下来,我们下载一下小米球ngrok工具链接如下,</p><p>windows64位安装包, <a href="https://pan.baidu.com/s/1aks8uJx0s9XrDj7oMsvqmw" target="_blank" rel="noopener">https://pan.baidu.com/s/1aks8uJx0s9XrDj7oMsvqmw</a> 提取码 74ex<br>windows32位安装包, <a href="https://pan.baidu.com/s/1Qt8_zwNlbsVqTeClxhzN7w" target="_blank" rel="noopener">https://pan.baidu.com/s/1Qt8_zwNlbsVqTeClxhzN7w</a> 提取码 e4eg</p><p>也可以去 <a href="https://manager.xiaomiqiu.com/index(小米球首页下载其他版本的安装包)" target="_blank" rel="noopener">https://manager.xiaomiqiu.com/index(小米球首页下载其他版本的安装包)</a></p><p>下载完之后,解压到你喜欢的目录</p><p><img src="https://img-blog.csdnimg.cn/20200805223541140.png" alt="在这里插入图片描述"></p><p>编辑ngrok.conf文件,在配置文件里替换你注册后获得的token<br><img src="https://img-blog.csdnimg.cn/20200805223635985.png" alt="在这里插入图片描述"></p><p>修改完毕后,双击该文件夹里面的“小米球Ngrok一键启动工具.bat”脚本,会出现这个界面</p><p><img src="https://img-blog.csdnimg.cn/20200805223655873.png" alt="在这里插入图片描述"></p><p>隧道名称就是上面配置文件里面的httptun,httpstun等等。</p><p>成功的话就会出现类似的界面,<br><img src="https://img-blog.csdnimg.cn/20200805225551404.png" alt="在这里插入图片描述"></p><p>你在公网上输入 <a href="http://mroldx.ngrok2.xiaomiqiu.cn" target="_blank" rel="noopener">http://mroldx.ngrok2.xiaomiqiu.cn</a> 这个就能成功跳转到你的本机的127.0.0.1:8888端口下面我们来尝试一下。<br>启动一个java项目,指定为8888端口。<br><img src="https://img-blog.csdnimg.cn/20200805223726467.png" alt="在这里插入图片描述"><br>启动完成后在浏览器随便输入一个controller的接口数据比如 我本机的</p><p><img src="https://img-blog.csdnimg.cn/20200805223800366.png" alt="在这里插入图片描述"></p><p><a href="http://127.0.0.1:8888/system/osmenu/list" target="_blank" rel="noopener">http://127.0.0.1:8888/system/osmenu/list</a></p><p>换成公网应该是</p><p><a href="http://mroldx.ngrok2.xiaomiqiu.cn/system/osmenu/list" target="_blank" rel="noopener">http://mroldx.ngrok2.xiaomiqiu.cn/system/osmenu/list</a></p><p>你会发现都是返回一样的数据,这就实现了内网穿透。</p>]]></content>
<summary type="html">
零基础使用小米球ngrok来快速实现内网穿透
</summary>
<category term="工具" scheme="http://mroldx.xyz/tags/%E5%B7%A5%E5%85%B7/"/>
</entry>
<entry>
<title>VPN,Shadowsocks/ShadowsocksR/V2ray/Trojan代理的工作原理</title>
<link href="http://mroldx.xyz/2020/07/04/software/%E6%B5%85%E8%B0%88VPN%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86/"/>
<id>http://mroldx.xyz/2020/07/04/software/浅谈VPN的工作原理/</id>
<published>2020-07-04T11:08:10.000Z</published>
<updated>2020-07-29T08:53:16.500Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h1 id="VPN-Shadowsocks-ShadowsocksR-V2ray-Trojan代理的工作原理"><a href="#VPN-Shadowsocks-ShadowsocksR-V2ray-Trojan代理的工作原理" class="headerlink" title="VPN,Shadowsocks/ShadowsocksR/V2ray/Trojan代理的工作原理"></a>VPN,Shadowsocks/ShadowsocksR/V2ray/Trojan代理的工作原理</h1><h2 id="一-VPN翻墙的实现方式及弊端"><a href="#一-VPN翻墙的实现方式及弊端" class="headerlink" title="一.VPN翻墙的实现方式及弊端"></a>一.VPN翻墙的实现方式及弊端</h2><h3 id="1-1实现方式"><a href="#1-1实现方式" class="headerlink" title="1.1实现方式"></a>1.1实现方式</h3><p> 本地网络上的这个计算机发送一个请求建立加密通道的数据包接入骨干网域名解析,发现我访问的并非Google或者是Facebook,而是一台我允许访问的这个国外的服务器,那么GFW放行数据包,经过中转服务器解密出我真实想要访问的地址,转到Google,然后再返回数据给中转服务器在经过强再转回本地计算机你会发现,这样一来就完美规避掉了JGFW的一切有效探测手段。</p><p><img src="/img/image-20200707161738317.png"></p><h3 id="1-2弊端"><a href="#1-2弊端" class="headerlink" title="1.2弊端"></a>1.2弊端</h3><p><img src="/img/image-20200707161956958.png"></p><p>二. Shadowsocks SSR v2Ray等方式运行原理</p><p> 先发出一个数据包给本地的Shadowsocks服务器发送数据加密请求,这里稍微等一下,这里说的这个本地服务器能指的是你电脑上或者手机上装的这个ssr,v2ray等软件,当然这个本地服务器也可以是你的翻墙路由器或者是软路由,这些硬件形式可以有很多种啊,但是逻辑是一样的,,因为在本地所以不过墙,而且瞬间能完成加密,然后发送加密数据,经过DNS解析,通过骨干网到达国际出口J。GFW因为探测不到具有特别明显特征的这个流量,所以也放行,到达你的远程中转服务器,也就是你的远程的Shadowsocks服务器,这个可以是你自己的VPS,也可以是机场的服务器,然后解密里的数据,然后转发到Google得到回应,数据发送回来,经过远程中转服务器的加密发送加密数据到达GFW;因为探测不到具有非常特别明显的流量也不是HTTP的明文数据,所以GFW无法嗅探到敏感词,只好放行到达你的本地设置的服务器。</p><p><img src="/img/image-20200707162118407.png"></p><h3 id="1-3全局的概念,何为全局"><a href="#1-3全局的概念,何为全局" class="headerlink" title="1.3全局的概念,何为全局"></a>1.3全局的概念,何为全局</h3><p>代表作为翻墙软件本身所接管到的这个本机所有的流量,全部转发到代理服务器</p><h3 id="1-4-开了全局是否一定就是全局?"><a href="#1-4-开了全局是否一定就是全局?" class="headerlink" title="1.4 开了全局是否一定就是全局?"></a>1.4 开了全局是否一定就是全局?</h3><p>有些软件跑在系统层权限更高,甚至不遵循这个操作系统的这个代理规则根本就不把这个通讯流量交给翻墙软件接管了,代表性的有UWP应用是,你Windows应用程序商店下载的这些软件,这都是uwp,还有较多的比方说银行,游戏类的,都不遵循系统代理的这个设置所以就算你打开全局,虽然大部分遵循这个系统,代理规则的这个应用和服务,所以你打开了全局也没用,总知很多游戏的通讯协议是TCP,UDP,,自然就无法加速这里提到的是绝大多数。</p><h3 id="1-5各类ssr-v2ray等线路详解"><a href="#1-5各类ssr-v2ray等线路详解" class="headerlink" title="1.5各类ssr,v2ray等线路详解"></a>1.5各类ssr,v2ray等线路详解</h3><p>大致有:CN2/BGP/IPLC/GCP/AWS/Azure</p><p>QoS :服务质量,cn2优点之一</p><p>CN2:中国电信下一代承载网络, cn2 gt ,cn2 gia 价格昂贵</p><p>BGp机房:多线接入,能够自动识别你所用的网络类型并且自动使用最合适服务器得线路,自动切换网络通畅的服务器</p><p>iplc:国际私有专线,专线价格昂贵 iplc不过GFW审查</p><h2 id="二-各种协议加密算法"><a href="#二-各种协议加密算法" class="headerlink" title="二.各种协议加密算法"></a>二.各种协议加密算法</h2><p>AES chacha20</p><p>RC4MD5</p><p>VMess </p><p>websocket+TLS</p>]]></content>
<summary type="html">
VPN,Shadowsocks/ShadowsocksR/V2ray/Trojan代理的工作原理
</summary>
<category term="工具" scheme="http://mroldx.xyz/tags/%E5%B7%A5%E5%85%B7/"/>
</entry>
<entry>
<title>从字节码说起,分析类加载的过程,并结合内存布局,讲解对象创建与垃圾回收</title>
<link href="http://mroldx.xyz/2020/05/15/java/%E8%B5%B0%E8%BF%9BJVM/"/>
<id>http://mroldx.xyz/2020/05/15/java/走进JVM/</id>
<published>2020-05-15T07:08:10.000Z</published>
<updated>2020-06-14T05:54:08.643Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h1 id="走进JVM"><a href="#走进JVM" class="headerlink" title="走进JVM"></a>走进JVM</h1><p>从字节码说起,分析类加载的过程,并结合内存布局,讲解对象创建与垃圾回收</p><h2 id="一-字节码"><a href="#一-字节码" class="headerlink" title="一.字节码"></a>一.字节码</h2><h3 id="1-加载或存储指令"><a href="#1-加载或存储指令" class="headerlink" title="1.加载或存储指令"></a>1.加载或存储指令</h3><p>在某个栈帧中,通过指令操作数据在虚拟机栈的局部变量表与操作栈之间来回传输,常用指令如下:</p><p> (1) 将局部变量加载到操作栈中。如ILOAD (将int类型的局部变量压入栈) 和ALOAD (将对象引用的局部变量压入栈)等。</p><p> (2)从操作栈顶存储到局部变量表。如ISTORE、 ASTORE等。</p><p> (3)将常量加载到操作栈顶,这是极为高频使用的指令。如ICONST、<br> BIPUSH、SIPUSH、LDC等。<br> ●ICONST加载的是-1 ~ 5的数( ICONST与BIPUSH的加载界限)。<br> ●BIPUSH,即Byte Immediate PUSH,加载-128 ~ 127 之间的数。<br> ●SIPUSH,即Short Immediate PUSH,加载-32768 ~ 32767之间的数。<br> ●LDC,即Load Constant, 在-2147483648 ~ 2147483647或者是字符串时,JVM采用LDC指令压入栈中。<br><img src="/img/加载.png"></p><h3 id="2-运算指令"><a href="#2-运算指令" class="headerlink" title="2.运算指令"></a>2.运算指令</h3><p>对两个操作栈帧.上的值进行运算,并把结果写入操作栈顶,如IADD、IMUL等。</p><h3 id="3-类型转换指令"><a href="#3-类型转换指令" class="headerlink" title="3.类型转换指令"></a>3.类型转换指令</h3><p>显式转换两种不同的数值类型。如I2L、D2F等。</p><h3 id="4-对象创建与访问指令"><a href="#4-对象创建与访问指令" class="headerlink" title="4.对象创建与访问指令"></a>4.对象创建与访问指令</h3><p>根据类进行对象的创建、初始化、方法调用相关指令,常见指令如下:<br> (1)创建对象指令。如NEW、NEWARRAY等。<br> (2)访问属性指令。如GETFIELD、 PUTFIELD、 GETSTATIC等。<br> (3)检查实例类型指令。如INSTANCEOF、 CHECKCAST等。</p><h3 id="5-操作栈管理指令"><a href="#5-操作栈管理指令" class="headerlink" title="5.操作栈管理指令"></a>5.操作栈管理指令</h3><p>JVM提供了直接控制操作栈的指令,常见指令如下:<br>(1 )出栈操作。如POP即一个元素,POP2即两个元素。<br>(2)复制栈项元素并压入栈。如DUP。</p><h3 id="6-方法调用与返回指令"><a href="#6-方法调用与返回指令" class="headerlink" title="6.方法调用与返回指令"></a>6.方法调用与返回指令</h3><p>常见指令如下:<br>( 1 ) INVOKEVIRTUAL指令:调用对象的实例方法。<br>(2 ) INVOKESPECIAL指令:调用实例初始化方法、私有方法、父类方法等。<br>(3) INVOKESTATIC指令: 调用类静态方法。<br>(4) RETURN指令:返回VOID类型。</p><h3 id="7-同步指令"><a href="#7-同步指令" class="headerlink" title="7.同步指令"></a>7.同步指令</h3><p>JVM使用方法结构中的ACC_ SYNCHRONIZED标志同步方法,指令集中有.MONITORENTER和MONITOREXIT支持synchronized语义。<br>除字节码指令外,还包含一些额外信息。例如,LINENUMBER存储了字节码与源码行号的对应关系,方便调试的时候正确地定位到代码的所在行;<br>LOCALVARIABLE存储当前方法中使用到的局部变量表。</p><p><img src="/img/字节码.png"></p><p> 字节码必须通过类加载过程加载到JVM环境后,才可以执行。执行有三种模式:第一,解释执行;第二,JIT编译执行;第三,JIT编译与解释混合执行(主流JVM .默认执行模式)。 混合执行模式的优势在于解释器在启动时先解释执行,省去编译时间。随着时间推进,JVM通过热点代码统计分析,识别高频的方法调用、循环体、公共模块等,基于强大的JIT动态编译技术,将热点代码转换成机器码,直接交给CPU执行。JIT的作用是将Java字节码动态地编译成可以直接发送给处理器指令执行的机器码。</p><p><img src="/img/方法调用.png"></p><h2 id="二-类加载过程"><a href="#二-类加载过程" class="headerlink" title="二.类加载过程"></a>二.类加载过程</h2><p>在冯.诺依曼定义的计算机模型中,任何程序都需要加载到内存才能与CPU进行交流。字节码.class文件同样需要加载到内存中,才可以实例化类。“ 兵马未动,<br>粮草先行。”ClassLoader正是准备粮草的先行军,它的使命就是提前加载.class 类文件到内存中。在加载类时,使用的是Parents Delegation Model,译为双亲委派模型,某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,<strong>依次递归</strong>,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。</p><p><strong>委托机制的意义 — 防止内存中出现多份同样的字节码</strong><br>比如两个类A和类B都要加载System类:</p><ul><li><p>如果不用委托而是自己加载自己的,那么类A就会加载一份System字节码,然后类B又会加载一份System字节码,<strong>这样内存中就出现了两份System字节码。</strong></p></li><li><p>如果使用委托机制,会递归的向父类查找,也就是<strong>首选用Bootstrap尝试加载</strong>,如果找不到再向下。这里的System就能在Bootstrap中找到然后加载,如果此时类B也要加载System,也从Bootstrap开始,此时<strong>Bootstrap发现已经加载过了System那么直接返回内存中的System即可而不需要重新加载</strong>,这样内存中就只有一份System的字节码了。</p><p><img src="/img/双亲委派.png"></p></li></ul><p>JVM预定义的三种类型类加载器:</p><ul><li><strong>启动(Bootstrap)类加载器</strong>:是用本地代码实现的类装入器,它负责将 <code><Java_Runtime_Home>/lib</code>下面的类库加载到内存中(比如<code>rt.jar</code>)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。</li><li><strong>标准扩展(Extension)类加载器</strong>:是由 Sun 的 <code>ExtClassLoader(sun.misc.Launcher$ExtClassLoader)</code>实现的。它负责将<code>< Java_Runtime_Home >/lib/ext</code>或者由系统变量 <code>java.ext.dir</code>指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。</li><li><strong>系统(System)类加载器</strong>:是由 Sun 的 <code>AppClassLoader(sun.misc.Launcher$AppClassLoader)</code>实现的。它负责将系统类路径(<code>CLASSPATH</code>)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。</li></ul><p>除了以上列举的三种类加载器,还有一种比较特殊的类型 — 线程上下文类加载器。</p><p> Java的类加载器是-个运行时核心基础设施模块,主要是在启动<br>之初进行类的<strong>Load、Link 和Init</strong>,即<strong>加载、链接、初始化</strong>。<br> 第一步,Load阶段读取类文件产生二进制流,并转化为特定的数据结构,初步校验<strong>cafe babe魔法数、常量池、文件长度、是否有父类</strong>等,然后创建对应类的java.lang.Class实例。<br> 第二步,Link阶段包括验证、准备、解析三个步骤。验证是更详细的校验,比如final是否合规、类型是否正确、静态变量是否合理等;准备阶段是为静态变量分配内存,并设定默认值,解析类和方法确保类与类之间的相互引用正确性,完成内存结构布局。<br> 第三步,Init阶段执行类构造器<clinit> 方法,如果赋值运算是通过其他类的静态方法来完成的,那么会马上解析另外一个类,在虚拟机栈中执行完毕后通过返回值进行赋值。</clinit></p><p><img src="/img/类加载过程图.png"></p><p>类加载是一个将.class字节码文件实例化成Class对象并进行相关初始化的过程。在这个过程中,JVM会初始化继承树上还没有被初始化过的<strong>所有父类</strong>,并且会执行<br>这个链路.上所有未执行过的静态代码块、静态变量赋值语句等。某些类在使用时,也可以按需由类加载器进行加载。</p><p>在学习了类加载器的实现机制后,知道双亲委派模型并非强制模型,用户可以自定义类加载器,在什么情况下需要自定义类加载器呢?<br> (1)隔离加载类。在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境。比如,阿里内某容器框架通过自定义类加载器确保应用中依赖的jar包不会影响到中间件运行时使用的jar包。<br> (2)修改类加载方式。类的加载模型并非强制,除Bootstrap外,其他的加载并非一定要引入,或者根据实际情况在某个时间点进行按需进行动态加载。<br> (3)扩展加载源。比如从数据库、网络,甚至是电视机机顶盒进行加载。<br> (4)防止源码泄露。Java代码容易被编译和篡改,可以进行编译加密。那么类加载器也需要自定义,还原加密的字节码。</p>]]></content>
<summary type="html">
从字节码说起,分析类加载的过程,并结合内存布局,讲解对象创建与垃圾回收
</summary>
<category term="jvm" scheme="http://mroldx.xyz/categories/jvm/"/>
<category term="java" scheme="http://mroldx.xyz/tags/java/"/>
</entry>
<entry>
<title>Jenkins+Maven+Git(GitLab)持续集成Java项目</title>
<link href="http://mroldx.xyz/2020/05/01/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/Jenkins+Maven+Git(GitLab)%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90Java%E9%A1%B9%E7%9B%AE/"/>
<id>http://mroldx.xyz/2020/05/01/持续集成/Jenkins+Maven+Git(GitLab)持续集成Java项目/</id>
<published>2020-05-01T06:59:51.000Z</published>
<updated>2020-05-05T07:34:06.946Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h1 id="Jenkins-Maven-Git-GitLab-持续集成Java项目"><a href="#Jenkins-Maven-Git-GitLab-持续集成Java项目" class="headerlink" title="Jenkins+Maven+Git(GitLab)持续集成Java项目"></a>Jenkins+Maven+Git(GitLab)持续集成Java项目</h1><h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><h3 id="1、本文主要内容"><a href="#1、本文主要内容" class="headerlink" title="1、本文主要内容"></a>1、本文主要内容</h3><ul><li>Jenkins+SSH获取Gitlab代码</li><li>Jenkins+Maven构建Java(Spring Boot)项目配置</li><li>Jenkins发布Spring Boot项目:远程服务器端配置</li><li>Jenkins发布Spring Boot项目:pom.xml编译配置</li><li>Jenkins+SSH将构建输出结果发布到远程服务器并启动应用</li></ul><h3 id="2、环境信息"><a href="#2、环境信息" class="headerlink" title="2、环境信息"></a>2、环境信息</h3><ul><li>服务器</li></ul><table><thead><tr><th style="text-align:left">服务器名</th><th style="text-align:left">操作系统</th><th style="text-align:left">IP</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left">GitLab</td><td style="text-align:left">CentOS 7</td><td style="text-align:left">192.168.56.160</td><td style="text-align:left">部署GitLab社区版</td></tr><tr><td style="text-align:left">Jenkins</td><td style="text-align:left">CentOS 7</td><td style="text-align:left">192.168.56.150</td><td style="text-align:left">部署Jenkins</td></tr><tr><td style="text-align:left">Server</td><td style="text-align:left">CentOS 7</td><td style="text-align:left">192.168.88.155</td><td style="text-align:left">部署Java项目</td></tr></tbody></table><ul><li>软件</li></ul><table><thead><tr><th style="text-align:left">工具/环境</th><th style="text-align:left">版本</th></tr></thead><tbody><tr><td style="text-align:left">Jenkins</td><td style="text-align:left">2.176.2</td></tr><tr><td style="text-align:left">Maven</td><td style="text-align:left">3.6.1</td></tr><tr><td style="text-align:left">GitLab</td><td style="text-align:left">GitLab CE 12.1.2</td></tr><tr><td style="text-align:left">JDK</td><td style="text-align:left">1.8.0_181</td></tr></tbody></table><h3 id="3、基础准备"><a href="#3、基础准备" class="headerlink" title="3、基础准备"></a>3、基础准备</h3><ul><li>GitLab部署</li></ul><p>参考:<a href="https://ken.io/note/centos7-gitlab-install-tutorial" target="_blank" rel="noopener">https://ken.io/note/centos7-gitlab-install-tutorial</a></p><p>配置GitLab访问地址为:<code>http://192.168.56.160</code></p><ul><li>Jenkins部署</li></ul><p>参考:<a href="https://ken.io/note/centos7-jenkins-install-tutorial" target="_blank" rel="noopener">https://ken.io/note/centos7-jenkins-install-tutorial</a></p><h2 id="二、-Java应用部署服务器"><a href="#二、-Java应用部署服务器" class="headerlink" title="二、 Java应用部署服务器"></a>二、 Java应用部署服务器</h2><h3 id="1、部署JDK8"><a href="#1、部署JDK8" class="headerlink" title="1、部署JDK8"></a>1、部署JDK8</h3><p>参考:<a href="https://ken.io/note/centos-java-setup" target="_blank" rel="noopener">https://ken.io/note/centos-java-setup</a></p><p>将<code>jdk1.8.0_181</code>部署在目录<code>/usr/java/</code></p><p>部署完成后,jdk的根目录就是:<code>/usr/java/jdk1.8.0_181/</code></p><h3 id="2、开放端口"><a href="#2、开放端口" class="headerlink" title="2、开放端口"></a>2、开放端口</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">#开放1000到9999的端口</span><br><span class="line">sudo firewall-cmd --add-port=<span class="number">1000</span><span class="number">-9999</span>/tcp --permanent</span><br><span class="line">sudo firewall-cmd --reload</span><br></pre></td></tr></table></figure><h3 id="3、创建应用部署目录"><a href="#3、创建应用部署目录" class="headerlink" title="3、创建应用部署目录"></a>3、创建应用部署目录</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">#创建目录</span><br><span class="line">sudo mkdir -p /webroot</span><br><span class="line"></span><br><span class="line">#授权</span><br><span class="line">sudo chown -R app:app /webroot</span><br></pre></td></tr></table></figure><h2 id="三、Jenkins环境准备"><a href="#三、Jenkins环境准备" class="headerlink" title="三、Jenkins环境准备"></a>三、Jenkins环境准备</h2><p>在配置构建任务之前,我们需要在Jenkins服务器配置Maven、Git环境</p><h3 id="1、Maven安装"><a href="#1、Maven安装" class="headerlink" title="1、Maven安装"></a>1、Maven安装</h3><ul><li>下载&解压</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">cd /home/downloads</span><br><span class="line"></span><br><span class="line">#下载</span><br><span class="line">sudo wget http:<span class="comment">//mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz</span></span><br><span class="line"></span><br><span class="line">#解压到指定目录</span><br><span class="line">sudo mkdir -p /usr/maven</span><br><span class="line">sudo tar -zvxf apache-maven<span class="number">-3.6</span><span class="number">.1</span>-bin.tar.gz -C /usr/maven</span><br></pre></td></tr></table></figure><ul><li>配置环境变量</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">#修改/etc/profile</span><br><span class="line">sudo vi /etc/profile</span><br><span class="line"></span><br><span class="line">#在文件末尾写入以下内容</span><br><span class="line"><span class="keyword">export</span> MAVEN_HOME=<span class="regexp">/usr/m</span>aven/apache-maven<span class="number">-3.6</span><span class="number">.1</span></span><br><span class="line"><span class="keyword">export</span> PATH=$MAVEN_HOME/bin:$PATH</span><br><span class="line"></span><br><span class="line">#使更改生效</span><br><span class="line">source /etc/profile</span><br><span class="line"></span><br><span class="line">#测试</span><br><span class="line">mvn -version</span><br></pre></td></tr></table></figure><ul><li>配置Maven仓库</li></ul><p>为了保证jar包的下载速度,修改maven配置使用国内镜像</p><figure class="highlight js"><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></pre></td><td class="code"><pre><span class="line">#进入Maven根目录</span><br><span class="line">cd $MAVEN_HOME</span><br><span class="line"></span><br><span class="line">#备份配置文件</span><br><span class="line">sudo mv conf/settings.xml conf/settings.xml.bak</span><br><span class="line"></span><br><span class="line">#新建配置文件</span><br><span class="line">sudo vi settings.xml</span><br><span class="line"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span><br><span class="line"></span><br><span class="line"><settings xmlns=<span class="string">"http://maven.apache.org/SETTINGS/1.0.0"</span></span><br><span class="line"> xmlns:xsi=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span><br><span class="line"> xsi:schemaLocation=<span class="string">"http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"</span>></span><br><span class="line"></span><br><span class="line"> <mirrors></span><br><span class="line"></span><br><span class="line"> <mirror></span><br><span class="line"> <id>alimaven<<span class="regexp">/id></span></span><br><span class="line"><span class="regexp"> <name>aliyun maven</</span>name></span><br><span class="line"> <url>https:<span class="comment">//maven.aliyun.com/repository/public/</url></span></span><br><span class="line"> <mirrorOf>*</mirrorOf> </span><br><span class="line"> <<span class="regexp">/mirror></span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp"> <mirror></span></span><br><span class="line"><span class="regexp"> <id>nexus-163</i</span>d></span><br><span class="line"> <mirrorOf>*</mirrorOf></span><br><span class="line"> <name>Nexus <span class="number">163</span><<span class="regexp">/name></span></span><br><span class="line"><span class="regexp"> <url>http:/</span><span class="regexp">/mirrors.163.com/m</span>aven/repository/maven-public/</url></span><br><span class="line"> <<span class="regexp">/mirror></span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp"> <mirror></span></span><br><span class="line"><span class="regexp"> <id>central</i</span>d></span><br><span class="line"> <name>Maven Repository Switchboard<<span class="regexp">/name></span></span><br><span class="line"><span class="regexp"> <url>http:/</span><span class="regexp">/repo1.maven.org/m</span>aven2/</url></span><br><span class="line"> <mirrorOf>central<<span class="regexp">/mirrorOf></span></span><br><span class="line"><span class="regexp"> </mi</span>rror></span><br><span class="line"></span><br><span class="line"> <<span class="regexp">/mirrors></span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp"></</span>settings></span><br></pre></td></tr></table></figure><h3 id="2、Git-Client安装"><a href="#2、Git-Client安装" class="headerlink" title="2、Git Client安装"></a>2、Git Client安装</h3><ul><li>安装</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install -y git</span><br></pre></td></tr></table></figure><ul><li>密钥准备</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">#生成密钥</span><br><span class="line">ssh-keygen -t rsa</span><br></pre></td></tr></table></figure><ul><li>将公钥添加到GitLab</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">#查看公钥</span><br><span class="line">cat ~<span class="regexp">/.ssh/i</span>d_rsa.pub</span><br></pre></td></tr></table></figure><p>访问GitLab:<code>http://192.168.56.150:/profile/keys</code>,添加公钥</p><ul><li>添加Git SSH凭据</li></ul><p>后面配置Jenkins构建任务代码仓库时需要用到</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">#查询SSH私钥</span><br><span class="line">cat ~<span class="regexp">/.ssh/i</span>d_rsa</span><br></pre></td></tr></table></figure><p>访问:<code>/credentials/store/system/domain/_/newCredentials</code> 直接进入凭据添加界面</p><p>类型选择:<code>SSH Username with private key</code></p><p><img src="https://ask.qcloudimg.com/http-save/1381082/w39peslr9p.png?imageView2/2/w/1620" alt="img">jenkins-credentials-gitlab-key</p><h3 id="3、插件安装"><a href="#3、插件安装" class="headerlink" title="3、插件安装"></a>3、插件安装</h3><ul><li>插件列表</li></ul><table><thead><tr><th style="text-align:left">插件名</th><th style="text-align:left">版本</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left"><a href="https://ken.io/note/centos7-gitlab-install-tutorial" target="_blank" rel="noopener">Git</a></td><td style="text-align:left">3.11.0</td><td style="text-align:left">使用Git访问远程仓库</td></tr><tr><td style="text-align:left"><a href="https://ken.io/note/centos7-gitlab-install-tutorial" target="_blank" rel="noopener">Maven Integration</a></td><td style="text-align:left">3.3</td><td style="text-align:left">使用Maven进行编译等</td></tr><tr><td style="text-align:left"><a href="https://ken.io/note/centos7-gitlab-install-tutorial" target="_blank" rel="noopener">Publish Over SSH </a></td><td style="text-align:left">1.20.1</td><td style="text-align:left">用于将编译结果发布到远程服务器</td></tr></tbody></table><ul><li>安装说明</li></ul><p>访问:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://192.168.56.150:8080/pluginManager/available</span><br></pre></td></tr></table></figure><p><code>Ctrl+F</code>搜索插件名,勾选后,进行安装</p><p>安装完成后,重启jenkins</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl restart jenkins</span><br></pre></td></tr></table></figure><h3 id="4、Jenkins插件-环境配置"><a href="#4、Jenkins插件-环境配置" class="headerlink" title="4、Jenkins插件/环境配置"></a>4、Jenkins插件/环境配置</h3><p>在菜单:系统管理->全局工具配置中对插件相关工具进行配置</p><p><img src="https://img2018.cnblogs.com/blog/1733080/201909/1733080-20190930185843004-1191682955.png" alt="img"></p><ul><li>Publish over SSH</li></ul><p>然后在菜单:系统管理->系统设置对Publish over SSH进行设置</p><p><img src="C:\Users\Old丶x\AppData\Roaming\Typora\typora-user-images\image-20200501143558976.png" alt="image-20200501143558976"></p><p>主要配置项说明:</p><table><thead><tr><th style="text-align:left">配置项</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left">Name</td><td style="text-align:left">服务器名,随便写,方便记忆即可</td></tr><tr><td style="text-align:left">Hostname</td><td style="text-align:left">服务器IP,或者可以被正常解析的服务器名/域名</td></tr><tr><td style="text-align:left">Username</td><td style="text-align:left">用于登录的账号</td></tr><tr><td style="text-align:left">Remote Dictionary</td><td style="text-align:left">远程目录,绝对路径</td></tr><tr><td style="text-align:left">Passphrase/Password</td><td style="text-align:left">密码</td></tr><tr><td style="text-align:left">Port</td><td style="text-align:left">SSH端口</td></tr></tbody></table><p>配置完成后可以点击<code>Test Configuration</code>进行连接测试 </p><h2 id="四、Jenkins构建任务"><a href="#四、Jenkins构建任务" class="headerlink" title="四、Jenkins构建任务"></a>四、Jenkins构建任务</h2><h3 id="1、示例项目准备"><a href="#1、示例项目准备" class="headerlink" title="1、示例项目准备"></a>1、示例项目准备</h3><blockquote><p>如果已经有现成项目可忽略此步骤</p></blockquote><p>访问:<code>http://192.168.56.150/projects/new</code>创建项目:<code>helloworld</code></p><ul><li>创建SpringBoot应用</li></ul><p>参考:<a href="https://ken.io/note/springboot-course-basic-helloworld" target="_blank" rel="noopener">https://ken.io/note/springboot-course-basic-helloworld</a> 创建SpringBoot应用</p><table><thead><tr><th style="text-align:left">参数</th><th style="text-align:left">值</th></tr></thead><tbody><tr><td style="text-align:left">Maven模板</td><td style="text-align:left">maven-archetype-webapp</td></tr><tr><td style="text-align:left">GroupId</td><td style="text-align:left">io.ken.tutorial</td></tr><tr><td style="text-align:left">ArtifactId</td><td style="text-align:left">helloworld</td></tr><tr><td style="text-align:left">Version</td><td style="text-align:left">1.0</td></tr></tbody></table><ul><li>配置编译选项</li></ul><p>修改pom.xml,以满足编译要求</p><figure class="highlight js"><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></pre></td><td class="code"><pre><span class="line"><build></span><br><span class="line"> <finalName>helloworld<<span class="regexp">/finalName></span></span><br><span class="line"><span class="regexp"> <resources></span></span><br><span class="line"><span class="regexp"> <resource></span></span><br><span class="line"><span class="regexp"> <directory>src/m</span>ain/resources<<span class="regexp">/directory></span></span><br><span class="line"><span class="regexp"> <filtering>false</</span>filtering></span><br><span class="line"> <<span class="regexp">/resource></span></span><br><span class="line"><span class="regexp"> </</span>resources></span><br><span class="line"> <plugins></span><br><span class="line"> <plugin></span><br><span class="line"> <groupId>org.springframework.boot<<span class="regexp">/groupId></span></span><br><span class="line"><span class="regexp"> <artifactId>spring-boot-maven-plugin</</span>artifactId></span><br><span class="line"> <<span class="regexp">/plugin></span></span><br><span class="line"><span class="regexp"> <plugin></span></span><br><span class="line"><span class="regexp"> <groupId>org.apache.maven.plugins</g</span>roupId></span><br><span class="line"> <artifactId>maven-compiler-plugin<<span class="regexp">/artifactId></span></span><br><span class="line"><span class="regexp"> <version>3.8.1</</span>version></span><br><span class="line"> <configuration></span><br><span class="line"> <source><span class="number">1.8</span><<span class="regexp">/source></span></span><br><span class="line"><span class="regexp"> <target>1.8</</span>target></span><br><span class="line"> <<span class="regexp">/configuration></span></span><br><span class="line"><span class="regexp"> </</span>plugin></span><br><span class="line"> <<span class="regexp">/plugins></span></span><br><span class="line"><span class="regexp"> </</span>build></span><br></pre></td></tr></table></figure><p>配置application.yml,配置应用端口为8081</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">server:</span><br><span class="line"> port: <span class="number">8081</span></span><br></pre></td></tr></table></figure><p>项目准备完成后,在GitLab账号<code>ken</code>下面创建项目<code>helloworld</code>并将刚才创建的文件提交上去</p><blockquote><p>示例代码:<a href="https://gitlab.com/ken-io/springboot-helloworld" target="_blank" rel="noopener">https://gitlab.com/ken-io/springboot-helloworld</a></p></blockquote><h3 id="2、Jenkins任务创建"><a href="#2、Jenkins任务创建" class="headerlink" title="2、Jenkins任务创建"></a>2、Jenkins任务创建</h3><p><img src="https://ask.qcloudimg.com/http-save/1381082/smueltu4o1.png?imageView2/2/w/1620" alt="img">jenkins-create-job-maven-springboot</p><p>选择:<code>构建一个maven项目</code>,然后确定即可</p><h3 id="3、配置源代码管理"><a href="#3、配置源代码管理" class="headerlink" title="3、配置源代码管理"></a>3、配置源代码管理</h3><p><img src="https://ask.qcloudimg.com/http-save/1381082/r7v5evbqyb.png?imageView2/2/w/1620" alt="img">jenkins-create-job-maven-springboot-sourcecode-git-ssh</p><p>这里我们选择Git,并配置SSH Git地址,选择之前创建好的凭据/密钥</p><h3 id="4、Publish-over-SSH配置"><a href="#4、Publish-over-SSH配置" class="headerlink" title="4、Publish over SSH配置"></a>4、Publish over SSH配置</h3><p><img src="https://ask.qcloudimg.com/http-save/1381082/c8v0o8tfko.png?imageView2/2/w/1620" alt="img">jenkins-create-job-maven-springboot-buildenv-publishoverssh</p><p>配置项说明:</p><table><thead><tr><th style="text-align:left">配置项</th><th style="text-align:left">值</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left">Name</td><td style="text-align:left">appserver</td><td style="text-align:left">SSH Server名称,根据之前配置选择即可</td></tr><tr><td style="text-align:left">Source files</td><td style="text-align:left">target/*.jar</td><td style="text-align:left">需要传输的文件,支持通配符,编译文件默认都在项目根目录下的target目录中</td></tr><tr><td style="text-align:left">Remove prefix</td><td style="text-align:left">target</td><td style="text-align:left">移除匹配到的文件路径的前缀,如果留空,会在远程服务器上创建对应的目录</td></tr><tr><td style="text-align:left">Remote directory</td><td style="text-align:left">helloworld/</td><td style="text-align:left">远程服务器上的项目目录,该目录会被创建在Publish over SSH配置的远程根目录中(/webroot)</td></tr><tr><td style="text-align:left">Exec command</td><td style="text-align:left"><a href="https://ken.io/note/centos7-gitlab-install-tutorial" target="_blank" rel="noopener">—</a></td><td style="text-align:left">文件传输到远程服务器后执行的命令</td></tr></tbody></table><p>命令示例:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">APP_NAME=helloworld.jar</span><br><span class="line">cd /webroot/helloworld</span><br><span class="line">mkdir -p logs</span><br><span class="line"></span><br><span class="line">#找到包含AppName的进程</span><br><span class="line">PROCESS=<span class="string">`ps -ef|grep $APP_NAME|grep -v grep |awk '{ print $2}'`</span></span><br><span class="line">#循环停用进程直到成功</span><br><span class="line"><span class="keyword">while</span> :</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"> kill <span class="number">-9</span> $PROCESS > <span class="regexp">/dev/</span><span class="literal">null</span> <span class="number">2</span>>&<span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> [ $? -ne <span class="number">0</span> ];then</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line">fi</span><br><span class="line">done</span><br><span class="line">echo <span class="string">'Stop Successed'</span></span><br><span class="line"></span><br><span class="line">#启动应用</span><br><span class="line">nohup /usr/java/jdk1<span class="number">.8</span><span class="number">.0</span>_181/bin/java -jar $APP_NAME >>logs/start.log <span class="number">2</span>>>logs/startError.log &</span><br><span class="line"></span><br><span class="line">#sleep等待15秒后,判断包含AppName的线程是否存在</span><br><span class="line">sleep <span class="number">15</span></span><br><span class="line"><span class="keyword">if</span> test $(pgrep -f $APP_NAME|wc -l) -eq <span class="number">0</span></span><br><span class="line">then</span><br><span class="line"> echo <span class="string">"Start Failed"</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"> echo <span class="string">"Start Successed"</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h3 id="5、构建"><a href="#5、构建" class="headerlink" title="5、构建"></a>5、构建</h3><p>点击立即构建即可进行项目构建,构建完成后,构建记录的图标会根据构建结果不同显示成不同颜色。 </p><p>蓝色、黄色、红色分别表示:成功、未完成、失败</p><p>如果构建并没有成功,可以点击构建记录,在后在<code>控制台输出</code>中查看构建记录</p><h2 id="五-,视频演示成果"><a href="#五-,视频演示成果" class="headerlink" title="五 ,视频演示成果"></a>五 ,视频演示成果</h2>]]></content>
<summary type="html">
CI/CD持续集成 Jenkins+Maven+Git(GitLab)持续集成Java项目
</summary>
<category term="持续集成" scheme="http://mroldx.xyz/categories/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/"/>
<category term="CI/CD" scheme="http://mroldx.xyz/tags/CI-CD/"/>
</entry>
<entry>
<title>redis缓存与memcache的区别</title>
<link href="http://mroldx.xyz/2020/04/29/redis/redis%E7%BC%93%E5%AD%98%E4%B8%8Ememcache%E7%9A%84%E5%8C%BA%E5%88%AB/"/>
<id>http://mroldx.xyz/2020/04/29/redis/redis缓存与memcache的区别/</id>
<published>2020-04-28T16:41:19.000Z</published>
<updated>2020-05-05T07:34:06.944Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><ul><li><p>数据结构方面</p><p> redis有更丰富的数据结构,可以满足不同的业务需求。而memcache需要客户端将数据获取再修改再set回去,增加网络io和系统开销。</p></li><li><p>内存使用方面</p><p> 使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。</p></li><li><p>性能对比</p><p> 由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。</p></li></ul><h3 id="数据类型支持不同"><a href="#数据类型支持不同" class="headerlink" title="数据类型支持不同"></a>数据类型支持不同</h3><p>Redis支持的数据类型有:String、Hash、List、Set和Sorted Set。Redis内部使用一个redisObject对象来表示所有的key和value。</p><p>redisObject最主要的信息如图所示:</p><p><img src="/images/1.jpg"></p><p>type代表一个value对象具体是什么数据类型,encoding表示不同数据类型在redis内部的存储方式,比如:type=String代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值类型存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:”123″ “456”这样的字符串。只有打开了Redis的虚拟内存功能,vm字段才会真正的分配内存,该功能默认是关闭状态的。</p><p>1)String</p><p>常用命令:set/get/decr/incr/mget等;</p><p>应用场景:String是最常用的一种数据类型,普通的key/value存储都可以归为此类;</p><p>实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。</p><p>2)Hash</p><p>常用命令:hget/hset/hgetall等</p><p>应用场景:我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、年龄和生日,通过用户ID我们希望获取该用户的姓名或者年龄或者生日;</p><p>实现方式:Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口。如图所示,Key是用户ID, value是一个Map。这个Map的key是成员的属性名,value是属性值。这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据。当前HashMap的实现有两种方式:当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。</p><p><img src="/images/2.jpg"></p><p>3)List</p><p>常用命令:lpush/rpush/lpop/rpop/lrange等;</p><p>应用场景:Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现;</p><p>实现方式:Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。</p><p>4)Set</p><p>常用命令:sadd/spop/smembers/sunion等;</p><p>应用场景:Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以去重,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的;</p><p>实现方式:set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速去重,这也是set能提供判断一个成员是否在集合内的原因。</p><p>5)Sorted Set</p><p>常用命令:zadd/zrange/zrem/zcard等;</p><p>应用场景:Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。</p><p>实现方式:Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。</p><h3 id="内存管理机制不同"><a href="#内存管理机制不同" class="headerlink" title="内存管理机制不同"></a>内存管理机制不同</h3><p>对于像Redis和Memcached这种基于内存的数据库系统来说,内存管理的效率高低是影响系统性能的关键因素。传统C语言中的malloc/free函数是最常用的分配和释放内存的方法,但是这种方法存在着很大的缺陷:首先,对于开发人员来说不匹配的malloc和free容易造成内存泄露;其次频繁调用会造成大量内存碎片无法回收重新利用,降低内存利用率;最后作为系统调用,其系统开销远远大于一般函数调用。所以,为了提高内存的管理效率,高效的内存管理方案都不会直接使用malloc/free调用。Redis和Memcached均使用了自身设计的内存管理机制,但是实现方法存在很大的差异,下面将会对两者的内存管理机制分别进行介绍。</p><p>Memcached默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。Slab Allocation机制只为存储外部数据而设计,也就是说所有的key-value数据都存储在Slab Allocation系统里,而Memcached的其它内存请求则通过普通的malloc/free来申请,因为这些请求的数量和频率决定了它们不会对整个系统的性能造成影响Slab Allocation的原理相当简单。 如图所示,它首先从操作系统申请一大块内存,并将其分割成各种尺寸的块Chunk,并把尺寸相同的块分成组Slab Class。其中,Chunk就是用来存储key-value数据的最小单位。每个Slab Class的大小,可以在Memcached启动的时候通过制定Growth Factor来控制。假定图中Growth Factor的取值为1.25,如果第一组Chunk的大小为88个字节,第二组Chunk的大小就为112个字节,依此类推。</p><p><img src="/images/3.jpg"></p><p>当Memcached接收到客户端发送过来的数据时首先会根据收到数据的大小选择一个最合适的Slab Class,然后通过查询Memcached保存着的该Slab Class内空闲Chunk的列表就可以找到一个可用于存储数据的Chunk。当一条数据库过期或者丢弃时,该记录所占用的Chunk就可以回收,重新添加到空闲列表中。从以上过程我们可以看出Memcached的内存管理制效率高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。如下图所示,将100个字节的数据存到128个字节的Chunk中,剩余的28个字节就浪费掉了。</p><p><img src="/images/4.png"></p><p>Redis的内存管理主要通过源码中zmalloc.h和zmalloc.c两个文件来实现的。Redis为了方便内存的管理,在分配一块内存之后,会将这块内存的大小存入内存块的头部。如图所示,real_ptr是redis调用malloc后返回的指针。redis将内存块的大小size存入头部,size所占据的内存大小是已知的,为size_t类型的长度,然后返回ret_ptr。当需要释放内存的时候,ret_ptr被传给内存管理程序。通过ret_ptr,程序可以很容易的算出real_ptr的值,然后将real_ptr传给free释放内存。</p><p><img src="/images/5.png"></p><p>Redis通过定义一个数组来记录所有的内存分配情况,这个数组的长度为ZMALLOC_MAX_ALLOC_STAT。数组的每一个元素代表当前程序所分配的内存块的个数,且内存块的大小为该元素的下标。在源码中,这个数组为zmalloc_allocations。zmalloc_allocations[16]代表已经分配的长度为16bytes的内存块的个数。zmalloc.c中有一个静态变量used_memory用来记录当前分配的内存总大小。所以,总的来看,Redis采用的是包装的mallc/free,相较于Memcached的内存管理方法来说,要简单很多。</p><h3 id="数据持久化支持"><a href="#数据持久化支持" class="headerlink" title="数据持久化支持"></a>数据持久化支持</h3><p>Redis提供两种持久化策略:RDB快照和AOF日志。而memcached不支持数据持久化。</p><p>1)RDB快照</p><p>Redis支持将当前数据的快照存成一个数据文件的持久化机制,即RDB快照。但是一个持续写入的数据库如何生成快照呢?RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作。在生成快照时,将当前进程fork出一个子进程,然后在子进程中循环所有的数据,将数据写成为RDB文件。</p><p>可以通过Redis的save指令来配置RDB快照生成的时机,比如配置10分钟就生成快照,也可以配置有1000次写入就生成快照,也可以多个规则一起实施。这些规则的定义就在Redis的配置文件中,你也可以通过Redis的CONFIG SET命令在Redis运行时设置规则,不需要重启Redis。</p><p>Redis的RDB文件不会坏掉,因为其写操作是在一个新进程中进行的,当生成一个新的RDB文件时,Redis生成的子进程会先将数据写到一个临时文件中,然后通过原子性rename系统调用将临时文件重命名为RDB文件,这样在任何时候出现故障,Redis的RDB文件都总是可用的。RDB的缺点,就是一旦数据库出现问题,我们的RDB文件中保存的数据并不是全新的,从上次RDB文件生成到Redis停机这段时间的数据全部丢失。</p><p>2)AOF日志</p><p><strong>AOF 优点:</strong></p><p>使用AOF 会让你的Redis更加耐久: 你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync.使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。</p><p>AOF文件是一个只进行追加的日志文件,所以不需要写入seek,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用redis-check-aof工具修复这些问题。</p><p>Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。</p><p>AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。</p><p><strong>AOF 缺点</strong></p><p>对于相同的数据集来说,AOF文件的体积通常要大于RDB文件的体积。</p><p>根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。</p><h3 id="集群管理的不同"><a href="#集群管理的不同" class="headerlink" title="集群管理的不同"></a>集群管理的不同</h3><p>Memcached是全内存的数据缓冲系统,Redis虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。</p><p>Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。下图给出了Memcached的分布式存储实现架构。当客户端向Memcached集群发送数据之前,首先会通过内置的分布式算法计算出该条数据的目标节点,然后数据会直接发送到该节点上存储。但客户端查询数据时,同样要计算出查询数据所在的节点,然后直接向该节点发送查询请求以获取数据。</p><p><img src="/images/6.jpg"></p><p>相较于Memcached只能采用客户端实现分布式存储,Redis更偏向于在服务器端构建分布式存储。最新版本的Redis已经支持了分布式存储功能。Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,具有线性可伸缩的功能。下图给出Redis Cluster的分布式存储架构,其中节点与节点之间通过二进制协议进行通信,节点与客户端之间通过ascii协议进行通信。在数据的放置策略上,Redis Cluster将整个key的数值域分成4096个哈希槽,每个节点上可以存储一个或多个哈希槽,也就是说当前Redis Cluster支持的最大节点数就是4096。Redis Cluster使用的分布式算法也很简单:crc16( key ) % HASH_SLOTS_NUMBER。</p><p><img src="/images/7.jpg"></p><p>为了保证单点故障下的数据可用性,Redis Cluster引入了Master节点和Slave节点。在Redis Cluster中,每个Master节点都会有对应的两个冗余的Slave节点。这样在整个集群中,任意两个节点的宕机都不会导致数据的不可用。当Master节点退出后,集群会自动选择一个Slave节点成为新的Master节点。</p><p><img src="/images/8.jpg"></p>]]></content>
<summary type="html">
redis缓存与memcache的区别
</summary>
<category term="redis" scheme="http://mroldx.xyz/categories/redis/"/>
<category term="redis" scheme="http://mroldx.xyz/tags/redis/"/>
</entry>
<entry>
<title>全网实用软件合集包含各类(游戏,模拟器,应用......)</title>
<link href="http://mroldx.xyz/2020/04/25/software/soft_all_internet/"/>
<id>http://mroldx.xyz/2020/04/25/software/soft_all_internet/</id>
<published>2020-04-25T11:08:10.000Z</published>
<updated>2020-06-14T05:54:08.644Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h1 id="各类实用软件合集"><a href="#各类实用软件合集" class="headerlink" title="各类实用软件合集"></a>各类实用软件合集</h1><h3 id="一-游戏类实用工具合集"><a href="#一-游戏类实用工具合集" class="headerlink" title="一 .游戏类实用工具合集"></a>一 .游戏类实用工具合集</h3><table><thead><tr><th>应用名称</th><th style="text-align:center">下载地址(蓝奏云地址)</th></tr></thead><tbody><tr><td>刺激战场画质助手 超清画质次次吃鸡</td><td style="text-align:center"><a href="https://lanzous.com/hzgjx" target="_blank" rel="noopener">https://lanzous.com/hzgjx</a></td></tr><tr><td>王者技能线 从此不再空技能</td><td style="text-align:center"><a href="https://lanzous.com/wzryj" target="_blank" rel="noopener">https://lanzous.com/wzryj</a></td></tr><tr><td>我的世界优化版去除无用资源,下载游戏就能玩,解锁所有皮肤!</td><td style="text-align:center"><a href="https://lanzous.com/wodes" target="_blank" rel="noopener">https://lanzous.com/wodes</a></td></tr><tr><td>皇室战争无限资源版本,无限钻石!</td><td style="text-align:center"><a href="https://lanzous.com/zhanz" target="_blank" rel="noopener">https://lanzous.com/zhanz</a></td></tr></tbody></table><h3 id="二-应用类软件工具合集"><a href="#二-应用类软件工具合集" class="headerlink" title="二.应用类软件工具合集"></a>二.应用类软件工具合集</h3><h4 id="1-模拟器类合集"><a href="#1-模拟器类合集" class="headerlink" title="1.模拟器类合集"></a>1.模拟器类合集</h4><table><thead><tr><th style="text-align:center">应用名称</th><th style="text-align:center">下载地址(蓝奏云地址浏览器打开自动下载)</th></tr></thead><tbody><tr><td style="text-align:center">小鸡模拟器-破改版 一款最全的掌机模拟器游戏APP</td><td style="text-align:center"><a href="https://lanzous.com/xiaoj" target="_blank" rel="noopener">https://lanzous.com/xiaoj</a></td></tr></tbody></table><h4 id="2-社交类软件合集"><a href="#2-社交类软件合集" class="headerlink" title="2.社交类软件合集"></a>2.社交类软件合集</h4><table><thead><tr><th style="text-align:center">应用名称</th><th style="text-align:center">下载地址(蓝奏云地址浏览器打开自动下载)</th></tr></thead><tbody><tr><td style="text-align:center">企鹅助手 汇聚各种玩Q功能</td><td style="text-align:center"><a href="https://lanzous.com/qerzs" target="_blank" rel="noopener">https://lanzous.com/qerzs</a></td></tr><tr><td style="text-align:center">QQ『美化包』8.33 简约红<br>破口令 ‖ 破闪照 ‖ 防撤回破语音 ‖ 防冻结 ‖ 破表情</td><td style="text-align:center"><a href="https://lanzous.com/ic4z8uj" target="_blank" rel="noopener">https://lanzous.com/ic4z8uj</a></td></tr><tr><td style="text-align:center">QQ签到助手 一键完成签到</td><td style="text-align:center"><a href="https://lanzous.com/qiand" target="_blank" rel="noopener">https://lanzous.com/qiand</a></td></tr><tr><td style="text-align:center">QQ自定义在线 法拉利在线</td><td style="text-align:center"><a href="https://lanzous.com/zdyzs" target="_blank" rel="noopener">https://lanzous.com/zdyzs</a></td></tr><tr><td style="text-align:center">祖安对线机 Q微信自动怼人</td><td style="text-align:center"><a href="https://lanzous.com/zndxj" target="_blank" rel="noopener">https://lanzous.com/zndxj</a></td></tr><tr><td style="text-align:center">短信烘榨鸡</td><td style="text-align:center"><a href="https://lanzous.com/ibkpxih" target="_blank" rel="noopener">https://lanzous.com/ibkpxih</a></td></tr><tr><td style="text-align:center">南瓜影视</td><td style="text-align:center"><a href="https://lanzous.com/ibl0a8f" target="_blank" rel="noopener">https://lanzous.com/ibl0a8f</a></td></tr><tr><td style="text-align:center">QQ美化包8.3.6破口令 ‖ 破闪照 ‖ 防撤回破语音 ‖ 防冻结 ‖</td><td style="text-align:center"><a href="https://lanzous.com/icxge0f" target="_blank" rel="noopener">https://lanzous.com/icxge0f</a></td></tr><tr><td style="text-align:center">微信语音、QQ语音导出</td><td style="text-align:center"><a href="https://ithuige.lanzous.com/id3f3hg" target="_blank" rel="noopener">https://ithuige.lanzous.com/id3f3hg</a></td></tr></tbody></table><h4 id="3-漫画类软件合集"><a href="#3-漫画类软件合集" class="headerlink" title="3.漫画类软件合集"></a>3.漫画类软件合集</h4><table><thead><tr><th style="text-align:center">应用名称</th><th style="text-align:center">下载地址(蓝奏云地址浏览器打开自动下载)</th></tr></thead><tbody><tr><td style="text-align:center">触动漫画【一款漫画APP,超多经典热门漫画免费看】</td><td style="text-align:center"><a href="https://lanzous.com/ic9ffwd" target="_blank" rel="noopener">https://lanzous.com/ic9ffwd</a></td></tr><tr><td style="text-align:center">知音漫客【直装破解可以看所有最新漫画的章节】</td><td style="text-align:center"><a href="https://lanzous.com/ibyn84f" target="_blank" rel="noopener">https://lanzous.com/ibyn84f</a></td></tr></tbody></table><h4 id="4-小说类软件合集"><a href="#4-小说类软件合集" class="headerlink" title="4.小说类软件合集"></a>4.小说类软件合集</h4><table><thead><tr><th style="text-align:center">应用名称</th><th style="text-align:center">下载地址(蓝奏云地址浏览器打开自动下载)</th></tr></thead><tbody><tr><td style="text-align:center">蜜桃小说【非常强大的神器!对接全网海量书源</td><td style="text-align:center"><a href="https://lanzous.com/ic915qd" target="_blank" rel="noopener">https://lanzous.com/ic915qd</a></td></tr></tbody></table><h4 id="5-追剧影视类软件合集"><a href="#5-追剧影视类软件合集" class="headerlink" title="5.追剧影视类软件合集"></a>5.追剧影视类软件合集</h4><table><thead><tr><th style="text-align:center">应用名称</th><th style="text-align:center">下载地址(蓝奏云地址浏览器打开自动下载)</th></tr></thead><tbody><tr><td style="text-align:center">U5影视聚合全球院线资源</td><td style="text-align:center"><a href="https://lanzous.com/yings" target="_blank" rel="noopener">https://lanzous.com/yings</a></td></tr><tr><td style="text-align:center">剧汇TV官方版</td><td style="text-align:center"><a href="http://ylj.rjjd6.com/1BFH0M" target="_blank" rel="noopener">http://ylj.rjjd6.com/1BFH0M</a></td></tr><tr><td style="text-align:center">光影</td><td style="text-align:center"><a href="https://ithuige.lanzous.com/ichmfne" target="_blank" rel="noopener">https://ithuige.lanzous.com/ichmfne</a></td></tr><tr><td style="text-align:center">pp猪影视</td><td style="text-align:center"><a href="http://www.ppzhu.vip/" target="_blank" rel="noopener">http://www.ppzhu.vip/</a></td></tr><tr><td style="text-align:center">花样影视</td><td style="text-align:center"><a href="https://i.hyys.me/" target="_blank" rel="noopener">https://i.hyys.me/</a></td></tr><tr><td style="text-align:center">小小影视</td><td style="text-align:center"><a href="http://www.wangdunwen.com/?inviteCode=ICU7HI" target="_blank" rel="noopener">http://www.wangdunwen.com/?inviteCode=ICU7HI</a></td></tr></tbody></table><h4 id="6-其他工具类合集"><a href="#6-其他工具类合集" class="headerlink" title="6.其他工具类合集"></a>6.其他工具类合集</h4><table><thead><tr><th style="text-align:center">应用名称</th><th style="text-align:center">下载地址(蓝奏云地址浏览器打开自动下载)</th></tr></thead><tbody><tr><td style="text-align:center">WiFi密码查看 一款免费的wifi密码显示软件</td><td style="text-align:center"><a href="https://lanzous.com/chaka" target="_blank" rel="noopener">https://lanzous.com/chaka</a></td></tr><tr><td style="text-align:center">西瓜分身(虚拟定位,模拟记性等)</td><td style="text-align:center"><a href="https://lanzous.com/icwn9of" target="_blank" rel="noopener">https://lanzous.com/icwn9of</a></td></tr></tbody></table><h3 id="三-科学上网类及慈善机场类网站合集-你再也不怕访问不了谷歌了"><a href="#三-科学上网类及慈善机场类网站合集-你再也不怕访问不了谷歌了" class="headerlink" title="三.科学上网类及慈善机场类网站合集(你再也不怕访问不了谷歌了)"></a>三.科学上网类及慈善机场类网站合集(你再也不怕访问不了谷歌了)</h3><p>稳定白嫖VPN</p><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>蚂蚁加速器(邀请10个人免费无限流量很稳)有win,mac,andirond,iphone多端</td><td><a href="https://ss.lanshuapi.com" target="_blank" rel="noopener">https://ss.lanshuapi.com</a></td></tr><tr><td></td><td></td></tr><tr><td></td><td></td></tr><tr><td></td></tr></tbody></table><p>===============机场推荐(排名不分前后)======================<br>比特云:<a href="https://bit.ly/2UUSdWU" target="_blank" rel="noopener">https://bit.ly/2UUSdWU</a> (可白嫖 全中转 全V2 油管8W+)<br>DLK:<a href="https://bit.ly/2yaiDw5" target="_blank" rel="noopener">https://bit.ly/2yaiDw5</a> (高峰测速全红 定制全平台客户端)<br>红莓:<a href="https://bit.ly/3ekTdMC" target="_blank" rel="noopener">https://bit.ly/3ekTdMC</a> (全网首家Trojan机场 众多IPEL专线)<br>杰西卡:<a href="https://bit.ly/2V7vlVl" target="_blank" rel="noopener">https://bit.ly/2V7vlVl</a> (老牌 节点个个是精品)<br>代号9:<a href="https://bit.ly/2Ru7EnR" target="_blank" rel="noopener">https://bit.ly/2Ru7EnR</a> (高速8K注册就送50G 不限时长使用)<br>追风岛:<a href="http://bit.ly/2Squ8qX" target="_blank" rel="noopener">http://bit.ly/2Squ8qX</a> (油管平均5W+ 1元/月)<br>2ray:<a href="https://bit.ly/2XhfF3g" target="_blank" rel="noopener">https://bit.ly/2XhfF3g</a> ( 全中转 油管9W+)<br>樱云:<a href="https://bit.ly/2wyuH9Q" target="_blank" rel="noopener">https://bit.ly/2wyuH9Q</a> (免费公益机场)<br>XIXICATS:<a href="https://bit.ly/2y0pDLC" target="_blank" rel="noopener">https://bit.ly/2y0pDLC</a> (高速免费公益 速度快)<br>v2box:<a href="https://bit.ly/2UNibwl" target="_blank" rel="noopener">https://bit.ly/2UNibwl</a> (7折优惠码:30OFF)<br>light-up点亮:<a href="https://bit.ly/3bEbQJB" target="_blank" rel="noopener">https://bit.ly/3bEbQJB</a> (全遂道8K机场)<br>无界VPN:<a href="https://bit.ly/2y2xgBj" target="_blank" rel="noopener">https://bit.ly/2y2xgBj</a> (高速 全中转机场)<br>J20:<a href="http://bit.ly/2UgAoRE" target="_blank" rel="noopener">http://bit.ly/2UgAoRE</a> (高速 全中转机场)<br>艾可云:<a href="http://bit.ly/2SI0j3T" target="_blank" rel="noopener">http://bit.ly/2SI0j3T</a> (免费订阅)<br>跑路机场:<a href="http://bit.ly/2tv6cJk" target="_blank" rel="noopener">http://bit.ly/2tv6cJk</a> (稳定可靠 提供免流量节点)<br>闪电机场:<a href="http://bit.ly/37YuNFc" target="_blank" rel="noopener">http://bit.ly/37YuNFc</a> (完全免费公益的机场)<br>酷鹰机场:<a href="http://bit.ly/31By4YO" target="_blank" rel="noopener">http://bit.ly/31By4YO</a> (免费节点多都可以NETFILX)<br>bigheadplus:<a href="http://bit.ly/2Qk5UNi" target="_blank" rel="noopener">http://bit.ly/2Qk5UNi</a> (中高端,专职客服)<br>云域机场:<a href="http://bit.ly/2U7DNCb" target="_blank" rel="noopener">http://bit.ly/2U7DNCb</a> (低倍率节点支持)<br>星梦数据:<a href="http://bit.ly/2TEoYId" target="_blank" rel="noopener">http://bit.ly/2TEoYId</a> (超级牛逼的机场)<br>有顶天:<a href="http://bit.ly/2wv3h4p" target="_blank" rel="noopener">http://bit.ly/2wv3h4p</a> (免费网飞账号支持流媒体及pcr日服)<br>新加坡边际加速:<a href="http://bit.ly/3cDNK2G" target="_blank" rel="noopener">http://bit.ly/3cDNK2G</a> (月可白嫖5G的流量)<br>最速:<a href="http://bit.ly/2uKJD3A" target="_blank" rel="noopener">http://bit.ly/2uKJD3A</a><br>口罩云N95:<a href="http://bit.ly/2IaOKNP" target="_blank" rel="noopener">http://bit.ly/2IaOKNP</a> (注册就送100G 免费节点油管50000+)<br>道长鸡场:<a href="http://bit.ly/2TVdMYe" target="_blank" rel="noopener">http://bit.ly/2TVdMYe</a> 邀请码: bluemango<br>司徒云:<a href="http://bit.ly/3aglxgf" target="_blank" rel="noopener">http://bit.ly/3aglxgf</a><br>崽崽云:<a href="http://bit.ly/2w5DOhR" target="_blank" rel="noopener">http://bit.ly/2w5DOhR</a><br>91ssr极速云:<a href="http://bit.ly/2Ir5sIL" target="_blank" rel="noopener">http://bit.ly/2Ir5sIL</a> (50个免费月卡,油管评论区送出)<br>抖音热:<a href="http://bit.ly/32s3hxW" target="_blank" rel="noopener">http://bit.ly/32s3hxW</a> (国际抖音专用机场)<br>BYwave机场:<a href="http://bit.ly/38xQzzA" target="_blank" rel="noopener">http://bit.ly/38xQzzA</a><br>100元机场:<a href="http://bit.ly/2vhYmUl" target="_blank" rel="noopener">http://bit.ly/2vhYmUl</a> (人少速度快)<br>浪花云地址:<a href="http://bit.ly/2uA0gP4" target="_blank" rel="noopener">http://bit.ly/2uA0gP4</a><br>TED加速云:<a href="http://bit.ly/2TuJR8R" target="_blank" rel="noopener">http://bit.ly/2TuJR8R</a><br>搬瓦工官方鸡场:<a href="http://bit.ly/37u6Oxs" target="_blank" rel="noopener">http://bit.ly/37u6Oxs</a> (优惠码:JMS9272283 不怕IP被封的机场)<br>====IPLC-NAT中转小鸡=====<br>AKKO:<a href="http://bit.ly/31Ba73O" target="_blank" rel="noopener">http://bit.ly/31Ba73O</a><br>套路云:<a href="http://bit.ly/391qXf8" target="_blank" rel="noopener">http://bit.ly/391qXf8</a><br>修罗去:<a href="http://bit.ly/2SDSTjq" target="_blank" rel="noopener">http://bit.ly/2SDSTjq</a><br>PQS:<a href="http://bit.ly/39DxtIP" target="_blank" rel="noopener">http://bit.ly/39DxtIP</a><br>碳云:<a href="http://bit.ly/2wcRV4F" target="_blank" rel="noopener">http://bit.ly/2wcRV4F</a><br>NecoVM:<a href="http://bit.ly/2I3Vxsx" target="_blank" rel="noopener">http://bit.ly/2I3Vxsx</a><br>OVZ:<a href="http://bit.ly/2VWwmjX" target="_blank" rel="noopener">http://bit.ly/2VWwmjX</a><br>=======================VPS推荐======================<br>搬瓦工:<a href="http://bit.ly/30S41M6" target="_blank" rel="noopener">http://bit.ly/30S41M6</a> (10G端口 GIA %6折扣:BWH34QMFYT2R )<br>justhost:<a href="http://bit.ly/39bZtDc" target="_blank" rel="noopener">http://bit.ly/39bZtDc</a> (机场主 俄罗斯节点首选 性价比高)<br>digital-vm: <a href="http://bit.ly/3b0EjJN" target="_blank" rel="noopener">http://bit.ly/3b0EjJN</a> (10G端口 不限流量)<br>hosteons:<a href="http://bit.ly/38H5dEM" target="_blank" rel="noopener">http://bit.ly/38H5dEM</a> (机场必选)<br>cloudcone:<a href="http://bit.ly/30S3Z6W" target="_blank" rel="noopener">http://bit.ly/30S3Z6W</a> (机场必选 灵活)<br>VULTR:<a href="http://bit.ly/2TZNIeC" target="_blank" rel="noopener">http://bit.ly/2TZNIeC</a> (充10刀送100刀)<br>PR:<a href="http://bit.ly/2TYadR2" target="_blank" rel="noopener">http://bit.ly/2TYadR2</a> (力推 建站首选)<br>HOSTDARE:<a href="http://bit.ly/36nIWu0" target="_blank" rel="noopener">http://bit.ly/36nIWu0</a> (CN2 GIA机场必选)<br>TMHHOST:<a href="http://bit.ly/3cgVOGw" target="_blank" rel="noopener">http://bit.ly/3cgVOGw</a> (CN2 GIA)<br>绿帽云:<a href="http://bit.ly/37MNniR" target="_blank" rel="noopener">http://bit.ly/37MNniR</a><br>狗云:<a href="http://bit.ly/2PB9AKd" target="_blank" rel="noopener">http://bit.ly/2PB9AKd</a><br>===============更多精彩视频==================<br>小白翻墙系列:<a href="http://bit.ly/2RDAjWP" target="_blank" rel="noopener">http://bit.ly/2RDAjWP</a><br>youtuber必备:<a href="http://bit.ly/2RY3295" target="_blank" rel="noopener">http://bit.ly/2RY3295</a> </p><p>应用收集来自于网上仅供学习实用,切勿用于非法用途</p>]]></content>
<summary type="html">
全网实用软件合集包含各类(游戏,模拟器,应用......)
</summary>
<category term="软件" scheme="http://mroldx.xyz/categories/%E8%BD%AF%E4%BB%B6/"/>
<category term="软件" scheme="http://mroldx.xyz/tags/%E8%BD%AF%E4%BB%B6/"/>
</entry>
<entry>
<title>Fiddler抓取PC端数据包</title>
<link href="http://mroldx.xyz/2020/04/16/Fiddler%E6%8A%93%E5%8F%96PC%E7%AB%AF%E6%95%B0%E6%8D%AE%E5%8C%85/"/>
<id>http://mroldx.xyz/2020/04/16/Fiddler抓取PC端数据包/</id>
<published>2020-04-16T11:08:10.000Z</published>
<updated>2020-05-05T07:37:09.452Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h1 id="Fiddler抓取PC端数据包:"><a href="#Fiddler抓取PC端数据包:" class="headerlink" title="Fiddler抓取PC端数据包:"></a>Fiddler抓取PC端数据包:</h1><p>这里 Fiddler 抓取网页客户端的数据包时,其原理就是在 客户端/浏览器 和 服务器端 之间,加上了一个 Fiddler 代理服务器,在数据包在客户端和服务器端进行传递时,会被处于中间代理的 Fiddler 代理服务器记录下来。</p><p>首先,我们启动 Fiddler 抓包工具,这个时候,一般情况下,代理会自己开启,不用进行额外的网络设置,我们打开一个 Chrome 浏览器,进行访问百度等网页,就会在 Fiddler 中出现浏览的数据包。如果发现这里抓不到数据包,我们需要进行排查一下:</p><p>1)排查我们的网络代理是否开启了;</p><p>我们打开浏览器,这里以 Chrome 浏览器为例,我们可以看到 Chrome 浏览器设置中高级设置,找到打开代理设置选项:</p><p><img src="https://uploader.shimo.im/f/vqsNy03ug4AnKtiC.png!thumbnail" alt="img"></p><p><img src="https://uploader.shimo.im/f/VvLQTG7G1tgIDLSu.png!thumbnail" alt="img"></p><p><img src="https://uploader.shimo.im/f/5sJxgyeDHpk7kHgz.png!thumbnail" alt="img"></p><p>这里的代理服务器,默认是不勾选的,然后我们打开 fiddler 抓包工具,可以看到这里的代理服务器设置被默认开启:</p><p><img src="https://uploader.shimo.im/f/2qNYlrgtlMUlL91l.png!thumbnail" alt="img"></p><p><img src="https://uploader.shimo.im/f/HB9JFIC1fV4Yb9ke.png!thumbnail" alt="img"></p><p>这个时候,我们就能抓取到数据包了。</p><p>2)排查Fiddler自身设置抓取 HTTPS 协议包;</p><p>打开 Fiddler,点击工具栏中的 Tools—> Options,切到Https页签,勾选选项:</p><p><img src="https://uploader.shimo.im/f/KfJPmm2h6dsnarlq.png!thumbnail" alt="img"></p><p>然后切换到 Connections 页签,勾选下面选项,这里的端口默认是 8888 端口:</p><p><img src="https://uploader.shimo.im/f/swZOQw8nIJ4Etf6K.png!thumbnail" alt="img"></p><p>3)排查浏览器版本;</p><p>这里建议安装最新版本的浏览器,可以避免一些奇怪的莫名错误。</p><p>4)证书安装;</p><p>证书安装这里自行百度,一般安装fiddler时会自动安装上。</p><h1 id="Fiddler抓取移动端数据包:"><a href="#Fiddler抓取移动端数据包:" class="headerlink" title="Fiddler抓取移动端数据包:"></a>Fiddler抓取移动端数据包:</h1><p>1)打开 fiddler,点击菜单栏中的 Tools —> Fiddler Options;</p><p><img src="https://uploader.shimo.im/f/YdawTrlNsxYywHlE.png!thumbnail" alt="img"></p><p>2)选中 Connections 页签,设置代理端口号为8888,勾选 Allow remote computer to connect,点击 OK,然后重启 Fiddler;</p><p><img src="https://uploader.shimo.im/f/V7XcfsjxdOk1ihl4.png!thumbnail" alt="img"></p><p>3)cmd进入到电脑dos界面,输入 ipconfig 命令,查看电脑的 ip 地址;</p><p><img src="https://uploader.shimo.im/f/XmRrjz3iH0Qx5l4D.png!thumbnail" alt="img"></p><p>4)在手机端链接同网段内的WiFi,然后设置代理IP和端口号一致;</p><p><img src="https://uploader.shimo.im/f/KG4mKHuCiMcWG8pa.png!thumbnail" alt="img"></p><p>5)然后在手机浏览器中,输入 IP:端口号,下载Fiddler的证书进行安装;</p><p><img src="https://uploader.shimo.im/f/l7t6yAxTyiYUzCrx.png!thumbnail" alt="img"></p><p>6)证书安装完成后,就可以用手机进行访问,然后在 Fiddler 中就可以看到手机访问的数据包了;</p><p><img src="https://uploader.shimo.im/f/VSZYlCatFTMQd2jQ.png!thumbnail" alt="img"></p><h1 id="Fiddler抓取模拟器数据包:"><a href="#Fiddler抓取模拟器数据包:" class="headerlink" title="Fiddler抓取模拟器数据包:"></a>Fiddler抓取模拟器数据包:</h1><p>模拟器的基本原理和移动端相似,就是相当于在电脑上操作一个模拟的手机端。</p><p>1)Fiddler设置和上面提到的是一样的,进行设置即可;</p><p>2)打开模拟器,找到模拟器中链接网络的WLAN信号,进行长按修改网络;</p><p><img src="https://uploader.shimo.im/f/oKUu4ZkdO7Ap1FJC.png!thumbnail" alt="img"></p><p>3)点击修改网络弹出界面中的“显示高级选项”设置,然后代理选择“手动”,代理服务器主机名和端口号,就用上面我们查询到的即可,然后保存;</p><p><img src="https://uploader.shimo.im/f/YZibjrlX4N0XmaQe.png!thumbnail" alt="img"></p><p>4)保存后,同样的,用模拟器的浏览器访问 ip地址:代理端口号,如:<a href="http://192.168.20.107:8888,然后下载" target="_blank" rel="noopener">http://192.168.20.107:8888,然后下载</a> Fiddler 安全证书进行安装;</p><p><img src="https://uploader.shimo.im/f/A5iu2MDoq4oqPHwb.png!thumbnail" alt="img"></p><p>5)安装完证书后,需要取一个名字,名字随便去一个就行了,然后到这一步,Fiddler就可以对我们设置过后的模拟器进行抓包了。</p><h1 id="fiddler小知识–会话属性及其图标的含义"><a href="#fiddler小知识–会话属性及其图标的含义" class="headerlink" title="fiddler小知识–会话属性及其图标的含义"></a>fiddler小知识–会话属性及其图标的含义</h1><p><img src="https://uploader.shimo.im/f/gVDFYZFxUpUqAXpQ.jpg!thumbnail" alt="img"></p><p>在测试的过程中,我们经常会用到抓包工具–Fiddler,用来抓取网络数据包,从而用来帮助定位Bug。对于 Fiddler 会话列表中,这里对其列表中的会话的属性及其图标的含义,做一个简单的整理小结。</p><h3 id="1-会话属性"><a href="#1-会话属性" class="headerlink" title="1.会话属性"></a>1.会话属性</h3><p><strong>#:</strong>为了方便查找和定位而自动生成的自增数列 id,从1开始递增。</p><p><strong>Result:</strong>网络协议相应的结果编码。</p><p><strong>Protocol:</strong>会话使用的协议类型,如:HTTP,HTTPS,FTP等。</p><p><strong>Host:</strong>网络请求发送到的服务器主机名。</p><p><strong>URL:</strong>服务器中的路径和文件。</p><p><strong>Body:</strong>响应 body 的字节数,以 bytes 为单位。</p><p><strong>Caching:</strong>响应的有效期或Cache-Control标头的值。</p><p><strong>Content-Type:</strong>响应的Content-Type标头。</p><p><strong>Process:</strong>发起流量数据包的本地 Windows 进程。</p><p><strong>Comments:</strong>注释,可以从脚本或会话的上下文菜单设置的文本。</p><p><strong>Custom:</strong>自定义,可设置脚本的文本。</p><h3 id="2-会话图标(图片来源于网络)"><a href="#2-会话图标(图片来源于网络)" class="headerlink" title="2.会话图标(图片来源于网络)"></a>2.会话图标(图片来源于网络)</h3><p><img src="https://uploader.shimo.im/f/DJ2hYoJrpzkdAveT.png!thumbnail" alt="img"></p>]]></content>
<summary type="html">
Fiddler抓取PC端数据包
</summary>
<category term="工具" scheme="http://mroldx.xyz/tags/%E5%B7%A5%E5%85%B7/"/>
</entry>
<entry>
<title>SpringBoot Admin使用</title>
<link href="http://mroldx.xyz/2020/04/12/Spring%20Admin%E4%BD%BF%E7%94%A8/"/>
<id>http://mroldx.xyz/2020/04/12/Spring Admin使用/</id>
<published>2020-04-12T11:08:10.000Z</published>
<updated>2020-07-07T08:57:22.994Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><p><strong>常见的功能或者监控如下:</strong></p><ul><li><p>显示健康状况</p></li><li><p>显示详细信息,例如</p></li><li><p>JVM和内存指标</p></li><li><p>micrometer.io指标</p></li><li><p>数据源指标</p></li><li><p>缓存指标</p></li><li><p>关注并下载日志文件</p></li><li><p>查看jvm系统和环境属性</p></li><li><p>查看Spring Boot配置属性</p></li><li><p>支持Spring Cloud的postable / env-和/ refresh-endpoint</p></li><li><p>轻松的日志级管理</p></li><li><p>与JMX-beans交互</p></li><li><p>查看线程转储</p></li><li><p>查看http跟踪</p></li><li><p>查看auditevents</p></li><li><p>查看http-endpoints</p></li><li><p>查看计划任务</p></li><li><p>查看和删除活动会话(使用spring-session)</p></li><li><p>查看Flyway / Liquibase数据库迁移</p></li><li><p>下载heapdump</p></li><li><p>状态变更通知</p></li></ul><p><strong>部署SpringBoot Admin Server,输入用户名密码进入控制台</strong></p><h1 id="一-SpringBoot-Admin-Server控制台"><a href="#一-SpringBoot-Admin-Server控制台" class="headerlink" title="一.SpringBoot Admin Server控制台"></a><strong>一.SpringBoot Admin Server控制台</strong></h1><h2 id="1-1-应用墙"><a href="#1-1-应用墙" class="headerlink" title="1.1.应用墙"></a><strong>1.1.应用墙</strong></h2><p>查看注册中心上所有的微服务,每个服务部署了多少个实例,可以点击任意一个服务进入看这个服务的监控信息</p><h2 id="1-2-服务详情"><a href="#1-2-服务详情" class="headerlink" title="1.2.服务详情"></a><strong>1.2.服务详情</strong></h2><p>点击服务,查看服务监控信息</p><p><img src="https://uploader.shimo.im/f/iVNc5fwzQRchWhcb.png!thumbnail" alt="img"></p><h2 id="1-3线上jvm信息"><a href="#1-3线上jvm信息" class="headerlink" title="1.3线上jvm信息"></a><strong>1.3线上jvm信息</strong></h2><p>如果发生oom或者死锁等问题,可以下载堆栈信息定位问题</p><p><img src="https://uploader.shimo.im/f/PizpsOcE9Rsf3iUK.png!thumbnail" alt="img"></p><h1 id="二-客户端接入-微服务"><a href="#二-客户端接入-微服务" class="headerlink" title="二.客户端接入(微服务)"></a><strong>二.客户端接入(微服务)</strong></h1><p><strong>所有服务接入也非常简单,只需要引入几个依赖和新增配置即可</strong></p><h2 id="2-1项目引入依赖"><a href="#2-1项目引入依赖" class="headerlink" title="2.1项目引入依赖"></a><strong>2.1项目引入依赖</strong></h2> <dependency><br><br> <groupid>de.codecentric</groupid><br><br> <artifactid>spring-boot-admin-starter-client</artifactid><br><br> <version>2.1.0</version><br><br> </dependency><h2 id="2-2新增配置"><a href="#2-2新增配置" class="headerlink" title="2.2新增配置"></a><strong>2.2新增配置</strong></h2><p><strong>开放endpoint, 在SpringBoot2.x中,默认只开放了info、health两个端点,剩余的需要自己通过配置management.endpoints.web.exposure.include属性来加载,在项目application.yaml文件中新增配置</strong></p><p>management:</p><p> endpoints:</p><p> web:</p><p> base-path: /</p><p> exposure:</p><p>#默认情况下,大多数actuator的端口都不会通过http公开,* 代表公开所有这些端,开#发环境可以全部打开</p><p> include: ‘*’</p><p> endpoint:</p><p> health:</p><p> show-details: <em>A**LWAYS</em></p><p>spring:</p><p> boot:</p><p> admin:</p><p> client:</p><p> instance:</p><p>#通过ip来替换hostname</p><p> prefer-ip: <em>true</em></p><h2 id="2-3-检查是否生效"><a href="#2-3-检查是否生效" class="headerlink" title="2.3.检查是否生效"></a><strong>2.3.检查是否生效</strong></h2><p>去控制台检查是否生效</p>]]></content>
<summary type="html">
SpringBoot Admin可以看作是SpringBoot actuator监控的一个UI界面,SpringBoot Admin分为server和client端,将admin server注册到服务注册中心,其他微服务只要在注册中心注册并且暴露了actuator,这样对于微服务没有任何改动
</summary>
<category term="工具" scheme="http://mroldx.xyz/tags/%E5%B7%A5%E5%85%B7/"/>
</entry>
<entry>
<title>CentOS 7 下安装部署 Jenkins教程</title>
<link href="http://mroldx.xyz/2020/02/01/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/CentOS-7%E4%B8%8B%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2-Jenkins%E6%95%99%E7%A8%8B/"/>
<id>http://mroldx.xyz/2020/02/01/持续集成/CentOS-7下安装部署-Jenkins教程/</id>
<published>2020-02-01T05:40:20.000Z</published>
<updated>2020-05-05T07:34:06.945Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p><img src="img/2.jpg" alt="img"></p><h3 id="1、-Jenkins是什么?"><a href="#1、-Jenkins是什么?" class="headerlink" title="1、 Jenkins是什么?"></a>1、 Jenkins是什么?</h3><p>Jenkins是一个开源的支持自动化构建、部署等任务的平台。基本上可以说是持续集成(CI)、持续发布(CD)不可或缺的工具。</p><p>官网:<a href="https://jenkins.io/" target="_blank" rel="noopener">https://jenkins.io/</a></p><h3 id="2、本篇环境信息"><a href="#2、本篇环境信息" class="headerlink" title="2、本篇环境信息"></a>2、本篇环境信息</h3><table><thead><tr><th>工具/环境</th><th>版本</th></tr></thead><tbody><tr><td>Linux Server</td><td>CentOS 7</td></tr><tr><td>Jenkins</td><td>2.121.2</td></tr><tr><td>JDK</td><td>1.8.0_181</td></tr></tbody></table><h3 id="3、准备工作安装JDK"><a href="#3、准备工作安装JDK" class="headerlink" title="3、准备工作安装JDK"></a>3、准备工作安装JDK</h3><h4 id="1、下载"><a href="#1、下载" class="headerlink" title="1、下载"></a>1、下载</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">#JDK下载首页</span><br><span class="line">http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html</span><br><span class="line">#JDK8历史版本</span><br><span class="line">https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html</span><br><span class="line">#(1)下载之后FTP/SFTP到服务器</span><br><span class="line">#(2)获取到下载链接后,用wget命令下载</span><br></pre></td></tr></table></figure><h4 id="2、解压到指定目录"><a href="#2、解压到指定目录" class="headerlink" title="2、解压到指定目录"></a>2、解压到指定目录</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo mkdir -p /usr/java </span><br><span class="line">sudo tar zvxf jdk-8u131-linux-x64.tar.gz -C /usr/java</span><br></pre></td></tr></table></figure><h4 id="3、配置环境变量"><a href="#3、配置环境变量" class="headerlink" title="3、配置环境变量"></a>3、配置环境变量</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/profile</span><br><span class="line"># 在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL下添加</span><br><span class="line"></span><br><span class="line">export JAVA_HOME=/usr/java/jdk1.8.0_131</span><br><span class="line">export PATH=$JAVA_HOME/bin:$PATH</span><br><span class="line">export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar</span><br></pre></td></tr></table></figure><h4 id="4、使环境变量生效"><a href="#4、使环境变量生效" class="headerlink" title="4、使环境变量生效"></a>4、使环境变量生效</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">source /etc/profile</span><br></pre></td></tr></table></figure><h4 id="5、检查是否配置成功"><a href="#5、检查是否配置成功" class="headerlink" title="5、检查是否配置成功"></a>5、检查是否配置成功</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java -version</span><br></pre></td></tr></table></figure><h2 id="二、Jenkins安装"><a href="#二、Jenkins安装" class="headerlink" title="二、Jenkins安装"></a>二、Jenkins安装</h2><h3 id="1、Yum安装"><a href="#1、Yum安装" class="headerlink" title="1、Yum安装"></a>1、Yum安装</h3><ul><li>yum源导入</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#添加Yum源</span></span><br><span class="line">sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo</span><br><span class="line"></span><br><span class="line"><span class="comment">#导入密钥</span></span><br><span class="line">sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key</span><br></pre></td></tr></table></figure><ul><li>安装</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install -y jenkins</span><br></pre></td></tr></table></figure><h3 id="2、开放端口"><a href="#2、开放端口" class="headerlink" title="2、开放端口"></a>2、开放端口</h3><p>Jenkins站点的默认监听端口是8080</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo firewall-cmd --add-port=8080/tcp --permanent</span><br><span class="line">sudo firewall-cmd --reload</span><br></pre></td></tr></table></figure><h3 id="3、配置Java可选路径"><a href="#3、配置Java可选路径" class="headerlink" title="3、配置Java可选路径"></a>3、配置Java可选路径</h3><p>因为Jenkins默认的java可选路径不包含我们部署的jdk路径,所以这里要配置一下,不然Jenkins服务会启动失败</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#修改jenkins启动脚本</span></span><br><span class="line">sudo vi /etc/init.d/jenkins</span><br><span class="line"></span><br><span class="line"><span class="comment">#修改candidates增加java可选路径:/usr/java/jdk1.8.0_181/bin/java</span></span><br><span class="line">candidates=<span class="string">"</span></span><br><span class="line"><span class="string">/etc/alternatives/java</span></span><br><span class="line"><span class="string">/usr/lib/jvm/java-1.8.0/bin/java</span></span><br><span class="line"><span class="string">/usr/lib/jvm/jre-1.8.0/bin/java</span></span><br><span class="line"><span class="string">/usr/lib/jvm/java-1.7.0/bin/java</span></span><br><span class="line"><span class="string">/usr/lib/jvm/jre-1.7.0/bin/java</span></span><br><span class="line"><span class="string">/usr/bin/java</span></span><br><span class="line"><span class="string">/usr/java/jdk1.8.0_181/bin/java</span></span><br><span class="line"><span class="string">"</span></span><br></pre></td></tr></table></figure><h3 id="4、启动Jenkins并设置Jenkins开机启动"><a href="#4、启动Jenkins并设置Jenkins开机启动" class="headerlink" title="4、启动Jenkins并设置Jenkins开机启动"></a>4、启动Jenkins并设置Jenkins开机启动</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#重载服务(由于前面修改了Jenkins启动脚本)</span></span><br><span class="line">sudo systemctl daemon-reload</span><br><span class="line"></span><br><span class="line"><span class="comment">#启动Jenkins服务</span></span><br><span class="line">sudo systemctl start jenkins</span><br><span class="line"></span><br><span class="line"><span class="comment">#将Jenkins服务设置为开机启动</span></span><br><span class="line"><span class="comment">#由于Jenkins不是Native Service,所以需要用chkconfig命令而不是systemctl命令</span></span><br><span class="line">sudo /sbin/chkconfig jenkins on</span><br></pre></td></tr></table></figure><p>浏览器输入 <code>http://你虚拟机的ip:8080</code> 访问Jenkins</p><h3 id="5-第一次启动需要输入密码"><a href="#5-第一次启动需要输入密码" class="headerlink" title="5,第一次启动需要输入密码"></a>5,第一次启动需要输入密码</h3><p>密码默认在/root/.jenkins/ssecrets/initiaAdminPassword</p><h3 id="6、插件安装修改默认插件源"><a href="#6、插件安装修改默认插件源" class="headerlink" title="6、插件安装修改默认插件源"></a>6、插件安装修改默认插件源</h3><p><strong>注:(vi /root/.jenkins/hudson.model.UpdateCenter.xml)</strong></p><p>打开 hudson.model.UpdateCenter.xml</p><p>把 <a href="http://updates.jenkins-ci.org/update-center.json" target="_blank" rel="noopener">http://updates.jenkins-ci.org/update-center.json</a></p><p>改成 :(以下其中一个)</p><p><a href="http://mirror.xmission.com/jenkins/updates/update-center.json" target="_blank" rel="noopener">http://mirror.xmission.com/jenkins/updates/update-center.json</a></p><p><a href="https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</a></p><p><a href="http://mirror.esuni.jp/jenkins/updates/update-center.json" target="_blank" rel="noopener">http://mirror.esuni.jp/jenkins/updates/update-center.json</a></p><p>,还是不行的话找到 updates 目录下的 default.json 把里面所有的谷歌地址改成百度的,即将 <a href="http://www.google.com/" target="_blank" rel="noopener">http://www.google.com/</a> 替换为 <a href="http://www.baidu.com/。输入密码后出现以下界面说明成功。" target="_blank" rel="noopener">http://www.baidu.com/。输入密码后出现以下界面说明成功。</a></p><p><img src="https://img2018.cnblogs.com/blog/1733080/201909/1733080-20190930111616624-1110674914.png" alt="img"></p><p>,还是不行的话找到 updates 目录下的 default.json 把里面所有的谷歌地址改成百度的,即将 <a href="http://www.google.com/" target="_blank" rel="noopener">http://www.google.com/</a> 替换为 <a href="http://www.baidu.com/。输入密码后出现以下界面说明成功。" target="_blank" rel="noopener">http://www.baidu.com/。输入密码后出现以下界面说明成功。</a></p><p><img src="https://img2018.cnblogs.com/blog/1733080/201909/1733080-20190930110700695-1135323904.png" alt="img"></p><p>配置完成出现以下界面说明url配置完成!</p><p><img src="https://img2018.cnblogs.com/blog/1733080/201909/1733080-20190930111616624-1110674914.png" alt="img"></p><h3 id="3-推荐插件安装"><a href="#3-推荐插件安装" class="headerlink" title="3.推荐插件安装"></a>3.推荐插件安装</h3><p><img src="https://img2018.cnblogs.com/blog/1733080/201909/1733080-20190930111842790-1822503375.png" alt="img"></p><h3 id="4-创建用户"><a href="#4-创建用户" class="headerlink" title="4.创建用户"></a>4.创建用户</h3><p><img src="https://img2018.cnblogs.com/blog/1733080/201909/1733080-20190930115339754-873101586.png" alt="img"></p><h3 id="5-实例配置"><a href="#5-实例配置" class="headerlink" title="5.实例配置"></a>5.实例配置</h3><p><img src="https://img2018.cnblogs.com/blog/1733080/201909/1733080-20190930115427702-1648350448.png" alt="img"></p><h3 id="6-开始使用"><a href="#6-开始使用" class="headerlink" title="6.开始使用"></a>6.开始使用</h3><p><img src="https://img2018.cnblogs.com/blog/1733080/201909/1733080-20190930115513633-1327651068.png" alt="img"></p><h3 id="7-进入首页"><a href="#7-进入首页" class="headerlink" title="7.进入首页"></a>7.进入首页</h3><p><img src="https://img2018.cnblogs.com/blog/1733080/201909/1733080-20190930115541147-1354444469.png" alt="img"></p><p> 至此、Jenkins的下载安装,完成</p>]]></content>
<summary type="html">
CentOS 7 下安装部署 Jenkins教程
</summary>
<category term="持续集成" scheme="http://mroldx.xyz/categories/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/"/>
<category term="CI/CD" scheme="http://mroldx.xyz/tags/CI-CD/"/>
</entry>
<entry>
<title>redis缓存</title>
<link href="http://mroldx.xyz/2020/01/16/redis/redis/"/>
<id>http://mroldx.xyz/2020/01/16/redis/redis/</id>
<published>2020-01-16T15:50:31.000Z</published>
<updated>2020-05-05T07:37:09.455Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><p><img src="localhost:4000/images/1.jpg" alt="image"></p><ul><li><a href="redis-master-slave.md">安装、主从复制</a></li><li><a href="redis缓存与memcache的区别.md">redis缓存与memcache的区别</a></li><li><a href="http://www.runoob.com/redis/redis-sorted-sets.html" target="_blank" rel="noopener">redis原生命令api</a></li><li><a href="http://doc.redisfans.com/index.html" target="_blank" rel="noopener">redis 命令参考</a></li><li><a href="http://www.runoob.com/redis/redis-pub-sub.html" target="_blank" rel="noopener">Redis 教程</a></li></ul><h2 id="redis缓存"><a href="#redis缓存" class="headerlink" title="redis缓存"></a>redis缓存</h2><h3 id="附录"><a href="#附录" class="headerlink" title="附录"></a>附录</h3><ul><li><a href="redis-master-slave.md">安装、主从复制</a></li><li><a href="redis缓存与memcache的区别.md">redis缓存与memcache的区别</a></li><li><a href="http://www.runoob.com/redis/redis-sorted-sets.html" target="_blank" rel="noopener">redis原生命令api</a></li><li><a href="http://doc.redisfans.com/index.html" target="_blank" rel="noopener">redis 命令参考</a></li><li><a href="http://www.runoob.com/redis/redis-pub-sub.html" target="_blank" rel="noopener">Redis 教程</a></li><li>redis cluster<ul><li><a href="http://www.redis.cn/topics/cluster-tutorial.html" target="_blank" rel="noopener">Redis 集群教程</a></li><li><a href="https://www.cnblogs.com/lykxqhh/p/5690923.html" target="_blank" rel="noopener">Redis Cluster集群搭建</a></li></ul></li></ul><p>客户端:</p><ul><li>Jedis<ul><li><a href="https://github.com/xetorthio/jedis" target="_blank" rel="noopener">github源码</a></li></ul></li><li>Redic<ul><li>Redis缓存客户端,支持读写分离和分片。</li><li><a href="https://gitee.com/robertleepeak/redic" target="_blank" rel="noopener">源码</a></li></ul></li><li>Codis<ul><li>在应用层和缓存服务器中间增加一个代理层,根据分片规则来路由请求。</li><li><a href="http://www.cnblogs.com/xuanzhi201111/p/4425194.html" target="_blank" rel="noopener">Codis集群的搭建与使用</a></li></ul></li></ul><p>资料收集:</p><ul><li><a href="http://blog.csdn.net/world6/article/details/79381682" target="_blank" rel="noopener">redis为什么是单线程?</a></li><li><a href="https://mp.weixin.qq.com/s/m-RdJQdG-qW-BLquorhMlQ" target="_blank" rel="noopener">Redis为什么这么快?一文深入了解Redis内存模型!</a></li><li><a href="https://mp.weixin.qq.com/s/vxJCG0Nk4csbZ1axLy0bfQ" target="_blank" rel="noopener">3台机器轻松搭建一个高可用Redis服务架构</a></li><li><a href="https://mp.weixin.qq.com/s/fpupqLp-wjR8fQvYSQhVLg" target="_blank" rel="noopener">Redis 内存为什么不宜过大</a></li><li><a href="https://mp.weixin.qq.com/s/BoLsVKYyu8yRXZbxd1uuQw" target="_blank" rel="noopener">史上最全Redis高可用技术解决方案大全</a></li></ul><p>业务应用:</p><ul><li><a href="https://mp.weixin.qq.com/s/2FEbkas_m1WnYUqjVpMkWw" target="_blank" rel="noopener">同程凤凰缓存系统基于Redis的设计与实践</a></li><li><a href="http://mp.weixin.qq.com/s/YhrJprLWjoZa2tU3qY8XZw" target="_blank" rel="noopener">携程开源其Redis多数据中心解决方案XPipe</a></li></ul><p>前沿:</p><ul><li><a href="redis-new-feature.md">redis不同版本新特性</a></li></ul><hr><p>redis采用C编写,redis服务器是核心业务采用单线程模式,无锁竞争且基于内存操作,执行效率非常高。</p><p>如果开启备份机制,会fork子线程来处理。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">用的比较多的redis客户端jedis:</span><br><span class="line">https://github.com/xetorthio/jedis</span><br></pre></td></tr></table></figure><h3 id="核心逻辑:"><a href="#核心逻辑:" class="headerlink" title="核心逻辑:"></a>核心逻辑:</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">protected Connection sendCommand(final Command cmd, final byte[]... args) {</span><br><span class="line">try {</span><br><span class="line">//建立连接,包装RedisOutputStream和RedisInputStream</span><br><span class="line"> connect();</span><br><span class="line"> //发送执行命令</span><br><span class="line"> Protocol.sendCommand(outputStream, cmd, args);</span><br><span class="line"> lastAccessTime = System.currentTimeMillis();</span><br><span class="line"> pipelinedCommands++;</span><br><span class="line"> return this;</span><br><span class="line">} catch (JedisConnectionException ex) {</span><br><span class="line">System.err.println(ex.getMessage());</span><br><span class="line"> // Any other exceptions related to connection?</span><br><span class="line"> broken = true;</span><br><span class="line"> throw ex;</span><br><span class="line">}</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><p>Command内提供了多种redis操作命令。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">public static enum Command {</span><br><span class="line">PING, SET, GET, QUIT, EXISTS, DEL, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBSUB, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, ZLEXCOUNT, ZRANGEBYLEX, ZREMRANGEBYLEX, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT, BITPOS, SETRANGE, GETRANGE, EVAL, EVALSHA, SCRIPT, SLOWLOG, OBJECT, BITCOUNT, BITOP, SENTINEL, DUMP, RESTORE, PEXPIRE, PEXPIREAT, PTTL, INCRBYFLOAT, PSETEX, CLIENT, TIME, MIGRATE, HINCRBYFLOAT, SCAN, HSCAN, SSCAN, ZSCAN, WAIT, CLUSTER, ASKING, PFADD, PFCOUNT, PFMERGE;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">public String set(final String key, final String value, final String nxxx,</span><br><span class="line"> final String expx, final long time) {</span><br><span class="line">checkIsInMulti();</span><br><span class="line">client.set(key, value, nxxx, expx, time);</span><br><span class="line">//返回结果</span><br><span class="line">return client.getStatusCodeReply();</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h3 id="不同类型长度限制:"><a href="#不同类型长度限制:" class="headerlink" title="不同类型长度限制:"></a>不同类型长度限制:</h3><ul><li>string 最大512M</li><li>List 最大长度 (2的32次方-1),有序可重复</li><li>Sets 最大长度 (2的32次方-1),不允许重复,自动去重</li><li>Sorted sets,同上,支持按score排序</li><li>Hashes kv对数(2的32次方-1)</li></ul><h3 id="内部方法详解:"><a href="#内部方法详解:" class="headerlink" title="内部方法详解:"></a>内部方法详解:</h3><h4 id="1-String"><a href="#1-String" class="headerlink" title="1.String"></a>1.String</h4><ul><li><p>String setBin(String key, byte[] value) </p><p>按字节数组关联到key下</p></li><li><p>byte[] getBin(String key) </p><p>根据key查找对应下的字节数组</p></li><li><p>String set(String key, String value) </p><p>将字符串值value关联到key</p></li><li><p>String get(String key)</p><p>返回key所关联的字符串值,如果key不存在则返回null</p></li><li><p>long setnx(String key, String value)</p><p>将字符串值value关联到key,如果key已存在则不做任何改变。返回1表示key不存在,第一次设置;返回0表示key已经存在</p></li><li><p>String setex(String key, int seconds, String value)</p><p>将值value关联到key,并将key的生命周期设为seconds(以秒为单位)。如果key 已经存在,SETEX命令将覆写旧值。 </p></li><li><p>long append(String key, String value)</p><p>如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后<br><br>如果key不存在,APPEND就简单地将给定key设为value,同 SET key value</p></li><li><p>long strlen(String key) throws RedisException;</p><p>获取key所对应的value字符串长度</p></li><li><p>long incr(String key) </p><p>将key中储存的数字值加1,如果key不存在,以0为key的初始值,然后执行INCR操作。线程安全</p></li><li><p>long incrBy(String key, long n)</p><p>将key中储存的数字值加n,如果key不存在,以0为key的初始值,然后执行INCRBY操作</p></li><li><p>long decr(String key)</p><p>将key中储存的数字值减1,如果key不存在,以0为key的初始值,然后执行DECR操作。</p></li><li><p>long decrBy(String key, long n)</p><p>将key中储存的数字值减n,如果key不存在,以0为key的初始值,然后执行DECRBY操 </p></li><li><p>String getSet(String key, String value) </p><p>设置key为当前值,并返回旧的值</p></li><li>String set(String key, String value, String nxxx, String expx, long time) throws RedisException;</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">将字符串值value关联到key:</span><br><span class="line">nxxx:必须是NX或者XX,NX表示不存在则设置否则不做操作;XX表示存在才设置否则不做操作</span><br><span class="line">expx:过期时间单位必须是EX或PX,EX表示单位是“秒”,PX表示单位是“毫秒”</span><br><span class="line">time:过期时间,前一个参数是"EX"的话单位为“秒”,是"PX"的话单位为“毫秒”</span><br><span class="line"></span><br><span class="line">@return 操作成功的话返回字符串OK,否则返回null</span><br><span class="line"></span><br><span class="line">ps:从Redis 2.6.12 版本开始支持</span><br></pre></td></tr></table></figure><h3 id="2-List"><a href="#2-List" class="headerlink" title="2.List"></a>2.List</h3><p>Redis lists基于Linked Lists实现。这意味着即使在一个list中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别的。用LPUSH 命令在十个元素的list头部添加新元素,和在千万元素list头部添加新元素的速度相同</p><ul><li><p>long lpush(String key, String value) </p><p>将值value插入到列表key的表头。 如果key不存在,一个空列表会被创建并执行LPUSH操作</p></li><li><p>long lpushBin(String key, byte[] value)</p><p>同上</p></li><li><p>long rpush(String key, String value) </p><p>将值value插入到列表key的表尾。 如果key不存在,一个空列表会被创建并执行RPUSH操作</p></li><li><p>long rpushBin(String key, byte[] value) </p><p>同上</p></li><li><p>String lpop(String key)</p><p>移除并返回列表key的头元素</p></li><li><p>byte[] lpopBin(String key)</p><p>同上</p></li><li><p>String rpop(String key)</p><p>移除并返回列表key的尾元素</p></li><li><p>byte[] rpopBin(String key)</p><p>同上</p></li><li><p>long llen(String key) </p><p>计算列表长度</p></li><li><p>List<string> lrange(String key, long start, long end) </string></p><p>返回列表key中指定区间内的元素,[start,end],区间为0开始</p></li><li><p>String ltrim(String key, int start, int end)</p><p>列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除</p></li><li><p>long lrem(final String key, final long count, final String value)</p><p>根据参数count的值,移除列表中与参数value相等的元素<br><br>count的值可以是以下几种:<br><br>count > 0: 从表头开始向表尾搜索,移除与value相等的元素,数量为count <br><br>count < 0: 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值 <br><br>count = 0: 移除表中所有与value相等的值 <br></p></li></ul><h4 id="3-Set"><a href="#3-Set" class="headerlink" title="3.Set"></a>3.Set</h4><ul><li><p>long sadd(String key, String member)</p><p>将member单个元素加入到集合key当中</p></li><li><p>long sadd(String key, String… members)</p><p>将members元素数组加入到集合key当中</p></li><li><p>long srem(String key, String member)</p><p>移除集合中的member元素</p></li><li><p>long scard(String key)</p><p>集合中元素的数量</p></li><li><p>Set<string> smembers(String key)</string></p><p>返回set中的所有元素</p></li></ul><h4 id="4-sorted-set"><a href="#4-sorted-set" class="headerlink" title="4.sorted set"></a>4.sorted set</h4><ul><li><p>long zadd(String key, double score, String member)</p><p>将member元素及其score值加入到有序集key当中</p></li><li><p>double zincrby(String key, double score, String member)</p><p>对member元素增加score值</p></li><li><p>long zrem(String key, String member)</p><p>移除有序集合key中的成员member,如果member不是有序集中的成员,不做任何操作</p></li><li><p>long zremrangeByScore(String key, double start, double end)</p><p>删除的有序集合保存在key的最小值和最大值(含)之间的分数的所有元素</p></li><li><p>long zcard(String key)</p><p>集合长度</p></li><li><p>long zcount(String key, double min, double max)</p><p>有序集key中,score值在min和max之间的成员数量</p></li><li><p>double zscore(String key, String member)</p><p>有序集key中,成员member的score值</p></li><li><p>long zrank(String key, String member)</p><p>返回有序集key中成员member的排名。其中有序集成员按score值递增(从小到大)顺序排列<br><br>排名以0为底,也就是说,score值最小的成员排名为0</p></li></ul><ul><li><p>Set\<string> zrange(String key, int start, int end)</string></p><p>返回索引区间之间的元素,最小元素索引号为0,[start,end]</p></li><li><p>Set\<string> zrangeByScore(String key, double min, double max)</string></p><p>返回分数之间的元素,[min,max]</p></li><li><p>Set\<string> zrangeByScore(String key, double min, double max, int offset, int count)</string></p><p>分数由小到大的顺序,取[min,max]之间的数据,offset表示取数据的开始位置(O:表示最小分数的那个位置),最多返回count个结果</p></li></ul><ul><li><p>long zrevrank(String key, String member) </p><p>返回有序集key中成员member的排名。其中有序集成员按score值递减(从大到小)排序<br><br>排名以0为底,也就是说,score值最大的成员排名为0</p></li><li><p>Set\<string> zrevrange(String key, int start, int end)</string></p><p>返回索引区间之间的元素,最大元素索引号为0,[start,end]</p></li><li><p>Set\<tuple> zrevrangeByScoreWithScores(String key, double max,</tuple></p><pre><code>double min, int offset, int count)</code></pre><p>分数按大到小的顺序,取[min,max]之间的数据,offset表示取数据的开始位置(O:表示最大分数的那个位置),最多返回count个结果,Tuple包含分数、value值等信息。 </p></li></ul><h4 id="5-Hash"><a href="#5-Hash" class="headerlink" title="5.Hash"></a>5.Hash</h4><ul><li><p>long hset(String key, String field, String value)</p><p>将哈希表key中的域field的值设为value,如果key不存在,一个新的哈希表被创建并进行HSET操作。</p></li><li><p>long hsetBin(String key, String field, byte[] value)</p><p>同上</p></li><li><p>long hsetnx(String key, String field, String value)</p><p>将哈希表key中的域field的值设为value,如果key已经存在,不做任何处理</p></li><li><p>String hmset(String key, Map<String, String> hash)</p><p>同时将多个field - value(域-值)对设置到哈希表key中</p></li><li><p>String hget(String key, String field)</p><p>返回哈希表key中给定域field的值</p></li><li><p>byte[] hgetBin(String key, String field) </p><p>同上</p></li><li><p>Map<String, String> hgetAll(String key)</p><p>返回哈希表key中,所有的域和值</p></li><li><p>List<string> hmget(String key, String… fields)</string></p><p>返回哈希表key中,一个或多个给定域的值,一一对应的<br><br>如果给定的域不存在于哈希表,那么返回一个null.</p></li><li><p>long hlen(String key)</p><p>返回Hash表中的元素个数</p></li><li><p>Set<string> hkeys(String key)</string></p><p>返回Hash表中的keys</p></li><li><p>List<string> hvals(String key)</string></p><p>返回Hash表中的values</p></li><li><p>boolean hexists(String key, String field) </p><p>哈希表key中,给定域field是否存在</p></li><li><p>long hdel(String key, String field)</p><p>删除哈希表key中的一个指定域</p></li><li><p>long hincrBy(String key, String field, long value)</p><p>对哈希中的某个key对应的值增加计数,线程安全。<br><br>如果field不存在,初始值为0<br></p></li></ul><h3 id="lua-脚本"><a href="#lua-脚本" class="headerlink" title="lua 脚本"></a>lua 脚本</h3><p>如果一次业务请求需要执行多条命令,可以借助lua脚本批量提交执行</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">// key:缓存键值; seconds:过期时间</span><br><span class="line">public static String luaScript(String key, long seconds) {</span><br><span class="line">return "local currIncr = redis.call('INCR', '" + key + "') "</span><br><span class="line">+ "if tonumber(currIncr) == 1 "</span><br><span class="line">+ "then "</span><br><span class="line">+ "redis.call('EXPIRE', '" + key + "', " + seconds + ") "</span><br><span class="line">+ "end "</span><br><span class="line">+ "return currIncr";</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">//寻找目标节点</span><br><span class="line">Node target = redisClient.getNodeByKey(key);</span><br><span class="line"></span><br><span class="line">//执行lua脚本命令</span><br><span class="line">Long count = (Long) redisClient.eval(target, luaScript方法返回的字符串命令);</span><br></pre></td></tr></table></figure><h3 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h3><p><a href="http://zhangtielei.com/posts/server.html" target="_blank" rel="noopener">http://zhangtielei.com/posts/server.html</a></p><p><a href="https://www.zhihu.com/question/19764056" target="_blank" rel="noopener">https://www.zhihu.com/question/19764056</a></p><p><a href="http://www.redis.cn/" target="_blank" rel="noopener">http://www.redis.cn/</a></p><p><a href="http://ifeve.com/category/redis/" target="_blank" rel="noopener">http://ifeve.com/category/redis/</a></p>]]></content>
<summary type="html">
安装、主从复制,redis缓存与memcache的区别,redis原生命令api,redis 命令参考,Redis 教程
</summary>
<category term="redis" scheme="http://mroldx.xyz/categories/redis/"/>
<category term="redis" scheme="http://mroldx.xyz/tags/redis/"/>
</entry>
<entry>
<title>Redis安装及主从复制</title>
<link href="http://mroldx.xyz/2019/12/12/redis/redis-master-slave/"/>
<id>http://mroldx.xyz/2019/12/12/redis/redis-master-slave/</id>
<published>2019-12-12T13:33:34.000Z</published>
<updated>2020-05-05T07:37:09.454Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h2 id="Redis安装及主从复制"><a href="#Redis安装及主从复制" class="headerlink" title="Redis安装及主从复制"></a>Redis安装及主从复制</h2><hr><h3 id="一、安装"><a href="#一、安装" class="headerlink" title="一、安装"></a>一、安装</h3><h5 id="下载安装包"><a href="#下载安装包" class="headerlink" title="下载安装包"></a>下载安装包</h5><p><a href="https://redis.io/download" target="_blank" rel="noopener">https://redis.io/download</a></p><h5 id="解压"><a href="#解压" class="headerlink" title="解压"></a>解压</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tar zxvf redis-4.0.2.tar.gz</span><br></pre></td></tr></table></figure><h5 id="编译源程序"><a href="#编译源程序" class="headerlink" title="编译源程序"></a>编译源程序</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd redis-4.0.2-6379</span><br><span class="line">make</span><br></pre></td></tr></table></figure><h5 id="服务启动"><a href="#服务启动" class="headerlink" title="服务启动"></a>服务启动</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd src</span><br><span class="line">./redis-server &</span><br></pre></td></tr></table></figure><h5 id="查看一下启动的Redis实例"><a href="#查看一下启动的Redis实例" class="headerlink" title="查看一下启动的Redis实例"></a>查看一下启动的Redis实例</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ps -ef|grep redis</span><br></pre></td></tr></table></figure><h5 id="客户端shell"><a href="#客户端shell" class="headerlink" title="客户端shell"></a>客户端shell</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd src</span><br><span class="line">./redis-cli</span><br></pre></td></tr></table></figure><h4 id="配置参数-redis-conf"><a href="#配置参数-redis-conf" class="headerlink" title="配置参数(redis.conf)"></a>配置参数(redis.conf)</h4><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">daemonize:如需要在后台运行,把该项的值改为yes</span><br><span class="line"></span><br><span class="line"> pdifile:把pid文件放在/var/run/redis.pid,可以配置到其他地址</span><br><span class="line"></span><br><span class="line"> bind:指定redis只接收来自该IP的请求,如果不设置,那么将处理所有请求,在生产环节中最好设置该项</span><br><span class="line"></span><br><span class="line"> port:监听端口,默认为6379</span><br><span class="line"></span><br><span class="line"> timeout:设置客户端连接时的超时时间,单位为秒</span><br><span class="line"></span><br><span class="line"> loglevel:等级分为4级,debug,revbose,notice和warning。生产环境下一般开启notice</span><br><span class="line"></span><br><span class="line"> logfile:配置log文件地址,默认使用标准输出,即打印在命令行终端的端口上</span><br><span class="line"></span><br><span class="line"> database:设置数据库的个数,默认使用的数据库是0</span><br><span class="line"></span><br><span class="line"> save:设置redis进行数据库镜像的频率</span><br><span class="line"></span><br><span class="line"> rdbcompression:在进行镜像备份时,是否进行压缩</span><br><span class="line"></span><br><span class="line"> dbfilename:镜像备份文件的文件名</span><br><span class="line"></span><br><span class="line"> dir:数据库镜像备份的文件放置的路径</span><br><span class="line"></span><br><span class="line"> slaveof:设置该数据库为其他数据库的从数据库</span><br><span class="line"></span><br><span class="line"> masterauth:当主数据库连接需要密码验证时,在这里设定</span><br><span class="line"></span><br><span class="line"> requirepass:设置客户端连接后进行任何其他指定前需要使用的密码</span><br><span class="line"></span><br><span class="line"> maxclients:限制同时连接的客户端数量</span><br><span class="line"></span><br><span class="line"> maxmemory:设置redis能够使用的最大内存</span><br><span class="line"></span><br><span class="line"> appendonly:开启appendonly模式后,redis会把每一次所接收到的写操作都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态</span><br><span class="line"></span><br><span class="line"> appendfsync:设置appendonly.aof文件进行同步的频率</span><br><span class="line"></span><br><span class="line"> vm_enabled:是否开启虚拟内存支持</span><br><span class="line"></span><br><span class="line"> vm_swap_file:设置虚拟内存的交换文件的路径</span><br><span class="line"></span><br><span class="line"> vm_max_momery:设置开启虚拟内存后,redis将使用的最大物理内存的大小,默认为0</span><br><span class="line"></span><br><span class="line"> vm_page_size:设置虚拟内存页的大小</span><br><span class="line"></span><br><span class="line"> vm_pages:设置交换文件的总的page数量</span><br><span class="line"></span><br><span class="line"> vm_max_thrrads:设置vm IO同时使用的线程数量</span><br></pre></td></tr></table></figure><h3 id="二、主从复制"><a href="#二、主从复制" class="headerlink" title="二、主从复制"></a>二、主从复制</h3><ul><li><a href="https://yq.aliyun.com/articles/79223?spm=5176.8091938.0.0.TKdCyN" target="_blank" rel="noopener">主从复制原理</a></li></ul><blockquote><p>单机启动三个实例,一主两从。创建三个目录,分别是6379、6380、6381,创建conf、log、db三个目录,并拷贝redis.conf到对应的conf目录下</p></blockquote><ul><li>(master)修改6379/conf 目录下的redis.conf 配置</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">daemonize yes <== daemon进程运行</span><br><span class="line">pidfile /Users/onlyone/software/redis/6379/redis.pid <== 进程id存放文件</span><br><span class="line">port 6379 <== 端口</span><br><span class="line">logfile /Users/onlyone/software/redis/6379/log/redis.log <== 日志目录</span><br><span class="line">dir /Users/onlyone/software/redis/6379/db/ <== db目录</span><br></pre></td></tr></table></figure><ul><li>(slave) 修改6380/conf 目录下的redis.conf 配置</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">daemonize yes <== daemon进程运行</span><br><span class="line">pidfile /Users/onlyone/software/redis/6380/redis.pid <== 进程id存放文件</span><br><span class="line">port 6380 <== 端口</span><br><span class="line">logfile /Users/onlyone/software/redis/6380/log/redis.log <== 日志目录</span><br><span class="line">dir /Users/onlyone/software/redis/6380/db/ <== db目录</span><br><span class="line">slaveof 127.0.0.1 6379 <== master机器</span><br></pre></td></tr></table></figure><ul><li>(slave) 修改6381/conf 目录下的redis.conf 配置</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">daemonize yes <== daemon进程运行</span><br><span class="line">pidfile /Users/onlyone/software/redis/6381/redis.pid <== 进程id存放文件</span><br><span class="line">port 6381 <== 端口</span><br><span class="line">logfile /Users/onlyone/software/redis/6381/log/redis.log <== 日志目录</span><br><span class="line">dir /Users/onlyone/software/redis/6381/db/ <== db目录</span><br><span class="line">slaveof 127.0.0.1 6379 <== master机器</span><br></pre></td></tr></table></figure><p>启动实例</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">./redis-server /Users/onlyone/software/redis/6379/conf/redis.conf & </span><br><span class="line">./redis-server /Users/onlyone/software/redis/6380/conf/redis.conf & </span><br><span class="line">./redis-server /Users/onlyone/software/redis/6381/conf/redis.conf &</span><br></pre></td></tr></table></figure><p>查看进程信息</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">ps -ef|grep redis</span><br><span class="line"></span><br><span class="line">501 32933 1 0 10:24上午 ?? 0:00.25 ./redis-server 127.0.0.1:6380 </span><br><span class="line">501 32986 1 0 10:27上午 ?? 0:00.09 ./redis-server 127.0.0.1:6381 </span><br><span class="line">501 32880 12633 0 10:22上午 ttys000 0:00.43 ./redis-server *:6379</span><br></pre></td></tr></table></figure><p>查看master节点信息</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">./redis-cli -p 6379 "info"</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">。。。省略。。。</span><br><span class="line">\# Replication</span><br><span class="line">role:master</span><br><span class="line">connected_slaves:2</span><br><span class="line">slave0:ip=127.0.0.1,port=6380,state=online,offset=518,lag=1</span><br><span class="line">slave1:ip=127.0.0.1,port=6381,state=online,offset=518,lag=1</span><br><span class="line">master_replid:38605ae9c8d326685b9d114b31efffc405b54129</span><br><span class="line">master_replid2:0000000000000000000000000000000000000000</span><br><span class="line">master_repl_offset:518</span><br><span class="line">second_repl_offset:-1</span><br><span class="line">repl_backlog_active:1</span><br><span class="line">repl_backlog_size:1048576</span><br><span class="line">repl_backlog_first_byte_offset:1</span><br><span class="line">repl_backlog_histlen:518</span><br><span class="line">。。。省略。。。</span><br></pre></td></tr></table></figure><p>查看slave(6380)节点信息</p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">./redis-cli -p 6380 "info"</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">。。。省略。。。</span><br><span class="line">\# Replication</span><br><span class="line">role:slave</span><br><span class="line">master_host:127.0.0.1</span><br><span class="line">master_port:6379</span><br><span class="line">master_link_status:up</span><br><span class="line">master_last_io_seconds_ago:10</span><br><span class="line">master_sync_in_progress:0</span><br><span class="line">slave_repl_offset:658</span><br><span class="line">slave_priority:100</span><br><span class="line">slave_read_only:1</span><br><span class="line">connected_slaves:0</span><br><span class="line">master_replid:38605ae9c8d326685b9d114b31efffc405b54129</span><br><span class="line">master_replid2:0000000000000000000000000000000000000000</span><br><span class="line">master_repl_offset:658</span><br><span class="line">second_repl_offset:-1</span><br><span class="line">repl_backlog_active:1</span><br><span class="line">repl_backlog_size:1048576</span><br><span class="line">repl_backlog_first_byte_offset:1</span><br><span class="line">repl_backlog_histlen:658</span><br><span class="line">。。。省略。。。</span><br></pre></td></tr></table></figure><p>主库写数据</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">➜ src ./redis-cli -p 6379</span><br><span class="line">127.0.0.1:6379> set name tom</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379> get name</span><br><span class="line">"tom"</span><br><span class="line">127.0.0.1:6379></span><br></pre></td></tr></table></figure><p>查看从库同步数据</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">➜ src ./redis-cli -p 6380</span><br><span class="line">127.0.0.1:6380> get name</span><br><span class="line">"tom"</span><br><span class="line">127.0.0.1:6380></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
Redis安装及主从复制
</summary>
<category term="redis" scheme="http://mroldx.xyz/categories/redis/"/>
<category term="redis" scheme="http://mroldx.xyz/tags/redis/"/>
</entry>
<entry>
<title>commons-io</title>
<link href="http://mroldx.xyz/2019/11/29/commons/commons-io/"/>
<id>http://mroldx.xyz/2019/11/29/commons/commons-io/</id>
<published>2019-11-29T13:33:34.000Z</published>
<updated>2020-05-05T07:37:09.453Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h2 id="commons-io"><a href="#commons-io" class="headerlink" title="commons-io"></a>commons-io</h2><hr><h4 id="封装了一些常用工具类方法,用于IO的各种操作"><a href="#封装了一些常用工具类方法,用于IO的各种操作" class="headerlink" title="封装了一些常用工具类方法,用于IO的各种操作:"></a>封装了一些常用工具类方法,用于IO的各种操作:</h4><ul><li>Utility class ,提供一些静态方法来满足一些常用的业务场景</li><li>Input , InputStream 和 Reader 实现</li><li>Output , OutputStream 和 Writer 实现</li><li>Filters , 多种文件过滤器实现(定义了 IOFileFilter接口,同时继承了 FileFilter 和 FilenameFilter 接口)</li><li>comparator包, 文件比较,提供了多种 java.util.Comparator<file> 实现</file></li></ul><h4 id="pom依赖"><a href="#pom依赖" class="headerlink" title="pom依赖"></a>pom依赖</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"> <dependency></span><br><span class="line"> <groupId>commons-io</groupId></span><br><span class="line"> <artifactId>commons-io</artifactId></span><br><span class="line"> <version>2.4</version></span><br><span class="line"></dependency></span><br></pre></td></tr></table></figure><h4 id="常用工具类"><a href="#常用工具类" class="headerlink" title="常用工具类"></a>常用工具类</h4><ul><li><p>IOUtils </p><p>提供各种静态方法,用于处理读,写和、拷贝,这些方法基于InputStream、OutputStream、Reader 和 Writer</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"> InputStream in = new URL( "http://commons.apache.org" ).openStream();</span><br><span class="line">try {</span><br><span class="line"> System.out.println( IOUtils.toString( in ) );</span><br><span class="line">} finally {</span><br><span class="line"> IOUtils.closeQuietly(in);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><ul><li><p>FileUtils</p><p> 提供各种静态方法,基于File对象工作,包括读、写、拷贝、比较文件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"> File file = new File("/commons/io/project.properties");</span><br><span class="line">List lines = FileUtils.readLines(file, "UTF-8");</span><br></pre></td></tr></table></figure></li><li><p>LineIterator</p><p>提供灵活的方式操作基于行的文件。通过FileUtils 或 IOUtils中的静态方法,可以直接创建一个实例</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"> LineIterator it = FileUtils.lineIterator(file, "UTF-8");</span><br><span class="line">try {</span><br><span class="line"> while (it.hasNext()) {</span><br><span class="line"> String line = it.nextLine();</span><br><span class="line"> /// do something with line</span><br><span class="line"> }</span><br><span class="line">} finally {</span><br><span class="line"> LineIterator.closeQuietly(it);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><h5 id="参考资料:"><a href="#参考资料:" class="headerlink" title="参考资料:"></a>参考资料:</h5><p><a href="http://ifeve.com/commons-io/" target="_blank" rel="noopener">http://ifeve.com/commons-io/</a></p>]]></content>
<summary type="html">
commons-io是Apache下面的用来处理常用的编码方法的工具类包,例如DES、SHA1、MD5、Base64,URL,Soundx等等。 不仅是编码,也可用于解码。
</summary>
<category term="common" scheme="http://mroldx.xyz/categories/common/"/>
<category term="common" scheme="http://mroldx.xyz/tags/common/"/>
</entry>
<entry>
<title>CentOS 7 下安装部署 GitLab社区版教程</title>
<link href="http://mroldx.xyz/2019/10/29/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/CentOS7%E4%B8%8B%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2-GitLab%E7%A4%BE%E5%8C%BA%E7%89%88%E6%95%99%E7%A8%8B/"/>
<id>http://mroldx.xyz/2019/10/29/持续集成/CentOS7下安装部署-GitLab社区版教程/</id>
<published>2019-10-29T13:33:34.000Z</published>
<updated>2020-05-05T07:34:06.946Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><h3 id="1、本文主要内容"><a href="#1、本文主要内容" class="headerlink" title="1、本文主要内容"></a>1、本文主要内容</h3><ul><li>GitLab11.1.4社区版部署</li><li>GitLab配置禁用创建组权限</li><li>GitLab配置邮件(SMTP)</li><li>GitLab常用命令说明</li></ul><h5 id="先介绍一下本篇文章所使用的环境"><a href="#先介绍一下本篇文章所使用的环境" class="headerlink" title="先介绍一下本篇文章所使用的环境"></a>先介绍一下本篇文章所使用的环境</h5><ul><li>服务器</li></ul><table><thead><tr><th>服务器名</th><th>操作系统</th><th>硬件配置</th><th>虚拟机IP</th><th>说明</th></tr></thead><tbody><tr><td>GitLab</td><td>CentOS 7</td><td>1C4G</td><td>192.168.56.160</td><td>部署GitLab社区版</td></tr></tbody></table><h2 id="二、准备工作"><a href="#二、准备工作" class="headerlink" title="二、准备工作"></a>二、准备工作</h2><h3 id="1、安准基础依赖"><a href="#1、安准基础依赖" class="headerlink" title="1、安准基础依赖"></a>1、安准基础依赖</h3><p>#安装技术依赖 </p><p>sudo yum install -y curl policycoreutils-python openssh-server</p><p> #启动ssh服务&设置为开机启动 </p><p>sudo systemctl enable sshd sudo systemctl start sshd</p><h3 id="2、安装Postfix"><a href="#2、安装Postfix" class="headerlink" title="2、安装Postfix"></a>2、安装Postfix</h3><p>Postfix是一个邮件服务器,GitLab发送邮件需要用到</p><p>#安装postfix </p><p>sudo yum install -y postfix </p><p>#启动postfix并设置为开机启动 </p><p>sudo systemctl enable postfix </p><p>sudo systemctl start postfix</p><h3 id="3、开放ssh以及http服务(80端口)"><a href="#3、开放ssh以及http服务(80端口)" class="headerlink" title="3、开放ssh以及http服务(80端口)"></a>3、开放ssh以及http服务(80端口)</h3><p>#开放ssh、http服务 </p><p>sudo firewall-cmd –add-service=ssh –permanent </p><p>sudo firewall-cmd –add-service=http –permanent</p><p>#重载防火墙规则 </p><p>sudo firewall-cmd –reload</p><h2 id="三、部署过程"><a href="#三、部署过程" class="headerlink" title="三、部署过程"></a>三、部署过程</h2><p>本次我们部署的是社区版:gitlab-ce,如果要部署商业版可以把关键字替换为:gitlab-ee</p><h3 id="1、Yum安装GitLab"><a href="#1、Yum安装GitLab" class="headerlink" title="1、Yum安装GitLab"></a>1、Yum安装GitLab</h3><ul><li>添加GitLab社区版Package</li></ul><p>curl <a href="https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh" target="_blank" rel="noopener">https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh</a> | sudo bash</p><ul><li>安装GitLab社区版</li></ul><p>sudo yum install -y gitlab-ce</p><p>安装成功后会看到gitlab-ce打印了以下图形</p><p><img src="https://img.ken.io/blog/gitlab/install/gitlab-install-success.png-kwrbm.png" alt="image-20200501131620151"></p><h3 id="2,浏览器输入-192-168-56-160就能进入到gitlab的登录界面了"><a href="#2,浏览器输入-192-168-56-160就能进入到gitlab的登录界面了" class="headerlink" title="2,浏览器输入 192.168.56.160就能进入到gitlab的登录界面了"></a>2,浏览器输入 192.168.56.160就能进入到gitlab的登录界面了</h3><p><img src="https://img.ken.io/blog/gitlab/install/gitlab-install-root-create-password.png-kblb.png" alt="image-20200501132126263"></p><p>这时候会提示为管理员账号设置密码。管理员账号默认username是root。</p><p>设置完成之后即可使用root账号登录,登陆后会进入欢迎界面。</p>]]></content>
<summary type="html">
CentOS 7 下安装部署 GitLab社区版教程
</summary>
<category term="持续集成" scheme="http://mroldx.xyz/categories/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/"/>
<category term="CI/CD" scheme="http://mroldx.xyz/tags/CI-CD/"/>
</entry>
<entry>
<title>commons-lang3</title>
<link href="http://mroldx.xyz/2019/10/29/commons/commons-lang3/"/>
<id>http://mroldx.xyz/2019/10/29/commons/commons-lang3/</id>
<published>2019-10-29T13:33:34.000Z</published>
<updated>2020-05-05T07:34:06.938Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h2 id="commons-lang3"><a href="#commons-lang3" class="headerlink" title="commons-lang3"></a>commons-lang3</h2><hr><p><strong>主要是提供一些基础的操作和处理,归为以下几类:</strong></p><ul><li><p>org.apache.commons.lang3(高度重用的Util类,常用的工具类静态方法;重点)</p></li><li><p>org.apache.commons.lang3.builder(忽略)</p></li><li><p>org.apache.commons.lang3.concurrent(忽略)</p></li><li><p>org.apache.commons.lang3.event(忽略)</p></li><li><p>org.apache.commons.lang3.exception(忽略)</p></li><li><p>org.apache.commons.lang3.math(数字类型转换、大小比较、是否数字 等相关工具类;重点)</p></li><li><p>org.apache.commons.lang3.mutable(包装值型变量,为基础数据类型扩展了更多方法)</p></li><li><p>org.apache.commons.lang3.reflect(反射相关,忽略)</p></li><li><p>org.apache.commons.lang3.text(文本相关)</p></li><li><p>org.apache.commons.lang3.time(处理日期和时间的功能;重点)</p></li><li><p>org.apache.commons.lang3.tuple(忽略)</p></li></ul><h3 id="pom依赖"><a href="#pom依赖" class="headerlink" title="pom依赖"></a>pom依赖</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><dependency></span><br><span class="line"> <groupId>org.apache.commons</groupId></span><br><span class="line"> <artifactId>commons-lang3</artifactId></span><br><span class="line"> <version>3.4</version></span><br><span class="line"></dependency></span><br></pre></td></tr></table></figure><h4 id="常用工具类:"><a href="#常用工具类:" class="headerlink" title="常用工具类:"></a>常用工具类:</h4><p>内容虽然有点多,但我们使用最多还是一些有用的包含static方法的Util类。</p><ul><li><p>StringUtils – 处理String的核心类,提供了相当多的功能;</p></li><li><p>NumberUtils - 类型转换(String->Long);取最大最小值;比较大小。所有操作都不会抛出异常,如果转换不成功返回0,0.0d,0.0f等形式,转换操作也可以指定默认值。</p></li><li><p>DateUtils -日期相关;是否同一天;时间+x;字符串转换成Date</p></li><li><p>ArrayUtils – 用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等;</p></li><li><p>SystemUtils – 在java.lang.System基础上提供更方便的访问,如用户路径、Java版本、时区、操作系统等判断;</p></li><li><p>WordUtils – 用于处理单词大小写、换行等。</p></li><li><p>StringEscapeUtils – 用于正确处理转义字符,产生正确的Java、JavaScript、HTML、XML和SQL代码;</p></li><li><p>CharRange – 用于设定字符范围并做相应检查;</p></li><li><p>ClassUtils – 用于对Java类的操作,不使用反射;</p></li><li><p>Validate – 提供验证的操作,有点类似assert断言;</p></li></ul><h5 id="参考资料:"><a href="#参考资料:" class="headerlink" title="参考资料:"></a>参考资料:</h5><p><a href="https://commons.apache.org/proper/commons-lang/javadocs/api-release/" target="_blank" rel="noopener">https://commons.apache.org/proper/commons-lang/javadocs/api-release/</a></p><p><a href="http://zhoualine.iteye.com/blog/1770014" target="_blank" rel="noopener">http://zhoualine.iteye.com/blog/1770014</a></p>]]></content>
<summary type="html">
commons-lang3是Apache下面的用来处理常用的编码方法的工具类包,例如DES、SHA1、MD5、Base64,URL,Soundx等等。 不仅是编码,也可用于解码。
</summary>
<category term="common" scheme="http://mroldx.xyz/categories/common/"/>
<category term="common" scheme="http://mroldx.xyz/tags/common/"/>
</entry>
<entry>
<title>commons-codec</title>
<link href="http://mroldx.xyz/2019/10/29/commons/commons-codec/"/>
<id>http://mroldx.xyz/2019/10/29/commons/commons-codec/</id>
<published>2019-10-29T12:33:34.000Z</published>
<updated>2020-05-05T07:34:06.937Z</updated>
<content type="html"><![CDATA[<p class="description"></p><a id="more"></a><h2 id="commons-codec"><a href="#commons-codec" class="headerlink" title="commons-codec"></a>commons-codec</h2><hr><p>commons-codec是Apache下面的用来处理常用的编码方法的工具类包,例如DES、SHA1、MD5、Base64,URL,Soundx等等。 不仅是编码,也可用于解码。</p><h3 id="pom依赖"><a href="#pom依赖" class="headerlink" title="pom依赖"></a>pom依赖</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><dependency></span><br><span class="line"> <groupId>commons-codec</groupId></span><br><span class="line"> <artifactId>commons-codec</artifactId></span><br><span class="line"> <version>1.9</version></span><br><span class="line"></dependency></span><br></pre></td></tr></table></figure><h4 id="常用工具类:"><a href="#常用工具类:" class="headerlink" title="常用工具类:"></a>常用工具类:</h4><ul><li><p>DigestUtils工具类</p><p>提供了多种编码方式的静态方法,用于对String、byte[]、InputStream等类型的数据编码。</p></li></ul><p><strong>案例场景:</strong></p><p>电子商务平台,买家对一件商品下单后,为了便于后面的纠纷处理,需要对下单那一时刻的商品信息备份(因为卖家随时会修改自己的宝贝信息),命名为快照。如果为每一个订单都保存一次商品详情显然不现实,DigestUtils可以很好解决这个问题。每次对整个商品详情数据编码得到一个32字符摘要,作为唯一id并关联到用户订单,并保存到数据库中。可以有效对快照去重,节省资源空间。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">import org.apache.commons.codec.digest.DigestUtils;</span><br><span class="line"></span><br><span class="line">public class DigestTest {</span><br><span class="line"></span><br><span class="line"> public static void encodeStr(String data) {</span><br><span class="line"> String encodeS = DigestUtils.md5Hex(data);</span><br><span class="line"> System.out.println(encodeS);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> public static void main(String[] args) {</span><br><span class="line"> String data = "网销投连险是保险公司的一款保险产品,在互联网金融上还是很常见的。" + "比如京东天天盈,网易有钱零钱++。这些保险削弱了保险的保障功能,降低成本,从而提高保险的理财功能提高理财收益。"</span><br><span class="line"> + "投连险基本和银行结构性理财产品一样,信息披露度不高,但是有保险公司兜底,不至于整个平台跑路。"</span><br><span class="line"> + "投资投连险可以想象为投资一个起点低的银行理财产品吧。网销投连险一般都受益在4-6%,不承诺保本。"</span><br><span class="line"> + "经常爆出保险公司的保障型长期投连险出现投资亏损新闻,但是网销短期投连险投资型投连险目前没有出现亏损,基本也能按照预期收益兑付。"</span><br><span class="line"> + "网销投连险安全性和收益性都比较居中,短期产品危险系数不高,但是在债券违约的大环境下,长期产品安全性没有太大保障。" + "不过好在保险公司没有跑路风险,至少不会把本金损失殆尽啊。";</span><br><span class="line"></span><br><span class="line"> encodeStr(data);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>运行结果:</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">9901d04398f5b2adc0049c8c751e7411</span><br></pre></td></tr></table></figure><h5 id="参考资料:"><a href="#参考资料:" class="headerlink" title="参考资料:"></a>参考资料:</h5><p><a href="http://commons.apache.org/proper/commons-codec/userguide.html" target="_blank" rel="noopener">http://commons.apache.org/proper/commons-codec/userguide.html</a></p><p><a href="https://commons.apache.org/proper/commons-codec/apidocs/index.html" target="_blank" rel="noopener">https://commons.apache.org/proper/commons-codec/apidocs/index.html</a></p>]]></content>
<summary type="html">
commons-codec是Apache下面的用来处理常用的编码方法的工具类包,例如DES、SHA1、MD5、Base64,URL,Soundx等等。 不仅是编码,也可用于解码。
</summary>
<category term="common" scheme="http://mroldx.xyz/categories/common/"/>
<category term="common" scheme="http://mroldx.xyz/tags/common/"/>
</entry>
</feed>