Keepalived高可用集群部署

来源:https://www.cnblogs.com/lvzb86/archive/2023/01/27/17068701.html
-Advertisement-
Play Games

前言 Proteus 新建工程雖然不難,但對於電子小白來說可能便成了學習路上的絆腳石,本篇我將逐步講解如何在 Proteus 中新建工程。 最新版 Proteus 8.15 最新版 Proteus 8.15 現已發佈,我為此編寫了詳細的圖文安裝教程並配有安裝包,需要安裝的朋友請跳轉進行安裝。 Pro ...


KeepAlived


目錄


KeepAlived安裝

1.yum源安裝

yum install keepalived

2.官網源碼包編譯

KeepAlived官網提供可編譯源碼包,可直接下載。
官網地址:

https://www.keepalived.org/

Keepalived官網

官網提供的軟體包,解壓編譯安裝即可。


KeepAlived部署

高可用實現支持多種集群配置模式:主備模式,主主模式,N+1模式,N+M模式;另外支持資源及節點故障檢測。

準備工作

  1. 硬體準備

要實現KeepAlived的多種模式,因此這裡準備了4台虛擬機進行測試,設備IP分別為:

192.168.25.23
192.168.25.24
192.168.25.25
192.168.25.26
  1. 軟體準備

本次高可用實現以nginx進行效果展示,nginx未進行任何配置,僅修改了對應index.html文件以展示對應情況的高可用實現效果。

  • nginx準備

系統可通過軟體倉庫安裝nginx:
yum install nginx -y

啟動nginx:
nginx

系統預設安裝並啟動了ApacheHttp服務,因此需要關閉httpd服務:
    systemctl stop httpd
    systemctl disable httpd
如果仍舊不能正常訪問nginx主頁,需要添加防火牆規則或關閉防火牆。
此處為方便後續操作且非為測試環境,所以關閉防火牆,如在生產環境,請添加防火牆規則:
    systemctl stop firewalld
    systemctl disable firewalld

分別在各個測試機中啟動nginx後,測試頁面是否正常顯示,如出現以下頁面即為正常:

nginx主頁

為了方便辨別實現效果,此處修改nginx的主頁。

nginx主頁的位置為:
/usr/share/nginx/html/index.html

編輯index.html:
vim /usr/share/nginx/html/index.html

在86行下添加內容:
<h2><strong>The IP is 192.168.25.**</strong></h2>
IP地址根據實際情況進行修改,效果如下:
nginx修改主頁

添加nginx預設啟動:
systemctl enable nginx

至此,nginx準備完畢。

  • keepalivd準備

軟體倉庫安裝keepalived,分別在測試機上執行:
yum install keepalived -y

確認安裝情況,執行腳本:
keepalived -v
輸出內容如下:
keepalived版本

查詢對應的配置文件:
rpm -ql keepalived
相關內容如下:
keepalived相關文件

文件說明:

/etc/keepalived                             -主目錄
/etc/keepalived/keepalived.conf             -配置文件
/etc/sysconfig/keepalived                   -系統配置文件
/usr/lib/systemd/system/keepalived.service  -系統服務
/usr/libexec/keepalived                     -庫目錄
/usr/sbin/keepalived                        -系統命令

Keepalived主要通過修改/etc/keepalived/keepalived.conf配置文件進行配置高可用集群。


主備模式

節點配置

此模式下使用兩台虛擬機和一個虛擬IP進行:
主節點192.168.25.23
備節點192.168.25.24
虛擬IP192.168.25.10

  1. 主節點(192.168.25.23)配置內容:
! Configuration File for keepalived

global_defs {
   router_id PV23
}

vrrp_instance VI_1 {
    state MASTER
    interface enp1s0
    virtual_router_id 86
    priority 200
    unicast_src_ip 192.168.25.23
    unicast_peer {
    192.168.25.24
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }
}
  1. 備節點(192.168.25.24)配置內容:
! Configuration File for keepalived

global_defs {
   router_id PV24
}

vrrp_instance VI_1 {
    state BACKUP
    interface enp1s0
    virtual_router_id 86
    priority 200
    unicast_src_ip 192.168.25.24
    unicast_peer {
    192.168.25.23
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }
}

驗證

正常狀態

  1. 瀏覽器訪問虛擬IP:192.168.25.10
  2. 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論刷新多少次均顯示為主節點提供服務。
    主備正常

故障

  1. 停止主節點keepalived服務,主節點執行;
    systemctl stop keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面實際訪問地址為192.168.25.24,當前由於主節點故障,備用節點啟用,接管VIP流量。
    主備故障

故障恢復

  1. 重新啟動主節點keepalived服務;
    systemctl restart keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面實際訪問地址為192.168.25.23,主節點恢復,接管VIP流量。
    主備恢復

1+N(一主多備)模式

節點配置

此模式下使用三台虛擬機(備用節點)進行:
主節點192.168.25.23
備節點1192.168.25.24
備節點2192.168.25.25
虛擬IP192.168.25.10

  1. 主節點(192.168.25.23)配置內容:
! Configuration File for keepalived

global_defs {
   router_id PV23
}

vrrp_instance VI_1 {
    state MASTER
    interface enp1s0
    virtual_router_id 86
    priority 200
    unicast_src_ip 192.168.25.23
    unicast_peer {
    192.168.25.24
    192.168.25.25
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }
}
  1. 備節點(192.168.25.24)配置內容:
! Configuration File for keepalived

global_defs {
   router_id PV24
}

vrrp_instance VI_1 {
    state BACKUP
    interface enp1s0
    virtual_router_id 86
    priority 100
    unicast_src_ip 192.168.25.24
    unicast_peer {
    192.168.25.23
    192.168.25.25
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }
}
  1. 備節點(192.168.25.25)配置內容:
! Configuration File for keepalived

global_defs {
   router_id PV25
}

vrrp_instance VI_1 {
    state BACKUP
    interface enp1s0
    virtual_router_id 86
    priority 20
    unicast_src_ip 192.168.25.25
    unicast_peer {
    192.168.25.23
    192.168.25.24
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }
}

驗證

正常狀態
  1. 瀏覽器訪問虛擬IP:192.168.25.10
  2. 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論刷新多少次均顯示為主節點提供服務。
    主備正常
故障-1
  1. 停止主節點keepalived服務,主節點執行;
    systemctl stop keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面實際訪問地址為192.168.25.24,當前由於主節點故障,備用節點啟用,由於備用節點1優先順序高於備用節點2,所以備用節點1接管VIP流量。
    主備故障
故障-2
  1. 停止備節點1keepalived服務,備節點1執行;
    systemctl stop keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面實際訪問地址為192.168.25.25,當前由於備節點1故障,備用節點2啟用,所以備用節點2接管VIP流量。
    主備故障
故障恢復-1
  1. 重新啟動主節點keepalived服務;
    systemctl restart keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面實際訪問地址為192.168.25.23,主節點恢復,接管VIP流量。
故障恢復-2
  1. 重新啟動備節點1keepalived服務;
    systemctl restart keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面實際訪問地址為192.168.25.23,當前由於主節點狀態正常,繼續管理VIP流量。

主主(互為主備)模式

此模式下兩台機器兩個虛擬IP,每台機器對應一個虛擬IP的主節點,對應另一個虛擬IP的備節點,兩台機器互為主備。

節點配置

此模式下使用兩台虛擬機進行:
節點1192.168.25.23
節點2192.168.25.24
虛擬IP1192.168.25.10
虛擬IP2192.168.25.20

  1. 節點1配置內容
! Configuration File for keepalived

global_defs {
   router_id PV23
}

vrrp_instance VI_1 {
    state MASTER
    interface enp1s0
    virtual_router_id 86
    priority 200
    unicast_src_ip 192.168.25.23
    unicast_peer {
    192.168.25.24
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }
}


vrrp_instance VI_2 {
    state BACKUP
    interface enp1s0
    virtual_router_id 85
    priority 20
    unicast_src_ip 192.168.25.23
    unicast_peer {
    192.168.25.24
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.20
    }
}

  1. 節點2配置內容
! Configuration File for keepalived

global_defs {
   router_id PV24
}

vrrp_instance VI_1 {
    state BACKUP
    interface enp1s0
    virtual_router_id 86
    priority 100
    unicast_src_ip 192.168.25.24
    unicast_peer {
    192.168.25.23
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface enp1s0
    virtual_router_id 85
    priority 100
    unicast_src_ip 192.168.25.24
    unicast_peer {
    192.168.25.23
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.20
    }
}

驗證

正常狀態
  1. 瀏覽器訪問虛擬IP:192.168.25.10
  2. 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論刷新多少次均顯示為VIP1的主節點-節點1提供服務。
  3. 瀏覽器訪問虛擬IP:192.168.25.20
  4. 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論刷新多少次均顯示為VIP2的主節點-節點2提供服務。
    主主正常
故障-1
  1. 停止節點1keepalived服務,節點1執行;
    systemctl stop keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面顯示實際訪問地址為192.168.25.24,當前由於節點1故障,備用節點啟用,所以作為節點1的備用節點,節點2接管VIP1流量。
  4. 瀏覽器訪問虛擬IP:192.168.25.20
  5. 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論刷新多少次均顯示為VIP2的主節點-節點2提供服務。
    主主異常
故障-1恢復
  1. 恢復節點1keepalived服務,節點1執行;
    systemctl restart keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面顯示實際訪問地址為192.168.25.23,由於節點1已恢復,作為VIP1的主節點-節點1,節點1恢復接管VIP1流量。
  4. 瀏覽器訪問虛擬IP:192.168.25.20
  5. 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論刷新多少次均顯示為VIP2的主節點-節點2提供服務。
    主主正常
故障-2
  1. 停止節點2keepalived服務,節點2執行;
    systemctl stop keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論刷新多少次均顯示為VIP1的主節點-節點1提供服務。
  4. 瀏覽器訪問虛擬IP:192.168.25.20
  5. 頁面顯示實際訪問地址為192.168.25.23,當前由於節點2故障,備用節點啟用,所以作為節點2的備用節點,節點1接管VIP2流量。
    主主異常
故障-2恢復
  1. 恢復節點2keepalived服務,節點1執行;
    systemctl restart keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論刷新多少次均顯示為VIP1的主節點-節點1提供服務。
  4. 瀏覽器訪問虛擬IP:192.168.25.20
  5. 頁面顯示實際訪問地址為192.168.25.24,由於節點2已恢復,作為VIP2的主節點-節點2,節點2恢復接管VIP2流量。
    主主正常

N+1模式

此模式下三台機器兩個虛擬IP,兩台機器各對應一個虛擬IP的主節點,另外一臺機器為兩個虛擬IP的備節點。

節點配置

此模式下使用兩台虛擬機進行:
主節點1192.168.25.23
主節點2192.168.25.24
備節點192.168.25.25
虛擬IP1192.168.25.10
虛擬IP2192.168.25.20

  1. 節點1配置內容
! Configuration File for keepalived

global_defs {
   router_id PV23
}

vrrp_instance VI_1 {
    state MASTER
    interface enp1s0
    virtual_router_id 86
    priority 200
    unicast_src_ip 192.168.25.23
    unicast_peer {
    192.168.25.25
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }
}
  1. 主節點2配置內容
! Configuration File for keepalived

global_defs {
   router_id PV24
}

vrrp_instance VI_2 {
    state MASTER
    interface enp1s0
    virtual_router_id 85
    priority 100
    unicast_src_ip 192.168.25.24
    unicast_peer {
    192.168.25.25
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.20
    }
}
  1. 備節點配置內容
! Configuration File for keepalived

global_defs {
   router_id PV25
}

vrrp_instance VI_1 {
    state BACKUP
    interface enp1s0
    virtual_router_id 86
    priority 100
    unicast_src_ip 192.168.25.25
    unicast_peer {
    192.168.25.23
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface enp1s0
    virtual_router_id 85
    priority 20
    unicast_src_ip 192.168.25.25
    unicast_peer {
    192.168.25.24
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.20
    }
}

驗證

正常狀態
  1. 瀏覽器訪問虛擬IP:192.168.25.10
  2. 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論刷新多少次均顯示為VIP1的主節點-節點1提供服務。
  3. 瀏覽器訪問虛擬IP:192.168.25.20
  4. 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論刷新多少次均顯示為VIP2的主節點-節點2提供服務。
    主主正常
故障-1
  1. 停止主節點1keepalived服務,主節點1執行;
    systemctl stop keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面顯示實際訪問地址為192.168.25.25,當前由於主節點1故障,備用節點啟用,所以作為節點1的備用節點,備節點接管VIP1流量。
  4. 瀏覽器訪問虛擬IP:192.168.25.20
  5. 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論刷新多少次均顯示為VIP2的主節點-節點2提供服務。
    主主異常
故障-1恢復
  1. 恢復主節點1keepalived服務,主節點1執行;
    systemctl restart keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面顯示實際訪問地址為192.168.25.23,由於節點1已恢復,作為VIP1的主節點-主節點1,主節點1重新接管VIP1流量。
  4. 瀏覽器訪問虛擬IP:192.168.25.20
  5. 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論刷新多少次均顯示為VIP2的主節點-主節點2提供服務。
    主主正常
故障-2
  1. 停止主節點2keepalived服務,主節點2執行;
    systemctl stop keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論刷新多少次均顯示為VIP1的主節點-主節點1提供服務。
  4. 瀏覽器訪問虛擬IP:192.168.25.20
  5. 頁面顯示實際訪問地址為192.168.25.25,當前由於主節點2故障,備用節點啟用,所以作為主節點2的備用節點,備節點接管VIP2流量。
    主主異常
故障-2恢復
  1. 恢復節點2keepalived服務,節點1執行;
    systemctl restart keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論刷新多少次均顯示為VIP1的主節點-節點1提供服務。
  4. 瀏覽器訪問虛擬IP:192.168.25.20
  5. 頁面顯示實際訪問地址為192.168.25.24,由於主節點2已恢復,作為VIP2的主節點-主節點2,主節點2恢復接管VIP2流量。
    主主正常
故障-3
  1. 停止主節點1keepalived服務,主節點1執行;
    systemctl stop keepalived
  2. 停止主節點2keepalived服務,主節點2執行;
    systemctl stop keepalived
  3. 瀏覽器訪問虛擬IP:192.168.25.10
  4. 頁面顯示實際訪問地址為192.168.25.25,當前由於主節點1故障,備用節點啟用,所以作為節點1的備用節點,備節點接管VIP1流量。
  5. 瀏覽器訪問虛擬IP:192.168.25.20
  6. 頁面顯示實際訪問地址為192.168.25.25,當前由於主節點2故障,備用節點啟用,所以作為主節點2的備用節點,備節點接管VIP2流量。
    主主異常
故障-3恢復
  1. 恢復主節點1keepalived服務,主節點1執行;
    systemctl restart keepalived
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面顯示實際訪問地址為192.168.25.23,由於節點1已恢復,作為VIP1的主節點-主節點1,主節點1重新接管VIP1流量。
  4. 恢復節點2keepalived服務,節點1執行;
    systemctl restart keepalived
  5. 瀏覽器訪問虛擬IP:192.168.25.20
  6. 頁面顯示實際訪問地址為192.168.25.24,由於主節點2已恢復,作為VIP2的主節點-主節點2,主節點2恢復接管VIP2流量。
    主主正常

N+M模式

N+M模式的配置參考N+1模式,複製備節點即可

資源故障檢測

說明

Keepalived通過在配置文件中添加script來實現對服務狀態的檢測和故障切換

在global配置段外定義腳本或者shell命令,然後再virtual_server配置段中調用腳本,最後根據腳本的執行結果(成功或失敗) 來增加或減少當前的節點的優先順序,因為keepalived是根據優先順序來判斷是否為主節點 所以當優先順序低時則就成為備份節點 從而將VIP飄動到優先順序高的主節點上 實現了對其他服務的高可用

script配置及調用說明:

vrrp_script chk_nginx {                 # chk_nginx為自定義的vrrp腳本名稱 後續調用需要此名稱
       script "killall -0 sshd"         # 執行的腳本或命令
       interval 2                       # 監測的時間間隔 單位:秒 預設:1秒
       weight -4                        # 此值預設為0 範圍:-253~253 ,
        # 如果此值為負數 則代表當上面的腳本或命令執行失敗時($?結果為非0) 則將本節點的優先順序減去定義的值;
        # 如果此值為正數 則代表當上面的腳本或命令執行成功時($?結果為0) 則將本節點的優先順序加上定義的值
       fall 2                           # 腳本或命令執行幾次失敗後 將本節點標記為失敗(進而進行減優先順序操作)
       rise 2                           # 腳本或命令執行幾次成功後 將本節點標記為成功(進而恢復節點)
       user USERNAME                    # 以什麼用戶身份執行腳本
}

vrrp_instance VI_1 {
...
    track_script {
       script_name
    }
}

節點配置

本次使用兩台虛擬機和一個虛擬IP進行配置:
主節點192.168.25.23
備節點192.168.25.24
虛擬IP192.168.25.10

  1. 主節點配置內容:
! Configuration File for keepalived

global_defs {
   router_id PV23
}

vrrp_script check_nginx {
       script "/etc/keepalived/check_nginx.sh"
       interval 2
       weight -30
       fall 2
       rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface enp1s0
    virtual_router_id 86
    priority 100
    unicast_src_ip 192.168.25.23
    unicast_peer {
    192.168.25.24
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }

        track_script {
                check_nginx
    }
}
  1. 備節點配置內容:
! Configuration File for keepalived

global_defs {
   router_id PV24
}

vrrp_script check_nginx {
       script "/etc/keepalived/check_nginx.sh"
       interval 2
       weight -30
       fall 2
       rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface enp1s0
    virtual_router_id 86
    priority 80
    unicast_src_ip 192.168.25.24
    unicast_peer {
    192.168.25.23
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.10
    }

        track_script {
                check_nginx
    }

}
  1. 配置檢測腳本

分別在主節點和備節點編輯腳本,編輯:
vim /etc/keepalived/check_nginx.sh
腳本內容為:\

#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
#    nginx          # 此處為展示效果,在nginx出現故障後,註釋不重啟nginx。
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

為腳本添加執行許可權:
chmod +x /etc/keepalived/check_nginx.sh

驗證

正常狀態
  1. 瀏覽器訪問虛擬IP:192.168.25.10
  2. 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論刷新多少次均顯示為主節點提供服務。
    主備正常
nginx服務故障
  1. 停止主節點nginx服務,主節點執行;
    killall nginx
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面實際訪問地址為192.168.25.24,當前由於主節點資源故障,權重-30,優先順序低於備用節點,備用節點啟用,接管VIP流量。
    主備故障
nginx服務恢復

故障恢復

  1. 重新啟動主節點nginx服務;
    nginx
  2. 瀏覽器訪問虛擬IP:192.168.25.10
  3. 頁面實際訪問地址為192.168.25.23,主節點nginx恢復,權重恢復,優先順序高於備用節點,重新接管VIP流量。
    主備恢復

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

-Advertisement-
Play Games
更多相關文章
  • 簡介: 中介者模式,屬於行為型的設計模式。用一個中介對象來封裝一系列的對象交互。中介者是各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的交互。 適用場景: 如果平行對象間的依賴複雜,可以使用中介者解耦。 優點: 符合迪米特法則,減少成員間的依賴。 缺點: 不適用於系統出現對 ...
  • 這篇文章主要描述RPC的路由策略,包括為什麼需要請求隔離,為什麼不在註冊中心中實現請求隔離以及不同粒度的路由策略。 ...
  • 這道題只要會自定義cmp恰當地進行排序,其他部分沒有什麼大問題。 上代碼: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,s,h1,h2,cnt; 4 struct apple{ 5 int height,ns;//height為蘋 ...
  • 隨著技術的進步,跨平臺開發已經成為了標配,在此大背景下,ASP.NET Core也應運而生。本文主要基於ASP.NET Core+Element+Sql Server開發一個校園圖書管理系統為例,簡述基於MVC三層架構開發的常見知識點,前一篇文章,已經簡單介紹瞭如何搭建開發框架,和登錄功能實現,本篇... ...
  • 1.部署歷史 猿友們好,作為初來實習的我,已經遭受社會的“毒打”,所以請容許我在下麵環節適當吐槽,3Q! 傳統部署 ​ 回顧以往在伺服器部署webapi項目(非獨立發佈),dotnet環境、守護進程兩個逃都逃不掉,正常情況下還得來個nginx代理。不僅僅這仨,可能牽扯到yum或npm。node等都要 ...
  • 一、導入光碟機 二、安裝可選的windows組件 三、雙擊打開網路服務,安裝DHCP/DNS伺服器。 註:伺服器地址要固定,因此安裝時要規劃好網路。 四、ip地址範圍規劃時要預留i出一些p地址。排除ip地址範圍可以在範圍內單獨留出來。預設網關是固定的,不可以亂配。 五、這裡的ip地址也是固定的,要去看 ...
  • 這兩天心血來潮想要裝個WSA(安卓windows子系統),原來一直用的安卓模擬器(mumu啊藍疊啊逍遙啊),但感覺像wsa這種安卓系統與主系統融合的模式更帶感,於是開始了我艱苦的安裝(瞎捯飭)之路 我也是真慘,別人安裝失敗都是一兩個原因,我安裝失敗倒是把幾乎所有失敗原因都搭上了。 因為我年少輕狂,當 ...
  • windows2003 的安裝以及安裝時遇到的問題簡介:Windows Server 2003是微軟於2003年3月28日發佈的基於Windows XP/NT5.1開發的伺服器操作系統,併在同年4月底上市。Windows Server 2003的官方支持即已在2015年7月14日結束,Windows ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...