主頁 > 軟體設計 > LVS的DR、NAT模式實作http負載均衡

LVS的DR、NAT模式實作http負載均衡

2021-10-16 08:37:40 軟體設計

文章目錄

  • 一、lvs的三種模式及其原理
    • 1.1 LVS簡介
    • 1.2 三種LVS作業模式詳細
      • NAT
      • DR
      • TUN
  • 二、實體
    • DR模式
    • NAT模式

一、lvs的三種模式及其原理

1.1 LVS簡介

LVS(linux virtual server)是linux虛擬服務器,目前LVS模塊已經被集成在linux內核中了,該專案在linux內核中實作了基于ip的資料請求負載均衡調度方案,終端互聯網用戶從外部訪問公司的外部負載均衡服務器,終端用戶的web請求會發送給LVS調度器,調度器根據自己欲設演算法將該請求發送給后端的某臺web服務器,比如輪詢調度法,一共有8中調度方法,LVS作業模式可以分為NAT模式、TUN模式和DR模式,

1.2 三種LVS作業模式詳細

NAT

在這里插入圖片描述

實作原理程序

① 用戶請求資料包經過層層網路,到達 lvs 網卡,此時資料包源 IP 是 CIP,目的 IP 是 VIP,

② 經過網卡進入網路層 prerouting 位置,根據目的 IP 查找路由,確認是本機 IP,將資料包轉發到 INPUT 上,此時源、目的 IP 都未發生變化,

③ 到達 lvs 后,通過目的 IP 和目的 port 查找是否為 IPVS 服務,若是 IPVS 服務,則會選擇一個 RS 作為后端服務器,將資料包目的 IP 修改為 RIP,并以 RIP 為目的 IP 查找路由資訊,確定下一跳和出口資訊,將資料包轉發至 output 上,

④ 修改后的資料包經過 postrouting 和鏈路層處理后,到達 RS 服務器,此時的資料包源 IP 是 CIP,目的 IP 是 RIP,

⑤ 到達 RS 服務器的資料包經過鏈路層和網路層檢查后,被送往用戶空間 nginx 程式,nginx 程式處理完畢,發送回應資料包,由于 RS 上默認網關配置為 lvs 設備 IP,所以 nginx 服務器會將資料包轉發至下一跳,也就是 lvs 服務器,此時資料包源 IP 是 RIP,目的 IP 是 CIP,

⑥ lvs 服務器收到 RS 回應資料包后,根據路由查找,發現目的 IP 不是本機 IP,且 lvs 服務器開啟了轉發模式,所以將資料包轉發給 forward 鏈,此時資料包未作修改,

⑦ lvs 收到回應資料包后,根據目的 IP 和目的 port 查找服務和連接表,將源 IP 改為 VIP,通過路由查找,確定下一跳和出口資訊,將資料包發送至網關,經過復雜的網路到達用戶客戶端,最終完成了一次請求和回應的互動,

NAT 模式雙向流量都經過 LVS,因此 NAT 模式性能會存在一定的瓶頸,不過與其它模式區別的是,NAT 支持埠映射,且支持 windows 作業系統,

DR

在這里插入圖片描述
其實 DR 是最常用的作業模式,因為它的強大的性能,下邊以一次請求和回應資料流的程序來描述 DR 模式的具體原理,

實作原理程序

① 當客戶端請求 www.sina.com.cn 主頁,經過 DNS 決議到 IP 后,向新浪服務器發送請求資料,資料包經過層層網路到達新浪負載均衡 LVS 服務器,到達 LVS 網卡時的資料包:源 IP 是客戶端 IP 地址 CIP,目的 IP 是新浪對外的服務器 IP 地址,也就是 VIP;此時源 MAC 地址是 CMAC,其實是 LVS 連接的路由器的 MAC 地址(為了容易理解記為 CMAC),目標 MAC 地址是 VIP 對應的 MAC,記為 VMAC,

② 資料包到達網卡后,經過鏈路層到達 PREROUTING 位置(剛進入網路層),查找路由發現目的 IP 是 LVS 的 VIP,就會遞送到 INPUT 鏈上,此時資料包 MAC、IP、Port 都沒有修改,

③ 資料包到達 INPUT 鏈,INPUT 是 LVS 主要作業的位置,此時 LVS 會根據目的 IP 和 Port 來確認是否是 LVS 定義的服務,如果是定義過的 VIP 服務,就會根據配置的 Service 資訊,從 RealServer 中選擇一個作為后端服務器 RS1,然后以 RS1 作為目標查找 Out 方向的路由,確定一下跳資訊以及資料包要通過哪個網卡發出,最后將資料包通過 INET_HOOK 到 OUTPUT 鏈上(Out 方向剛從四層進入網路層),

④ 資料包通過 POSTROUTING 鏈后,從網路層轉到鏈路層,將目的 MAC 地址修改為 RealServer 服務器 MAC 地址,記為 RMAC;而源 MAC 地址修改為 LVS 與 RS 同網段的 selfIP 對應的 MAC 地址,記為 DMAC,此時,資料包通過交換機轉發給了 RealServer 服務器(注:為了簡單圖中沒有畫交換機),

⑤ 請求資料包到達 RealServer 服務器后,鏈路層檢查目的 MAC 是自己網卡地址,到了網路層,查找路由,目的 IP 是 VIP(lo 上配置了 VIP),判定是本地主機的資料包,經過協議堆疊后拷貝至應用程式(比如這里是 nginx 服務器),nginx 回應請求后,產生回應資料包,以目的 VIP 為 dst 查找 Out 路由,確定嚇一跳資訊和發送網卡設備資訊,發送資料包,此時資料包源、目的 IP 分別是 VIP、CIP,而源 MAC 地址是 RS1 的 RMAC,目的 MAC 是下一跳(路由器)的 MAC 地址,記為 CMAC(為了容易理解,記為 CMAC),然后資料包通過 RS 相連的路由器轉發給真正客戶端,

從整個程序可以看出,DR 模式 LVS 邏輯非常簡單,資料包通過路由方式直接轉發給 RS,而且回應資料包是由 RS 服務器直接發送給客戶端,不經過 LVS,我們知道一般請求資料包會比較小,回應報文較大,經過 LVS 的資料包基本上都是小包,上述幾條因素是 LVS 的 DR 模式性能強大的主要原因,

TUN

在這里插入圖片描述
實作原理與程序

① 用戶請求資料包經過多層網路,到達 lvs 網卡,此時資料包源 IP 是 cip,目的 ip 是 vip,

② 經過網卡進入網路層 prerouting 位置,根據目的 ip 查找路由,確認是本機 ip,將資料包轉發到 input 鏈上,到達 lvs,此時源、目的 ip 都未發生變化,

③ 到達 lvs 后,通過目的 ip 和目的 port 查找是否為 IPVS 服務,若是 IPVS 服務,則會選擇一個 rs 作為后端服務器,以 rip 為目的 ip 查找路由資訊,確定下一跳、dev 等資訊,然后 IP 頭部前邊額外增加了一個 IP 頭(以 dip 為源,rip 為目的 ip),將資料包轉發至 output 上,

④ 資料包根據路由資訊經最終經過 lvs 網卡,發送至路由器網關,通過網路到達后端服務器,

⑤ 后端服務器收到資料包后,ipip 模塊將 Tunnel 頭部卸載,正常看到的源 ip 是 cip,目的 ip 是 vip,由于在 tunl0 上配置 vip,路由查找后判定為本機 ip,送往應用程式,應用程式 nginx 正常回應資料后以 vip 為源 ip,cip 為目的 ip 資料包發送出網卡,最終到達客戶端,

Tunnel 模式具備 DR 模式的高性能,又支持跨機房訪問,聽起來比較完美了,

二、實體

// 在調度器主機上面過濾ipvs
[root@DR ~]# grep -iA 2 'ipvs' /boot/config-4.18.0-193.el8.x86_64
CONFIG_NETFILTER_XT_MATCH_IPVS=m
# CONFIG_NETFILTER_XT_MATCH_L2TP is not set
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
--
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
--
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
--
# IPVS SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8
--
# IPVS MH scheduler
#
CONFIG_IP_VS_MH_TAB_INDEX=12
--
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
有ipvs,證明支持lvs

環境說明:

主機名DipVip職責
DR192.168.91.132192.168.58.200調度器
RS1192.168.91.133服務器(RS)
RS2192.168.91.135服務器(RS)

DR模式

準備作業:

DR

//關閉防火墻和selinux
[root@DR ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@DR ~]# vi /etc/selinux/config 
SELINUX=disabled

[root@DR ~]# setenforce 0
[root@DR ~]# reboot

//添加一個臨時網卡作為"Vip"
[root@DR ~]# ip addr add 192.168.91.200/24 dev ens160
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:cd:a4:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.132/24 brd 192.168.91.255 scope global dynamic noprefixroute ens160
       valid_lft 1572sec preferred_lft 1572sec
    inet 192.168.91.200/24 scope global secondary ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::f1de:a72e:4bf:9503/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

//下載ipvsadm
[root@DR ~]# yum -y install ipvsadm
RS1

// 關閉防火墻和selinux
[root@RS1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS1 ~]# vi /etc/selinux/config 
SELINUX=disabled
[root@RS1 ~]# reboot

// 下載httpd服務,添加網頁內容
[root@RS1 ~]# yum -y install httpd
[root@RS1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS1 ~]# ss -antl
State  Recv-Q Send-Q Local Address:Port   Peer Address:Port Process                                                     
LISTEN 0      128          0.0.0.0:22          0.0.0.0:*                                                                
LISTEN 0      128                *:80                *:*                                                                
LISTEN 0      128             [::]:22             [::]:*                                  [root@RS1 ~]# echo "amu" > /var/www/html/index.html                              
[root@RS1 ~]# curl 127.0.0.1
amu
RS2

// 關閉防火墻和selinux
[root@RS2 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS2 ~]# vi /etc/selinux/config 
SELINUX=disabled
[root@RS2 ~]# reboot

// 下載httpd服務,添加網頁內容
[root@RS2 ~]# yum -y install httpd
[root@RS2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS2 ~]# ss -antl
State  Recv-Q Send-Q Local Address:Port   Peer Address:Port Process                                                     
LISTEN 0      128          0.0.0.0:22          0.0.0.0:*                                                                
LISTEN 0      128                *:80                *:*                                                                
LISTEN 0      128             [::]:22             [::]:*                                                                
[root@RS2 ~]# echo "gf" > /var/www/html/index.html
[root@RS2 ~]# curl 127.0.0.1
gf

RS1,RS2上配置apr內核引數

RS配置apr內核引數

[root@RS1 ~]# cat /etc/sysctl.conf   # 末尾添加兩行
net.ipv4.conf.all.arp_ignore = 1  # 將對應網卡設定為只回應目標IP為自身介面地址的ARP請求
net.ipv4.conf.all.arp_announce = 2 設定RIP

[root@RS1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

[root@RS2 ~]# cat /etc/sysctl.conf   # 末尾添加兩行
net.ipv4.conf.all.arp_ignore = 1  # 將對應網卡設定為只回應目標IP為自身介面地址的ARP請求
net.ipv4.conf.all.arp_announce = 2 # 設定RIP

[root@RS2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

RS1,RS2上配置VIP

// RS1添加臨時網卡設立Vip 
[root@RS1 ~]# ip addr add 192.168.91.200/24 dev ens160
[root@RS1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:9f:8b:bc brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.133/24 brd 192.168.91.255 scope global dynamic noprefixroute ens160
       valid_lft 1656sec preferred_lft 1656sec
    inet 192.168.91.200/24 scope global secondary ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::d7db:4688:7fc5:fbcc/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

// RS2添加臨時網卡設立Vip 
[root@RS2 ~]# ip addr add 192.168.91.200/24 dev ens32
[root@RS2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:5b:3b:74 brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.135/24 brd 192.168.91.255 scope global dynamic noprefixroute ens32
       valid_lft 958sec preferred_lft 958sec
    inet 192.168.91.200/24 scope global secondary ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::29db:511:eca0:9fec/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

DR 上配置轉發規則


DR

[root@DR ~]# ipvsadm -A -t 192.168.91.200:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.91.200:80 -r 192.168.91.133:80 -g
[root@DR ~]# ipvsadm -a -t 192.168.91.200:80 -r 192.168.91.135:80 -g
[root@DR ~]# ipvsadm -Sn
-A -t 192.168.91.200:80 -s rr
-a -t 192.168.91.200:80 -r 192.168.91.133:80 -g -w 1
-a -t 192.168.91.200:80 -r 192.168.91.135:80 -g -w 1
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm

請添加圖片描述
在這里插入圖片描述

NAT模式

環境說明:

主機名DipVip職責
DR192.168.91.132192.168.58.200調度器
RS1192.168.91.133DR網關服務器(RS)
RS2192.168.91.135DR網關服務器(RS)

準備作業

DR

//關閉防火墻和selinux
[root@DR ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@DR ~]# vi /etc/selinux/config 
SELINUX=disabled

[root@DR ~]# setenforce 0
[root@DR ~]# reboot

//添加一個臨時網卡作為"Vip"
[root@DR ~]# ip addr add 192.168.91.200/24 dev ens160
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:cd:a4:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.132/24 brd 192.168.91.255 scope global dynamic noprefixroute ens160
       valid_lft 1572sec preferred_lft 1572sec
    inet 192.168.91.200/24 scope global secondary ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::f1de:a72e:4bf:9503/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

//下載ipvsadm
[root@DR ~]# yum -y install ipvsadm

// 查看DR網關
[root@DR ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens160
UUID=ff6e1ed4-e92b-413e-804c-480e5ddd7fb3
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.91.132
PREFIX=24
GATEWAY=192.168.91.2   //網關
DNS1=114.114.114.114
IPV6_PRIVACY=no

RS1

// 關閉防火墻和selinux
[root@RS1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS1 ~]# vi /etc/selinux/config 
SELINUX=disabled
[root@RS1 ~]# reboot

// 下載httpd服務,添加網頁內容
[root@RS1 ~]# yum -y install httpd
[root@RS1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS1 ~]# ss -antl
State  Recv-Q Send-Q Local Address:Port   Peer Address:Port Process                                                     
LISTEN 0      128          0.0.0.0:22          0.0.0.0:*                                                                
LISTEN 0      128                *:80                *:*                                                                
LISTEN 0      128             [::]:22             [::]:*                                  [root@RS1 ~]# echo "amu hello" > /var/www/html/index.html                              
[root@RS1 ~]# curl 127.0.0.1
amu hello
RS2

// 關閉防火墻和selinux
[root@RS2 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS2 ~]# vi /etc/selinux/config 
SELINUX=disabled
[root@RS2 ~]# reboot

// 下載httpd服務,添加網頁內容
[root@RS2 ~]# yum -y install httpd
[root@RS2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS2 ~]# ss -antl
State  Recv-Q Send-Q Local Address:Port   Peer Address:Port Process                                                     
LISTEN 0      128          0.0.0.0:22          0.0.0.0:*                                                                
LISTEN 0      128                *:80                *:*                                                                
LISTEN 0      128             [::]:22             [::]:*                                                                
[root@RS2 ~]# echo "gf hello" > /var/www/html/index.html
[root@RS2 ~]# curl 127.0.0.1
gf hello

配置RS主機網關

RS1

[root@RS1 ~]# sed -ri 's/^(GATEWAY=).*/\192.168.91.2/' /etc/sysconfig/network-scripts/ifcfg-ens160
[root@RS1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens160
UUID=37a2c72f-e00b-4c82-b130-867e4b827d54
DEVICE=ens160
ONBOOT=no
IPADDR=192.168.91.133
PREFIX=24
GATEWAY=192.168.91.2
DNS1=114.114.114.114
IPV6_PRIVACY=no

RS2

[root@RS2 ~]# sed -ri 's/^(GATEWAY=).*/\192.168.91.2/' /etc/sysconfig/network-scripts/ifcfg-ens32
[root@RS2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens32
UUID=324fa695-5716-4706-84ec-6b2777061c43"
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.91.135
PREFIX=24
GATEWAY=192.168.91.2
DNS1=114.114.114.114
IPV6_PRIVACY=no

DR上配置轉發規則

##DR

[root@DR ~]# vi /etc/sysctl.conf
[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1

# 配置轉發規則
[root@DR ~]# ipvsadm -A -t 192.168.91.200:80 -s rr
[root@DR ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.91.200:80 rr

[root@DR ~]# ipvsadm -a -t 192.168.91.200:80 -r 192.168.91.133:80 -m
[root@DR ~]# ipvsadm -a -t 192.168.91.200:80 -r 192.168.91.135:80 -m

[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.91.200:80 -s rr
-a -t 192.168.91.200:80 -r 192.168.91.133:80 -m -w 1
-a -t 192.168.91.200:80 -r 192.168.91.135:80 -m -w 1

檢測

[root@DR ~]# curl 192.168.91.133
amu hello
[root@DR ~]# curl 192.168.91.135
gf hello

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

標籤:其他

上一篇:Nginx代理mysql埠

下一篇:我可以從apatch中的php檔案在apatch服務器的硬碟中的檔案路徑中播放視頻嗎?

標籤雲
其他(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