部署prometheus、grafana、alertmanager

来源:https://www.cnblogs.com/heiguu/archive/2023/04/19/17332545.html
-Advertisement-
Play Games

簡介:由於資源有限,本實驗用了兩台機器 監控端:部署prometheus、grafana、alertmanager 被監控端:node_exporter、mysqld_exporter 一. 部署promethus 1. 下載 https://prometheus.io/download/ 2. 解 ...


簡介:由於資源有限,本實驗用了兩台機器

  1. 監控端:部署prometheus、grafana、alertmanager
  2. 被監控端:node_exporter、mysqld_exporter

一. 部署promethus

1. 下載

https://prometheus.io/download/

2. 解壓

​ mkdir -p /data/prometheus

​ tar -zxvf /root/prometheus-2.42.0.linux-amd64.tar.gz -C /data/

​ cd /data

​ mv prometheus-2.42.0.linux-amd64/ prometheus

3. 部署

  • 創建prometheus用戶

​ useradd -s /sbin/nologin -M prometheus

​ mkdir -p /data/database/prometheus

​ chown -R prometheus:prometheus /data/database/prometheus/

  • 配置systemctl啟動項

​ vim /etc/systemd/system/prometheus.service

[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/data/prometheus/prometheus --web.enable-lifecycle --config.file=/data/prometheus/prometheus.yml --storage.tsdb.path=/data/database/prometheus
Restart=on-failure
[Install]
WantedBy=multi-user.target

4. 載入配置&啟動服務

​ systemctl daemon-reload

​ systemctl start prometheus

​ systemctl status prometheus

​ systemctl enable prometheus

  • 訪問web頁面,IP:9090

  • 查看到監控的數據,IP:9090/metrics

二. 監控linux主機

1. 下載node_exporter

​ wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz

2.解壓

​ tar -zxvf node_exporter-1.5.0.linux-amd64.tar.gz -C /data/

​ mv /data/node_exporter-1.5.0.linux-amd64/ /data/node_exporter

3. 配置systemctl啟動項

​ vim /etc/systemd/system/node_exporter.service

[Unit]
Description=node_exporter
[Service]
ExecStart=/data/source.package/node_exporter-1.1.2.linux-amd64/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

4. 載入配置&啟動服務

​ systemctl daemon-reload

​ systemctl start node_exporter.service

​ systemctl status node_exporter.service

​ systemctl enable node_exporter.service

  • 查看到被監控的數據,IP:9100/metrics

5. 監控端配置

  • 在主配置文件最後加上下麵三行

    vim /data/prometheus/prometheus.yml

- job_name: 'agent1' #取一個job名稱來代表被監控的機器
    static_configs:
    - targets: ['192.168.1.1:9100'] # 這裡改成被監控機器的IP,後面埠接9100
  • 測試prometheus.yaml文件有無報錯
[root@VM-16-2-centos prometheus]# ./promtool check config prometheus.yml
Checking prometheus.yml
 SUCCESS: prometheus.yml is valid prometheus config file syntax

6. 重新載入prometheus配置文件

  • curl -X POST http://127.0.0.1:9090/-/reload,打開prometheus頁面輸入up查看是不是有對應的數據了

    image-20230227154628548

  • 回到web管理界面 ——>點——>點Targets ——>可以看到多了一臺監控目標

三. 監控mysql

1. 下載mysqld_exporter

​ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-amd64.tar.gz2

2. 解壓

​ tar -zxvf mysqld_exporter-0.14.0.linux-amd64.tar.gz -C /data/

​ mv /data/mysqld_exporter-0.14.0.linux-amd64/ /data/mysqld_exporter

[root@VM-12-2-centos ~]# ls /data/mysqld_exporter/
LICENSE  mysqld_exporter  NOTICE

3. 安裝mariadb資料庫,並授權

​ yum -y install mariadb-server -y

​ systemctl start mariadb

[root@VM-12-2-centos ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
MariaDB [(none)]> grant select,replication client,process ON *.* to 'mysql_monito'@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]>
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]>
MariaDB [(none)]> exit
Bye

4. 啟動

​ nohup /usr/local/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter/.my.cnf &

5. 監控端配置

​ vim /data/prometheus/prometheus.yml

  - job_name: 'mysql' #取一個job名稱來代表被監控的機器
    static_configs:
      - targets: ['192.168.1.1:9104'] # 這裡改成被監控機器的IP,後面埠接9104

6. 重啟prometheus

​ systemctl restart prometheus

  • 回到web管理界面 ——>點——>點Targets ——>可以看到多了一臺監控目標

image-20230227154816415

四. 部署grafana

1. 下載

​ wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.3.6.linux-amd64.tar.gz

2. 解壓

​ tar -zxvf grafana-enterprise-9.3.6.linux-amd64.tar.gz -C /data

​ mv grafana-9.3.6/ grafana

3. 修改初始化文件

  • 備份

​ cp /data/grafana/conf/defaults.ini /data/grafana/conf/defaults.ini.bak

  • 修改

​ vim /data/grafana/conf/defaults.ini

data = /data/database/grafana/data
logs = /data/database/grafana/log
plugins = /data/database/grafana/plugins
provisioning = /data/grafana/conf/provisioning/

4. 配置systemctl啟動項

​ vim /etc/systemd/system/grafana-server.service

[Unit]
Description=Grafana
After=network.target
[Service]
User=grafana
Group=grafana
Type=notify
ExecStart=/data/grafana/bin/grafana-server -homepath /data/grafana/
Restart=on-failure
[Install]
WantedBy=multi-user.target

5. 載入配置&啟動服務

systemctl daemon-reload

systemctl start grafana-server.service

systemctl status grafana-server.service

systemctl enable grafana-server.service

  • web頁面:ip+3000

    • 預設賬號密碼都是admin admin,登陸時需要修改密碼。

image-20230224141714202

6. 配置grafana

  • 添加prometheus監控數據及模板,將grafana和prometheus關聯起來,也就是在grafana中添加添加數據源

image-20230224141938640

  • 點擊:左邊欄Dashboards“+”號內import->輸入“8919”->load->更改name為“Prometheus Node”->victoriaMetrics選擇剛創建的數據源“prometheus”

    image-20230227143329410

  • 設置完成後,點擊"Dashboards",->"victoriaMetrics"->"Prometheus Node"

    image-20230227155129483

五、部署alertmanager

1. 下載

​ https://prometheus.io/download/

2. 解壓

​ tar -zxvf alertmanager-0.25.0.linux-amd64.tar.gz -C /data/

​ cd /data

​ mv alertmanager-0.25.0.linux-amd64/ alertmanager

​ chown -R prometheus:prometheus /data/alertmanager

​ mkdir -p /data/alertmanager/data

3. 配置報警系統altermanger服務

vim /data/alertmanager/alertmanager.yml(最初配置)

global:
  resolve_timeout: 5m
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

4. 配置systemctl啟動項

​ vim /etc/systemd/system/alertmanager.service

[Unit]
Description=Alertmanager
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/data/alertmanager/alertmanager --config.file=/data/alertmanager/alertmanager.yml --storage.path=/data/alertmanager/data
Restart=on-failure
[Install]
WantedBy=multi-user.target

5. 載入配置&啟動服務

​ systemctl daemon-reload

​ systemctl start alertmanager.service

​ systemctl status alertmanager.service

​ systemctl enable alertmanager.service

6. 配置promethues.yaml

  • 備份

​ cp /data/prometheus/prometheus.yml /data/prometheus/prometheus.yml.bak

  • 編輯

​ vim /data/prometheus/prometheus.yml (job_name中有幾台監控的機器就寫幾行)

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - 192.168.1.1:9093

rule_files:
  - "/data/database/prometheus/rules/*.rules"

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['192.168.1.1:9090']


  - job_name: 'node'
    static_configs:
    - targets: ['192.168.1.2:9100']
    - targets: ['192.168.1.3:9100']
    - targets: ['192.168.1.4:9100']
  • 測試prometheus.yaml文件有無報錯(可以檢測出rules文件有無報錯)

​ cd /data/prometheus

​ ./promtool check config prometheus.yml

[root@VM-16-2-centos prometheus]# ./promtool check config prometheus.yml
Checking prometheus.yml
  SUCCESS: 1 rule files found
 SUCCESS: prometheus.yml is valid prometheus config file syntax

Checking /data/database/prometheus/rules/node.rules
  SUCCESS: 21 rules found

7. 創建prometheus的規則文件

​ mkdir /data/database/prometheus/rules

​ vim /data/database/prometheus/rules/node.rules

groups:
  - name: Node-rules
    rules:
    - alert: Node-Down
      expr: up{job="node1"} == 0
      for: 1m
      labels:
        severity: 嚴重警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{$labels.instance }} 節點已經宕機 1分鐘"
        description: "節點宕機"

    - alert: Node-CpuHigh
      expr: (1 - avg by (instance) (irate(node_cpu_seconds_total{job="node",mode="idle"}[5m]))) * 100 > 80
      for: 1m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} cpu使用率超 80%"
        description: "CPU 使用率為 {{ $value }}%"

    - alert: Node-CpuIowaitHigh
      expr: avg by (instance) (irate(node_cpu_seconds_total{job="node",mode="iowait"}[5m])) * 100 > 80
      for: 1m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} CPU iowait 使用率超過 80%"
        description: "CPU iowait 使用率為 {{ $value }}%"

    - alert: Node-MemoryHigh
      expr: (1 - node_memory_MemAvailable_bytes{job="node"} / node_memory_MemTotal_bytes{job="node"}) * 100 > 80
      for: 1m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Memory使用率超過 80%"
        description: "Memory 使用率為 {{ $value }}%"

    - alert: Node-Load5High
      expr: node_load5 > (count by (instance) (node_cpu_seconds_total{job="node",mode='system'})) * 1.2
      for: 1m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Load(5m)過高,超出cpu核數1.2倍"
        description: "Load(5m)過高,超出cpu核數 1.2倍"

    - alert: Node-DiskRootHigh
      expr: (1 - node_filesystem_avail_bytes{job="node",fstype=~"ext.*|xfs",mountpoint ="/"} / node_filesystem_size_bytes{job="node",fstype=~"ext.*|xfs",mountpoint ="/"}) * 100 > 80
      for: 10m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Disk(/ 分區) 使用率超過 80%"
        description: "Disk(/ 分區) 使用率為 {{ $value }}%"

    - alert: Node-DiskDataHigh
      expr: (1 - node_filesystem_avail_bytes{job="node",fstype=~"ext.*|xfs",mountpoint ="/data"} / node_filesystem_size_bytes{job="node",fstype=~"ext.*|xfs",mountpoint ="/data"}) * 100 > 80
      for: 10m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Disk(/data 分區) 使用率超過 80%"
        description: "Disk(/data 分區) 使用率為 {{ $value }}%"

    - alert: Node-DiskReadHigh
      expr: irate(node_disk_read_bytes_total{job="node"}[5m]) > 20 * (1024 ^ 2)
      for: 1m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Disk 讀取位元組數速率超過 20 MB/s"
        description: "Disk 讀取位元組數速率為 {{ $value }}MB/s"

    - alert: Node-DiskWriteHigh
      expr: irate(node_disk_written_bytes_total{job="node"}[5m]) > 20 * (1024 ^ 2)
      for: 1m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Disk 寫入位元組數速率超過 20 MB/s"
        description: "Disk 寫入位元組數速率為 {{ $value }}MB/s"

    - alert: Node-DiskReadRateCountHigh
      expr: irate(node_disk_reads_completed_total{job="node"}[5m]) > 3000
      for: 1m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Disk iops 每秒讀取速率超過 3000 iops"
        description: "Disk iops 每秒讀取速率為 {{ $value }}"

    - alert: Node-DiskWriteRateCountHigh
      expr: irate(node_disk_writes_completed_total{job="node"}[5m]) > 3000
      for: 1m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Disk iops 每秒寫入速率超過 3000 iops"
        description: "Disk iops 每秒寫入速率為 {{ $value }}"

    - alert: Node-InodeRootUsedPercentHigh
      expr: (1 - node_filesystem_files_free{job="node",fstype=~"ext4|xfs",mountpoint="/"} / node_filesystem_files{job="node",fstype=~"ext4|xfs",mountpoint="/"}) * 100 > 80
      for: 10m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Disk (/ 分區) inode 使用率超過 80%"
        description: "Disk (/ 分區) inode 使用率為 {{ $value }}%"

    - alert: Node-InodeBootUsedPercentHigh
      expr: (1 - node_filesystem_files_free{job="node",fstype=~"ext4|xfs",mountpoint="/data"} / node_filesystem_files{job="node",fstype=~"ext4|xfs",mountpoint="/data"}) * 100 > 80
      for: 10m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Disk (/data 分區) inode 使用率超過 80%"
        description: "Disk (/data 分區) inode 使用率為 {{ $value }}%"

    - alert: Node-FilefdAllocatedPercentHigh
      expr: node_filefd_allocated{job="node"} / node_filefd_maximum{job="node"} * 100 > 80
      for: 10m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Filefd 打開百分比超過 80%"
        description: "Filefd 打開百分比為 {{ $value }}%"

    - alert: Node-NetworkNetinBitRateHigh
      expr: avg by (instance) (irate(node_network_receive_bytes_total{device=~"eth0|eth1|ens33|ens37"}[1m]) * 8) > 20 * (1024 ^ 2) * 8
      for: 3m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Network 接收比特數速率超過 20MB/s"
        description: "Network 接收比特數速率為 {{ $value }}MB/s"

    - alert: Node-NetworkNetoutBitRateHigh
      expr: avg by (instance) (irate(node_network_transmit_bytes_total{device=~"eth0|eth1|ens33|ens37"}[1m]) * 8) > 20 * (1024 ^ 2) * 8
      for: 3m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Network 接收比特數速率超過 20MB/s"
        description: "Network 發送比特數速率為 {{ $value }}MB/s"

    - alert: Node-NetworkNetinPacketErrorRateHigh
      expr: avg by (instance) (irate(node_network_receive_errs_total{device=~"eth0|eth1|ens33|ens37"}[1m])) > 15
      for: 3m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Network 接收錯誤包速率超過 15個/秒"
        description: "Network 接收錯誤包速率為 {{ $value }}個/秒"

    - alert: Node-NetworkNetoutPacketErrorRateHigh
      expr: avg by (instance) (irate(node_network_transmit_packets_total{device=~"eth0|eth1|ens33|ens37"}[1m])) > 15
      for: 3m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Network 發送錯誤包速率超過 15個/秒"
        description: "Network 發送錯誤包速率為 {{ $value }}個/秒"

    - alert: Node-ProcessBlockedHigh
      expr: node_procs_blocked{job="node"} > 10
      for: 10m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} Process 當前被阻塞的任務的數量超過 10個"
        description: "Process 當前被阻塞的任務的數量為 {{ $value }}個"

    - alert: Node-TimeOffsetHigh
      expr: abs(node_timex_offset_seconds{job="node"}) > 3 * 60
      for: 2m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} 節點的時間偏差超過 3m"
        description: "節點的時間偏差為 {{ $value }}m"

    - alert: Node-TCPconnection
      expr: node_sockstat_TCP_tw{job="node"} > 15000
      for: 2m
      labels:
        severity: 警告
        instance: "{{ $labels.instance }}"
      annotations:
        summary: "{{ $labels.instance }} TCP 等待關閉的TCP連接數TIME_WAIT過高大於15000"
        description: "TCP 等待關閉的TCP連接數為 {{ $value }}"
8. 配置alertmanager郵件報警

​ vim /data/alertmanager/alertmanager.yml

# 全局配置項
global:
  resolve_timeout: 5m #處理超時時間,預設為5min
  smtp_smarthost: 'smtp.qq.com:465' #郵箱smtp伺服器代理
  smtp_from: '[email protected]' #發送郵箱名稱
  smtp_auth_username: '[email protected]' #郵箱名稱
  smtp_auth_password: 'asdklfjwiehrqc' #郵箱授權碼
  smtp_require_tls: false
  smtp_hello: 'qq.com'

# 定義報警模板
templates:
  - '/data/alertmanager/email.tmpl'

# 定義路由樹信息
route:
  group_by: ['alertname'] #報警分組依據
  group_wait: 10s #最初即第一次等待多久時間發送一組警報的通知
  group_interval: 10s #在發送新警報前的等待時間
  repeat_interval: 10m #發送重覆警報的周期 對於email配置中,此項不可以設置過低,否則將會由於郵件發送太多頻繁,被smtp伺服器拒絕
  receiver: 'email' #發送警報的接收者的名稱,以下receivers name的名稱
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 教程簡介 PHP語法吸收了C語言、Java和Perl的特點,易於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程式嵌入到HTML(標準 ...
  • 教程簡介 EJB入門教程 - 從簡單的步驟瞭解EJB 3.0和3.1(Enterprise Java Bean)框架,從基本概念到高級概念,包括概述,環境設置,應用伺服器,容器,企業Bean,註釋,會話,無狀態會話,有狀態會話,消息驅動,實體Bean,持久性,遠程介面,查找,生命周期,介面,攔截器, ...
  • Python動態伺服器網頁(需要使用WSGI介面),基本實現步驟如下: 1.等待客戶端的鏈接,伺服器會收到一個http協議的請求數據報 2.利用正則表達式對這個請求數據報進行解析(請求方式、提取出文件的環境) 3.提取出文件的環境之後,利用截斷取片的方法將文件名轉化為模塊名稱 4.使用m = __i ...
  • 背景 最近小編接到一個獲取網站請求數據的需求,要求抓取網站某個頁面請求的數據。我使用Google Chrome瀏覽器查看了一下請求鏈接的傳入參數,發現需要傳入一個Token值才能獲取數據。於是我在Chrome中登錄後,通過Postman請求成功,並將Token存儲到了Cookie中。然而問題又來了, ...
  • 一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供後來者少踩坑吧。 二:WinDbg 分析 1. 為什麼會卡死 因為是窗體程式,理所當然就是看主線程此時正在做什麼? 可以用 ~0s ; k 看一下便知。 0:000> k # ...
  • 在運行 Linux 系統的過程中為了讓電腦或者伺服器以最佳水平運行,常常需要監控記憶體統計信息。今天我們就來看看都有那些方法可以查看記憶體信息。 ...
  • 報錯如下 [root@centos bin]# ./redis-server ./redis-server: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such fi ...
  • VMware17安裝Windows10詳細記錄 1. 前置準備 VMware軟體,這裡用的VMware17 Windows系統鏡像文件(.iso文件) Windows系統官方下載地址:Windows系統官方下載 I Tell You舊版站點:MSDN, 我告訴你 - 做一個安靜的工具站 (itell ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...