本教程教大家通過阿里云服務(wù)器搭建一個由nginx做代理轉(zhuǎn)發(fā)的javaweb系統(tǒng),所有的請求通過nginx
轉(zhuǎn)發(fā)到對應(yīng)的tomcat下。
1、阿里云Ubuntu服務(wù)器一臺
2、ssh遠(yuǎn)程連接工具
window下可以使用xshell,putty,securecrt。推薦使用xshell個人覺得比較方便。
Mac或者linux都可以直接使用控制臺連接
3、下載安裝所需要資源包(tomcat7,nginx1.6,nginx配置 linux環(huán)境證書更新腳本),把下載好的resource.zip上傳到服務(wù)器上
本例中resource包放在 /home/resource下
resource.zip
在開始安裝具體的軟件前我們需要安裝一些支持性環(huán)境或者軟件,創(chuàng)建好文件夾。
1、更新apt-get命令
apt-get -y update
2、安裝mysql依賴查詢和其他所需要用到的程序
apt-get -y install unzip build-essential libncurses5-dev libfreetype6-dev libxml2-dev libssl-dev libcurl4-openssl-dev libjpeg62-dev libpng12-dev libfreetype6-dev libsasl2-dev libpcre3-dev autoconf libperl-dev libtool libaio*
3、清除防火墻設(shè)置
iptables -F
4、解壓resource.zip,切換到resource文件夾中
unzip /home/resource.zip
5、更新ssl證書
./env/update_openssl.sh
6、創(chuàng)建所需要用到的文件夾,我們需要創(chuàng)建的文件結(jié)構(gòu)如下
/home
|- www
|- java1.7 //java環(huán)境安裝文件夾
|- tomcat7 // tomcat文件夾
|- nginx // nginx根目錄
|-sites-enabled //nginx配置文件目錄
|-log //日志文件目錄
|- webresource
|- static //nginx文件上傳目錄
mkdir -p /home/www/tomcat7
1、安裝tomcat
mv apache-tomcat-7.0.63 /home/www/tomcat7
2、安裝java運(yùn)行環(huán)境,命令的意思是下載jdk、解壓jdk壓縮文件、移動解壓后的文件
wget
設(shè)置java環(huán)境變量
echo 'export JAVA_HOME=/home/www/java1.7' >> /etc/profile
3、安裝ngix
創(chuàng)建文件夾,解壓文件
touch /home/www/log/nginx/access.log
切換工作目錄
cd /home/www/nginx/
開始安裝
./configure
修改配置文件
cd /home/resource
啟動nginx,我們在nginx的root路徑下寫入一個index.html文件然后啟動nginx
touch /home/www/webresource/static/index.html
啟動成功后你可以通過訪問ip看到一個寫著hellow的網(wǎng)站
配置nginx代理tomcat,我們在 /home/www/nginx/sites-enabled 文件下創(chuàng)建一個叫tomcat的文件,文件內(nèi)容如下,表示nginx將代理www.test.com這個域名,并且轉(zhuǎn)發(fā)到本地的tomcat監(jiān)聽端口下。
server {
4、mysql數(shù)據(jù)庫安裝
sudo apt-get -y install mysql-server
修改遠(yuǎn)程登錄權(quán)限 ,mysql默認(rèn)是不開啟遠(yuǎn)程登錄的,如要需要開啟則需要修改配置
需要改動一下 /etc/mysql/my.cnf文件把#bind-address=127.0.0.1節(jié)點注釋掉
注意最新版本mysql my.cnf中已經(jīng)不再配置具體參數(shù),而是分成了2個文件
#bind-address 需要在/etc/mysql/mysql.conf.d/mysqld.cnf中修改
修改完成后重啟mysql
service mysql restart
創(chuàng)建mysql遠(yuǎn)程登錄用戶,給用戶授權(quán)數(shù)據(jù)庫管理權(quán)限。這里創(chuàng)建了一個testdb數(shù)據(jù)庫,然后創(chuàng)建了一個用戶,用戶名為:testdb_user,密碼為:testdbpassword。這個用戶就可以遠(yuǎn)程登錄mysql數(shù)據(jù)庫了
CREATE DATABASE testdb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
5、安全軟件
考慮到服務(wù)器端的安全問題,大家可以選擇性的安裝一些安全軟件如安全狗,
wget
啟動安全狗
service safedog restart
進(jìn)入管理界面
sdui
久之前,小編就買了一年的阿里云服務(wù)器,也購買了域名,一直都沒有時間,加上自己對linux的知識不足,最后小編終于把wordpress和tomcat同時部署在一個服務(wù)器上,
先簡單說說阿里云的購買流程,如果你的域名不需要備案,只是能夠訪問那么簡單的多,
wordpress部署部分
在阿里云部署購買云主機(jī)CES或輕應(yīng)用服務(wù)器,
如果你在24歲以下,進(jìn)行學(xué)生認(rèn)證,那么一平均一個月9.9元,
在系統(tǒng)選擇上,windows會有可視化的界面,不會linux的可以選擇windows
想搭建自己的博客的可以選擇wordpress;
只是部署java項目可以直接選擇系統(tǒng)鏡像的centos
域名購買
域名可以選擇一個自己喜歡的,看一下不同的后綴名交流,查看一下價格
這里需要填寫個人相關(guān)信息
并且通過實名認(rèn)證
在控制臺的域名就可看到自己購買的域名,選擇解析,填寫剛才購買服務(wù)器的ip地址就解析完成了
這時回到輕應(yīng)用服務(wù)器列表,
按照圖中的命令就可以進(jìn)行操作,設(shè)置wordpress的站點信息,這里阿里云有完整的參考文檔,這里我就不寫了,可以參考這個文章
java項目部署
java項目部署需要tomcat jdk 和mysql 本地電腦與服務(wù)傳遞文件需要使用ftp,以及開啟相關(guān)端口,在阿里云的安全組開啟如圖的安全規(guī)則,
使用遠(yuǎn)程連接工具鏈接阿里云:
ftp安裝:
ftp的安裝
這里小編一直沒有使用安裝上傳文件成功過,
百度了ftp的文件的配置,執(zhí)行了安裝命令,使用Suceure File Transfer就可以進(jìn)行文件上傳
mysql安裝
安裝mysql:
依次運(yùn)行一下命令
cd /tmpwget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum install mysql mysql-server mysql-devel -y
開啟服務(wù)
systemctl start mysql.service
查看是否開啟成功
netstat -anp|grep 3306
通過Yum安裝的mysql的管理員賬戶是沒有密碼的, 如下命令設(shè)置為admin
mysqladmin -u root password admin mysql -uroot -padmin
創(chuàng)建一個用戶
>insert into mysql.user(Host,User,Password) values("localhost","用戶名",password("密碼")); 賦予遠(yuǎn)程連接等權(quán)限 >grant all privileges on *.* to '用戶名'@'%' identified by '密碼';刷新權(quán)限flush privileges;
就可以使用mysql管理工具進(jìn)行管理
在wordpress部署的時候,會默認(rèn)安裝mysql,所以我們就不需要自己再裝mysql了
需要自己創(chuàng)建一個用戶,賦予權(quán)限,不能修改默認(rèn)的數(shù)據(jù)庫密碼,否則wordpress會鏈接不上數(shù)據(jù)庫導(dǎo)致博客網(wǎng)頁不能訪問,
jdk安裝
CentOS 7.3 可能會默認(rèn)安裝open jdk,如果沒有的話,本地在oracle下載tar.gz格式的jdk
上傳到服務(wù)器,復(fù)制到一個文件夾 解壓然后
vim vim /etc/profile
在打開的文件最后一行,
加入#java environmentexport JAVA_HOME=/usr/java/安裝的jdk目錄export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jarexport PATH=$PATH:${JAVA_HOME}/bin/etc/profile
還有就是在線安裝
yum -y install java-1.8.0-openjdk.x86_64
接著運(yùn)行
java -version
出現(xiàn)當(dāng)前java版本即表示java安裝成功了
tomcat安裝
tomcat 也可以進(jìn)行在線安裝
cd /tmp wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.92/bin/apache-tomcat-7.0.92.tar.gz tar xzf apache-tomcat-7.0.92.tar.gz mv apache-tomcat-7.0.92 /usr/local/tomcat7 運(yùn)行 /usr/local/tomcat7/bin/startup.sh 檢查 netstat -anp|grep 8080
開啟防火墻的8080端口 包括阿里云的安全組
firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload #重啟firewall
在瀏覽器進(jìn)行測試
也可以在tomca官網(wǎng)下載linux的tomcat壓縮包,上傳到阿里云,解壓啟動服務(wù)開放端口
通過后就可以將自己的數(shù)據(jù)庫導(dǎo)入阿里云的數(shù)據(jù)庫,
將自己的java項目打包(打包前將連接參數(shù)修改)
復(fù)制到tomcat的webapps下,地址欄輸入
ip:8080/項目名
就可以訪問自己的項目了
如果不想要項目名.就將原來的ROOT刪除,項目的war包重命名為ROOT
這里基本就配置完成,這里小編介紹的相對簡單,有興趣的可以參考
http://how2j.cn/k/deploy2linux/deploy2linux-breif/1591.html
這里有詳細(xì)到命令的介紹
最后說一下小編遇到的問題
ftp上傳文件問題:開始小編安裝了ftp一直不能上傳,最后使用了Suceure File Transfer就可以進(jìn)行上傳了
還有就是,開始小編使用在線安裝,一直不成功最后使用了上傳的方式安裝成功
小編使用wordpress的數(shù)據(jù)庫,輸入mysql -u root - u 提示找不到命令,然后可能是環(huán)境變量找不到命令.在阿里云上找到了mysql的安裝位置,創(chuàng)建一個軟連接到/usr/bin目錄下,解決
**不要輕易修改mysql的命令,否則會導(dǎo)致wordpress不能訪問
多個項目部署到tomcat是,注意路徑問題,存在訪問路徑添加項目名時,第一種方式;修改項目的所有請求路徑,第二種,再創(chuàng)建一個tomcat 修改端口號
小編寫的比較簡單,配置過程中還要參考其他資料,大佬勿噴
多用戶量大并發(fā)度高的應(yīng)用系統(tǒng)為了避免發(fā)布過程中的流量有損,一般選擇在流量較小的半夜發(fā)布,雖然這樣做有效果,但不可控導(dǎo)致背后的研發(fā)運(yùn)維成本對企業(yè)來說是一筆不小的負(fù)擔(dān)。基于此,阿里云微服務(wù)引擎 MSE 在應(yīng)用發(fā)布過程中,通過應(yīng)用下線時進(jìn)行自適應(yīng)等待+主動通知,應(yīng)用上線時就緒檢查與微服務(wù)生命周期對齊+服務(wù)預(yù)熱等技術(shù)手段所提供的微服務(wù)應(yīng)用無損上下線功能,能有效幫助企業(yè)規(guī)避線上發(fā)布所出現(xiàn)的流量資損。
常見的流量有損現(xiàn)象出現(xiàn)的原因包括但不限于以下幾種:
無損下線
其中的服務(wù)無法及時下線問題,如下圖 1 所示:
圖1. Spring Cloud 應(yīng)用消費(fèi)者無法及時感知提供者服務(wù)下線
對于 Spring Cloud 應(yīng)用,當(dāng)應(yīng)用的兩個實例 A’ 和 A 中的 A 下線時,由于 Spring Cloud 框架為了在可用性和性能方面做平衡,消費(fèi)者默認(rèn)是 30s 去注冊中心拉取最新的服務(wù)列表,因此 A 實例的下線不能被實時感知,此時消費(fèi)者繼續(xù)通過本地緩存繼續(xù)調(diào)用 A 就會出現(xiàn)調(diào)用已下線實例出現(xiàn)流量有損。
針對該問題,阿里云微服務(wù)引擎 MSE 基于 Java Agent 字節(jié)碼技術(shù)設(shè)計實現(xiàn)的無損下線功能如下圖 2 所示:
圖2. 無損下線方案
在該套無損下線方案中,服務(wù)提供者應(yīng)用僅需接入 MSE,相比一般的有損下線。應(yīng)用在下線前會有一段自適應(yīng)等待時期,該時期待下線應(yīng)用會通過主動通知的方式,向其在自適應(yīng)等待階段發(fā)送了請求的服務(wù)消費(fèi)者發(fā)送下線事件,消費(fèi)者接收到下線事件后會主動拉取注冊中心服務(wù)實例列表以便實時感知應(yīng)用下線事件避免調(diào)用已下線實例造成應(yīng)用下線流量有損。
無損上線
延遲加載是軟件框架設(shè)計中最常見的一種策略,例如在 Spring Cloud 框架中 Ribbon 組件的拉取服務(wù)列表初始化時機(jī)默認(rèn)是要等到服務(wù)的第 1 次調(diào)用時刻,例如下圖 3 是 Spring Cloud 應(yīng)用中第 1 次和第 2 次通過 RestTemplate 調(diào)用遠(yuǎn)程服務(wù)的請求耗時情況:
圖3. 應(yīng)用啟動資源初始化與正常運(yùn)行過程中耗時情況對比
由測試結(jié)果可見,第一次調(diào)用由于進(jìn)行了一些資源初始化,耗時是正常情況的數(shù)倍之多。因此把新應(yīng)用發(fā)布到線上直接處理大流量極易出現(xiàn)大量請求響應(yīng)慢,資源阻塞,應(yīng)用實例宕機(jī)的現(xiàn)象。針對該類大流量下應(yīng)用資源初始化慢問題,MSE 提供的小流量預(yù)熱功能通過調(diào)節(jié)剛上線應(yīng)用所分配的流量幫助其在進(jìn)行充分預(yù)熱后再處理正常流量從而對新實例進(jìn)行保護(hù)。小流量預(yù)熱過程如下圖 4 所示:
圖4. 小流量服務(wù)預(yù)熱過程 QPS 與啟動時間關(guān)系圖
除了針對上述應(yīng)用第一次調(diào)用初始化慢所造成的有損上線問題,MSE 還提供了資源預(yù)建連接、延遲注冊、確保 Kubernetes 就緒檢查通過前完成服務(wù)注冊和確保 Kubernetes 就緒檢查通過前完成服務(wù)預(yù)熱等一整套無損上線手段來滿足各類不同應(yīng)用的無損上線需求,整套方案如圖 5 所示:
圖5. MSE 無損上線方案
接下來將演示阿里云微服務(wù)引擎 MSE 在應(yīng)用發(fā)布時提供的無損上下線和服務(wù)預(yù)熱能力最佳實踐。假設(shè)應(yīng)用的架構(gòu)由 Zuul 網(wǎng)關(guān)以及后端的微服務(wù)應(yīng)用實例(Spring Cloud)構(gòu)成。具體的后端調(diào)用鏈路有購物車應(yīng)用 A,交易中心應(yīng)用 B,庫存中心應(yīng)用 C,這些應(yīng)用中的服務(wù)之間通過 Nacos 注冊中心實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)。
前提條件
開啟 MSE 微服務(wù)治理
準(zhǔn)備工作
注意,本實踐所使用的 Agent 目前還在灰度中,需要對應(yīng)用 Agent 進(jìn)行灰度升級,升級文檔:
https://help.aliyun.com/document_detail/392373.html
應(yīng)用部署在不同的 Region(暫時僅支持國內(nèi) Region)請使用對應(yīng)的 Agent 下載地址:
http://arms-apm-cn-[regionId].oss-cn-[regionId].aliyuncs.com/2.7.1.3-mse-beta/
注意替換地址中的[RegionId],RegionId 是阿里云 RegionId。
例如 Region 北京 Agent 地址為:
http://arms-apm-cn-beijing.oss-cn-beijing.aliyuncs.com/2.7.1.3-mse-beta/
應(yīng)用部署流量架構(gòu)圖
圖6. 演示應(yīng)用部署架構(gòu)
流量壓力來源
在 spring-cloud-zuul 應(yīng)用中,如圖 6 所示,其分別向 spring-cloud-a 的灰度版本和正常版本以 QPS 為 100 的速率同時進(jìn)行服務(wù)調(diào)用。
部署 Demo 應(yīng)用程序
將下面的內(nèi)容保存到一個文件中,假設(shè)取名為 mse-demo.yaml,并執(zhí)行 kubectl apply -f mse-demo.yaml 以部署應(yīng)用到提前創(chuàng)建好的 Kubernetes 集群中(注意因為 demo 中有 CronHPA 任務(wù),所以請先在集群中安裝 ack-kubernetes-cronhpa-controller 組件,具體在容器服務(wù)-Kubernetes->市場->應(yīng)用目錄中搜索組件在測試集群中進(jìn)行安裝),這里我們將要部署 Zuul,A, B 和 C 三個應(yīng)用,其中 A、B 兩個應(yīng)用分別部署一個基線版本和一個灰度版本,B 應(yīng)用的基線版本關(guān)閉了無損下線能力,灰度版本開啟了無損下線能力。C 應(yīng)用開啟了服務(wù)預(yù)熱能力,其中預(yù)熱時長為 120 秒。
# Nacos Server
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nacos-server
name: nacos-server
spec:
replicas: 1
selector:
matchLabels:
app: nacos-server
template:
metadata:
labels:
app: nacos-server
spec:
containers:
- env:
- name: MODE
value: standalone
image: registry.cn-shanghai.aliyuncs.com/yizhan/nacos-server:latest
imagePullPolicy: Always
name: nacos-server
resources:
requests:
cpu: 250m
memory: 512Mi
dnsPolicy: ClusterFirst
restartPolicy: Always
# Nacos Server Service 配置
---
apiVersion: v1
kind: Service
metadata:
name: nacos-server
spec:
ports:
- port: 8848
protocol: TCP
targetPort: 8848
selector:
app: nacos-server
type: ClusterIP
#入口 zuul 應(yīng)用
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-zuul
spec:
replicas: 1
selector:
matchLabels:
app: spring-cloud-zuul
template:
metadata:
annotations:
msePilotAutoEnable: "on"
msePilotCreateAppName: spring-cloud-zuul
labels:
app: spring-cloud-zuul
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
- name: LANG
value: C.UTF-8
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-zuul:1.0.1
imagePullPolicy: Always
name: spring-cloud-zuul
ports:
- containerPort: 20000
# A 應(yīng)用 base 版本,開啟按照機(jī)器緯度全鏈路透傳
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: spring-cloud-a
name: spring-cloud-a
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-a
template:
metadata:
annotations:
msePilotCreateAppName: spring-cloud-a
msePilotAutoEnable: "on"
labels:
app: spring-cloud-a
spec:
containers:
- env:
- name: LANG
value: C.UTF-8
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
- name: profiler.micro.service.tag.trace.enable
value: "true"
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-a
ports:
- containerPort: 20001
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
livenessProbe:
tcpSocket:
port: 20001
initialDelaySeconds: 10
periodSeconds: 30
# A 應(yīng)用 gray 版本,開啟按照機(jī)器緯度全鏈路透傳
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: spring-cloud-a-gray
name: spring-cloud-a-gray
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-a-gray
strategy:
template:
metadata:
annotations:
alicloud.service.tag: gray
msePilotCreateAppName: spring-cloud -a
msePilotAutoEnable: "on"
labels:
app: spring-cloud-a-gray
spec:
containers:
- env:
- name: LANG
value: C.UTF-8
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
- name: profiler.micro.service.tag.trace.enable
value: "true"
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-a-gray
ports:
- containerPort: 20001
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
livenessProbe:
tcpSocket:
port: 20001
initialDelaySeconds: 10
periodSeconds: 30
# B 應(yīng)用 base 版本,關(guān)閉無損下線能力
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: spring-cloud-b
name: spring-cloud-b
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-b
strategy:
template:
metadata:
annotations:
msePilotCreateAppName: spring-cloud-b
msePilotAutoEnable: "on"
labels:
app: spring-cloud-b
spec:
containers:
- env:
- name: LANG
value: C.UTF-8
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
- name: micro.service.shutdown.server.enable
value: "false"
- name: profiler.micro.service.http.server.enable
value: "false"
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-b
ports:
- containerPort: 8080
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 10
periodSeconds: 30
# B 應(yīng)用 gray 版本,默認(rèn)開啟無損下線功能
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: spring-cloud-b-gray
name: spring-cloud-b-gray
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-b-gray
template:
metadata:
annotations:
alicloud.service.tag: gray
msePilotCreateAppName: spring-cloud-b
msePilotAutoEnable: "on"
labels:
app: spring-cloud-b-gray
spec:
containers:
- env:
- name: LANG
value: C.UTF-8
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-b-gray
ports:
- containerPort: 8080
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
lifecycle:
preStop:
exec:
command:
- /bin/sh
- '-c'
- >-
wget http://127.0.0.1:54199/offline 2>/tmp/null;sleep
30;exit 0
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 10
periodSeconds: 30
# C 應(yīng)用 base 版本
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: spring-cloud-c
name: spring-cloud-c
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-c
template:
metadata:
annotations:
msePilotCreateAppName: spring-cloud-c
msePilotAutoEnable: "on"
labels:
app: spring-cloud-c
spec:
containers:
- env:
- name: LANG
value: C.UTF-8
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-c
ports:
- containerPort: 8080
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
livenessProbe:
tcpSocket:
port: 20003
initialDelaySeconds: 10
periodSeconds: 30
#HPA 配置
---
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: spring-cloud-b
spec:
scaleTargetRef:
apiVersion: apps/v1beta2
kind: Deployment
name: spring-cloud-b
jobs:
- name: "scale-down"
schedule: "0 0/5 * * * *"
targetSize: 1
- name: "scale-up"
schedule: "10 0/5 * * * *"
targetSize: 2
---
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: spring-cloud-b-gray
spec:
scaleTargetRef:
apiVersion: apps/v1beta2
kind: Deployment
name: spring-cloud-b-gray
jobs:
- name: "scale-down"
schedule: "0 0/5 * * * *"
targetSize: 1
- name: "scale-up"
schedule: "10 0/5 * * * *"
targetSize: 2
---
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: spring-cloud-c
spec:
scaleTargetRef:
apiVersion: apps/v1beta2
kind: Deployment
name: spring-cloud-c
jobs:
- name: "scale-down"
schedule: "0 2/5 * * * *"
targetSize: 1
- name: "scale-up"
schedule: "10 2/5 * * * *"
targetSize: 2
# zuul 網(wǎng)關(guān)開啟 SLB 暴露展示頁面
---
apiVersion: v1
kind: Service
metadata:
name: zuul-slb
spec:
ports:
- port: 80
protocol: TCP
targetPort: 20000
selector:
app: spring-cloud-zuul
type: ClusterIP
# a 應(yīng)用暴露 k8s service
---
apiVersion: v1
kind: Service
metadata:
name: spring-cloud-a-base
spec:
ports:
- name: http
port: 20001
protocol: TCP
targetPort: 20001
selector:
app: spring-cloud-a
---
apiVersion: v1
kind: Service
metadata:
name: spring-cloud-a-gray
spec:
ports:
- name: http
port: 20001
protocol: TCP
targetPort: 20001
selector:
app: spring-cloud-a-gray
# Nacos Server SLB Service 配置
---
apiVersion: v1
kind: Service
metadata:
name: nacos-slb
spec:
ports:
- port: 8848
protocol: TCP
targetPort: 8848
selector:
app: nacos-server
type: LoadBalancer
由于我們對 spring-cloud-b 跟 spring-cloud-b-gray 應(yīng)用均開啟了定時 HPA,模擬每 5 分鐘進(jìn)行一次定時的擴(kuò)縮容。
登錄 MSE 控制臺,進(jìn)入微服務(wù)治理中心->應(yīng)用列表->spring-cloud-a->應(yīng)用詳情,從應(yīng)用監(jiān)控曲線,我們可以看到 spring-cloud-a 應(yīng)用的流量數(shù)據(jù):
gray 版本的流量在 pod 擴(kuò)縮容的過程中請求錯誤數(shù)為 0,無流量損失。未打標(biāo)的版本由于關(guān)閉了無損下線功能,在 pod 擴(kuò)縮容的過程中有 20 個從 spring-cloud-a 發(fā)到 spring-cloud-b 的請求出現(xiàn)報錯,發(fā)生了請求流量損耗。
我們在 spring-cloud-c 應(yīng)用開啟了定時 HPA 模擬應(yīng)用上線過程,每隔 5 分鐘做一次伸縮,在擴(kuò)縮容周期內(nèi)第 2 分鐘第 0 秒縮容到 1 個節(jié)點,第 2 分鐘第 10 秒擴(kuò)容到 2 個節(jié)點。
在預(yù)熱應(yīng)用的消費(fèi)端 spring-cloud-b 開啟服務(wù)預(yù)熱功能。
在預(yù)熱應(yīng)用的服務(wù)提供端 spring-cloud-c 開啟服務(wù)預(yù)熱功能。預(yù)熱時長配置為 120 秒。
觀察節(jié)點的流量,發(fā)現(xiàn)節(jié)點流量緩慢上升。并且能看到節(jié)點的預(yù)熱開始和結(jié)束時間,以及相關(guān)的事件。
從上圖可以看到開啟預(yù)熱功能的應(yīng)用重啟后的流量會隨時間緩慢增加,在一些應(yīng)用啟動過程中需要預(yù)建連接池和緩存等資源的慢啟動場景,開啟服務(wù)預(yù)熱能有效保護(hù)應(yīng)用啟動過程中緩存資源有序創(chuàng)建保障應(yīng)用安全啟動從而實現(xiàn)應(yīng)用上線的流量無損。
方案介紹 & 實操
更多方案設(shè)計細(xì)節(jié),請點擊下方鏈接觀看微服務(wù)應(yīng)用如何實現(xiàn)無損上下線主題直播視頻回放:
https://yqh.aliyun.com/live/detail/27936
[1]創(chuàng)建 Kubernetes 托管版集群:https://help.aliyun.com/document_detail/95108.htm#task-skz-qwk-qfb
[2]開通 MSE 微服務(wù)治理:https://help.aliyun.com/document_detail/347625.htm#task-2140253
原文鏈接:https://developer.aliyun.com/article/872430?utm_content=g_1000331001
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。