Elasticsearch是實時的分布式搜索分析引擎,內(nèi)部使用Lucene做索引與搜索

實時性:新增到 ES 中的數(shù)據(jù)在1秒后就可" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > 【超詳細(xì)】手把手教你ElasticSearch集群搭建

【超詳細(xì)】手把手教你ElasticSearch集群搭建

時間:2023-05-30 11:00:01 | 來源:網(wǎng)站運(yùn)營

時間:2023-05-30 11:00:01 來源:網(wǎng)站運(yùn)營

【超詳細(xì)】手把手教你ElasticSearch集群搭建:

1. ElasticSearch快速入門

1.1. 基本介紹

Lucene是Java語言編寫的全文搜索框架,用于處理純文本的數(shù)據(jù),但它只是一個庫,提供建立索引、執(zhí)行搜索等接口,但不包含分布式服務(wù),這些正是 ES 做的



注意: ES7之后Type被舍棄,只有Index(等同于數(shù)據(jù)庫+表定義)和Document(文檔,行記錄)。

1.2 ElasticSearch安裝

  1. 下載ElasticSearch服務(wù)

    下載最新版ElasticSearch7.10.2: https://www.elastic.co/cn/start

  2. 解壓安裝包

    tar -xvf elasticsearch-7.10.2-linux-x86_64.tar.gz
  3. ElasticSearch不能以Root身份運(yùn)行, 需要單獨(dú)創(chuàng)建一個用戶

    1. groupadd elsearch2. useradd elsearch -g elsearch -p elasticsearch3. chown -R elsearch:elsearch /usr/local/elasticsearch-7.10.2執(zhí)行以上命令,創(chuàng)建一個名為elsearch用戶, 并賦予目錄權(quán)限。

  4. 修改配置文件

    vi config/elasticsearch.yml, 默認(rèn)情況下會綁定本機(jī)地址, 外網(wǎng)不能訪問, 這里要修改下:

    # 外網(wǎng)訪問地址network.host: 0.0.0.0
  5. 關(guān)閉防火墻

    systemctl stop firewalld.servicesystemctl disable firewalld.service
  1. 指定JDK版本

    • 最新版的ElasticSearch需要JDK11版本, 下載JDK11壓縮包, 并進(jìn)行解壓。

    • 修改環(huán)境配置文件

      vi bin/elasticsearch-env

      參照以下位置, 追加一行, 設(shè)置JAVA_HOME, 指定JDK11路徑。

      JAVA_HOME=/usr/local/jdk-11.0.11# now set the path to javaif [ ! -z "$JAVA_HOME" ]; then JAVA="$JAVA_HOME/bin/java"else if [ "$(uname -s)" = "Darwin" ]; then # OSX has a different structure JAVA="$ES_HOME/jdk/Contents/Home/bin/java" else JAVA="$ES_HOME/jdk/bin/java" fifi
  1. 啟動ElasticSearch

    • 切換用戶

      su elsearch

    • 以后臺常駐方式啟動

      bin/elasticsearch -d

  1. 問題記錄

    出現(xiàn)max virtual memory areas vm.max_map_count [65530] is too low, increase to at least 錯誤信息

    修改系統(tǒng)配置:

    • vi /etc/sysctl.conf

      添加

      vm.max_map_count=655360

      執(zhí)行生效

      sysctl -p

    • vi /etc/security/limits.conf

      在文件末尾添加

      * soft nofile 65536* hard nofile 131072* soft nproc 2048* hard nproc 4096elsearch soft nproc 125535elsearch hard nproc 125535重新切換用戶即可:

      su - elsearch

  2. 訪問驗證

    訪問地址:http://192.168.116.140:9200/_cat/health



    啟動狀態(tài)有g(shù)reen、yellow和red。 green是代表啟動正常。

1.3 Kibana服務(wù)安裝

Kibana是一個針對Elasticsearch的開源分析及可視化平臺,用來搜索、查看交互存儲在Elasticsearch索引中的數(shù)據(jù)。

  1. 到官網(wǎng)下載, Kibana安裝包, 與之對應(yīng)7.10.2版本, 選擇Linux 64位版本下載,并進(jìn)行解壓。

    tar -xvf kibana-7.10.2-linux-x86_64.tar.gz
  2. Kibana啟動不能使用root用戶, 使用上面創(chuàng)建的elsearch用戶, 進(jìn)行賦權(quán):

    chown -R elsearch:elsearch kibana-7.10.2-linux-x86_64
  3. 修改配置文件

    vi config/kibana.yml , 修改以下配置:

    # 服務(wù)端口server.port: 5601# 服務(wù)地址server.host: "0.0.0.0"# elasticsearch服務(wù)地址elasticsearch.hosts: ["http://192.168.116.140:9200"]
  4. 啟動kibana

    ./kibana -q看到以下日志, 代表啟動正常

    log [01:40:00.143] [info][listening] Server running at http://0.0.0.0:5601如果出現(xiàn)啟動失敗的情況, 要檢查集群各節(jié)點(diǎn)的日志, 確保服務(wù)正常運(yùn)行狀態(tài)。

  5. 訪問服務(wù)

    http://192.168.116.140:5601/app/home#/

1.4 ES的基礎(chǔ)操作

  1. 進(jìn)入Kibana管理后臺

    地址: http://192.168.116.140:5601

    進(jìn)入"Dev Tools"欄:

    在Console中輸入命令進(jìn)行操作。

  1. 分片設(shè)置:

    這里增加名為orders的索引, 因為是單節(jié)點(diǎn), 如果副本數(shù), 是會出現(xiàn)錯誤。

    PUT orders{ "settings": { "index": { "number_of_shards": 2, "number_of_replicas": 2 } }}查看索引信息, 會出現(xiàn)yellow提示:



    因為單節(jié)點(diǎn)模式, 只有主節(jié)點(diǎn)信息:

    刪除重新創(chuàng)建:

    PUT orders{ "settings": { "index": { "number_of_shards": 2, "number_of_replicas": 0 } }}將分片數(shù)設(shè)為0, 再次查看, 則顯示正常:



  1. 索引

    3.1 新建索引orders

    ## 創(chuàng)建索引PUT orders3.2 查詢索引orders

    ## 查詢索引GET orders


通過查詢命令, 能查看到對應(yīng)信息, 默認(rèn)分片數(shù)和副本數(shù)都為1:

"number_of_shards" : "1", ## 主分片數(shù) "number_of_replicas" : "1", ## 副分片數(shù) 3.3 刪除索引

## 刪除索引 DELETE orders 3.4 索引的設(shè)置

## 設(shè)置索引 PUT orders { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 0 } } }
  1. 文檔

    4.1 創(chuàng)建文檔

    ## 創(chuàng)建文檔,生成默認(rèn)的文檔idPOST orders/_doc{ "name": "襪子1雙", "price": "200", "count": 1, "address": "杭州市"}## 創(chuàng)建文檔,生成自定義文檔idPOST orders/_doc/1{ "name": "襪子1雙", "price": "2", "count": 1, "address": "杭州市"}4.2 查詢文檔

    ## 根據(jù)指定的id查詢GET orders/_doc/1## 根據(jù)指定條件查詢文檔GET orders/_search{ "query": { "match": { "address": "杭州市" } }}## 查詢?nèi)课臋nGET orders/_search4.3 更新文檔

    ## 更新文檔POST orders/_doc/1{ "price": "200"}## 更新文檔POST orders/_update/1{ "doc": { "price": "200" }}4.4 刪除文檔

    ## 刪除文檔DELETE orders/_doc/1


  2. 對于映射,只能進(jìn)行字段添加,不能對字段進(jìn)行修改或刪除,如有需要,則重新創(chuàng)建映射。

    ## 設(shè)置mapping信息PUT orders/_mappings{ "properties":{ "price": { "type": "long" } }}## 設(shè)置分片和映射PUT orders{ "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 0 } }, "mappings": { "properties": { "name": { "type": "text" }, "price": { "type": "long" }, "count": { "type": "long" }, "address": { "type": "text" } } }}

1.5 ES數(shù)據(jù)類型

整體數(shù)據(jù)類型結(jié)構(gòu):



  1. String 類型

    主要分為text與keyword兩種類型。兩者區(qū)別主要在于能否分詞。

    • text類型

      會進(jìn)行分詞處理, 分詞器默認(rèn)采用的是standard。

    • keyword類型

      不會進(jìn)行分詞處理。在ES的倒排索引中存儲的是完整的字符串。

  2. Date時間類型

    數(shù)據(jù)庫里的日期類型需要規(guī)范具體的傳入格式, ES是可以控制,自適應(yīng)處理。

    傳遞不同的時間類型:

    PUT my_date_index/_doc/1{ "date": "2021-01-01" } PUT my_date_index/_doc/2{ "date": "2021-01-01T12:10:30Z" } PUT my_date_index/_doc/3{ "date": 1520071600001 }

查看日期數(shù)據(jù):

GET my_date_index/_mapping

![file](http://image.openwrite.cn/29993_978759DA6B664CFB9D0E8EC9C6E709B6) ES的Date類型允許可以使用的格式有: > yyyy-MM-dd HH:mm:ss > yyyy-MM-dd > epoch_millis(毫秒值)3. 復(fù)合類型 復(fù)雜類型主要有三種: Array、object、nested。 + Array類型: 在Elasticsearch中,數(shù)組不需要聲明專用的字段數(shù)據(jù)類型。但是,在數(shù)組中的所有值都必須具有相同的數(shù)據(jù)類型。舉例: ```sh POST orders/_doc/1 { "goodsName":["足球","籃球","兵乓球", 3] } POST orders/_doc/1 { "goodsName":["足球","籃球","兵乓球"] } ``` + object類型: 用于存儲單個JSON對象, 類似于JAVA中的對象類型, 可以有多個值, 比如LIST<object>,可以包含多個對象。 但是LIST<object>只能作為整體, 不能獨(dú)立的索引查詢。舉例: ```sh # 新增第一組數(shù)據(jù), 組別為美國,兩個人。 POST my_index/_doc/1 { "group" : "america", "users" : [ { "name" : "John", "age" : "22" }, { "name" : "Alice", "age" : "21" } ] } # 新增第二組數(shù)據(jù), 組別為英國, 兩個人。 POST my_index/_doc/2 { "group" : "england", "users" : [ { "name" : "lucy", "age" : "21" }, { "name" : "John", "age" : "32" } ] } ``` 這兩組數(shù)據(jù)都包含了name為John,age為21的數(shù)據(jù), 采用這個搜索條件, 實際結(jié)果: ```sh GET my_index/_search { "query": { "bool": { "must": [ { "match": { "users.name": "John" } }, { "match": { "users.age": "21" } } ] } } } ``` 結(jié)果可以看到, 這兩組數(shù)據(jù)都能找出,因為每一組數(shù)據(jù)都是作為一個整體進(jìn)行搜索匹配, 而非具體某一條數(shù)據(jù)。 + Nested類型 用于存儲多個JSON對象組成的數(shù)組,`nested` 類型是 `object` 類型中的一個特例,可以讓對象數(shù)組獨(dú)立索引和查詢。 舉例: 創(chuàng)建nested類型的索引: ```sh PUT my_index { "mappings": { "properties": { "users": { "type": "nested" } } } } ``` 發(fā)出查詢請求: ```sh GET my_index/_search { "query": { "bool": { "must": [ { "nested": { "path": "users", "query": { "bool": { "must": [ { "match": { "users.name": "John" } }, { "match": { "users.age": "21" } } ] } } } } ] } } } ``` 采用以前的條件, 這個時候查不到任何結(jié)果, 將年齡改成22, 就可以找出對應(yīng)的數(shù)據(jù): ```sh "hits" : [ { "_index" : "my_index", "_type" : "_doc", "_id" : "1", "_score" : 1.89712, "_source" : { "group" : "america", "users" : [ { "name" : "John", "age" : "22" }, { "name" : "Alice", "age" : "21" } ] } } ] ``` 4. GEO地理位置類型 現(xiàn)在大部分APP都有基于位置搜索的功能, 比如交友、購物應(yīng)用等。這些功能是基于GEO搜索實現(xiàn)的。 對于GEO地理位置類型,分為地理坐標(biāo)類型:Geo-point, 和形狀:Geo-shape 兩種類型。 | 經(jīng)緯度 | 英文 | 簡寫 | 正數(shù) | 負(fù)數(shù) | | :----- | :-------- | :------- | :--- | ---- | | 維度 | latitude | lat | 北緯 | 南緯 | | 經(jīng)度 | longitude | lon或lng | 東經(jīng) | 西經(jīng) | 創(chuàng)建地理位置索引: ```sh PUT my_locations { "mappings": { "properties": { "location": { "type": "geo_point" } } } } ``` 添加地理位置數(shù)據(jù): ```sh # 采用object對象類型 PUT my_locations/_doc/1 { "user": "張三", "text": "Geo-point as an object", "location": { "lat": 41.12, "lon": -71.34 } } # 采用string類型 PUT my_locations/_doc/2 { "user": "李四", "text": "Geo-point as a string", "location": "45.12,-75.34" } # 采用geohash類型(geohash算法可以將多維數(shù)據(jù)映射為一串字符) PUT my_locations/_doc/3 { "user": "王二麻子", "text": "Geo-point as a geohash", "location": "drm3btev3e86" } # 采用array數(shù)組類型 PUT my_locations/_doc/4 { "user": "木頭老七", "text": "Geo-point as an array", "location": [ -80.34, 51.12 ] } ``` 需求:搜索出距離我{"lat" : 40,"lon" : -70} 200km范圍內(nèi)的人: ```sh GET my_locations/_search { "query": { "bool": { "must": { "match_all": {} }, "filter": { "geo_distance": { "distance": "200km", "location": { "lat": 40, "lon": -70 } } } } } } ```## 2. ES高可用集群配置### 2.1 ElasticSearch集群介紹+ **主節(jié)點(diǎn)(或候選主節(jié)點(diǎn))** 主節(jié)點(diǎn)負(fù)責(zé)創(chuàng)建索引、刪除索引、分配分片、追蹤集群中的節(jié)點(diǎn)狀態(tài)等工作, 主節(jié)點(diǎn)負(fù)荷相對較輕, 客戶端請求可以直接發(fā)往任何節(jié)點(diǎn), 由對應(yīng)節(jié)點(diǎn)負(fù)責(zé)分發(fā)和返回處理結(jié)果。 一個節(jié)點(diǎn)啟動之后, 采用 Zen Discovery機(jī)制去尋找集群中的其他節(jié)點(diǎn), 并與之建立連接, 集群會從候選主節(jié)點(diǎn)中選舉出一個主節(jié)點(diǎn), 并且一個集群只能選舉一個主節(jié)點(diǎn), 在某些情況下, 由于網(wǎng)絡(luò)通信丟包等問題, 一個集群可能會出現(xiàn)多個主節(jié)點(diǎn), 稱為“腦裂現(xiàn)象”, 腦裂會存在丟失數(shù)據(jù)的可能, 因為主節(jié)點(diǎn)擁有最高權(quán)限, 它決定了什么時候可以創(chuàng)建索引, 分片如何移動等, 如果存在多個主節(jié)點(diǎn), 就會產(chǎn)生沖突, 容易產(chǎn)生數(shù)據(jù)丟失。要盡量避免這個問題, 可以通過 discovery.zen.minimum_master_nodes 來設(shè)置最少可工作的候選主節(jié)點(diǎn)個數(shù)。 建議設(shè)置為(候選主節(jié)點(diǎn)/2) + 1 比如三個候選主節(jié)點(diǎn),該配置項為 (3/2)+1 ,來保證集群中有半數(shù)以上的候選主節(jié)點(diǎn), 沒有足夠的master候選節(jié)點(diǎn), 就不會進(jìn)行master節(jié)點(diǎn)選舉,減少腦裂的可能。 主節(jié)點(diǎn)的參數(shù)設(shè)置: ```sh node.master = true node.data = false

2.2 ElasticSearch集群原理

2.2.1 集群分布式原理

ES集群可以根據(jù)節(jié)點(diǎn)數(shù), 動態(tài)調(diào)整主分片與副本數(shù), 做到整個集群有效均衡負(fù)載。

單節(jié)點(diǎn)狀態(tài)下:



兩個節(jié)點(diǎn)狀態(tài)下, 副本數(shù)為1:



三個節(jié)點(diǎn)狀態(tài)下, 副本數(shù)為1:



三個節(jié)點(diǎn)狀態(tài)下, 副本數(shù)為2:



2.2.2 分片處理機(jī)制

設(shè)置分片大小的時候, 需預(yù)先做好容量規(guī)劃, 如果節(jié)點(diǎn)數(shù)過多, 分片數(shù)過小, 那么新的節(jié)點(diǎn)將無法分片, 不能做到水平擴(kuò)展, 并且單個分片數(shù)據(jù)量太大, 導(dǎo)致數(shù)據(jù)重新分配耗時過大。

假設(shè)一個集群中有一個主節(jié)點(diǎn)、兩個數(shù)據(jù)節(jié)點(diǎn)。orders索引的分片分布情況如下所示:

PUT orders{ "settings":{ "number_of_shards":2, ## 主分片 2 "number_of_replicas":2 ## 副分片 4 }}

整個集群中存在P0和P1兩個主分片, P0對應(yīng)的兩個R0副本分片, P1對應(yīng)的是兩個R1副本分片。

2.2.3 新建索引處理流程



  1. 寫入的請求會進(jìn)入主節(jié)點(diǎn), 如果是NODE2副本接收到寫請求, 會將它轉(zhuǎn)發(fā)至主節(jié)點(diǎn)。

  2. 主節(jié)點(diǎn)接收到請求后, 根據(jù)documentId做取模運(yùn)算(外部沒有傳遞documentId,則會采用內(nèi)部自增ID),

    如果取模結(jié)果為P0,則會將寫請求轉(zhuǎn)發(fā)至NODE3處理。

  3. NODE3節(jié)點(diǎn)寫請求處理完成之后, 采用異步方式, 將數(shù)據(jù)同步至NODE1和NODE2節(jié)點(diǎn)。

2.2.4 讀取索引處理流程



  1. 讀取的請求進(jìn)入MASTER節(jié)點(diǎn), 會根據(jù)取模結(jié)果, 將請求轉(zhuǎn)發(fā)至不同的節(jié)點(diǎn)。
  2. 如果取模結(jié)果為R0,內(nèi)部還會有負(fù)載均衡處理機(jī)制,如果上一次的讀取請求是在NODE1的R0, 那么當(dāng)前請求會轉(zhuǎn)發(fā)至NODE2的R0, 保障每個節(jié)點(diǎn)都能夠均衡的處理請求數(shù)據(jù)。
  3. 讀取的請求如果是直接落至副本節(jié)點(diǎn), 副本節(jié)點(diǎn)會做判斷, 若有數(shù)據(jù)則返回,沒有的話會轉(zhuǎn)發(fā)至其他節(jié)點(diǎn)處理。

2.3 ElasticSearch集群部署規(guī)劃

準(zhǔn)備一臺虛擬機(jī):

192.168.116.140: Node-1 (節(jié)點(diǎn)一), 端口:9200, 9300

192.168.116.140: Node-2 (節(jié)點(diǎn)二),端口:9201, 9301

192.168.116.140: Node-3 (節(jié)點(diǎn)三),端口:9202, 9302

2.4 ElasticSearch集群配置

  1. 解壓安裝包:

    mkdir /usr/local/clustercd /usr/local/clustertar -xvf elasticsearch-7.10.2-linux-x86_64.tar.gz將安裝包解壓至/usr/local/cluster目錄。

  2. 修改集群配置文件:

    vi /usr/local/cluster/elasticsearch-7.10.2-node1/config/elasticsearch.yml 192.168.116.140, 第一臺節(jié)點(diǎn)配置內(nèi)容:

    # 集群名稱cluster.name: my-application#節(jié)點(diǎn)名稱node.name: node-1# 綁定IP地址network.host: 192.168.116.140# 指定服務(wù)訪問端口http.port: 9200# 指定API端戶端調(diào)用端口transport.tcp.port: 9300#集群通訊地址discovery.seed_hosts: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#集群初始化能夠參選的節(jié)點(diǎn)信息cluster.initial_master_nodes: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#開啟跨域訪問支持,默認(rèn)為falsehttp.cors.enabled: true##跨域訪問允許的域名, 允許所有域名http.cors.allow-origin: "*"修改目錄權(quán)限:

    chown -R elsearch:elsearch /usr/local/cluster/elasticsearch-7.10.2-node1
  3. 復(fù)制ElasticSearch安裝目錄:

    復(fù)制其余兩個節(jié)點(diǎn):

    cd /usr/local/clustercp -r elasticsearch-7.10.2-node1 elasticsearch-7.10.2-node2cp -r elasticsearch-7.10.2-node1 elasticsearch-7.10.2-node3
  4. 修改其余節(jié)點(diǎn)的配置:

    192.168.116.140 第二臺節(jié)點(diǎn)配置內(nèi)容:

    # 集群名稱cluster.name: my-application#節(jié)點(diǎn)名稱node.name: node-2# 綁定IP地址network.host: 192.168.116.140# 指定服務(wù)訪問端口http.port: 9201# 指定API端戶端調(diào)用端口transport.tcp.port: 9301#集群通訊地址discovery.seed_hosts: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#集群初始化能夠參選的節(jié)點(diǎn)信息cluster.initial_master_nodes: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#開啟跨域訪問支持,默認(rèn)為falsehttp.cors.enabled: true##跨域訪問允許的域名, 允許所有域名http.cors.allow-origin: "*"192.168.116.140 第三臺節(jié)點(diǎn)配置內(nèi)容:

    # 集群名稱cluster.name: my-application#節(jié)點(diǎn)名稱node.name: node-3# 綁定IP地址network.host: 192.168.116.140# 指定服務(wù)訪問端口http.port: 9202# 指定API端戶端調(diào)用端口transport.tcp.port: 9302#集群通訊地址discovery.seed_hosts: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#集群初始化能夠參選的節(jié)點(diǎn)信息cluster.initial_master_nodes: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#開啟跨域訪問支持,默認(rèn)為falsehttp.cors.enabled: true##跨域訪問允許的域名, 允許所有域名http.cors.allow-origin: "*"
  1. 啟動集群節(jié)點(diǎn)

    先切換elsearch用戶, 在三臺節(jié)點(diǎn)依次啟動服務(wù):

    su elsearch/usr/local/cluster/elasticsearch-7.10.2-node1/bin/elasticsearch -d/usr/local/cluster/elasticsearch-7.10.2-node2/bin/elasticsearch -d/usr/local/cluster/elasticsearch-7.10.2-node3/bin/elasticsearch -d注意: 如果啟動出現(xiàn)錯誤, 將各節(jié)點(diǎn)的data目錄清空, 再重啟服務(wù)。

  2. 集群狀態(tài)查看

    集群安裝與啟動成功之后, 執(zhí)行請求: http://192.168.116.140:9200/_cat/nodes?pretty

    可以看到三個節(jié)點(diǎn)信息,三個節(jié)點(diǎn)會自行選舉出主節(jié)點(diǎn):



2.5 ElasticSearch集群分片測試

修改kibana的配置文件,指向創(chuàng)建的集群節(jié)點(diǎn):

elasticsearch.hosts: ["http://192.168.116.140:9200","http://192.168.116.140:9201","http://192.168.116.140:9202"]重啟kibana服務(wù), 進(jìn)入控制臺:

http://192.168.116.140:5601/app/home#/

再次創(chuàng)建索引(副本數(shù)量范圍內(nèi)):

PUT orders{ "settings": { "index": { "number_of_shards": 2, "number_of_replicas": 2 } }}可以看到, 這次結(jié)果是正常:



集群并非可以隨意增加副本數(shù)量, 創(chuàng)建索引(超出副本數(shù)量范圍):

PUT orders{ "settings": { "index": { "number_of_shards": 2, "number_of_replicas": 5 } }}可以看到出現(xiàn)了yellow警告錯誤:



好了,至此ES集群搭建完畢,歡迎志同道合的小伙伴,一起交流學(xué)習(xí)成長。進(jìn)階架構(gòu)師,F(xiàn)ighting?。?!

本文由傳智教育博學(xué)谷 - 狂野架構(gòu)師教研團(tuán)隊發(fā)布如果本文對您有幫助,歡迎關(guān)注和點(diǎn)贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創(chuàng)作的動力轉(zhuǎn)載請注明出處!

關(guān)鍵詞:詳細(xì),把手

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉