本篇文章源于他人創(chuàng)意的啟發(fā)與深入思考,我投入了大量時間與精力,致力于EdgeOne與HAI之間的協(xié)同調(diào)試,克服了眾多技術(shù)奇葩問題。通過不懈的努力,成功地將這兩個強大的平臺整合在一起,打造出一個還不錯的參考案例。這次探索也是我個人首次涉足邊緣函數(shù)式產(chǎn)品的實踐之旅。我希望通過分享這次的經(jīng)歷和成果,能夠激
在當今快速發(fā)展的數(shù)字時代,安全和速度已成為網(wǎng)絡(luò)服務(wù)的基石。EdgeOne,作為騰訊云提供的邊緣安全加速平臺,以其全球部署的節(jié)點和強大的安全防護功能,為用戶提供了穩(wěn)定而高效的網(wǎng)絡(luò)體驗。而HAI(HyperApplicationInventor),騰訊云推出的高性能應(yīng)用服務(wù),通過其易用的圖形化界面和豐富的模型庫,使得AI應(yīng)用開發(fā)變得觸手可及。本文將探討EdgeOne與HAI的結(jié)合如何為用戶提供一個既安全又高效的AI應(yīng)用開發(fā)環(huán)境。
不多說了,剩下的內(nèi)容都已經(jīng)在官方文檔中有詳細描述。就我們個人而言,EdgeOne具有以下主要優(yōu)點,并且我也附上了需要的關(guān)鍵文檔地址:
HAI提供了可視化交互界面,支持JupyterLab、WebUI等多種算力連接方式,使得用戶即使沒有深厚的編程背景也能輕松開發(fā)AI應(yīng)用。這種“有手就能開發(fā)”的設(shè)計理念,極大地降低了AI技術(shù)的應(yīng)用門檻。支持學術(shù)加速,通過線路自動擇優(yōu),能夠大幅提升主流學術(shù)資源平臺的訪問、下載速度。同時,HAI預(yù)裝了StableDiffusion、ChatGLM等熱門模型,用戶可以在數(shù)分鐘內(nèi)構(gòu)建自己的大語言模型、AI作畫等應(yīng)用環(huán)境。
這個話題不需要詳細討論了,我已經(jīng)整理了開發(fā)中需要了解的主要優(yōu)點和相關(guān)文檔,以便大家能夠快速入手開發(fā):
現(xiàn)在讓我們來探討一下為何可以采用聯(lián)動開發(fā)的方式。我們的目標是以最為經(jīng)濟實惠的價格部署我們的AI繪畫應(yīng)用。
我們接下來看下我們會用到哪些技術(shù):HTML、Javascript、CSS、Nginx、Python、邊緣函數(shù)中的各個API、Linux基本命令。
關(guān)于創(chuàng)建服務(wù)器的步驟,我就不再進行演示了,請直接查看官方教程,相關(guān)地址也已經(jīng)提供。我們將重點演示以下內(nèi)容:下載/上傳模型、通過WEB UI演示AI繪畫功能、下載并配置Nginx以監(jiān)聽80端口、啟動API接口服務(wù)。
這一步我當時使用過如何官方默認的JupyterLab頁面上傳,速度是真的很可觀~我直接放棄了。選擇了COS對象存儲。我們先去下載好看的模型。這里以https://civitai.com/ 為例。
模型下載到本地之后,去創(chuàng)建COS對象存儲服務(wù)。
如何創(chuàng)建這么簡單的教程,我就不演示了,我們直接看上傳和下載。這里創(chuàng)建存儲桶的時候,所屬地域一定要和你HAI繪畫服務(wù)器在一起。否則會產(chǎn)生很多額外的花銷。謹記~
進入存儲桶之后,直接點擊頁面的上傳文件即可,請選擇剛才下載的模型文件。上傳的過程中不要動瀏覽器,一旦刷新和關(guān)閉瀏覽器就會前功盡棄。
稍等片刻,然后點擊模型文件的詳情,進入基本信息頁面。在這里,請確保將權(quán)限設(shè)置為公有讀取,否則HAI服務(wù)器將無法下載到模型文件。然后,復制臨時鏈接。
我們進入已經(jīng)創(chuàng)建好的HAI服務(wù)器。
進入終端,使用一下幾個命令,下載模型文件到模型文件夾。
cd stable-diffusion-webui/models/Stable-diffusion
wget 臨時鏈接粘貼到此處
等待下載完畢。
讓我們前往WEB UI頁面,嘗試一下看看是否成功安裝了。
在WEB UI頁面上,選擇您自己的模型文件,并使用一段神奇的提示詞。當然,提示詞越好,生成的結(jié)果也會越好。如果有任何不清楚的地方,您可以參考您下載的模型附帶的教程。這樣基本上就沒有問題了。接下來,讓我們再來看看如何讓HAI提供站點服務(wù)。
依然是同樣的步驟,在JupyterLab中的終端中直接使用以下命令操作:
apt install nginx
進行安裝。
service nginx start
啟動服務(wù)。
當您直接使用IP地址在瀏覽器中訪問后,如果顯示以下界面,那就表示安裝成功了。
接下來,我們繼續(xù)修改Nginx的配置文件:
使用以下命令編輯配置文件:
vim /etc/nginx/sites-available/default
然后,在文件中添加以下配置:
# 配置/images路徑的訪問規(guī)則
location /images/ {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Expose-Headers' 'strict-origin-when-cross-origin';
alias /root/stable-diffusion-webui/outputs/star/images/; # 你的靜態(tài)頁面
expires 1d;
}
location /sdapi/ {
# Add CORS headers
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
proxy_pass http://127.0.0.1:7862/sdapi/;
if ($request_method = "OPTIONS"){
return 200;
}
}
這里配置了/images路徑的訪問規(guī)則以及API服務(wù)的代理。為什么要配置代理呢?這顯然是因為繪畫的API服務(wù)不支持跨域訪問,所以我們添加了一個反向代理。由于我們的請求是POST非簡單請求,因此瀏覽器還會發(fā)送一個OPTIONS的預(yù)檢請求。我也做了相應(yīng)的處理。以免跨域報錯。
修改完成后,使用命令
service nginx reload
來重新加載Nginx的配置。您可以看到我們配置的/images路徑對應(yīng)的文件。這個路徑您可以隨心配置,只要確保其中包含您自己的圖片即可。您可以選擇自己維護這些圖片,也可以通過程序生成。為了演示,我只簡單復制了幾張我使用AI繪畫出來的圖片。
讓我們通過Nginx來訪問一下圖片,以確保可以正常訪問。
在瀏覽器中輸入以下地址進行訪問:
http://你的IP/images/1.png
接下來,我們繼續(xù)調(diào)試API服務(wù)。請啟動HAI繪畫應(yīng)用的API服務(wù),使用以下命令:
python launch.py --nowebui --xformers --opt-split-attention --listen --port 7862
然后,在瀏覽器中輸入IP地址和端口號,后面加上/docs路徑即可正常訪問路徑了。
讓我們通過工具來測試一下,看看能否通過Nginx正常訪問接口。你可以隨意選擇一個接口路徑進行測試。我選擇了一個簡單的無請求參數(shù)的GET請求作為示例。通常情況下,這個請求會帶有端口號。
使用調(diào)試工具來調(diào)用一下Nginx配置的路徑,確保一切正常。
如果您還不確定的話,可以通過查看默認的Nginx訪問路徑來確認。您可以使用以下命令來實時查看日志:
tail -f /var/log/nginx/access.log
這樣您就可以確定API是否能夠被正確命中。
為了解決Nginx每次關(guān)機后無法正常啟動的難題,我們采取了一項巧妙的解決方案:將啟動命令直接寫入API啟動服務(wù)接口中,從而確保服務(wù)能夠在每次啟動時正確配置Nginx。具體操作如下:首先,我們需要找到項目中的launch.py文件。一旦找到了該文件,我們只需在其中添加幾行命令即可。這些命令將確保Nginx在服務(wù)器啟動時得到正確的配置,并能夠順利啟動。這種方法簡單而高效,能夠有效解決Nginx啟動問題,保證服務(wù)的穩(wěn)定性和可靠性。
代碼如下:
import subprocess
# 此處省略很多代碼~~
def main():
# 使用subprocess.run()執(zhí)行命令
result = subprocess.run(['service', 'nginx', 'start'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 檢查命令是否執(zhí)行成功
if result.returncode == 0:
print("Nginx 已成功啟動")
else:
print("啟動 Nginx 時出錯")
print("錯誤信息:", result.stderr)
# 此處省略很多代碼~~
為了驗證我們的解決方案的有效性,讓我們再次重新啟動API服務(wù),觀察是否能夠成功啟動Nginx。
通過以上步驟,我們的HAI高性能服務(wù)器已經(jīng)完成了基本配置。無論進行多少次關(guān)機重啟,我們的Nginx都會隨著API接口一起啟動,確保了系統(tǒng)的穩(wěn)定性和可靠性,F(xiàn)在,讓我們繼續(xù)深入探討EdgeOne的配置過程。
在配置EdgeOne時,首先需要確保完成無域名站點的配置,你可以直接參考官方文檔進行操作。接著,我們需要創(chuàng)建邊緣函數(shù)來實現(xiàn)相應(yīng)的緩存處理?紤]到你沒有企業(yè)版權(quán)限,因此無法使用四層加速,但可以通過邊緣函數(shù)來達到類似的效果。關(guān)于邊緣函數(shù)中代碼的具體使用問題,我建議你仔細閱讀官方文檔,其中包含了詳細的操作指南和示例代碼,可以幫助你快速上手。你可以點擊以下鏈接查看官方文檔: EdgeOne 官方文檔
在配置邊緣函數(shù)時,你可以選擇Hello World模板作為起點,然后依次點擊下一步進行配置。雖然選擇了Hello World模板,但它只是一個起點,我們將在此基礎(chǔ)上進行深入的定制,以實現(xiàn)我們所需要的功能。
完成所有配置后,系統(tǒng)會為你生成一個默認的域名。接下來,我們需要編寫代碼來實現(xiàn)功能。通常情況下,我會額外編寫一個test函數(shù),專門用于測試。當然,如果你覺得不需要,也可以忽略。在這次配置中,我們創(chuàng)建了兩個邊緣函數(shù)。這些函數(shù)已經(jīng)經(jīng)過我封裝,通過最小的變動來應(yīng)對HAI服務(wù)器外網(wǎng)IP的變化,確保了系統(tǒng)的穩(wěn)定性和可靠性。
一個繪畫應(yīng)用的關(guān)鍵之一在于能夠提供優(yōu)質(zhì)的圖片展示功能。畢竟,畫作的視覺效果是吸引用戶的關(guān)鍵之一。缺少了圖片展示功能,這個應(yīng)用就好比是一本沒有插圖的畫冊,缺乏吸引力,難以引起用戶的興趣。
async function fetchJquery(event, request) {
const cache = caches.default;
// 緩存沒有命中,回源并緩存
let response = await fetch(request);
// 在響應(yīng)頭添加 Cahe-Control,設(shè)置緩存時長 10s
response.headers.append('Cache-Control', 's-maxage=600');
event.waitUntil(cache.put(request, response.clone()));
// 未命中緩存,設(shè)置響應(yīng)頭標識
response.headers.append('x-edgefunctions-cache', 'miss');
return response;
}
async function handleEvent(event) {
const urlInfo = new URL(event.request.url);
var url = new URL(event.request.url);
var ip = url.searchParams.get('ip');
// 請求非圖片資源
if (!/\.(jpe?g|png)$/.test(urlInfo.pathname)) {
return event.respondWith(new Response('Error thrown 沒命中圖片URL' + urlInfo.pathname));
}
// 資源地址,也作為緩存鍵
const request = new Request(ip + urlInfo.pathname);
// 緩存默認實例
const cache = caches.default;
try {
// 獲取關(guān)聯(lián)的緩存內(nèi)容,緩存過,接口底層不主動回源,拋出 504 錯誤
let response = await cache.match(request);
// 緩存不存在,重新獲取遠程資源
if (!response) {
return fetchJquery(event, request);
}
// 命中緩存,設(shè)置響應(yīng)頭標識
response.headers.append('x-edgefunctions-cache', 'hit');
return response;
} catch (e) {
await cache.delete(request);
// 緩存過期或其他異常,重新獲取遠程資源
return fetchJquery(event, request);
}
}
addEventListener('fetch', (event) => {
event.respondWith(handleEvent(event));
});
這段代碼的主要功能是用于處理網(wǎng)絡(luò)請求并管理資源的緩存策略,確?焖夙憫(yīng)用戶請求的同時,減少不必要的網(wǎng)絡(luò)流量。
fetchJquery
函數(shù):
fetch
函數(shù)發(fā)起網(wǎng)絡(luò)請求,獲取資源的最新響應(yīng)。
Cache-Control
,設(shè)置資源在服務(wù)端緩存中的最長有效時間為600秒。
cache.put
方法將獲取的響應(yīng)克隆一份并存入緩存中,以便后續(xù)請求可以直接從緩存中獲取。
x-edgefunctions-cache
為
miss
,表示這是一個未命中緩存的請求。
handleEvent
函數(shù):
x-edgefunctions-cache
為
hit
,表示這是一個命中緩存的請求,并返回緩存中的資源。
fetchJquery
函數(shù)獲取資源。
在訪問圖片資源時,需要特別注意的是,我采用了路徑后面的 IP 參數(shù)進行訪問。這是因為 HAI 每次重啟后外網(wǎng) IP 都會發(fā)生變化,如果每次都要修改每個邊緣函數(shù)的話,會相當繁瑣。為了避免這種情況,我選擇通過參數(shù)傳遞的方式來獲取圖片資源。這樣一來,獲取圖片資源的邊緣函數(shù)就不需要再進行任何修改了。另外,你還需要對匹配觸發(fā)規(guī)則進行配置,比如我設(shè)置的規(guī)則是包含 "/images" 的路徑才會觸發(fā)相應(yīng)的操作。
在瀏覽器中輸入默認域名,并隨意添加 "/images/*.png" 即可訪問相應(yīng)圖片,前提是該圖片存儲于我們的服務(wù)器上,F(xiàn)在讓我們來觀察一下效果。值得注意的是,這種方式的命中率并不是很高,所以在剛部署完邊緣函數(shù)后,需要多刷新幾次才能看到效果。
這個邊緣函數(shù)專門用于處理用戶交互。
const html = `
AI錕斤拷圖
錕斤拷圖錕斤拷錕?/h2>
錕僥憋拷錕斤拷錕斤拷
`;
async function handleRequest(request) {
return new Response(html, {
headers: {
'content-type': 'text/html; charset=UTF-8',
'x-edgefunctions-test': 'Welcome to use Edge Functions.',
},
});
}
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
錕斤拷未錕斤拷攵拷錕斤拷錕揭伙拷錕紿TML頁錕芥,錕斤拷錕斤拷展示一錕斤拷AI錕斤拷圖應(yīng)錕矯碉拷錕矯伙拷錕斤拷錕芥,錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷之錕斤拷錕斤拷錕斤拷JavaScript錕斤拷錕誡。錕斤拷要錕斤拷錕杰猴拷錕斤拷剎錕斤拷錕斤拷錕斤拷攏錕?
container
錕斤拷錕斤拷錕節(jié)詫拷錕斤拷錕斤拷錕斤拷錕斤拷要錕斤拷錕街o拷錕斤拷圖錕斤拷錕秸故撅拷錕斤拷謀錕斤拷錕斤拷錕斤拷錕斤拷搿?
image-container
錕斤拷錕斤拷錕斤拷展示AI錕斤拷錕繳碉拷圖錕斤拷
text-description
錕斤拷
text-description2
錕斤拷錕斤拷錕矯伙拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕酵鳳拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷指錕斤拷AI錕斤拷圖錕斤拷
generate-button
錕斤拷錕斤拷錕節(jié)達拷錕斤拷AI錕斤拷圖錕斤拷錕教★拷
createImageList
錕斤拷錕斤拷錕斤拷錕斤拷態(tài)錕斤拷錕斤拷一錕斤拷圖片錕叫憋拷錕斤拷展示錕斤拷頁錕斤拷錕較★拷
generate-button
錕斤拷鈕錕僥碉拷錕斤拷錄錕斤拷錕斤拷占錕斤拷?jīng)]錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷選錕斤拷牟錕斤拷錕斤拷錕斤拷錕斤拷錕揭伙拷錕紸I錕斤拷圖錕斤拷錕襟,詫拷錕斤拷錕酵碉拷錕斤拷錕斤拷錕斤拷錕斤拷
XMLHttpRequest
錕斤拷錕斤拷錕斤拷POST錕斤拷錕斤拷指錕斤拷錕僥鳳拷錕斤拷錕斤拷錕斤拷址錕斤拷錕斤拷錕斤拷錕斤拷應(yīng)錕斤拷錕斤拷態(tài)錕斤拷錕斤拷頁錕斤拷錕較碉拷圖錕斤拷錕斤拷錕斤拷錕斤拷展示錕斤拷錕繳碉拷圖錕斤拷
錕斤拷錕角匡拷一錕斤拷錕斤拷錕斤拷效錕斤拷錕斤拷
錕斤拷錕窖撅拷錕斤拷 IP 錕斤拷址錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕餃鳳拷錕斤拷錕叫★拷錕斤拷潿拷錕斤拷錕斤拷錕斤拷錕斤拷要錕斤拷錕斤拷錕斤拷只錕斤拷錕斤拷錕?IP 錕斤拷址錕斤拷然錕斤拷錕斤拷錕鉸詫拷錕金即匡拷錕斤拷錕鉸鳳拷錕絞★拷
錕斤拷錕斤拷錕斤拷錕劫次觀詫拷一錕斤拷錕斤拷錕斤拷圖片錕斤拷效錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕絞憋拷錕斤拷錕教拷涌詰錕斤拷錕接σ詫拷錕斤拷錕斤拷錕斤拷錕斤拷摹錕?
錕斤拷錕斤拷確實錕斤拷錕斤拷錕斤拷錕斤拷錕秸間,錕斤拷錕斤拷細錕斤拷錕斤拷錕揭伙拷攏錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕杰籌拷錕斤拷模錕酵碉拷錕斤拷錕斤拷錕較★拷錕斤拷錕界,錕斤拷錕節(jié)匡拷錕竭比詫拷錕斤拷錕斤拷錕斤拷錕斤拷錕轎碉拷圖錕今,匡拷錕斤拷錕斤拷微錕斤拷一錕斤拷錕斤拷一錕姐。錕斤拷錕斤拷錕斤拷錕繳碉拷圖錕斤拷錕斤拷錕竭癸拷錕斤拷錕皆★拷錕斤拷錕斤拷些錕斤拷錕解都錕角匡拷錕斤拷通錕斤拷錕斤拷錕皆斤拷錕斤拷摹錕斤拷艿錕斤拷錕剿碉拷錕斤拷錕斤拷塹錕紼dgeOne錕斤拷HAI錕斤拷錕轎伙拷錕斤拷錕斤拷錕窖撅拷取錕斤拷錕剿階訛拷錕皆的成癸拷錕斤拷錕斤拷錕角革拷一錕斤拷錕斤拷錕剿★拷
錕斤拷篇錕斤拷錕斤拷源錕斤拷錕斤拷錕剿達拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕剿鹼拷錕斤拷錕斤拷錕酵訛拷錕斤拷舜錕斤拷錕絞憋拷錕斤拷刖拷錕斤拷錕斤拷錕斤拷錕斤拷錕紼dgeOne錕斤拷HAI之錕斤拷錕叫拷錕斤拷裕錕斤拷朔錕斤拷錕斤拷詼嗉鹼拷錕斤拷錕斤拷錕斤拷錕斤拷。通锟藉K斤拷錕叫革拷錕腳拷錕斤拷錕斤拷曬錕斤拷亟錕斤拷錕斤拷錕斤拷錕角匡拷錕斤拷平臺錕斤拷錕斤拷錕斤拷一錕金,達拷錕斤拷錕揭伙拷錕斤拷錕斤拷錕斤拷錕斤拷牟慰錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷探錕斤拷也錕斤拷錕揭革拷錕斤拷錕階達拷錕斤拷錕斤拷錕皆碉拷錕斤拷錕絞斤拷錕狡鳳拷錕絞碉拷錕街拷謾錕斤拷錕較o拷錕酵拷錕斤拷錕斤拷錕斤拷錕轎的撅拷錕斤拷錕酵成癸拷錕斤拷錕杰癸拷錕斤拷錕斤拷錕斤拷錕斤拷錕剿訛拷錕斤拷些前錕截鹼拷錕斤拷錕斤拷錕斤拷趣錕斤拷探錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕揭碉拷錕斤拷目錕斤拷錕斤拷趣錕斤拷錕斤拷錕竭達拷錕叫伙拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕街э拷鄭錕揭詫拷錕接拷錕階拷遙錕揭伙拷錕斤拷錕窖幫拷錕斤拷錕酵拷錕斤拷錕斤拷錕?
全錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷ERA5錕斤拷錕斤拷錕截鳳拷錕斤拷
錕僥訛拷錕斤拷錕斤拷學習錕斤拷錕斤拷錕斤拷錕界構(gòu)錕斤拷錕斤拷錕鉸o拷
錕僥訛拷錕斤拷為Mate品錕斤拷盛錕戒:HarmonyOS NEXT錕接籌拷錕斤拷錕斤拷戲錕斤拷錕杰得碉拷錕斤拷錕斤拷頭錕?/a>
錕僥訛拷實錕街訛拷錕襟集猴拷錕斤拷DataTable錕斤拷錕潔互轉(zhuǎn)錕斤拷
錕僥訛拷錕斤拷錕斤拷NEXT元錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕窖匡拷錕斤拷錕較鹼拷錕斤拷品
錕僥訛拷錕結(jié)巢錕斤拷錕叫★拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕狡鹼拷錕截閉鳳拷錕斤拷
錕僥訛拷錕斤拷錕斤拷錕紸rcMap錕斤拷錕斤拷錕叫斤拷錕斤拷柵錕斤拷圖錕斤拷錕截詫拷錕斤拷錕斤拷錕斤拷
錕僥訛拷錕姐法錕斤拷錕斤拷錕捷結(jié)構(gòu) 1 - 模錕斤拷
錕僥訛拷錕斤拷訊錕斤拷錕斤拷錕竭客鳳拷錕斤拷營錕斤拷系統(tǒng)錕斤拷錕斤拷
錕僥訛拷錕斤拷錕節(jié)猴拷錕斤拷NEXT錕斤拷血錕斤拷錕腳達拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷
錕僥訛拷5. Spring Cloud OpenFeign 錕斤拷錕斤拷式 WebService 錕酵伙拷錕剿的籌拷錕斤拷細使錕斤拷
錕僥訛拷Java錕斤拷錕斤拷模式錕斤拷錕斤拷態(tài)錕斤拷錕斤拷錕酵訛拷態(tài)錕斤拷錕斤拷錕僥對比鳳拷錕斤拷
錕僥訛拷Win11錕絞記憋拷錕斤拷錕皆訛拷錕斤拷錕斤拷應(yīng)錕矯碉拷錕斤拷色錕斤拷錕斤拷示錕斤拷錕斤拷
錕僥訛拷錕斤拷錕節(jié)猴拷錕斤拷錕斤拷錕斤拷系錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕?/a>錕斤拷錕斤拷站錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕狡鹼拷錕斤拷錕斤拷
頻錕斤拷 錕斤拷錕斤拷頻錕斤拷錕斤拷錕斤拷錕斤拷專錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷卓錕斤拷錕斤拷錕?/a>錕斤拷app錕斤拷錕斤拷
錕狡鹼拷 錕斤拷原錕斤拷錕斤拷錕斤拷錕斤拷錕鉸幫拷錕斤拷錕斤拷錕斤拷錕杰匡拷錕斤拷錕斤拷錕截詫拷錕斤拷
錕斤拷錕斤拷 錕斤拷錕斤拷色錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷 錕斤拷錕斤拷錕?/a>錕斤拷錕斤拷戰(zhàn)錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷
掃錕斤拷維錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕街伙拷錕芥本錕斤拷
掃錕斤拷維錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷微錕腳癸拷錕節(jié)號o拷
錕斤拷站錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕斤拷錕較達拷錕斤拷錕斤拷錕斤拷錕街鳳拷錕斤拷陌錕餃拷錕斤拷敕拷始錕?a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7011141d191e3018111f04155e131f1d">[email protected]
錕斤拷ICP錕斤拷2022002427錕斤拷-10 錕芥公錕斤拷錕斤拷錕斤拷錕斤拷43070202000427錕斤拷© 2013~2025 haote.com 錕斤拷錕斤拷錕斤拷