件簡介:無損音樂軟件鑒別檢測軟件,使用非常簡單。
適用平臺:Windows
軟件名稱:Loseless Audio Validator(無損音樂校驗助手)
首先普及一下音樂文件常識:
音樂文件播放格式分為有損壓縮和無損壓縮兩種。常見到的MP3、WMA、OGG被稱為有損壓縮,有損壓縮顧名思義就是降低音頻采樣頻率與比特率,輸出的音頻文件會比原文件小。另一種音頻壓縮被稱為無損壓縮,能夠在100%保存原文件的所有數據的前提下,將音頻文件的體積壓縮的更小,而將壓縮后的音頻文件還原后,能夠實現與源文件相同的大小、相同的碼率。無損壓縮格式常見的、主流的無損壓縮格式有APE、FLAC、TTA、TAK。百度百科
有人就說了,那我直接看文件格式和文件大小不就得了嗎?
NO!這個方法是非常不可靠的!
很多假無損,要么是原CD碟為盜版碟,要么文件是由早期磁帶轉錄而成,即盒帶數字化,要么由MP3等有損轉錄的,從容量和文件格式來看,根本看不出來!坑爹啊,這種人!
關于這些基礎知識,這個貼文說的比較清楚,這里不再贅述。
去偽存真 這幾招教你辨析真假無損音樂(全文)_音頻HiFi-中關村在線sound.zol.com.cn/599/5991974_all.html
以往檢測音樂,一般都是使用頻譜軟件,譬如Adobe Audition等專業軟件,但是這類軟件使用復雜、而且專業性強。
下面小編介紹的這款軟件,使用非常的簡單。
文件導入軟件界面后,點擊菜單欄“校驗”按鈕,即可開始驗證無損文件真偽。文件名前面打對號“√”綠色顯示的即真無損;前面打問號“?”或者“!”顯示的判定為假無損,顯示“MPEG(表示由低劣MP3轉換而成)。從驗證結果圖中,我們還看到“正確率”一欄,表示的是判定結果的準確程度。當然,100%的CDDA是理想狀態;其實,只要結果是“CDDA”就可以接受。
上面的假無損是小編下載的192碼率的MP3音樂文件,然后將其轉換成flac格式,體積高達66M,可見使用擴展名和容量判斷真假無損是極不準確的!
TML5 是第五個且是當前的 HTML 版本,它是用于在萬維網上構建和呈現內容的標記語言。本文將幫助讀者了解它。 -- Palak Shah
本文導航
-新標簽和元素 …… 08%
-HTML5 的高級功能 …… 16%
-地理位置 …… 16%
-網絡存儲 …… 33%
-應用緩存(AppCache) …… 44%
-視頻 …… 50%
-音頻 …… 61%
-畫布(Canvas) …… 71%
-HTML5 工具 …… 78%
編譯自: http://opensourceforu.com/2017/06/introduction-to-html5/作者: Palak Shah
譯者: geekpi
HTML5 是第五個且是當前的 HTML 版本,它是用于在萬維網上構建和呈現內容的標記語言。本文將幫助讀者了解它。
HTML5 通過 W3C 和Web 超文本應用技術工作組Web Hypertext Application Technology Working Group之間的合作發展起來。它是一個更高版本的 HTML,它的許多新元素可以使你的頁面更加語義化和動態。它是為所有人提供更好的 Web 體驗而開發的。HTML5 提供了很多的功能,使 Web 更加動態和交互。
HTML5 的新功能是:
新標簽,如 <header> 和 <section>
用于 2D 繪圖的 <canvas> 元素
本地存儲
新的表單控件,如日歷、日期和時間
新媒體功能
地理位置
HTML5 還不是正式標準(LCTT 譯注:HTML5 已于 2014 年成為“推薦標準”),因此,并不是所有的瀏覽器都支持它或其中一些功能。開發 HTML5 背后最重要的原因之一是防止用戶下載并安裝像 Silverlight 和 Flash 這樣的多個插件。
語義化元素: 圖 1 展示了一些有用的語義化元素。
表單元素: HTML5 中的表單元素如圖 2 所示。
圖形元素: HTML5 中的圖形元素如圖 3 所示。
媒體元素: HTML5 中的新媒體元素如圖 4 所示。
圖 1:語義化元素
圖 2:表單元素
圖 3:圖形元素
圖 4:媒體元素
地理位置
這是一個 HTML5 API,用于獲取網站用戶的地理位置,用戶必須首先允許網站獲取他或她的位置。這通常通過按鈕和/或瀏覽器彈出窗口來實現。所有最新版本的 Chrome、Firefox、IE、Safari 和 Opera 都可以使用 HTML5 的地理位置功能。
地理位置的一些用途是:
公共交通網站
出租車及其他運輸網站
電子商務網站計算運費
旅行社網站
房地產網站
在附近播放的電影的電影院網站
在線游戲
網站首頁提供本地標題和天氣
工作職位可以自動計算通勤時間
工作原理: 地理位置通過掃描位置信息的常見源進行工作,其中包括以下:
全球定位系統(GPS)是最準確的
網絡信號 - IP地址、RFID、Wi-Fi 和藍牙 MAC地址
GSM/CDMA 蜂窩 ID
用戶輸入
該 API 提供了非常方便的函數來檢測瀏覽器中的地理位置支持:
if (navigator.geolocation) {// do stuff
}
getCurrentPosition API 是使用地理位置的主要方法。它檢索用戶設備的當前地理位置。該位置被描述為一組地理坐標以及航向和速度。位置信息作為位置對象返回。
語法是:
getCurrentPosition(showLocation, ErrorHandler, options);
showLocation:定義了檢索位置信息的回調方法。
ErrorHandler(可選):定義了在處理異步調用時發生錯誤時調用的回調方法。
options (可選): 定義了一組用于檢索位置信息的選項。
我們可以通過兩種方式向用戶提供位置信息:測地和民用。
描述位置的測地方式直接指向緯度和經度。
位置信息的民用表示法是人類可讀的且容易理解。
如下表 1 所示,每個屬性/參數都具有測地和民用表示。
圖 5 包含了一個位置對象返回的屬性集。
圖5:位置對象屬性
網絡存儲
在 HTML 中,為了在本機存儲用戶數據,我們需要使用 JavaScript cookie。為了避免這種情況,HTML5 已經引入了 Web 存儲,網站利用它在本機上存儲用戶數據。
與 Cookie 相比,Web 存儲的優點是:
更安全
更快
存儲更多的數據
存儲的數據不會隨每個服務器請求一起發送。只有在被要求時才包括在內。這是 HTML5 Web 存儲超過 Cookie 的一大優勢。
有兩種類型的 Web 存儲對象:
本地 - 存儲沒有到期日期的數據。
會話 - 僅存儲一個會話的數據。
如何工作: localStorage 和 sessionStorage 對象創建一個 key=value 對。比如: key="Name", value="Palak"。
這些存儲為字符串,但如果需要,可以使用 JavaScript 函數(如 parseInt() 和 parseFloat())進行轉換。
下面給出了使用 Web 存儲對象的語法:
存儲一個值:
localStorage.setItem("key1", "value1");
localStorage["key1"]="value1";
得到一個值:
alert(localStorage.getItem("key1"));
alert(localStorage["key1"]);
刪除一個值: -removeItem("key1");
刪除所有值:
localStorage.clear();
應用緩存(AppCache)
使用 HTML5 AppCache,我們可以使 Web 應用程序在沒有 Internet 連接的情況下脫機工作。除 IE 之外,所有瀏覽器都可以使用 AppCache(截止至此時)。
應用緩存的優點是:
網頁瀏覽可以脫機
頁面加載速度更快
服務器負載更小
cache manifest 是一個簡單的文本文件,其中列出了瀏覽器應緩存的資源以進行脫機訪問。 manifest 屬性可以包含在文檔的 HTML 標簽中,如下所示:
<html manifest="test.appcache">...
</html>
它應該在你要緩存的所有頁面上。
緩存的應用程序頁面將一直保留,除非:
用戶清除它們
manifest 被修改
緩存更新
視頻
在 HTML5 發布之前,沒有統一的標準來顯示網頁上的視頻。大多數視頻都是通過 Flash 等不同的插件顯示的。但 HTML5 規定了使用 video 元素在網頁上顯示視頻的標準方式。
目前,video 元素支持三種視頻格式,如表 2 所示。
下面的例子展示了 video 元素的使用:
<! DOCTYPE HTML><html>
<body>
<video src=" vdeo.ogg" width="320" height="240" controls="controls">
This browser does not support the video element.
</video>
</body>
</html>
例子使用了 Ogg 文件,并且可以在 Firefox、Opera 和 Chrome 中使用。要使視頻在 Safari 和未來版本的 Chrome 中工作,我們必須添加一個 MPEG4 和 WebM 文件。
video 元素允許多個 source 元素。source 元素可以鏈接到不同的視頻文件。瀏覽器將使用第一個識別的格式,如下所示:
<video width="320" height="240" controls="controls"><source src="vdeo.ogg" type="video/ogg" />
<source src=" vdeo.mp4" type="video/mp4" />
<source src=" vdeo.webm" type="video/webm" />
This browser does not support the video element.
</video>
圖6:Canvas 的輸出
音頻
對于音頻,情況類似于視頻。在 HTML5 發布之前,在網頁上播放音頻沒有統一的標準。大多數音頻也通過 Flash 等不同的插件播放。但 HTML5 規定了通過使用音頻元素在網頁上播放音頻的標準方式。音頻元素用于播放聲音文件和音頻流。
目前,HTML5 audio 元素支持三種音頻格式,如表 3 所示。
audio 元素的使用如下所示:
<! DOCTYPE HTML><html>
<body>
<audio src=" song.ogg" controls="controls">
This browser does not support the audio element.
</video>
</body>
</html>
此例使用 Ogg 文件,并且可以在 Firefox、Opera 和 Chrome 中使用。要在 Safari 和 Chrome 的未來版本中使 audio 工作,我們必須添加一個 MP3 和 Wav 文件。
audio 元素允許多個 source 元素,它可以鏈接到不同的音頻文件。瀏覽器將使用第一個識別的格式,如下所示:
<audio controls="controls"><source src="song.ogg" type="audio/ogg" />
<source src="song.mp3" type="audio/mpeg" />
This browser does not support the audio element.
</audio>
畫布(Canvas)
要在網頁上創建圖形,HTML5 使用 畫布 API。我們可以用它繪制任何東西,并且它使用 JavaScript。它通過避免從網絡下載圖像而提高網站性能。使用畫布,我們可以繪制形狀和線條、弧線和文本、漸變和圖案。此外,畫布可以讓我們操作圖像中甚至視頻中的像素。你可以將 canvas 元素添加到 HTML 頁面,如下所示:
<canvas id="myCanvas" width="200" height="100"></canvas>
畫布元素不具有繪制元素的功能。我們可以通過使用 JavaScript 來實現繪制。所有繪畫應在 JavaScript 中。
<script type="text/javascript">var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
cxt.fillStyle="blue";
cxt.storkeStyle="red";
cxt.fillRect(10,10,100,100);
cxt.storkeRect(10,10,100,100);
</script>
以上腳本的輸出如圖 6 所示。
你可以繪制許多對象,如弧、圓、線/垂直梯度等。
為了有效操作,所有熟練的或業余的 Web 開發人員/設計人員都應該使用 HTML5 工具,當需要設置工作流/網站或執行重復任務時,這些工具非常有幫助。它們提高了網頁設計的可用性。
以下是一些幫助創建很棒的網站的必要工具。
HTML5 Maker: 用來在 HTML、JavaScript 和 CSS 的幫助下與網站內容交互。非常容易使用。它還允許我們開發幻燈片、滑塊、HTML5 動畫等。
Liveweave: 用來測試代碼。它減少了保存代碼并將其加載到屏幕上所花費的時間。在編輯器中粘貼代碼即可得到結果。它非常易于使用,并為一些代碼提供自動完成功能,這使得開發和測試更快更容易。
Font dragr: 在瀏覽器中預覽定制的 Web 字體。它會直接載入該字體,以便你可以知道看起來是否正確。也提供了拖放界面,允許你拖動字形、Web 開放字體和矢量圖形來馬上測試。
HTML5 Please: 可以讓我們找到與 HTML5 相關的任何內容。如果你想知道如何使用任何一個功能,你可以在 HTML Please 中搜索。它提供了支持的瀏覽器和設備的有用資源的列表,語法,以及如何使用元素的一般建議等。
Modernizr: 這是一個開源工具,用于給訪問者瀏覽器提供最佳體驗。使用此工具,你可以檢測訪問者的瀏覽器是否支持 HTML5 功能,并加載相應的腳本。
Adobe Edge Animate: 這是必須處理交互式 HTML 動畫的 HTML5 開發人員的有用工具。它用于數字出版、網絡和廣告領域。此工具允許用戶創建無瑕疵的動畫,可以跨多個設備運行。
Video.js: 這是一款基于 JavaScript 的 HTML5 視頻播放器。如果要將視頻添加到你的網站,你應該使用此工具。它使視頻看起來不錯,并且是網站的一部分。
The W3 Validator: W3 驗證工具測試 HTML、XHTML、SMIL、MathML 等中的網站標記的有效性。要測試任何網站的標記有效性,你必須選擇文檔類型為 HTML5 并輸入你網頁的 URL。這樣做之后,你的代碼將被檢查,并將提供所有錯誤和警告。
HTML5 Reset: 此工具允許開發人員在 HTML5 中重寫舊網站的代碼。你可以使用這些工具為你網站的訪問者提供一個良好的網絡體驗。
Palak Shah
作者是高級軟件工程師。她喜歡探索新技術,學習創新概念。她也喜歡哲學。你可以通過 palak311@gmail.com[1] 聯系她。
via: http://opensourceforu.com/2017/06/introduction-to-html5/
作者:Palak Shah[2] 譯者:geekpi 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
多用戶量大并發度高的應用系統為了避免發布過程中的流量有損,一般選擇在流量較小的半夜發布,雖然這樣做有效果,但不可控導致背后的研發運維成本對企業來說是一筆不小的負擔。基于此,阿里云微服務引擎 MSE 在應用發布過程中,通過應用下線時進行自適應等待+主動通知,應用上線時就緒檢查與微服務生命周期對齊+服務預熱等技術手段所提供的微服務應用無損上下線功能,能有效幫助企業規避線上發布所出現的流量資損。
常見的流量有損現象出現的原因包括但不限于以下幾種:
無損下線
其中的服務無法及時下線問題,如下圖 1 所示:
圖1. Spring Cloud 應用消費者無法及時感知提供者服務下線
對于 Spring Cloud 應用,當應用的兩個實例 A’ 和 A 中的 A 下線時,由于 Spring Cloud 框架為了在可用性和性能方面做平衡,消費者默認是 30s 去注冊中心拉取最新的服務列表,因此 A 實例的下線不能被實時感知,此時消費者繼續通過本地緩存繼續調用 A 就會出現調用已下線實例出現流量有損。
針對該問題,阿里云微服務引擎 MSE 基于 Java Agent 字節碼技術設計實現的無損下線功能如下圖 2 所示:
圖2. 無損下線方案
在該套無損下線方案中,服務提供者應用僅需接入 MSE,相比一般的有損下線。應用在下線前會有一段自適應等待時期,該時期待下線應用會通過主動通知的方式,向其在自適應等待階段發送了請求的服務消費者發送下線事件,消費者接收到下線事件后會主動拉取注冊中心服務實例列表以便實時感知應用下線事件避免調用已下線實例造成應用下線流量有損。
無損上線
延遲加載是軟件框架設計中最常見的一種策略,例如在 Spring Cloud 框架中 Ribbon 組件的拉取服務列表初始化時機默認是要等到服務的第 1 次調用時刻,例如下圖 3 是 Spring Cloud 應用中第 1 次和第 2 次通過 RestTemplate 調用遠程服務的請求耗時情況:
圖3. 應用啟動資源初始化與正常運行過程中耗時情況對比
由測試結果可見,第一次調用由于進行了一些資源初始化,耗時是正常情況的數倍之多。因此把新應用發布到線上直接處理大流量極易出現大量請求響應慢,資源阻塞,應用實例宕機的現象。針對該類大流量下應用資源初始化慢問題,MSE 提供的小流量預熱功能通過調節剛上線應用所分配的流量幫助其在進行充分預熱后再處理正常流量從而對新實例進行保護。小流量預熱過程如下圖 4 所示:
圖4. 小流量服務預熱過程 QPS 與啟動時間關系圖
除了針對上述應用第一次調用初始化慢所造成的有損上線問題,MSE 還提供了資源預建連接、延遲注冊、確保 Kubernetes 就緒檢查通過前完成服務注冊和確保 Kubernetes 就緒檢查通過前完成服務預熱等一整套無損上線手段來滿足各類不同應用的無損上線需求,整套方案如圖 5 所示:
圖5. MSE 無損上線方案
接下來將演示阿里云微服務引擎 MSE 在應用發布時提供的無損上下線和服務預熱能力最佳實踐。假設應用的架構由 Zuul 網關以及后端的微服務應用實例(Spring Cloud)構成。具體的后端調用鏈路有購物車應用 A,交易中心應用 B,庫存中心應用 C,這些應用中的服務之間通過 Nacos 注冊中心實現服務注冊與發現。
前提條件
開啟 MSE 微服務治理
準備工作
注意,本實踐所使用的 Agent 目前還在灰度中,需要對應用 Agent 進行灰度升級,升級文檔:
https://help.aliyun.com/document_detail/392373.html
應用部署在不同的 Region(暫時僅支持國內 Region)請使用對應的 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/
應用部署流量架構圖
圖6. 演示應用部署架構
流量壓力來源
在 spring-cloud-zuul 應用中,如圖 6 所示,其分別向 spring-cloud-a 的灰度版本和正常版本以 QPS 為 100 的速率同時進行服務調用。
部署 Demo 應用程序
將下面的內容保存到一個文件中,假設取名為 mse-demo.yaml,并執行 kubectl apply -f mse-demo.yaml 以部署應用到提前創建好的 Kubernetes 集群中(注意因為 demo 中有 CronHPA 任務,所以請先在集群中安裝 ack-kubernetes-cronhpa-controller 組件,具體在容器服務-Kubernetes->市場->應用目錄中搜索組件在測試集群中進行安裝),這里我們將要部署 Zuul,A, B 和 C 三個應用,其中 A、B 兩個應用分別部署一個基線版本和一個灰度版本,B 應用的基線版本關閉了無損下線能力,灰度版本開啟了無損下線能力。C 應用開啟了服務預熱能力,其中預熱時長為 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 應用
---
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 應用 base 版本,開啟按照機器緯度全鏈路透傳
---
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 應用 gray 版本,開啟按照機器緯度全鏈路透傳
---
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 應用 base 版本,關閉無損下線能力
---
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 應用 gray 版本,默認開啟無損下線功能
---
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 應用 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 網關開啟 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 應用暴露 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 應用均開啟了定時 HPA,模擬每 5 分鐘進行一次定時的擴縮容。
登錄 MSE 控制臺,進入微服務治理中心->應用列表->spring-cloud-a->應用詳情,從應用監控曲線,我們可以看到 spring-cloud-a 應用的流量數據:
gray 版本的流量在 pod 擴縮容的過程中請求錯誤數為 0,無流量損失。未打標的版本由于關閉了無損下線功能,在 pod 擴縮容的過程中有 20 個從 spring-cloud-a 發到 spring-cloud-b 的請求出現報錯,發生了請求流量損耗。
我們在 spring-cloud-c 應用開啟了定時 HPA 模擬應用上線過程,每隔 5 分鐘做一次伸縮,在擴縮容周期內第 2 分鐘第 0 秒縮容到 1 個節點,第 2 分鐘第 10 秒擴容到 2 個節點。
在預熱應用的消費端 spring-cloud-b 開啟服務預熱功能。
在預熱應用的服務提供端 spring-cloud-c 開啟服務預熱功能。預熱時長配置為 120 秒。
觀察節點的流量,發現節點流量緩慢上升。并且能看到節點的預熱開始和結束時間,以及相關的事件。
從上圖可以看到開啟預熱功能的應用重啟后的流量會隨時間緩慢增加,在一些應用啟動過程中需要預建連接池和緩存等資源的慢啟動場景,開啟服務預熱能有效保護應用啟動過程中緩存資源有序創建保障應用安全啟動從而實現應用上線的流量無損。
方案介紹 & 實操
更多方案設計細節,請點擊下方鏈接觀看微服務應用如何實現無損上下線主題直播視頻回放:
https://yqh.aliyun.com/live/detail/27936
[1]創建 Kubernetes 托管版集群:https://help.aliyun.com/document_detail/95108.htm#task-skz-qwk-qfb
[2]開通 MSE 微服務治理:https://help.aliyun.com/document_detail/347625.htm#task-2140253
原文鏈接:https://developer.aliyun.com/article/872430?utm_content=g_1000331001
本文為阿里云原創內容,未經允許不得轉載。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。