Haproxy安装与配置
Haproxy安裝與配置
有關(guān)高負(fù)載均衡的軟件,目前使用比較多的是haproxy、nginx和lvs。下面我們就開(kāi)始學(xué)習(xí)haprxoy這款軟件。
1、Haproxy概念
1.1、haproxy原理
haproxy提供高可用性、負(fù)載均衡以及基于TCP(第四層)和HTTP(第七層)應(yīng)用的代理,支持虛擬主機(jī),它是免費(fèi)、快速并且可靠的一種解決方案。
haproxy特別適用于那些負(fù)載特別大的web站點(diǎn),這些站點(diǎn)通常又需要會(huì)話保持或七層處理。haproxy運(yùn)行在時(shí)下的硬件上,完全可以支持?jǐn)?shù)以萬(wàn)計(jì)的并發(fā)連接,并且它的運(yùn)行模式使得它可以很簡(jiǎn)單安全的整合進(jìn)您當(dāng)前的架構(gòu)中,同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。
haproxy實(shí)現(xiàn)了一種事件驅(qū)動(dòng)、單一進(jìn)程模型,此模型支持非常大的并發(fā)連接數(shù)。多進(jìn)程或多線程模型受內(nèi)存限制、系統(tǒng)調(diào)度器限制以及無(wú)處不在的鎖限制,很少能處理數(shù)千并發(fā)連接。
事件驅(qū)動(dòng)模型因?yàn)樵谟懈玫馁Y源和時(shí)間管理的用戶端(User-Space)實(shí)現(xiàn)所有這些任務(wù),所以沒(méi)有這些問(wèn)題。此模型的弊端是,在多核系統(tǒng)上,這些程序通常擴(kuò)展性較差。這就是為什么他們必須進(jìn)行優(yōu)化以使每個(gè)CPU時(shí)間片(Cycle)做更多的工作。
1.2、haproxy的優(yōu)點(diǎn)
- 免費(fèi)開(kāi)源,穩(wěn)定性也是非常好。單haproxy也跑得不錯(cuò),穩(wěn)定性可以與硬件級(jí)的F5相媲美。
- 根據(jù)官方文檔,haproxy可以跑滿10Gbps,這個(gè)數(shù)值作為軟件級(jí)負(fù)載均衡器是相當(dāng)驚人的。
- haproxy支持連接拒絕:因?yàn)榫S護(hù)一個(gè)連接的打開(kāi)的開(kāi)銷是很低的,有時(shí)我們很需要限制gongji蠕蟲(chóng)(attack bots),也就是說(shuō)限制它們的連接打開(kāi)從而限制它們的危害。這個(gè)已經(jīng)為一個(gè)陷于小型DDoSgongji的網(wǎng)站開(kāi)發(fā)了而且已經(jīng)拯救了很多站點(diǎn),這個(gè)優(yōu)點(diǎn)也是其它負(fù)載均衡器沒(méi)有的。
- haproxy支持全透明代理(已具備硬件防火墻的典型特點(diǎn)):可以用客戶端IP地址或者任何其他地址來(lái)連接后端服務(wù)器。這個(gè)特性僅在Linux 2.4/2.6內(nèi)核打了tcp proxy補(bǔ)丁后才可以使用。這個(gè)特性也使得為某特殊服務(wù)器處理部分流量同時(shí)又不修改服務(wù)器的地址成為可能。
- haproxy現(xiàn)多于線上的Mysql集群環(huán)境,我們常用于它作為MySQL(讀)負(fù)載均衡。
- 自帶強(qiáng)大的監(jiān)控服務(wù)器狀態(tài)的頁(yè)面,實(shí)際環(huán)境中我們結(jié)合Nagios進(jìn)行郵件或短信報(bào)警。
- HAProxy支持虛擬主機(jī),許多朋友說(shuō)它不支持虛擬主機(jī)是錯(cuò)誤的,通過(guò)測(cè)試我們知道,HAProxy是支持虛擬主機(jī)的。
2、環(huán)境
內(nèi)核版本:3.10.0-862
架構(gòu):x86_64
系統(tǒng)版本:CentOS Linux release 7.5.1804 (Core)
HAproxy版本:haproxy-1.8.19.tar.gz
安裝方式:源碼編譯
安裝路徑:/usr/local/haproxy/
官方文檔:https://www.haproxy.org/#docs
下載路徑:https://www.haproxy.org/#down
3、安裝Haproxy
3.1、yum安裝:參考
3.1.1、官方base源安裝
CentOS 6.*和CentOS 7安裝的Haproxy版本一樣
[root@node1 ~]# yum install haproxy # base源 [root@node1 ~]# haproxy -v HA-Proxy version 1.5.18 2016/05/10 Copyright 2000-2016 Willy Tarreau <willy@haproxy.org>3.1.2、SCL源安裝haproxy1.8
安裝 Software Collections (SCL) repository 源以獲取最新版本的haproxy
sudo yum install centos-release-scl -y安裝haproxy:訪問(wèn)慢
sudo yum install rh-haproxy18-haproxy rh-haproxy18-haproxy-syspaths -y開(kāi)啟:systemctl start rh-haproxy18-haproxy
停止:systemctl stop rh-haproxy18-haproxy
開(kāi)機(jī)啟動(dòng):systemctl enable rhhaproxy18-haproxy
3.2、編譯安裝Haproxy
3.2.1、創(chuàng)建運(yùn)行賬戶和組
groupadd --system haproxy #添加haproxy的組 useradd --system -M -g haproxy haproxy -s /sbin/nologin #創(chuàng)建haproxy的系統(tǒng)賬戶到haproxy的組,但是禁止其登陸系統(tǒng)。3.2.2、編譯安裝Haproxy
[root@node1 opt]# yum install gcc make -y # 安裝編譯工具 [root@node1 opt]# wget https://www.haproxy.org/download/1.8/src/haproxy-1.8.19.tar.gz [root@node1 opt]# tar xf haproxy-1.8.19.tar.gz [root@node1 opt]# cd haproxy-1.8.19 [root@node1 haproxy-1.8.19]# uname -r 3.10.0-862.el7.x86_64 [root@node1 haproxy-1.8.19]# more README # 查看安裝說(shuō)明 ... ...38 - linux22 for Linux 2.239 - linux24 for Linux 2.4 and above (default)40 - linux24e for Linux 2.4 with support for a working epoll (> 0.21)41 - linux26 for Linux 2.6 and above42 - linux2628 for Linux 2.6.28, 3.x, and above (enables splice and tproxy)43 - solaris for Solaris 8 or 10 (others untested)44 - freebsd for FreeBSD 5 to 10 (others untested)45 - netbsd for NetBSD46 - osx for Mac OS/X47 - openbsd for OpenBSD 5.7 and above48 - aix51 for AIX 5.149 - aix52 for AIX 5.250 - cygwin for Cygwin51 - haiku for Haiku52 - generic for any other OS or version.53 - custom to manually adjust every setting ... ...要構(gòu)建haproxy,必須在上面操作系統(tǒng)中選擇目標(biāo)操作系統(tǒng) 并將其分配給TARGET變量: 我的內(nèi)核是3.10.0,選擇linux2628 [root@node1 haproxy-1.8.19]# make TARGET=linux2628 ARCH=x86_64 prefix=/usr/local/haproxy # TARGET指定內(nèi)核版本,ARCH指定CPU架構(gòu),PREFIX指haprxoy的安裝路徑。 [root@node1 haproxy-1.8.19]# make install PREFIX=/usr/local/haproxy [root@node1 haproxy-1.8.19]# ll /usr/local/haproxy/ 總用量 0 drwxr-xr-x 3 root root 21 3月 22 17:50 doc drwxr-xr-x 2 root root 21 3月 22 17:50 sbin drwxr-xr-x 3 root root 17 3月 22 17:50 share [root@node1 haproxy-1.8.19]# cp -a examples /usr/local/haproxy/ # 拷貝一些模板;3.2.3、創(chuàng)建目錄
mkdir -pv /usr/local/haproxy/conf/ready/{tcp,http} # 為多配置文件準(zhǔn)備,省略; mkdir -pv /usr/local/haproxy/conf/enabled/{tcp,http} # 為多配置文件準(zhǔn)備,省略; mkdir -pv /usr/local/haproxy/logsmkdir -pv /etc/haproxy #創(chuàng)建配置目錄 mkdir -pv /usr/share/haproxy/ #防止啟動(dòng)出錯(cuò) touch /usr/local/haproxy/conf/haproxy.cfg #創(chuàng)建配置文件 ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件3.2.4、查看haprxoy的版本
[root@node1 haproxy-1.8.19]# /usr/local/haproxy/sbin/haproxy -v HA-Proxy version 1.8.19 2019/02/11 Copyright 2000-2019 Willy Tarreau <willy@haproxy.org>3.2.5、把haproxy添加到系統(tǒng)服務(wù)
復(fù)制haproxy文件到/usr/sbin下
因?yàn)橄旅娴膆aproxy.init啟動(dòng)腳本默認(rèn)會(huì)去/usr/sbin下找。
添加到系統(tǒng)服務(wù)并開(kāi)機(jī)自啟動(dòng)
[root@node1 haproxy-1.8.19]# cp ./examples/haproxy.init /etc/init.d/haproxy [root@node1 haproxy-1.8.19]# chmod 755 /etc/init.d/haproxy [root@node1 haproxy-1.8.19]# chkconfig --add haproxy [root@node1 haproxy-1.8.19]# chkconfig haproxy on [root@node1 haproxy-1.8.19]# chkconfig --list|grep haproxy注:該輸出結(jié)果只顯示 SysV 服務(wù),并不包含 原生 systemd 服務(wù)。SysV 配置數(shù)據(jù) 可能被原生 systemd 配置覆蓋。要列出 systemd 服務(wù),請(qǐng)執(zhí)行 'systemctl list-unit-files'。查看在具體 target 啟用的服務(wù)請(qǐng)執(zhí)行'systemctl list-dependencies [target]'。haproxy 0:關(guān) 1:關(guān) 2:開(kāi) 3:開(kāi) 4:開(kāi) 5:開(kāi) 6:關(guān)服務(wù)管理:
啟動(dòng):service haproxy start 停止:service haproxy stop 重載:service haproxy restart 狀態(tài):service haproxy status 檢查:service haproxy test處理一個(gè)報(bào)錯(cuò)
[root@node1 haproxy-1.8.19]# service haproxy status /etc/init.d/haproxy: 第 26 行:[: =: 期待一元表達(dá)式 ● haproxy.service - SYSV: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments.Loaded: loaded (/etc/rc.d/init.d/haproxy; bad; vendor preset: disabled)Active: inactive (dead)Docs: man:systemd-sysv-generator(8)[root@node1 haproxy-1.8.19]# vim +26 /etc/rc.d/init.d/haproxy26 [ ${NETWORKING} = "no" ] && exit 0改為:26 [ "${NETWORKING}" = "no" ] && exit 04、配置Haproxy
官方文檔:
https://cbonte.github.io/haproxy-dconv/1.8/configuration.html
4.1、為多配置文件準(zhǔn)備,省略;
熟悉 Nginx 和 Apache 的朋友都知道,這兩個(gè) Webservice 都支持 include 加載多個(gè)配置文件的語(yǔ)法,但是 Haproxy 并不支持!如果現(xiàn)網(wǎng)映射規(guī)則非常多,那么 haproxy.cfg 這個(gè)配置文件就很長(zhǎng)!
Hparoxy 實(shí)現(xiàn)多配置文件的方案,但是不是 include 語(yǔ)法,而是在啟動(dòng)的時(shí)候多次使用-f 拼接配置文件,比如:
因此,我們可以在配置文件目錄以及啟動(dòng)腳本上做點(diǎn)改變,讓 Haproxy 支持多配置文件。
路徑約定:
- 待上線的 tcp 映射規(guī)則存放目錄:/usr/local/haproxy/conf/ready/tcp
- 待上線的 http 映射規(guī)則存放目錄:/usr/local/haproxy/conf/ready/http
- 已上線的 tcp 映射規(guī)則存放目錄:/usr/local/haproxy/conf/enabled/tcp
- 已上線的 http 映射規(guī)則存放目錄:/usr/local/haproxy/conf/enabled/http
- Ps:本文為多配置模式,enabled 里面的配置為軟鏈接形式,軟鏈接至 ready 對(duì)應(yīng)配置文件,方便管理。
4.2、配置模板
Haproxy配置中分成五部分內(nèi)容,當(dāng)然這些組件不是必選的,可以根據(jù)需要選擇作為配置。
? global:參數(shù)是進(jìn)程級(jí)的,通常和操作系統(tǒng)(OS)相關(guān)。這些參數(shù)一般只設(shè)置一次,如果配置無(wú)誤,就不需要再次配置進(jìn)行修改;
? default:配置默認(rèn)參數(shù)的,這些參數(shù)可以被利用配置到frontend,backend,listen組件;
? frontend:接收請(qǐng)求的前端虛擬節(jié)點(diǎn),Frontend可以根據(jù)規(guī)則直接指定具體使用后端的backend(可動(dòng)態(tài)選擇);
? backend:后端服務(wù)集群的配置,是真實(shí)的服務(wù)器,一個(gè)Backend對(duì)應(yīng)一個(gè)或者多個(gè)實(shí)體服務(wù)器;
? listen:Frontend和Backend的組合體;通過(guò)關(guān)聯(lián)“前端”和“后端”定義了一個(gè)完整的代理,通常只對(duì)TCP流量有用。
主配置:/usr/local/haproxy/haproxy.cfg文件
[root@node1 ~]# vim /usr/local/haproxy/conf/haproxy.cfg #configure haproxy.cfg # 全局配置 globallog 127.0.0.1 local0 # 設(shè)置日志log 127.0.0.1 local1 noticemaxconn 4000 # 最大連接數(shù)chroot /usr/local/haproxy # 安裝目錄user haproxygroup haproxydaemon # 守護(hù)進(jìn)程運(yùn)行#nbproc 1 # 進(jìn)程數(shù)量,只能用于守護(hù)進(jìn)程模式的haproxy;默認(rèn)啟動(dòng)一個(gè)進(jìn)程,一般只在單進(jìn)程僅能打開(kāi)少數(shù)文件描述符的場(chǎng)景中才使用多進(jìn)程模式;pidfile /var/run/haproxy.pid# 默認(rèn)配置 defaultslog globalmode http # 默認(rèn)的模式mode { tcp|http|health },tcp是4層,http是7層,health只會(huì)返回OKoption httplog # http 日志格式option dontlognull # 不記錄健康檢查日志信息;option redispatch # serverId對(duì)應(yīng)的服務(wù)器掛掉后,強(qiáng)制定向到其他健康的服務(wù)器option http-server-close#option abortonclose # 當(dāng)服務(wù)器負(fù)載很高的時(shí)候,自動(dòng)結(jié)束掉當(dāng)前隊(duì)列處理比較久的鏈接;#option forwardfor # 如果后端服務(wù)器需要獲得客戶端真實(shí)ip需要配置的參數(shù),可以從Http Header中獲得客戶端ip;#option httpclose # 主動(dòng)關(guān)閉http通道,每次請(qǐng)求完畢后主動(dòng)關(guān)閉http通道,ha-proxy不支持keep-alive,只能模擬這種模式的實(shí)現(xiàn); balance roundrobin # 負(fù)載均衡算法,輪詢;retries 3 # 重試次數(shù);timeout http-request 10s # 客戶端建立連接但不請(qǐng)求數(shù)據(jù)時(shí),關(guān)閉客戶端連接;timeout queue 1m # 等待最大時(shí)長(zhǎng);timeout connect 10s # 定義haproxy將客戶端請(qǐng)求轉(zhuǎn)發(fā)至后端服務(wù)器所等待的超時(shí)時(shí)間;timeout client 1m # 客戶端非活動(dòng)狀態(tài)的超長(zhǎng)時(shí)間(默認(rèn)毫秒)timeout server 1m # 客戶端與服務(wù)器建立連接后,等待服務(wù)器端的超時(shí)時(shí)長(zhǎng)(默認(rèn)毫秒)timeout http-keep-alive 10s # 定義保持連接的超時(shí)時(shí)長(zhǎng);timeout check 10s # 心跳檢測(cè)超時(shí);maxconn 3000 # 每個(gè)server最大的連接數(shù);# 統(tǒng)計(jì)頁(yè)面配置 listen admin_stats bind 0.0.0.0:50000 # 監(jiān)聽(tīng)I(yíng)P和端口,為了安全可以設(shè)置本機(jī)的局域網(wǎng)IP及端口;mode httpoption httplog # 采用http日志格式 stats refresh 30s # 統(tǒng)計(jì)頁(yè)面自動(dòng)刷新時(shí)間 stats uri /haproxy?stats # 狀態(tài)管理頁(yè)面,通過(guò)/haproxy?stats來(lái)訪問(wèn)stats realm Haproxy Manager # 統(tǒng)計(jì)頁(yè)面密碼框上提示文本 stats auth admin:psadmin # 統(tǒng)計(jì)頁(yè)面用戶名和密碼設(shè)置 #stats hide-version # 隱藏統(tǒng)計(jì)頁(yè)面上HAProxy的版本信息#errorfile 403 /usr/local/haproxy/examples/errorfiles/ #設(shè)置haproxy 錯(cuò)誤頁(yè)面#前端配置 frontend http_mainbind 0.0.0.0:80 # http請(qǐng)求的端口,會(huì)被轉(zhuǎn)發(fā)到設(shè)置的ip及端口# 轉(zhuǎn)發(fā)規(guī)則#acl url_yuming path_beg www.yuming.com#use_backend server_yuming if url_yuming# 默認(rèn)跳轉(zhuǎn)項(xiàng),當(dāng)上面都沒(méi)有匹配上,就轉(zhuǎn)到backend的http_default上;default_backend http_default# 提升失敗的時(shí)候的用戶體驗(yàn)#errorfile 502 /usr/local/haproxy/examples/errorfiles/502.http#errorfile 503 /usr/local/haproxy/examples/errorfiles/503.http#errorfile 504 /usr/local/haproxy/examples/errorfiles/504.http# 后端配置 backend http_default# 額外的一些設(shè)置,按需使用option forwardforoption forwardfor header Client-IPoption http-server-closeoption httpclose# 負(fù)載均衡方式#source 根據(jù)請(qǐng)求源IP#static-rr 根據(jù)權(quán)重#leastconn 最少連接先處理;在有著較長(zhǎng)時(shí)間會(huì)話的場(chǎng)景中推薦使用此算法,如LDAP、SQL等,其并不太適用于較短會(huì)話的應(yīng)用層協(xié)議,如HTTP;此算法是動(dòng)態(tài)的,#uri 根據(jù)請(qǐng)求的uri#url_param 根據(jù)請(qǐng)求的url參數(shù)#rdp-cookie 據(jù)據(jù)cookie(name)來(lái)鎖定并哈希每一次請(qǐng)求#hdr(name) 根據(jù)HTTP請(qǐng)求頭來(lái)鎖定每一次HTTP請(qǐng)求#roundrobin 輪詢方式balance roundrobin # 負(fù)載均衡的方式,輪詢方式# 設(shè)置健康檢查頁(yè)面#option httpchk GET /index.html#傳遞客戶端真實(shí)IPoption forwardfor header X-Forwarded-For# 需要轉(zhuǎn)發(fā)的ip及端口# inter 2000 健康檢查時(shí)間間隔2秒# rise 3 檢測(cè)多少次才認(rèn)為是正常的# fall 3 失敗多少次才認(rèn)為是不可用的# weight 30 權(quán)重server node1 192.168.1.101:8080 check inter 2000 rise 3 fall 3 weight 30server node2 192.168.1.101:8081 check inter 2000 rise 3 fall 3 weight 30多配置模式中,多個(gè) frontend 必須綁定不同的 IP 或者端口,否則數(shù)據(jù)會(huì)串,導(dǎo)致映射到不同的后端而報(bào)錯(cuò)。因此,同一個(gè) IP+端口下的映射務(wù)必配置到同一個(gè) frontend 模塊內(nèi)。
4.3、配置說(shuō)明
轉(zhuǎn)發(fā)規(guī)則
前端配置frontend中
acl url_yuming path_beg www.yuming.com use_backend yuming if url_yuming當(dāng)www.yuming.com訪問(wèn)時(shí),會(huì)轉(zhuǎn)發(fā)給后端backend的yuming項(xiàng)目;可用于一下幾種配置:
域名跳轉(zhuǎn):客戶端通過(guò)訪問(wèn)某個(gè)域名跳轉(zhuǎn)到跳轉(zhuǎn)指定服務(wù)器或者其他域名;
IP地址跳轉(zhuǎn):客戶端訪問(wèn)指定IP地址時(shí),轉(zhuǎn)發(fā)到后端IP;
端口跳轉(zhuǎn):客戶端通過(guò)域名加端口訪問(wèn)時(shí),轉(zhuǎn)發(fā)到后端IP和端口;
動(dòng)靜分離:
默認(rèn)跳轉(zhuǎn):客戶端訪問(wèn)時(shí),如果其它規(guī)則都不匹配,默認(rèn)轉(zhuǎn)發(fā)到后端IP和端口;
多ACL匹配:當(dāng)指定客戶端(根據(jù)IP匹配)訪問(wèn)某一個(gè)域名或者IP時(shí),默認(rèn)轉(zhuǎn)發(fā)到后端IP和端口;
5、配置日志rsyslog
vim /etc/rsyslog.conf # 取消如下2行注釋 $ModLoad imudp $UDPServerRun 514# 新增配置:local 1~7 –自定義的日志設(shè)備 local7.* /var/log/haproxy.log重啟syslog服務(wù)
# centos 6.* service rsyslog restart# CentOS 7.* systemctl restart rsyslog6、驗(yàn)證
6.1、啟動(dòng)Haproxy
[root@node1 ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg [root@node1 ~]# ps -ef |grep haproxy |grep -v grep root 6950 1 0 19:35 ? 00:00:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg或者
[root@node1 ~]# service haproxy start Starting haproxy (via systemctl): [ 確定 ] [root@node1 ~]# ps -ef |grep haproxy |grep -v grep haproxy 4383 1 0 15:53 ? 00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pidhaproxy參數(shù)說(shuō)明
-v 顯示版本; -vv 顯示已知的構(gòu)建選項(xiàng)。 -f 指定配置文件啟動(dòng); -p 指定pid文件; -d 進(jìn)入調(diào)試模式; -db 僅禁用后臺(tái)模式。 -dM [<byte>] 使用<byte>中毒內(nèi)存(默認(rèn)為0x50) -V 進(jìn)入詳細(xì)模式(禁用安靜模式) -D 去守護(hù)進(jìn)程; -C 在加載文件之前更改為<dir>。 -q quiet mode:不顯示消息 -c check mode:只檢查配置文件并退出 -n 設(shè)置最大連接數(shù)(2000) -m 限制可用內(nèi)存量(以MB為單位) -N 設(shè)置默認(rèn)的每代理最大連接數(shù)(2000) -L 設(shè)置本地對(duì)等名稱(默認(rèn)為hostname) -p 將所有子項(xiàng)的pid寫(xiě)入此文件 -de 即使在可用時(shí)也禁用epoll()用法 -dp 即使在可用時(shí)也禁用poll()用法 -dS 禁用拼接使用(在舊內(nèi)核上斷開(kāi)) -dG 禁用getaddrinfo()用法 -dV 在服務(wù)器端禁用SSL驗(yàn)證 -sf/-st [pid]* 完成/終止舊的pid。必須是最后的論點(diǎn)。6.2、前端登陸頁(yè)面
URL:http://$IP:80
建議把上面兩個(gè)轉(zhuǎn)發(fā)改為不同的頁(yè)面,不停刷新,查看是否有頁(yè)面切換;
6.3、后臺(tái)監(jiān)控登陸
URL:http://$IP:50000/haproxy?stats
username:admin
password:psadmin
haproxy監(jiān)控后臺(tái)服務(wù)器的情況如圖:
參考
https://www.cnblogs.com/ilanni/p/4750081.html
http://www.ttlsa.com/linux/haproxy-study-tutorial/
轉(zhuǎn)載于:https://blog.51cto.com/moerjinrong/2370128
總結(jié)
以上是生活随笔為你收集整理的Haproxy安装与配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于spring boot 的ssm项目
- 下一篇: 软件工程小组第三次正式会议