整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          阿里云服務(wù)器部署方案(nginx+tomcat+my

          阿里云服務(wù)器部署方案(nginx+tomcat+mysql)

          署結(jié)構(gòu)說明

          本教程教大家通過阿里云服務(wù)器搭建一個由nginx做代理轉(zhuǎn)發(fā)的javaweb系統(tǒng),所有的請求通過nginx

          轉(zhuǎn)發(fā)到對應(yīng)的tomcat下。

          一、準(zhǔn)備

          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

          二、安裝基礎(chǔ)環(huán)境

          在開始安裝具體的軟件前我們需要安裝一些支持性環(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)的流量資損。

          無損上下線功能設(shè)計

          常見的流量有損現(xiàn)象出現(xiàn)的原因包括但不限于以下幾種:

          • 服務(wù)無法及時下線:服務(wù)消費(fèi)者感知注冊中心服務(wù)列表存在延時,導(dǎo)致應(yīng)用下線后在一段時間內(nèi)服務(wù)消費(fèi)者仍然調(diào)用已下線應(yīng)用造成請求報錯。
          • 初始化慢:應(yīng)用剛啟動接收線上流量進(jìn)行資源初始化加載,由于流量太大,初始化過程慢,出現(xiàn)大量請求響應(yīng)超時、阻塞、資源耗盡從而造成剛啟動應(yīng)用宕機(jī)。
          • 注冊太早:服務(wù)存在異步資源加載問題,當(dāng)服務(wù)還未初始化完全就被注冊到注冊中心,導(dǎo)致調(diào)用時資源未加載完畢出現(xiàn)請求響應(yīng)慢、調(diào)用超時報錯等現(xiàn)象。
          • 發(fā)布態(tài)與運(yùn)行態(tài)未對齊:使用 Kubernetes 的滾動發(fā)布功能進(jìn)行應(yīng)用發(fā)布,由于Kubernetes 的滾動發(fā)布一般關(guān)聯(lián)的就緒檢查機(jī)制,是通過檢查應(yīng)用特定端口是否啟動作為應(yīng)用就緒的標(biāo)志來觸發(fā)下一批次的實例發(fā)布,但在微服務(wù)應(yīng)用中只有當(dāng)應(yīng)用完成了服務(wù)注冊才可對外提供服務(wù)調(diào)用。因此某些情況下會出現(xiàn)新應(yīng)用還未注冊到注冊中心,老應(yīng)用實例就被下線,導(dǎo)致無服務(wù)可用。

          無損下線

          其中的服務(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 無損上線方案

          如何使用 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ù)治理

          • 已創(chuàng)建 Kubernetes 集群,請參見創(chuàng)建 Kubernetes 托管版集群[1]。
          • 已開通 MSE 微服務(wù)治理專業(yè)版,請參見開通 MSE 微服務(wù)治理[2]

          準(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

          結(jié)果驗證一:無損下線功能

          由于我們對 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ā)生了請求流量損耗。

          結(jié)果驗證二:服務(wù)預(yù)熱功能

          我們在 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

          相關(guān)鏈接

          [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)載。


          主站蜘蛛池模板: 中文字幕日韩一区二区三区不卡| 精品国产乱子伦一区二区三区 | 亚洲国产综合无码一区| 亚州日本乱码一区二区三区| 精品视频一区二区| 国产91大片精品一区在线观看| 成人精品一区二区三区不卡免费看| 亚洲一区二区三区在线播放 | 亚洲av无码一区二区三区天堂古代| 久久久久人妻精品一区三寸蜜桃| 日本一区二区三区在线观看视频 | 无码人妻精品一区二区| 亚洲国产精品一区二区三区久久| 国产在线观看精品一区二区三区91| 国产日本亚洲一区二区三区| 精品三级AV无码一区| 日本在线一区二区| 久久se精品动漫一区二区三区| 日韩综合无码一区二区| 国产凹凸在线一区二区| 中文字幕一区二区三区永久| 国产精品一区二区三区99 | 91在线一区二区| 日韩免费一区二区三区在线播放| 少妇无码一区二区三区| 精品人妻中文av一区二区三区| 2021国产精品一区二区在线| 亚洲丰满熟女一区二区v| 亚洲精品国产suv一区88| 欧美激情国产精品视频一区二区| 成人一区二区三区视频在线观看| 国产精品美女一区二区三区 | V一区无码内射国产| www一区二区www免费| 夜夜添无码试看一区二区三区| 久久久国产精品亚洲一区| 激情无码亚洲一区二区三区| 视频一区二区三区在线观看| 任你躁国产自任一区二区三区 | 一区二区三区AV高清免费波多| 97久久精品午夜一区二区|