主頁 > 軟體設計 > 企業級日志系統架構——ELK(Elasticsearch、Filebeat、Kafka、Logstash、Kibana)

企業級日志系統架構——ELK(Elasticsearch、Filebeat、Kafka、Logstash、Kibana)

2021-12-11 07:22:35 軟體設計

文章目錄

    • 一、概述
      • 1)Elasticsearch 存盤
      • 2)Filebeat 日志資料采集
      • 3)Kafka
      • 4)Logstash 過濾
      • 5)Kibana 展示
      • filebeat和logstash的關系
    • 二、helm3安裝ELK
      • 1)準備條件
      • 2)helm3安裝elasticsearch
        • 1、自定義values
        • 2、開始安裝Elasitcsearch
        • 3、驗證
        • 4、清理
      • 3)helm3安裝Kibana
        • 1、自定義values
        • 2、開始安裝Kibana
        • 3、驗證
        • 4、清理
      • 4)helm3安裝Filebeat
        • 1、自定義values
        • 2、開始安裝Filefeat
        • 3、驗證
        • 4、清理
      • 5)helm3安裝Logstash
        • 1、自定義values
        • 2、開始安裝Logstash
        • 3、驗證
        • 4、清理
    • 三、ELK相關的備份組件和備份方式
      • 1)Elasticsearch的snapshot快照備份
      • 2)elasticdump備份遷移es資料
      • 3)esm備份遷移es資料

一、概述

ELK是三個開源軟體的縮寫,分別表示:Elasticsearch , Logstash, Kibana , 它們都是開源軟體,新增了一個FileBeat,它是一個輕量級的日志收集處理工具(Agent),Filebeat占用資源少,適合于在各個服務器上搜集日志后傳輸給Logstash,官方也推薦此工具,

大致流程圖如下:
在這里插入圖片描述

1)Elasticsearch 存盤

Elasticsearch是個開源分布式搜索引擎,提供搜集、分析、存盤資料三大功能,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料源,自動搜索負載等,

2)Filebeat 日志資料采集

filebeat是Beats中的一員,Beats在是一個輕量級日志采集器,其實Beats家族有6個成員,早期的ELK架構中使用Logstash收集、決議日志,但是Logstash對記憶體、cpu、io等資源消耗比較高,相比Logstash,Beats所占系統的CPU和記憶體幾乎可以忽略不計,

Filebeat是用于轉發和集中日志資料的輕量級傳送工具,Filebeat監視您指定的日志檔案或位置,收集日志事件,

目前Beats包含六種工具:

  • Packetbeat:網路資料(收集網路流量資料)
  • Metricbeat:指標(收集系統、行程和檔案系統級別的CPU和記憶體使用情況等資料)
  • Filebeat:日志檔案(收集檔案資料)
  • Winlogbeat:windows事件日志(收集Windows事件日志資料)
  • Auditbeat:審計資料(收集審計日志)
  • Heartbeat:運行時間監控(收集系統運行時的資料)

作業的流程圖如下:
在這里插入圖片描述
優點

  • Filebeat 只是一個二進制檔案沒有任何依賴,它占用資源極少,

缺點

  • Filebeat 的應用范圍十分有限,因此在某些場景下咱們會碰到問題,在 5.x 版本中,它還具有過濾的能力,

3)Kafka

kafka能幫助我們削峰,ELK可以使用redis作為訊息佇列,但redis作為訊息佇列不是強項而且redis集群不如專業的訊息發布系統kafka,kafka安裝請看這里

4)Logstash 過濾

Logstash 主要是用來日志的搜集、分析、過濾日志的工具,支持大量的資料獲取方式,一般作業方式為c/s架構,client端安裝在需要收集日志的主機上,server端負責將收到的各節點日志進行過濾、修改等操作在一并發往elasticsearch上去,

優點

  • 可伸縮性

節拍應該在一組Logstash節點之間進行負載平衡,
建議至少使用兩個Logstash節點以實作高可用性,
每個Logstash節點只部署一個Beats輸入是很常見的,但每個Logstash節點也可以部署多個Beats輸入,以便為不同的資料源公開獨立的端點,

  • 彈性

Logstash持久佇列提供跨節點故障的保護,對于Logstash中的磁盤級彈性,確保磁盤冗余非常重要,對于內部部署,建議您配置RAID,在云或容器化環境中運行時,建議您使用具有反映資料SLA的復制策略的永久磁盤,

  • 可過濾

對事件欄位執行常規轉換,您可以重命名,洗掉,替換和修改事件中的欄位,

缺點

  • Logstash耗資源較大,運行占用CPU和記憶體高,另外沒有訊息佇列快取,存在資料丟失隱患,

5)Kibana 展示

Kibana 也是一個開源和免費的工具,Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助匯總、分析和搜索重要資料日志,

filebeat和logstash的關系

因為logstash是jvm跑的,資源消耗比較大,所以后來作者又用golang寫了一個功能較少但是資源消耗也小的輕量級的logstash-forwarder,不過作者只是一個人,加入http://elastic.co公司以后,因為es公司本身還收購了另一個開源專案packetbeat,而這個專案專門就是用golang的,有整個團隊,所以es公司干脆把logstash-forwarder的開發作業也合并到同一個golang團隊來搞,于是新的專案就叫filebeat了,

二、helm3安裝ELK

詳細流程圖如下:
在這里插入圖片描述

1)準備條件

1、添加helm倉庫

$ helm repo add elastic   https://helm.elastic.co

2)helm3安裝elasticsearch

1、自定義values

主要是設定storage Class 持久化和資源限制,本人電腦資源有限,所以這里就把資源調小了很多,小伙伴們可以根據自己配置自定義哈,

$ cat <<EOF> my-values.yaml
resources:
  requests:
    memory: 1Gi
volumeClaimTemplate:
  storageClassName: "bigdata-nfs-storage"
  accessModes: [ "ReadWriteOnce" ]
  resources:
    requests:
      storage: 3Gi
service:
  type: NodePort
  port: 9000
  nodePort: 31311
EOF

2、開始安裝Elasitcsearch

安裝程序比較慢,因為官方鏡像下載比較慢

$ helm install es elastic/elasticsearch -f my-values.yaml  --namespace bigdata

在這里插入圖片描述

W1207 23:10:57.980283   21465 warnings.go:70] policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
W1207 23:10:58.015416   21465 warnings.go:70] policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
NAME: es
LAST DEPLOYED: Tue Dec  7 23:10:57 2021
NAMESPACE: bigdata
STATUS: deployed
REVISION: 1
NOTES:
1. Watch all cluster members come up.
  $ kubectl get pods --namespace=bigdata -l app=elasticsearch-master -w2. Test cluster health using Helm test.
  $ helm --namespace=bigdata test es

查看,需要所有pod都正常運行才正常,下載鏡像有點慢,需要稍等一段時間再查看

$ kubectl get pod -n bigdata -l app=elasticsearch-master
$ kubectl get pvc -n bigdata
$ watch kubectl get pod -n bigdata -l app=elasticsearch-master

在這里插入圖片描述

3、驗證

$ helm --namespace=bigdata test es
$ kubectl get pod,svc -n bigdata -l app=elasticsearch-master -o wide
$ curl 192.168.0.113:31311/_cat/health
$ curl 192.168.0.113:31311/_cat/nodes

在這里插入圖片描述

4、清理

$ helm uninstall es -n bigdata
$ kubectl delete pvc elasticsearch-master-elasticsearch-master-0 -n bigdata
$ kubectl delete pvc elasticsearch-master-elasticsearch-master-1 -n bigdata
$ kubectl delete pvc elasticsearch-master-elasticsearch-master-2 -n bigdata

3)helm3安裝Kibana

1、自定義values

$ cat <<EOF> my-values.yaml
#此處修改了kibana的組態檔,默認位置/usr/share/kibana/kibana.yaml
kibanaConfig:
   kibana.yml: |
     server.port: 5601
     server.host: "0.0.0.0"
     elasticsearch.hosts: [ "http://elasticsearch-master-0:9200","http://elasticsearch-master-1:9200","http://elasticsearch-master-2:9200" ]
resources:
  requests:
    cpu: "1000m"
    memory: "256Mi"
  limits:
    cpu: "1000m"
    memory: "1Gi"
service:
  #type: ClusterIP
  type: NodePort
  loadBalancerIP: ""
  port: 5601
  nodePort: "30026"
EOF

2、開始安裝Kibana

$ helm install kibana elastic/kibana -f my-values.yaml  --namespace bigdata

在這里插入圖片描述

3、驗證

$ kubectl get pod,svc -n bigdata -l app=kibana

瀏覽器訪問:http://192.168.0.113:30026/
在這里插入圖片描述
在這里插入圖片描述

4、清理

$ helm uninstall kibana -n bigdata

4)helm3安裝Filebeat

filebeat默認收集宿主機上docker的日志路徑:/var/lib/docker/containers,如果我們修改了docker的安裝路徑要怎么收集呢,很簡單修改chart里的DaemonSet檔案里邊的hostPath引數:

- name: varlibdockercontainers
  hostPath:
    path: /var/lib/docker/containers   #改為docker安裝路徑

當然也可以自定義values修改,這里推薦自定義values方式修改采集日志路徑

1、自定義values

默認是將資料存盤到ES,這里做修改資料存盤到Kafka,kafka的部署可以看這里

$ cat <<EOF> my-values.yaml
daemonset:
  filebeatConfig:
    filebeat.yml: |
      filebeat.inputs:
      - type: container
        paths:
          - /var/log/containers/*.log

      output.elasticsearch:
        enabled: false
        host: '${NODE_NAME}'
        hosts: '${ELASTICSEARCH_HOSTS:elasticsearch-master:9200}'
      output.kafka:
       enabled: true
       hosts: ["kafka-0.kafka-headless.bigdata.svc.cluster.local:9092","kafka-1.kafka-headless.bigdata.svc.cluster.local:9092","kafka-2.kafka-headless.bigdata.svc.cluster.local:9092"]
       topic: test
EOF

2、開始安裝Filefeat

$ helm install filebeat elastic/filebeat -f my-values.yaml  --namespace bigdata
$ kubectl get pods --namespace=bigdata -l app=filebeat-filebeat -w

在這里插入圖片描述
在這里插入圖片描述

3、驗證

# 先登錄kafka客戶端
$ kubectl exec --tty -i kafka-client --namespace bigdata -- bash
# 再消費資料
$ kafka-console-consumer.sh --bootstrap-server kafka.bigdata.svc.cluster.local:9092 --topic test

在這里插入圖片描述
看到已經可以消費資料了,說明資料已經存盤到kafka了,

查看kafka資料積壓情況

$ kubectl exec --tty -i kafka-client --namespace bigdata -- bash
$ kafka-consumer-groups.sh --bootstrap-server kafka-0.kafka-headless.bigdata.svc.cluster.local:9092 --describe --group mygroup

發現大量資料都是處于積壓的狀態
在這里插入圖片描述
接下來就是部署logstash去消費kafka資料,最后存盤到ES,

4、清理

$ helm uninstall filebeat -n bigdata

5)helm3安裝Logstash

1、自定義values

【注意】記得把ES和kafka的地址換成自己環境的,

$ cat <<EOF> my-values.yaml
logstashPipeline: 
   logstash.yml: |
    input {
      kafka {
            bootstrap_servers => "kafka-0.kafka-headless.bigdata.svc.cluster.local:9092"
            topics => ["test"]
            group_id => "mygroup"
            #如果使用元資料就不能使用下面的byte位元組序列化,否則會報錯
            #key_deserializer_class => "org.apache.kafka.common.serialization.ByteArrayDeserializer"
            #value_deserializer_class => "org.apache.kafka.common.serialization.ByteArrayDeserializer"
            consumer_threads => 1
            #默認為false,只有為true的時候才會獲取到元資料
            decorate_events => true
            auto_offset_reset => "earliest"
         }
    }
    filter {
      mutate {
        #從kafka的key中獲取資料并按照逗號切割
        split => ["[@metadata][kafka][key]", ","]
        add_field => {
            #將切割后的第一位資料放入自定義的“index”欄位中
            "index" => "%{[@metadata][kafka][key][0]}"
        }
      }
    }
    output { 
      elasticsearch {
          pool_max => 1000
          pool_max_per_route => 200
          hosts => ["http://elasticsearch-master-0:9200","http://elasticsearch-master-1:9200","http://elasticsearch-master-2:9200"]
          index => "test-%{+YYYY.MM.dd}"
      }
    }

# 資源限制
resources:
  requests:
    cpu: "100m"
    memory: "256Mi"
  limits:
    cpu: "1000m"
    memory: "1Gi"

volumeClaimTemplate:
  accessModes: ["ReadWriteOnce"]
  resources:
    requests:
      storage: 3Gi
EOF

output plugin 輸出插件,將事件發送到特定目標:

  • stdout :標準輸出,將事件輸出到螢屏上
output{
    stdout{
        codec => "rubydebug"
    }
}
  • file :將事件寫入檔案
output{
   file {
       path => "/data/logstash/%{host}/{application}
       codec => line { format => "%{message}"} }
    }
}
  • kafka :將事件發送到kafka
output{
   kafka{
        bootstrap_servers => "localhost:9092"
        topic_id => "test_topic"  #必需的設定,生成訊息的主題
    }
}
  • elasticseach :在es中存盤日志
output{
   elasticsearch {
        #user => elastic
        #password => changeme
        hosts => "localhost:9200"
        index => "nginx-access-log-%{+YYYY.MM.dd}"  
    }
}

2、開始安裝Logstash

$ helm install logstash elastic/logstash -f my-values.yaml  --namespace bigdata

在這里插入圖片描述

$ kubectl get pods --namespace=bigdata -l app=logstash-logstash

在這里插入圖片描述

3、驗證

1、登錄kibana查看索引是否創建
在這里插入圖片描述
2、查看logs

$ kubectl logs -f  logstash-logstash-0 -n bigdata >logs
$ tail -100 logs

在這里插入圖片描述
3、查看kafka消費情況

$ kubectl exec --tty -i kafka-client --namespace bigdata -- bash
$ kafka-consumer-groups.sh --bootstrap-server kafka-0.kafka-headless.bigdata.svc.cluster.local:9092 --describe --group mygroup

在這里插入圖片描述
4、通過kibana查看索引資料(Kibana版本:7.15.0)
創建索引模式

Management-》Stack Management-》Kibana-》Index patterns
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

通過上面創建的索引模式查詢資料(Discover)

在這里插入圖片描述
在這里插入圖片描述

4、清理

$ helm uninstall logstash -n bigdata

三、ELK相關的備份組件和備份方式

Elasticsearch備份兩種方式:

  • 將資料匯出成文本檔案,比如通過 elasticdump、esm 等工具將存盤在 Elasticsearch 中的資料匯出到檔案中,適用資料量小的場景
  • 備份 elasticsearch data 目錄中檔案的形式來做快照,借助 Elasticsearch 中 snapshot 介面實作的功能,適用大資料量的場景

1)Elasticsearch的snapshot快照備份

  • 優點:通過snapshot拍攝快照,然后定義快照備份策略,能夠實作快照自動化存盤,可以定義各種策略來滿足自己不同的備份
  • 缺點:還原不夠靈活,拍攝快照進行備份很快,但是還原的時候沒辦法隨意進行還原,類似虛擬機快照

1、配置備份目錄

在 elasticsearch.yml 的組態檔中注明可以用作備份路徑 path.repo ,如下所示:

path.repo: ["/mount/backups", "/mount/longterm_backups"]

配置好后,就可以使用 snapshot api 來創建一個 repository 了,如下我們創建一個名為 my_backup 的 repository,

PUT /_snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "/mount/backups/my_backup"
  }
}

2、開始通過API介面備份
有了 repostiroy 后,我們就可以做備份了,也叫快照,也就是記錄當下資料的狀態,如下所示我們創建一個名為 snapshot_1 的快照,

PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true

【溫馨提示】wait_for_completion 為 true 是指該 api 在備份執行完畢后再回傳結果,否則默認是異步執行的,我們這里為了立刻看到效果,所以設定了該引數,線上執行時不用設定該引數,讓其在后臺異步執行即可,

3、增量備份

PUT /_snapshot/my_backup/snapshot_2?wait_for_completion=true

當執行完畢后,你會發現 /mount/backups/my_backup 體積變大了,這說明新資料備份進來了,要說明的一點是,當你在同一個 repository 中做多次 snapshot 時,elasticsearch 會檢查要備份的資料 segment 檔案是否有變化,如果沒有變化則不處理,否則只會把發生變化的 segment file 備份下來,這其實就實作了增量備份,

4、資料恢復
通過呼叫如下 api 即可快速實作恢復功能:

POST /_snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true
{
  "indices": "index_1",
  "rename_replacement": "restored_index_1"
}

2)elasticdump備份遷移es資料

索引資料匯出為檔案(備份)

# 匯出索引Mapping資料
elasticdump \
  --input=http://es實體IP:9200/index_name/index_type \
  --output=/data/my_index_mapping.json \    # 存放目錄
  --type=mapping 
# 匯出索引資料
elasticdump \
  --input=http://es實體IP:9200/index_name/index_type \
  --output=/data/my_index.json \
  --type=data

索引資料檔案匯入至索引(恢復)

# Mapping 資料匯入至索引
elasticdump \
  --output=http://es實體IP:9200/index_name \
  --input=/home/indexdata/roll_vote_mapping.json \ # 匯入資料目錄
  --type=mapping
# ES檔案資料匯入至索引
elasticdump \
  --output=http:///es實體IP:9200/index_name \
  --input=/home/indexdata/roll_vote.json \ 
  --type=data

可直接將備份資料匯入另一個es集群

elasticdump --input=http://127.0.0.1:9200/test_event   --output=http://127.0.0.2:9200/test_event --type=data

type型別

type是ES資料匯出匯入型別,Elasticdump工具支持以下資料型別:

type型別說明
mappingES的索引映射結構資料
dataES的資料
settingsES的索引庫默認配置
analyzerES的分詞器
templateES的模板結構資料
aliasES的索引別名

3)esm備份遷移es資料

備份es資料

esm -s http://10.33.8.103:9201 -x "petition_data" -b 5 --count=5000 --sliced_scroll_size=10 --refresh -o=./es_backup.bin

-w 表示執行緒數
-b 表示一次bulk請求資料大小,單位MB默認 5M
-c 一次scroll請求數量
匯入恢復es資料

esm -d http://172.16.20.20:9201 -y "petition_data6" -c 5000 -b 5 --refresh -i=./dump.bin

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/379171.html

標籤:其他

上一篇:Hadoop環境搭建(主機名、Ip地址、映射及網路配置)

下一篇:檢查PNG和JPG影像檔案之間是否存在,并使用JavaScript選擇可用的任何一個

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more