-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
1247 lines (855 loc) · 66.7 KB
/
index.html
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
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222"><meta name="generator" content="Hexo 7.0.0">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
<link rel="mask-icon" href="/images/logo.svg" color="#222">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" integrity="sha256-CTSx/A06dm1B063156EVh15m6Y67pAjZZaQc89LLSrU=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">
<script class="next-config" data-name="main" type="application/json">{"hostname":"lossingdawn.top","root":"/","images":"/images","scheme":"Muse","darkmode":false,"version":"8.18.2","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12},"copycode":{"enable":false,"style":null},"fold":{"enable":false,"height":500},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":true,"async":false,"transition":{"menu_item":"fadeInDown","post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果:${query}","hits_time":"找到 ${hits} 个搜索结果(用时 ${time} 毫秒)","hits":"找到 ${hits} 个搜索结果"}}</script><script src="/js/config.js"></script>
<meta name="description" content="今天又是充满希望的一天">
<meta property="og:type" content="website">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="https://lossingdawn.top/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="今天又是充满希望的一天">
<meta property="og:locale" content="zh_CN">
<meta property="article:author" content="Ruffianjiang">
<meta property="article:tag" content="java">
<meta property="article:tag" content="spring">
<meta name="twitter:card" content="summary">
<link rel="canonical" href="https://lossingdawn.top/">
<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":true,"isPost":false,"lang":"zh-CN","comments":"","permalink":"","path":"index.html","title":""}</script>
<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>Hexo</title>
<noscript>
<link rel="stylesheet" href="/css/noscript.css">
</noscript>
</head>
<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
<div class="headband"></div>
<main class="main">
<div class="column">
<header class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="site-brand-container">
<div class="site-nav-toggle">
<div class="toggle" aria-label="切换导航栏" role="button">
</div>
</div>
<div class="site-meta">
<a href="/" class="brand" rel="start">
<i class="logo-line"></i>
<h1 class="site-title">Hexo</h1>
<i class="logo-line"></i>
</a>
<p class="site-subtitle" itemprop="description">今天又是充满希望的一天</p>
</div>
<div class="site-nav-right">
<div class="toggle popup-trigger" aria-label="搜索" role="button">
</div>
</div>
</div>
</header>
<aside class="sidebar">
<div class="sidebar-inner sidebar-overview-active">
<ul class="sidebar-nav">
<li class="sidebar-nav-toc">
文章目录
</li>
<li class="sidebar-nav-overview">
站点概览
</li>
</ul>
<div class="sidebar-panel-container">
<!--noindex-->
<div class="post-toc-wrap sidebar-panel">
</div>
<!--/noindex-->
<div class="site-overview-wrap sidebar-panel">
<div class="site-author animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
<p class="site-author-name" itemprop="name">Ruffianjiang</p>
<div class="site-description" itemprop="description">今天又是充满希望的一天</div>
</div>
<div class="site-state-wrap animated">
<nav class="site-state">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">46</span>
<span class="site-state-item-name">日志</span>
</a>
</div>
<div class="site-state-item site-state-categories">
<a href="/categories/">
<span class="site-state-item-count">21</span>
<span class="site-state-item-name">分类</span></a>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags/">
<span class="site-state-item-count">33</span>
<span class="site-state-item-name">标签</span></a>
</div>
</nav>
</div>
</div>
</div>
</div>
</aside>
</div>
<div class="main-inner index posts-expand">
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://lossingdawn.top/p/zh-CN/undefined.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="Ruffianjiang">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
<meta itemprop="description" content="今天又是充满希望的一天">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | Hexo">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/p/zh-CN/undefined.html" class="post-title-link" itemprop="url">Hello World</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2023-11-06 16:37:57" itemprop="dateCreated datePublished" datetime="2023-11-06T16:37:57+08:00">2023-11-06</time>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>Welcome to <a target="_blank" rel="noopener" href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a target="_blank" rel="noopener" href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a target="_blank" rel="noopener" href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a target="_blank" rel="noopener" href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/writing.html">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/server.html">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/generating.html">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://lossingdawn.top/p/zh-CN/14267.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="Ruffianjiang">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
<meta itemprop="description" content="今天又是充满希望的一天">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | Hexo">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/p/zh-CN/14267.html" class="post-title-link" itemprop="url">面向微服务的体系结构评审中需要问的三个问题-咖啡杂谈:Java、新闻、故事和观点</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-09-09 09:44:00" itemprop="dateCreated datePublished" datetime="2019-09-09T09:44:00+08:00">2019-09-09</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2023-11-06 10:17:14" itemprop="dateModified" datetime="2023-11-06T10:17:14+08:00">2023-11-06</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Java/" itemprop="url" rel="index"><span itemprop="name">Java</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Java/%E5%BE%AE%E6%9C%8D%E5%8A%A1/" itemprop="url" rel="index"><span itemprop="name">微服务</span></a>
</span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。</p>
<p>然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为面向微服务的体系结构,这可能是许多层面上阻碍和冲突的根源。</p>
<p>虽然<a target="_blank" rel="noopener" href="https://searchunifiedcommunications.techtarget.com/definition/greenfield-deployment">Greenfield</a> (未开发的)面向微服务的体系结构实现可以坚持对当前微服务的严格解释-设计原则。但在面向微服务的体系结构中,分解的遗留应用程序存在灰色阴影,如果没有其他原因,只能满足预算和时间限制。</p>
<p>在企业管理链的某个地方,有一位业务主管在一个面向微服务的体系结构中查看与这些遗留应用程序相关的分解成本,并将其与遗留代码已经提供的价值进行比较。一旦开发成本超过了预期的收益,业务主管很可能会退出并取消该项目。</p>
<p>这种事经常会发生。</p>
<p>因此,开发经理面临着巨大的压力,要求他们尽快将代码输出。“足够好”地成为转型的理想目标。</p>
<p>现在,这不一定是一件坏事。与等待梦想到来相比,输出工作代码的能力总是更好。但是,“灰色的阴影”是很难管理的,问题就在于如何界定“足够好”的界限。</p>
<p>因此,冲突开始了。一方想要输出他们想要的东西,而另一方则希望做更多的改进。</p>
<p>对你来说,挑战是不要让这些<a target="_blank" rel="noopener" href="https://searchmicroservices.techtarget.com/tip/5-basic-SOA-principles-that-still-apply-to-microservices">不同学派</a>在本质上是信仰支持的观点上制造一场没完没了的争吵。如果您这样做了,它将造成一种情况,即根本不提供任何代码。现在,冲突可以从许多相互竞争的想法中综合出最好的想法。但是,当话语退化为永无止境的冲突时,它可能是致命的。</p>
<p>我通过集中讨论以下三个问题来处理这类情况,以避免这种冲突:</p>
<ul>
<li>设计的理由是什么?</li>
<li>风险有多大?</li>
<li>减少风险的计划是什么?</li>
</ul>
<p>请允许我详细说明。</p>
<h2 id="1-设计的理由是什么?"><a href="#1-设计的理由是什么?" class="headerlink" title="1. 设计的理由是什么?"></a>1. 设计的理由是什么?</h2><p>当您评估面向微服务的体系结构的设计时,所面临的挑战是将过去的观点转移到理论基础分析上。它的创建主要来自于单个应用程序的分解。任何设计都可能“足够好”,只要你能证明它的好处和价值。</p>
<p>例如,面向微服务的体系结构设计的首选样式之一是采用事件驱动的方法进行服务间通信。具体来说,这意味着您使用消息节点<a target="_blank" rel="noopener" href="https://searchmicroservices.techtarget.com/tip/Synchronous-vs-asynchronous-communication-The-differences">以异步方式</a>在微服务之间传递消息。然而,从长远来看,虽然异步通信更加灵活和可扩展,但消息系统实现比在“面向”微服务的API之间使用同步HTTP调用的设计要复杂得多。因此,当市场时间被关注时,完全有理由将单块应用程序中的特性重构为以HTTP API方式表示的独立的微服务。</p>
<p><img src="http://springforall.ufile.ucloud.com.cn/static/img/21f5a71d92ffa7b7d8fb99a88e25be111567956" alt="Synchronous microservices are usually less complex to implement than asynchronous ones."></p>
<p><code>与异步服务相比,同步微服务的实现通常不那么复杂。</code></p>
<p>从长远来看,同步通信不一定是最佳选择,但考虑到从单块应用程序中提取独立的微服务所需的所有其他工作,同步对于第一个版本来说是“足够好”的。因此,这是一个合理的理由。</p>
<p>然而,这并不是说同步方法没有风险。事实上,风险有很多。当涉及到审查面向微服务的体系结构设计时,仅仅说明理由并不是唯一的因素。风险也必须加以阐述。</p>
<h2 id="2-风险有多大?"><a href="#2-风险有多大?" class="headerlink" title="2. 风险有多大?"></a>2. 风险有多大?</h2><p>所有的设计都有内在的风险。在上面描述的同步设计示例中,这种服务间通信方法可能会导致服务之间类型耦合的风险,由于同步HTTP通信和其他通信的性质而<a target="_blank" rel="noopener" href="https://searchmicroservices.techtarget.com/tip/Microservices-challenges-include-latency-but-it-can-be-beat">增加延迟</a>增加延迟。</p>
<p>重要的是要让人们知道这些风险,这样就可以根据预期设计的合理性来权衡它们。如果风险是巨大的,再多的理由也是不够的。另一方面,考虑到目前的需求,某些风险可能是可以接受的。诀窍是确保风险在审查过程中得到明确的传达。讨论中已知的风险总是比隐藏的风险更可取,而这种风险可能会在路上造成冲击。此外,如果您以前知道风险,那么随着面向微服务的体系结构的成熟,您可以计划如何在未来的版本中更好地向前迈进。这就是减少风险的原因。</p>
<h2 id="3-减少风险的计划是什么?"><a href="#3-减少风险的计划是什么?" class="headerlink" title="3. 减少风险的计划是什么?"></a>3. 减少风险的计划是什么?</h2><p>一个明智的应用程序设计人员的一个标志是能够识别他们的设计风险,一旦确定下来他会有远见地阐明一种方法,以减轻这些风险。没有适当的缓解技术的风险识别是思维不完整的标志。</p>
<p>如果面向微服务的体系结构设计有很大的风险和解决这些问题的边际计划,那么设计团队需要认真考虑其可行性。此外,如果缓解计划不切实际-超出<a target="_blank" rel="noopener" href="https://searchmicroservices.techtarget.com/tip/Understand-business-logic-to-fortify-microservices-design">项目的专门知识和预算</a>-设计的可行性也需要质疑。这都是平衡的问题。</p>
<p>一个平衡良好的面向微服务的体系结构设计是合理的,因为它想要满足的条件与其固有的设计风险和旨在解决这些风险的缓解计划相权衡。</p>
<h2 id="4-把它们放在一起"><a href="#4-把它们放在一起" class="headerlink" title="4. 把它们放在一起"></a>4. 把它们放在一起</h2><p>冲突是创造性进程的重要组成部分。有创造力的人往往对自己的想法坚韧不拔。所以,当你把它们放在一个房间里,让他们为面向微服务的建筑设计一个单一的设计时,紧张关系肯定会加剧。事情就是这样的。但要振作起来!冲突是好事。</p>
<p>幸运的是,有了一种理性的方法,用我前面描述的三个问题来审查面向微服务的体系结构设计,您就可以促进客观的讨论,从而产生软件以及时满足您的需求。没有任何设计是完美的,特别是那些分解单个应用程序的设计。但是,交付面向微服务的体系结构有一个很大的好处,这个体系结构足够好<a target="_blank" rel="noopener" href="https://microservices.io/patterns/microservices.html">有效运作</a>在短期和灵活性足够持续不断改善长期。</p>
<blockquote>
<p>原文:<a target="_blank" rel="noopener" href="https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/3-questions-to-ask-in-a-microservices-oriented-architecture-review">https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/3-questions-to-ask-in-a-microservices-oriented-architecture-review</a></p>
</blockquote>
<blockquote>
<p>作者:Bob Reselman</p>
</blockquote>
<blockquote>
<p>译者:遗失的拂晓</p>
</blockquote>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://lossingdawn.top/p/zh-CN/12305.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="Ruffianjiang">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
<meta itemprop="description" content="今天又是充满希望的一天">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | Hexo">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/p/zh-CN/12305.html" class="post-title-link" itemprop="url">restful api设计</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-07-26 21:44:00" itemprop="dateCreated datePublished" datetime="2019-07-26T21:44:00+08:00">2019-07-26</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2023-11-06 10:17:14" itemprop="dateModified" datetime="2023-11-06T10:17:14+08:00">2023-11-06</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/restful/" itemprop="url" rel="index"><span itemprop="name">restful</span></a>
</span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://lossingdawn.top/p/zh-CN/42520.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="Ruffianjiang">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
<meta itemprop="description" content="今天又是充满希望的一天">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | Hexo">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/p/zh-CN/42520.html" class="post-title-link" itemprop="url">Java 8 终于支持 Docker!</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-07-22 10:09:00" itemprop="dateCreated datePublished" datetime="2019-07-22T10:09:00+08:00">2019-07-22</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2023-11-06 10:17:14" itemprop="dateModified" datetime="2023-11-06T10:17:14+08:00">2023-11-06</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/java/" itemprop="url" rel="index"><span itemprop="name">java</span></a>
</span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>Java 8曾经与Docker无法很好地兼容性,现在问题已消失。</p>
<p>请注意:我在本文中使用采用GNU GPL v2许可证的OpenJDK官方docker映像。在Oracle Java SE中,这里描述的docker支持功能在更新191中引入。Oracle在2019年4月更改了Java 8更新的许可证,自Java SE 8 Update 211以来商业使用不再免费。</p>
<p>你是否遇到过在docker中运行的基于JVM的应用程序出现“随机”故障?或者也许是一些奇怪的死机?两者都可能是Java 8(仍广泛使用的)中糟糕的docker支持引起的。</p>
<p>Docker使用控制组(cgroups)来限制资源。在容器中运行应用程序时限制内存和CPU绝对是个好主意――它可以阻止应用程序占用整个可用内存及/或CPU,这会导致在同一个系统上运行的其他容器毫无反应。限制资源可提高应用程序的可靠性和稳定性。它还允许为硬件容量作好规划。在Kubernetes或DC/OS之类的编排系统上运行容器时尤为重要。</p>
<p><strong>问题</strong></p>
<p>JVM可以“看到”系统上的整个内存和可用的所有CPU核心,并确保与资源一致。它默认情况下将最大堆大小(heap size)设置为系统内存的1/4,并将某些线程池大小(比如针对GC)设置为物理核心数量。不妨举例说明。</p>
<p>我们将运行一个简单的应用程序,它消耗尽可能多的内存(可在该网站上找到):</p>
<p><img src="https://mmbiz.qlogo.cn/mmbiz_jpg/9FiaOYU1BlzpXtUWdTElKp4aXXA6ahVARKBg3SHeB0WyqANTBoYoSjErQ69c7c8ibcNicomy2e1rADIc8Hrm0UV6Q/640?wx_fmt=jpeg" alt="img"></p>
<p>我们在拥有64GB内存的系统上运行,所以不妨检查默认的最大堆大小:</p>
<p>如上所述,它是物理内存的1/4即16GB。如果我们使用docker cgroups限制内存,会发生什么?不妨检查一下:</p>
<p><img src="https://mmbiz.qlogo.cn/mmbiz_jpg/9FiaOYU1BlzpXtUWdTElKp4aXXA6ahVAR3nbPC13DHD9wW9ZfqIQCAH4oXlGiaVaFZPcl4r6DverFMIPZRFoMAsg/640?wx_fmt=jpeg" alt="img"></p>
<p>JVM进程被杀死了。由于它是一个子进程――容器本身幸存下来,但通常当java是容器(PID 1)内的唯一进程时,容器会崩溃。</p>
<p>不妨深入看看系统日志:</p>
<p><img src="https://mmbiz.qlogo.cn/mmbiz_jpg/9FiaOYU1BlzpXtUWdTElKp4aXXA6ahVARgJXSMB4nquC6u4pvbzXZeh85GRMP8OUDY1GMSuzsfewZBaTiace3EDw/640?wx_fmt=jpeg" alt="img"></p>
<p><img src="https://mmbiz.qlogo.cn/mmbiz_jpg/9FiaOYU1BlzpXtUWdTElKp4aXXA6ahVARYsnlGiaMM2Tia6tSeDLo0ZFczPD2ichpOibFH0aHicoU5tjtdoXCic1TjNAw/640?wx_fmt=jpeg" alt="img"></p>
<p>像这样的故障调试起来可能很难――应用程序日志中没有任何内容。在AWS ECS之类的托管系统上尤其困难重重。</p>
<p>CPU怎么样?不妨再次检查,运行一个显示可用处理器数量的小程序:</p>
<p>不妨在一个cpu编号设置为1的docker容器中运行它:</p>
<p>不好,这个系统上的确有12个CPU。因此,即使可用处理器的数量限制为1,JVM也会尝试使用12――比如说,GC线程数量由该公式设置:</p>
<p>在拥有N个硬件线程(N大于8)的机器上,并行收集器使用N的固定分数作为垃圾收集器线程的数量。如果N的值很大,该分数约5/8。如果N的值低于8,使用的数字是N。</p>
<p>在我们的情况下:</p>
<p><strong>解决方案</strong></p>
<p>OK,我们现在意识到了这个问题。有解决方案吗?幸运的是,有!</p>
<p>新的Java版本(10及以上版本)已经内置了docker支持功能。但有时升级不是办法,比如说如果应用程序与新JVM不兼容就不行。</p>
<p>好消息:Docker支持还被向后移植到Java 8。不妨检查标记为8u212的最新openjdk映像。我们将内存限制为1G,并使用1个CPU:docker run -ti –cpus 1 -m 1G openjdk:8u212-jdk。</p>
<p>内存:</p>
<p>它是256M,正好是已分配内存的1/4。</p>
<p>CPU:</p>
<p>正如我们想要的那样。</p>
<p>此外,还有几个新的设置:</p>
<p>它们允许微调堆大小――这些设置的含义在StackOverflow的这个优秀答案中已得到了解释。请注意:他们设置的是百分比,而不是固定值。正因为如此,改变Docker内存设置不会破坏任何东西。</p>
<p>如果由于某种原因不想要看到新的JVM行为,可以使用-XX:-UseContainerSupport来关闭。</p>
<p><strong>总结</strong></p>
<p>为基于JVM的应用程序设置正确的堆大小极其重要。如果使用最新的Java 8版本,你可以依赖安全(但非常保守)的默认设置。不需要在docker入口点中使用任何变通办法,也不需要再将Xmx设置为固定值。</p>
<p>使用JVM愉快!</p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://lossingdawn.top/p/zh-CN/39944.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="Ruffianjiang">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
<meta itemprop="description" content="今天又是充满希望的一天">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | Hexo">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/p/zh-CN/39944.html" class="post-title-link" itemprop="url">微服务高可用方案</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-07-22 08:09:00" itemprop="dateCreated datePublished" datetime="2019-07-22T08:09:00+08:00">2019-07-22</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2023-11-06 10:17:14" itemprop="dateModified" datetime="2023-11-06T10:17:14+08:00">2023-11-06</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/spring-cloud/" itemprop="url" rel="index"><span itemprop="name">spring cloud</span></a>
</span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>微服务高可用方案</p>
<h1 id="一、微服务的高可用"><a href="#一、微服务的高可用" class="headerlink" title="一、微服务的高可用"></a>一、微服务的高可用</h1><p>在注册中心、配置中心高可用方案之前,了解一下注册中心的工作原理,下面分为两个部分来解释,一是注册中心和各个微服务的注册表的获取与同步,二是注册中心如何去维护注册表。</p>
<h2 id="1-1、注册表的获取与同步"><a href="#1-1、注册表的获取与同步" class="headerlink" title="1.1、注册表的获取与同步"></a>1.1、注册表的获取与同步</h2><p>Eureka Server和Eureka Client之间的关系,通过注册表来维护,而注册表的通过Eureka Server集中化管理,每个Client在本地进行注册表的缓存,通过周期性的任务拉取最新的注册表信息。简单的示例图如下。</p>
<p><img src="https://blog-lossingdawn.oss-cn-shanghai.aliyuncs.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E9%AB%98%E5%8F%AF%E7%94%A8%E6%96%B9%E6%A1%88/1.jpeg?x-oss-process=style/default_blog" alt="img"></p>
<p>根据上图所展示的流程,可以了解到注册中心与微服务之间的基本联系的流程:</p>
<p>1.服务A启动时,向Eureka Server注册自己的相关信息</p>
<p>2.当服务B向Eureka Server拉取最新的注册表时,就可以拿到服务A的一台机器注册信息</p>
<p>3.服务A的另外两台机器再去注册,服务B 30s后再次去拉取时,就会得到服务A的三台机器的注册信息</p>
<p>4.服务A、每30s向Eureka Server发送一次心跳信息,表明自己的注册信息还是有效的</p>
<p>以上是注册中心与微服务之间交互的大体流程,在具体的实践中,Eureka Server会提供多级缓存,其中的注册表的信息的获取与同步,又会有细微的差别。</p>
<p>1.Eureka Server的注册表直接基于纯内存,即在内存里维护了一个数据结构。</p>
<p>2.各个服务的注册、服务下线、服务故障,全部会在内存里维护和更新这个注册表。</p>
<p>3.各个服务每隔30秒拉取注册表的时候,Eureka Server就是直接提供内存里存储的有变化的注册表数据给他们就可以了。</p>
<p>4.同样,每隔30秒发起心跳时,也是在这个纯内存的Map数据结构里更新心跳时间。</p>
<p>Eureka Server的注册表是纯内存处理的,因此处理速度会很快,同时提供 readWriteCacheMap 和 readOnlyCacheMap 做缓存,保障了频繁读写不会冲突。示意图如下。</p>
<p><img src="https://blog-lossingdawn.oss-cn-shanghai.aliyuncs.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E9%AB%98%E5%8F%AF%E7%94%A8%E6%96%B9%E6%A1%88/2.jpeg?x-oss-process=style/default_blog" alt="img"></p>
<p>上图介绍了Eureka Server多级缓存的工作原理:</p>
<p>1.当第一台服务A注册时,它的注册信息会更新到内存的注册表中,如果 readWriteCacheMap 中有相应的信息,则过期掉,如果没有则不做操作</p>
<p>2.当服务B去拉取注册表信息时,先找 readOnlyCacheMap ,没有再找 readWriteCacheMap ,再没有就去内存的注册表查找注册信息,查到就更新到 readWriteCacheMap 中,返回给服务B,服务B的注册表中,就会有一台服务A的机器注册信息</p>
<p>3.readOnlyCacheMap 和 readWriteCacheMap 之间的同步是有一个后台的定时任务,每隔30s去同步一次,缓存同步任务</p>
<p>4.第二台服务A注册时,更新内存的注册表,同时把 readWriteCacheMap 过期掉</p>
<p>5.在缓存同步任务执行之前服务B去拉取注册表时,都是从 readOnlyCacheMap 中拿到数据,新的注册表的信息,不会被服务B拿到</p>
<p>6.30s后,缓存同步任务会同步 readWriteCacheMap 和 readOnlyCacheMap 中的数据,把readOnlyCacheMap 中的注册表过期掉,这时服务B就会找 readWriteCacheMap 拿数据,readWriteCacheMap 从内存中拿到数据后缓存,返回给服务B,服务B的注册表中,就会有两台服务A的机器注册信息</p>
<p>7.在下一个30s,缓存同步任务把 readWriteCacheMap 同步到 readOnlyCacheMap 之前, readOnlyCacheMap 没有第二台服务A的注册缓存,因此都是从 readWriteCacheMap 中取到最新数据</p>
<p>注:</p>
<p> readOnlyCacheMap 缓存更新的定时器时间间隔,默认为30秒</p>
<p> readWriteCacheMap 缓存过期时间,默认为 180 秒</p>
<p>由以上流程说明可知,Eureka Server采取了多级缓存策略,同时最新的注册表生效有30s的时延。多级缓存机制的优点是什么:</p>
<p>1.尽可能保证了内存注册表数据不会出现频繁的读写冲突问题。</p>
<p>2.并且进一步保证对Eureka Server的大量请求,都是快速从纯内存走,性能极高。</p>
<h2 id="1-2、注册中心维护微服务的注册表"><a href="#1-2、注册中心维护微服务的注册表" class="headerlink" title="1.2、注册中心维护微服务的注册表"></a>1.2、注册中心维护微服务的注册表</h2><p>Eureka Client与注册表相关的行为如下所示:</p>
<p>1.服务注册(Registry)——初始化时执行一次,向服务端注册自己服务实例节点信息包括ip、端口、实例名等,基于POST请求。</p>
<p>2.服务续约(renew)——默认每隔30s向服务端PUT一次,保证当前服务节点状态信息实时更新,不被服务端失效剔除。</p>
<p>3.更新已经注册服务列表(fetchRegistry)——默认每隔30s从服务端GET一次增量版本信息,然后和本地比较并合并,保证本地能获取到其他节点最新注册信息。</p>
<p>4.服务下线(cancel)——在服务shutdown的时候,需要及时通知服务端把自己剔除,以避免客户端调用已经下线的服务。</p>
<p>Eureka Client是通过Jersey Client基于Http协议与Eureka Server交互来注册服务、续约服务、取消服务、服务查询等。同时,Server端还会维护一份服务实例清单,并每隔90s对未续约的实例进行失效剔除。</p>
<p>Eureka Server有一个自我保护机制,当网络发生故障时,客户端与服务端不通,这是需要启动Eureka Server的自我保护机制,这样不会剔除服务,当网络恢复时,退出自我保护。自我保护有两个参数,最后一分钟收到的心跳数(Renews (last min))、期望收到的心跳数(Renews threshold),当Renews threshold > Renews (last min) 时,进入自我保护模式。</p>
<p>Renews (last min) = 实例数 * 2 #实例数算上Eureka Server自注册服务</p>
<p>Renews threshold = Renews (last min) * 0.85 # 0.85可配置</p>
<p>下图的注册中有10个实例:</p>
<p><img src="https://blog-lossingdawn.oss-cn-shanghai.aliyuncs.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E9%AB%98%E5%8F%AF%E7%94%A8%E6%96%B9%E6%A1%88/3.jpeg?x-oss-process=style/default_blog" alt="img"></p>
<p>推荐多个Eureka Server部署时,开启自我保护</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">eureka.client.register-with-eureka = true</span><br></pre></td></tr></table></figure>
<h2 id="1-3、分布式注册中心"><a href="#1-3、分布式注册中心" class="headerlink" title="1.3、分布式注册中心"></a>1.3、分布式注册中心</h2><p>了解了注册中心的工作原理,下面开始研究分布式服务,多注册中心、多服务实例的情况。</p>
<p>当微服务仅向一台注册中心注册时,当这个注册中心发生故障时,新服务无法继续注册上去,旧服务的注册信息,缓存在其他注册中心和客户端中,依旧可以使用,当重启之后,无法向注册中心注册,也是无法使用的。</p>
<p>因此构建高可用的注册中心时,需要交叉注册,每个注册中心既当服务端,又当客户端,向其他注册中心注册自己,同时微服务需要向每个注册中心进行注册,由注册中心自己过滤互备,防止单个注册中心故障而导致只往它上面注册微服务重启后不可用。示意图如下所示。</p>
<p><img src="https://blog-lossingdawn.oss-cn-shanghai.aliyuncs.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E9%AB%98%E5%8F%AF%E7%94%A8%E6%96%B9%E6%A1%88/4.jpeg?x-oss-process=style/default_blog" alt="img"></p>
<p>目前注册中心与配置中心集中在一起,可拆可不拆,对整体影响不大,拆分是为了注册中心和配置中心相互间不影响。gitlab部署在某一台机器上,所有config共用,由于gitlab的原因,导致config的分布式存在单点故障的隐患。每个config分别用独立的gitlab,又给运维带来极大的不便。后期采用apollo,用数据库存储配置,利用数据库的分布式优势替代gitlab,来解决单点故障的问题。</p>
<h2 id="1-4、注册中心压测"><a href="#1-4、注册中心压测" class="headerlink" title="1.4、注册中心压测"></a>1.4、注册中心压测</h2><p>根据压测调研,8核4G的Eureka Server在处理1000个服务实例时,没有任何压力,在默认情况下,可以处理7000个实例,超出的会超时报错,在修改tomcat的配置之后,最多可以承载8000实例,此时CPU基本满载。</p>
<p>升级注意事项:</p>
<p>1、Eureka Server之间相互注册,Eureka Client需要在每个Server上都注册一边</p>
<p>2、Eureka Server开启自我保护</p>
<p>3、Eureka Client的实例数不超过1000个</p>
<h1 id="参考:"><a href="#参考:" class="headerlink" title="参考:"></a>参考:</h1><p>[1] <a target="_blank" rel="noopener" href="https://www.jianshu.com/p/ae4f0c8b8135">https://www.jianshu.com/p/ae4f0c8b8135</a></p>
<p>[2] <a target="_blank" rel="noopener" href="https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html">https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html</a></p>
<p>[3] <a target="_blank" rel="noopener" href="http://springcloud.cn/view/31">http://springcloud.cn/view/31</a></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://lossingdawn.top/p/zh-CN/34700.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="Ruffianjiang">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
<meta itemprop="description" content="今天又是充满希望的一天">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | Hexo">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/p/zh-CN/34700.html" class="post-title-link" itemprop="url">eureka注册中心账户登陆</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-06-15 22:09:00" itemprop="dateCreated datePublished" datetime="2019-06-15T22:09:00+08:00">2019-06-15</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2023-11-06 10:17:14" itemprop="dateModified" datetime="2023-11-06T10:17:14+08:00">2023-11-06</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/spring-cloud/" itemprop="url" rel="index"><span itemprop="name">spring cloud</span></a>
</span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://lossingdawn.top/p/zh-CN/12168.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="Ruffianjiang">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
<meta itemprop="description" content="今天又是充满希望的一天">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | Hexo">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/p/zh-CN/12168.html" class="post-title-link" itemprop="url">CentOS 7.3 安装python3</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-05-21 14:19:00" itemprop="dateCreated datePublished" datetime="2019-05-21T14:19:00+08:00">2019-05-21</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2023-11-06 10:17:14" itemprop="dateModified" datetime="2023-11-06T10:17:14+08:00">2023-11-06</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/linux/" itemprop="url" rel="index"><span itemprop="name">linux</span></a>
</span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h3 id="1、排查"><a href="#1、排查" class="headerlink" title="1、排查"></a>1、排查</h3><p>CentOS 7.3 默认安装的是python2,使用命令 python -V 可以看到 python 的版本</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Python 2.7.5</span><br></pre></td></tr></table></figure>
<p>然后使用命令 which python 查看一下Python可执行文件的位置<br><img src="https://img2018.cnblogs.com/blog/670989/201905/670989-20190521164747683-835556990.png"></p>
<p>可见执行文件在 /usr/bin/ 目录下,切换到该目录下执行 ll python/* 命令查看 <br><img src="https://img2018.cnblogs.com/blog/670989/201905/670989-20190521164804189-1266289982.png"></p>
<p>可见 python 和 python2 都指向了 python2.7,因此执行 python 程序可用 python 和 python2。</p>
<p>我们在 yum 仓库搜索 python 相关的包,发现没有 python3 相关的</p>
<figure class="highlight plaintext"><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">yum search python</span><br><span class="line">yum search python3</span><br></pre></td></tr></table></figure>
<p>因此,我们使用编译的形式安装 python3,并使用软链在 /usr/bin/ 下建立 python3 。</p>
<h3 id="2、安装"><a href="#2、安装" class="headerlink" title="2、安装"></a>2、安装</h3><p>没有 python 的可用 yum install python 来安装</p>
<p>安装相关依赖</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make</span><br></pre></td></tr></table></figure>
<p>下载 python3 的包,在任意目录。没有wget的,yum安装一下,再下载</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz</span><br></pre></td></tr></table></figure>
<p>解压</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tar -xvJf Python-3.6.2.tar.xz</span><br></pre></td></tr></table></figure>
<p>切换进入</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd Python-3.6.2</span><br></pre></td></tr></table></figure>
<p>编译安装</p>
<figure class="highlight plaintext"><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">./configure prefix=/usr/local/python3</span><br><span class="line">make && make install</span><br></pre></td></tr></table></figure>
<p>安装完毕,/usr/local/ 目录下就会有 python3了<br><img src="https://img2018.cnblogs.com/blog/670989/201905/670989-20190521164824241-932419417.png"><br>因此我们可以添加软链到执行目录下/usr/bin</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ln -s /usr/local/python3/bin/python3 /usr/bin/python3</span><br></pre></td></tr></table></figure>
<p><img src="https://img2018.cnblogs.com/blog/670989/201905/670989-20190521164837050-1742035920.png"></p>
<p>查看 python 的版本</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">python -V</span><br><span class="line">python2 -V</span><br><span class="line">python3 -V</span><br></pre></td></tr></table></figure>
<p><img src="https://img2018.cnblogs.com/blog/670989/201905/670989-20190521164852467-160857733.png"></p>
<p>需要 python 即是 python3 的,可以参考最后的参考链接。建软链不同,和需要修改 yum 的配置(不建议去修改 python 的默认版本,建议用 python3 来代替,因为有些软件默认是 python2 的,可能会引起意外的事故)</p>
<p>参考:<br><a target="_blank" rel="noopener" href="https://www.cnblogs.com/JahanGu/p/7452527.html">https://www.cnblogs.com/JahanGu/p/7452527.html</a></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://lossingdawn.top/p/zh-CN/58622.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="Ruffianjiang">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
<meta itemprop="description" content="今天又是充满希望的一天">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | Hexo">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/p/zh-CN/58622.html" class="post-title-link" itemprop="url">找到linux中当前java的安装位置</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-05-13 13:49:00" itemprop="dateCreated datePublished" datetime="2019-05-13T13:49:00+08:00">2019-05-13</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2023-11-06 10:17:14" itemprop="dateModified" datetime="2023-11-06T10:17:14+08:00">2023-11-06</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/linux/" itemprop="url" rel="index"><span itemprop="name">linux</span></a>
</span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>先看java -version</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$java version "1.8.0_111"</span><br><span class="line">Java(TM) SE Runtime Environment (build 1.8.0_111-b14)</span><br><span class="line">Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)</span><br></pre></td></tr></table></figure>
<p>然后:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo $JAVA_HOME</span><br></pre></td></tr></table></figure>
<p>不一定有,如果没有,那就要找一下 先</p>
<figure class="highlight plaintext"><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">$which java</span><br><span class="line">/usr/bin/java</span><br></pre></td></tr></table></figure>
<p>再找到/usr/bin/java的超链接位置发现还是超链接</p>
<figure class="highlight plaintext"><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">$ls -lrt /usr/bin/java</span><br><span class="line">lrwxrwxrwx 1 root root 22 Jul 27 11:43 /usr/bin/java -> /etc/alternatives/java</span><br></pre></td></tr></table></figure>
<p>再来一次,发现最终位置</p>
<figure class="highlight plaintext"><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">$ls -lrt /etc/alternatives/java</span><br><span class="line">lrwxrwxrwx 1 root root 35 Jul 27 11:43 /etc/alternatives/java -> /usr/java/jdk1.8.0_111/jre/bin/java</span><br></pre></td></tr></table></figure>
<p>最后的这个jdk位置就是目前用的java的jdk位置</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/java/jdk1.8.0_111/(这个是我的,你用你自己的)</span><br></pre></td></tr></table></figure>
<p>在.bashrc里面<br>加上一句<br>export JAVA_HOME=你的java安装路径</p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>