docker-compose快速部署elasticsearch-8.x集群+kibana

来源:https://www.cnblogs.com/bolingcavalry/archive/2023/08/22/17642370.html
-Advertisement-
Play Games

### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 前文[《Docker下elasticse ...


歡迎訪問我的GitHub

這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos

本篇概覽

  • 前文《Docker下elasticsearch8部署、擴容、基本操作實戰(含kibana)》介紹了用docker快速部署es和kibana的過程,然而整個過程人工操作步驟還是多了點,能不能更簡單些呢?畢竟很多時候大家關註的是使用,不願在部署上費太多時間

  • 藉助docker-compose,可以將es集群+kibana的安裝過程可以進一步簡化,精簡後的步驟如下圖,已經省的不能再省了...
    在這裡插入圖片描述

  • 本文會按照上述流程進行實戰,一共實戰兩次:第一次部署帶證書賬號密碼的安全版本,第二次部署沒有任何安全檢查的版本,裝好直接訪問使用

  • 請註意docker部署ElasticSearch的適用場景:我這邊只在開發過程中使用,此種方式在生產環境是否適合是有待商榷的,用於生產環境時請您慎重考慮

  • 本篇由以下內容構成

  1. 介紹我這邊實戰的環境供您參考
  2. Linxu用戶需要額外註意的地方
  3. 編寫配置文件
  4. 啟動
  5. 驗證

環境信息

  • 以下是本次實戰的環境信息,可以作為參考
  1. 操作系統:macOS Monterey(M1 Pro晶元的MacBook Pro,16G記憶體)
  2. Docker:Docker Desktop 4.7.1 (77678)
  3. ElasticSearch:8.2.2
  4. Kibana:8.2.2

Linux用戶請註意

  • 如果您的環境是Linux,註意要做以下操作,否則es可能會啟動失敗
  1. 用編輯工具打開文件/etc/sysctl.conf

  2. 在尾部添加一行配置vm.max_map_count = 262144,如果已存在就修改,數值不能低於262144

  3. 修改保存,然後執行命令sudo sysctl -p使其立即生效

編寫配置文件

  • 再次確認接下來工作的目標:用docker-compose快速部署es集群+kibana,這個集群是帶安全檢查的(自簽證書+賬號密碼)

  • 找個乾凈目錄,新建名為.env的文件,內容如下,這是給docker-compose用到的配置文件每個配置項都有詳細註釋說明

# elastic賬號的密碼 (至少六個字元)
ELASTIC_PASSWORD=123456

# kibana_system賬號的密碼 (至少六個字元),該賬號僅用於一些kibana的內部設置,不能用來查詢es
KIBANA_PASSWORD=abcdef

# es和kibana的版本
STACK_VERSION=8.2.2

# 集群名字
CLUSTER_NAME=docker-cluster

# x-pack安全設置,這裡選擇basic,基礎設置,如果選擇了trail,則會在30天後到期
LICENSE=basic
#LICENSE=trial

# es映射到宿主機的的埠
ES_PORT=9200

# kibana映射到宿主機的的埠
KIBANA_PORT=5601

# es容器的記憶體大小,請根據自己硬體情況調整
MEM_LIMIT=1073741824

# 命名空間,會體現在容器名的首碼上
COMPOSE_PROJECT_NAME=demo
  • 然後是docker-compose.yaml文件,這裡面會用到剛纔創建的.env文件,一共創建了五個容器:啟動操作、三個es組成集群,一個kibana(多說一句:官方腳本,放心用)
version: "2.2"

services:
  setup:
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
    user: "0"
    command: >
      bash -c '
        if [ x${ELASTIC_PASSWORD} == x ]; then
          echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
          exit 1;
        elif [ x${KIBANA_PASSWORD} == x ]; then
          echo "Set the KIBANA_PASSWORD environment variable in the .env file";
          exit 1;
        fi;
        if [ ! -f config/certs/ca.zip ]; then
          echo "Creating CA";
          bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
          unzip config/certs/ca.zip -d config/certs;
        fi;
        if [ ! -f config/certs/certs.zip ]; then
          echo "Creating certs";
          echo -ne \
          "instances:\n"\
          "  - name: es01\n"\
          "    dns:\n"\
          "      - es01\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          "  - name: es02\n"\
          "    dns:\n"\
          "      - es02\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          "  - name: es03\n"\
          "    dns:\n"\
          "      - es03\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          > config/certs/instances.yml;
          bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
          unzip config/certs/certs.zip -d config/certs;
        fi;
        echo "Setting file permissions"
        chown -R root:root config/certs;
        find . -type d -exec chmod 750 \{\} \;;
        find . -type f -exec chmod 640 \{\} \;;
        echo "Waiting for Elasticsearch availability";
        until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
        echo "Setting kibana_system password";
        until curl -s -X POST --cacert config/certs/ca/ca.crt -u elastic:${ELASTIC_PASSWORD} -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
        echo "All done!";
      '
    healthcheck:
      test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"]
      interval: 1s
      timeout: 5s
      retries: 120

  es01:
    depends_on:
      setup:
        condition: service_healthy
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es02,es03
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es01/es01.key
      - xpack.security.http.ssl.certificate=certs/es01/es01.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es01/es01.key
      - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  es02:
    depends_on:
      - es01
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata02:/usr/share/elasticsearch/data
    environment:
      - node.name=es02
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es03
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es02/es02.key
      - xpack.security.http.ssl.certificate=certs/es02/es02.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es02/es02.key
      - xpack.security.transport.ssl.certificate=certs/es02/es02.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  es03:
    depends_on:
      - es02
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata03:/usr/share/elasticsearch/data
    environment:
      - node.name=es03
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es02
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es03/es03.key
      - xpack.security.http.ssl.certificate=certs/es03/es03.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es03/es03.key
      - xpack.security.transport.ssl.certificate=certs/es03/es03.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  kibana:
    depends_on:
      es01:
        condition: service_healthy
      es02:
        condition: service_healthy
      es03:
        condition: service_healthy
    image: kibana:${STACK_VERSION}
    volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - SERVERNAME=kibana
      - ELASTICSEARCH_HOSTS=https://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
      - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
    mem_limit: ${MEM_LIMIT}
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  esdata02:
    driver: local
  esdata03:
    driver: local
  kibanadata:
    driver: local
  • 註意:.env和docker-compose.yaml兩個文件在同一目錄下

啟動應用

  • 在docker-compose.yaml文件所在目錄,執行命令docker-compose up -d啟動所有容器
❯ docker-compose up -d
Creating network "demo_default" with the default driver
Pulling setup (elasticsearch:8.2.2)...
8.2.2: Pulling from library/elasticsearch
Digest: sha256:8c666cb1e76650306655b67644a01663f9c7a5422b2c51dd570524267f11ce3d
Status: Downloaded newer image for elasticsearch:8.2.2
Pulling kibana (kibana:8.2.2)...
8.2.2: Pulling from library/kibana
Digest: sha256:cf34801f36a2e79c834b3cdeb0a3463ff34b8d8588c3ccdd47212c4e0753f8a5
Status: Downloaded newer image for kibana:8.2.2
Creating demo_setup_1 ... done
Creating demo_es01_1  ... done
Creating demo_es02_1  ... done
Creating demo_es03_1  ... done
Creating demo_kibana_1 ... done
  • 查看容器狀態,負責啟動的demo_setup_1已退出,其他的正常運行
❯ docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS                      PORTS                              NAMES
c8ce010cddfc   kibana:8.2.2          "/bin/tini -- /usr/l…"   20 minutes ago   Up 20 minutes (healthy)     0.0.0.0:5601->5601/tcp             demo_kibana_1
78662d44ae31   elasticsearch:8.2.2   "/bin/tini -- /usr/l…"   21 minutes ago   Up 21 minutes (healthy)     9200/tcp, 9300/tcp                 demo_es03_1
7e96273872cb   elasticsearch:8.2.2   "/bin/tini -- /usr/l…"   21 minutes ago   Up 21 minutes (healthy)     9200/tcp, 9300/tcp                 demo_es02_1
8b8be1d645ba   elasticsearch:8.2.2   "/bin/tini -- /usr/l…"   21 minutes ago   Up 21 minutes (healthy)     0.0.0.0:9200->9200/tcp, 9300/tcp   demo_es01_1
c48ffb724ca2   elasticsearch:8.2.2   "/bin/tini -- /usr/l…"   21 minutes ago   Exited (0) 20 minutes ago                                      demo_setup_1
  • 看看demo_setup_1的日誌,提示啟動順利
❯ docker logs demo_setup_1
Setting file permissions
Waiting for Elasticsearch availability
Setting kibana_system password
All done!
  • 如果要使用curl命令向ES發請求,需要提前將crt文件從容器中複製出來
docker cp demo_es01_1:/usr/share/elasticsearch/config/certs/es01/es01.crt .

驗證

  • 現在來驗證es集群和kibana能不能正常工作

  • 瀏覽器訪問https://localhost:9200/,註意是https,會看到以下警告頁面
    在這裡插入圖片描述

  • 此時直接鍵入thisisunsafe再回車,會提示輸入賬號密碼,根據之前的配置賬號elastic,密碼123456

image-20220605091424931

  • 瀏覽器顯示如下,證明es成功響應了
    在這裡插入圖片描述

  • 如果chrome上安裝了eshead插件,此時就能查看es集群情況了(註意內部的地址欄中,要用https,而非http),如下圖,一共三個節點,es02前面有五角星標誌,表示其主節點的身份
    在這裡插入圖片描述

  • 目前看來es集群部署和運行都已經正常,再看kibana是否可用

  • 訪問http://localhost:5601/,賬號elastic,密碼123456
    在這裡插入圖片描述

  • 點擊下圖紅框位置,進入輸入命令的頁面
    在這裡插入圖片描述

  • 如下圖,左側輸入創建索引的命令,再點擊紅框中的按鈕,右側會顯示執行結果
    在這裡插入圖片描述

  • 批量寫入兩條記錄
    在這裡插入圖片描述

  • 最後是查詢操作
    在這裡插入圖片描述

清理

  • 如果要刪除es,執行docker-compose down就會刪除容器,但是,此命令不會刪除數據,下次執行docker-compose up -d後,新的es集群中會出現剛纔創建的test001索引,並且數據也在
  • 這是因為docker-compose.yaml中使用了數據捲volume存儲es集群的關鍵數據,這些輸入被保存在宿主機的磁碟上
❯ docker volume ls
DRIVER    VOLUME NAME
local     demo_certs
local     demo_esdata01
local     demo_esdata02
local     demo_esdata03
local     demo_kibanadata
  • 執行docker volume rm demo_certs demo_esdata01 demo_esdata02 demo_esdata03即可將它們徹底清除
  • 以上就是快速部署es集群+kibana的整個過程了,是不是很簡單呢?

不帶密碼的集群

  • 有時候咱們部署es不需要安全認證,例如開發環境,或者有防火牆禁止外部訪問的環境,那麼剛纔的部署就不夠用了,咱們需要一個更簡單的、部署完了立刻能用的集群,接下來動手試試吧

  • 找個乾凈目錄,新建名為.env的文件,內容如下,和安全版相比去掉了一些不需要的內容

# kibana_system賬號的密碼 (至少六個字元),該賬號僅用於一些kibana的內部設置,不能用來查詢es
KIBANA_PASSWORD=abcdef

# es和kibana的版本
STACK_VERSION=8.2.2

# 集群名字
CLUSTER_NAME=docker-cluster

# es映射到宿主機的的埠
ES_PORT=9200

# kibana映射到宿主機的的埠
KIBANA_PORT=5601

# es容器的記憶體大小,請根據自己硬體情況調整
MEM_LIMIT=1073741824

# 命名空間,會體現在容器名的首碼上
COMPOSE_PROJECT_NAME=demo
  • 然後是docker-compose.yaml文件,這裡面會用到剛纔創建的.env文件,和安全版相比去掉了啟動容器,和安全相關的配置和腳本也刪除了
version: "2.2"

services:
  es01:
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es02,es03
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=false
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1

  es02:
    depends_on:
      - es01
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    environment:
      - node.name=es02
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es03
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=false
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1

  es03:
    depends_on:
      - es02
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - esdata03:/usr/share/elasticsearch/data
    environment:
      - node.name=es03
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es02
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=false
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
  kibana:
    image: kibana:${STACK_VERSION}
    volumes:
      - kibanadata:/usr/share/kibana/data
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - SERVERNAME=kibana
      - ELASTICSEARCH_HOSTS=http://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
    mem_limit: ${MEM_LIMIT}

volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local
  esdata03:
    driver: local
  kibanadata:
    driver: local
  • 註意:.env和docker-compose.yaml兩個文件在同一目錄下

啟動和驗證

  • 啟動前,請先停止和清理掉剛纔部署的安全版
  • 在docker-compose.yaml文件所在目錄,執行命令docker-compose up -d啟動所有容器,稍等片刻,可見所有容器已經就緒
❯ docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                              NAMES
11663375288d   elasticsearch:8.2.2   "/bin/tini -- /usr/l…"   4 minutes ago   Up 4 minutes   9200/tcp, 9300/tcp                 demo_es03_1
ad6f0390b9cf   elasticsearch:8.2.2   "/bin/tini -- /usr/l…"   4 minutes ago   Up 4 minutes   9200/tcp, 9300/tcp                 demo_es02_1
5080709e5358   kibana:8.2.2          "/bin/tini -- /usr/l…"   4 minutes ago   Up 4 minutes   0.0.0.0:5601->5601/tcp             demo_kibana_1
4b1e576fbfd3   elasticsearch:8.2.2   "/bin/tini -- /usr/l…"   4 minutes ago   Up 4 minutes   0.0.0.0:9200->9200/tcp, 9300/tcp   demo_es01_1
  • 瀏覽器訪問http://localhost:9200/ ,註意是http,收到es響應
    在這裡插入圖片描述
  • chrome的eshead插件也能正常獲取es集群信息
    在這裡插入圖片描述
  • 訪問kibana,地址是http://localhost:5601/ ,註意是http,能夠正常使用,下圖是成功創建索引的操作
    在這裡插入圖片描述
  • 至此,基於docker-compose部署es集群+kibana的部署已經完成,藉助嫻熟的複製粘貼操作,快速部署一個es集群簡直易如反掌,如果您正要快速部署一套es集群,希望本文能給您一些參考

歡迎關註博客園:程式員欣宸

學習路上,你不孤單,欣宸原創一路相伴...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ##### 9 閉包 我們都知道,函數里是可以訪問函數外的全局變數,而函數外不能訪問函數內的局部變數,如下: ```js // 函數外定義a,在函數內可以訪問 var a = "測試"; function fn() { console.log(a); } fn(); ``` 執行結果: ![imag ...
  • ##### 5 偽類選擇器 anchor偽類:專用於控制鏈接的顯示效果 |More Actions[:link](https://www.w3school.com.cn/cssref/selector_link.asp) |a:link |選擇所有未被訪問的鏈接。 | | | | | |[:visi ...
  • # 通過 NVM 安裝、管理Node.js 版本(Windows) ## 介紹 NVM 可以讓我們通過指令安裝指定版本,並且可以切換當前Node.js 版本,不用花時間在解決升版和降版。 ## 安裝 鏈接: https://github.com/coreybutler/nvm-windows 選擇最 ...
  • ##### 4 屬性選擇器 屬性選擇器是通過元素的屬性及屬性值來選擇元素的。下麵介紹屬性選擇器的用法。 1. 第一種用法 ``` 作用:選擇含有指定屬性的元素。 語法:[屬性名]{} ``` 示例如下: ```html 屬性選擇器 用戶名: 密 碼: 數據量: ``` 運行結果: ![image]( ...
  • ##### 8 JavaScript函數 在JS中聲明函數和python差不多. 也要有一個關鍵字頂在前面. python是`def`, 到了JS里換成了`function`, 只不過在JS中沒有像python那麼死板, 必須`def`後面必須跟上函數名. 這也為我們未來做逆向提供了第一個超大的伏筆 ...
  • 在當今快節奏的社會中,技術變化日新月異。作為一名技術博客站長,我深切感受到了學習和傳播知識的重要性。為了更好地滿足讀者的需求,我決定採用VuePress搭建一個功能強大且易於維護的知識庫平臺,名為LearnData。本文將介紹我如何利用VuePress構建LearnData,並展示一些相關的代碼示例... ...
  • ## 直連 直連模式下,選擇一個玩家充當伺服器(房主)。如果游戲出現不同步,那麼均按房主的世界來,玩家1可以作弊修改其游戲來影響其他玩家的世界 針對兩個玩家來說,直連連接質量更好,延遲小 如果玩家數量很多,不同玩家間的通信則需要靠房主為中介,那通信質量與房主主機配置、網路情況有很大關係 ## 專用服 ...
  • 從研發的角度來看如果系統上下文清晰、應用架構設計簡單、應用拆分合理應該稱之為架構合理。基於以上的定義可以從以下三個方面來梳理評估: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...