API網(wǎng)關(guān) API Gateway)提供高性能、高可用的 API 托管服務(wù),幫助用戶對(duì)外開(kāi)放其部署在 ECS、容器服務(wù)等阿里云產(chǎn)品上的應(yīng)用,提供完整的 API 發(fā)布、管理、維護(hù)生命周期管理。用戶只需進(jìn)行簡(jiǎn)單的操作,即可快速、低成本、低風(fēng)險(xiǎn)地開(kāi)放數(shù)據(jù)或服務(wù)。
目前創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、赫山網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
利用API網(wǎng)關(guān)你可以提高自己公司API安全性,也可以上架到API云市場(chǎng),供用戶購(gòu)買和使用。
這個(gè)沒(méi)什么可說(shuō)的,主要是你要想辦法盡可能安全地存儲(chǔ)你的AppKey和AppSecrect。
所屬分組是API的基本屬性,所以需要先創(chuàng)建分組,再在分組下創(chuàng)建API。每個(gè)賬號(hào)默認(rèn)最多可創(chuàng)建100個(gè)分組,如需更多分組需要提交工單。分組有所屬區(qū)域(Region)的概念,比如華東上海區(qū),選擇之后就不能修改了。創(chuàng)建完分組之后,系統(tǒng)會(huì)給該分組分配一個(gè)二級(jí)域名,供測(cè)試使用,不過(guò),每個(gè)二級(jí)域名每天最多可訪問(wèn)1000次。
如果你的API支持HTTPS協(xié)議,還需要為該獨(dú)立域名上傳 SSL 證書(shū)。我們需要把我們的域名解析到該分組上,之后才能綁定到該分組上。綁定的域名需要現(xiàn)在阿里云系統(tǒng)備案。綁定域名之后,該分組下的API就可以通過(guò)該域名來(lái)訪問(wèn)了,不再需要調(diào)用系統(tǒng)分配的二級(jí)域名了。
在API分組的環(huán)境管理中,你可以自定義環(huán)境變量,同一個(gè)變量可以再在線上、預(yù)發(fā)和測(cè)試三個(gè)環(huán)境下對(duì)應(yīng)不同的值,這樣在API的定義中就可以使用這里定義好的環(huán)境變量了??梢栽赑ath、入?yún)⒛J(rèn)值和后端服務(wù)服務(wù)地址中加入環(huán)境變量,在API的定義中使用環(huán)境變量需要以 #變量名# 的方式使用。 如果要修改已發(fā)布的API用到的環(huán)境變量,先把老的環(huán)境變量給刪掉,再重新定義一個(gè)新的同名環(huán)境變量賦上新值之后再把全部對(duì)應(yīng)的API重新發(fā)布一遍,這個(gè)是異步生效的,一般發(fā)布后1分鐘內(nèi)生效。
這里的內(nèi)容還是蠻多的,包括基本配置,前端和后端地址,請(qǐng)求參數(shù)配置等,詳細(xì)文檔可以看阿里API的官方文檔,這里說(shuō)幾點(diǎn)重要的:
創(chuàng)建好API之后,就可以對(duì)應(yīng)用進(jìn)行授權(quán)了,點(diǎn)擊API的“授權(quán)”就可以在指定環(huán)境下授權(quán)某個(gè)APP可以訪問(wèn)該API了,如果你在調(diào)用API的過(guò)程中控制臺(tái)打印了x-ca-message中包含了Unauthorized錯(cuò)誤,你應(yīng)該想到你的API還未對(duì)該APP進(jìn)行授權(quán)訪問(wèn)。
API編輯完成之后就可以發(fā)布到指定環(huán)境上去了,發(fā)布之后就立馬生效了。可以多次編輯然后發(fā)布到不同的環(huán)境下,如果你編輯完了忘記發(fā)布到指定環(huán)境下了,是不會(huì)生效的。在分組API列表下,直接點(diǎn)擊API名字進(jìn)入的是當(dāng)前API最后一次編輯保存的狀態(tài),不一定跟發(fā)布的狀態(tài)一直哦。點(diǎn)擊API右邊的線上、預(yù)發(fā)或測(cè)試后面的"運(yùn)行中"可以看到在該環(huán)境下最后一次編輯發(fā)布后的狀態(tài)哦。
網(wǎng)關(guān)會(huì)在請(qǐng)求的時(shí)候加上日期、時(shí)間戳、nonce、userAgent、Host、AppKey、version等參數(shù)值,如果是POST請(qǐng)求的話,需要對(duì)參數(shù)值進(jìn)行urlEncode。如果有body值的話,需要對(duì)body值,將body中的內(nèi)容MD5算法加密后再采用BASE64方法Encode成字符串,放入HTTP頭中。最后再通過(guò)將httpMethod、headers、path、queryParam、formParam經(jīng)過(guò)一系列的運(yùn)算,合成一個(gè)字符串用hmacSha256算法雙向加密進(jìn)行簽名。
在我們分組上綁定好了域名之后,我們不管是預(yù)發(fā)還是線上環(huán)境都可以通過(guò)這同一個(gè)域名進(jìn)行訪問(wèn),那網(wǎng)關(guān)是怎么幫我們區(qū)分環(huán)境的呢?這個(gè)時(shí)候就用到上面的環(huán)境變量管理了,我們通過(guò)在環(huán)境變量中定義一個(gè)變量在不同環(huán)境下不同的值達(dá)到區(qū)分環(huán)境的效果。在網(wǎng)絡(luò)請(qǐng)求的時(shí)候,我們可以在頭部指定 X-Ca-Stage 參數(shù)值來(lái)讓網(wǎng)關(guān)幫我們轉(zhuǎn)發(fā)到對(duì)應(yīng)環(huán)境的后端服務(wù)上,對(duì)應(yīng)的值分別是:線上(RELEASE)默認(rèn)、預(yù)發(fā)(PRE)和測(cè)試(TEST)。
這里重點(diǎn)說(shuō)一下參數(shù)位置下可選的Body選項(xiàng),這個(gè)地方坑了我們蠻久。我們知道在我們客戶端發(fā)起POST請(qǐng)求時(shí),我們會(huì)在頭部指定“Content-Type”為“application/x-www-form-urlencoded”,然后把請(qǐng)求的參數(shù)組裝成"key1=value1key2=value2"的字符串,然后在編碼成二進(jìn)制,放在請(qǐng)求的Body里,以Form表單的形式提交的。所以呢,我們?cè)诙xAPI的參數(shù)時(shí),應(yīng)該把參數(shù)位置選擇為Body選項(xiàng)。但是我們?cè)诤荛L(zhǎng)一段時(shí)間里,創(chuàng)建API時(shí)或編輯API時(shí),參數(shù)位置處下拉一直沒(méi)有Body選項(xiàng),我們就把參數(shù)定義成了Query類型的了。在使用時(shí)也沒(méi)有啥問(wèn)題,但是一旦當(dāng)我們的參數(shù)值非常長(zhǎng)時(shí),比如一個(gè)json字符串,這個(gè)是就報(bào)錯(cuò)了“414 Request-URI Too Large”,這個(gè)時(shí)候呢,網(wǎng)關(guān)就不會(huì)再幫我們把請(qǐng)求轉(zhuǎn)發(fā)到服務(wù)端了。排查了很久終于找到了罪魁禍?zhǔn)自谶@里等著呢,通過(guò)把參數(shù)位置改成Body就可以了。這個(gè)可能是阿里API網(wǎng)關(guān)前端頁(yè)面上的一個(gè)bug,有時(shí)候根本選不到Body選項(xiàng),這個(gè)時(shí)候你可以先把“請(qǐng)求Body(非Form表單數(shù)據(jù),比如JSON字符串、文件二進(jìn)制數(shù)據(jù)等)”選項(xiàng)給勾選上,然后再取消勾選,再下拉展開(kāi)“參數(shù)位置”就可以看到Body選項(xiàng)了。(該文發(fā)布時(shí)是如此,我已經(jīng)將該問(wèn)題反饋給阿里API網(wǎng)關(guān),可能后面會(huì)修復(fù)該bug。)
另外一個(gè)問(wèn)題是如果你的參數(shù)值中包含了emoji表情,需要對(duì)參數(shù)值進(jìn)行urlEncode,服務(wù)端在收到請(qǐng)求時(shí)需要對(duì)參數(shù)值進(jìn)行urlDecode。否則用的過(guò)程中會(huì)出現(xiàn)各種奇怪的問(wèn)題。問(wèn)了阿里網(wǎng)關(guān)的服務(wù)人員,他們的解釋是,如果不進(jìn)行urlEncode,參數(shù)在傳到網(wǎng)關(guān)時(shí)可能會(huì)丟失。可以對(duì)所有Post請(qǐng)求的參數(shù)值統(tǒng)一urlEncode,服務(wù)端對(duì)收到的參數(shù)值統(tǒng)一進(jìn)行urlDecode。
在使用網(wǎng)關(guān)時(shí),timestamp和nonce這兩個(gè)header參數(shù)值是可選的,如果加上這兩個(gè)值,網(wǎng)關(guān)層會(huì)對(duì)請(qǐng)求進(jìn)行校驗(yàn),防止重放攻擊。不過(guò)有個(gè)問(wèn)題:在當(dāng)前時(shí)間的前后15分鐘的時(shí)間戳都是可以的,一旦超過(guò)15分鐘就會(huì)請(qǐng)求失敗,所以,如果用戶修改了客戶端的系統(tǒng)時(shí)間的話,API就會(huì)調(diào)不通了。這個(gè)校驗(yàn)有點(diǎn)嚴(yán)格,如果不知道這一點(diǎn)的話,用戶反饋客戶端不能用,而你這里測(cè)試又沒(méi)有任何問(wèn)題,那就淚奔了,哈哈。當(dāng)然這個(gè)是可選的校驗(yàn),如果不傳這兩個(gè)值的話,就不會(huì)校驗(yàn),這個(gè)時(shí)候防重放攻擊的工作就需要我們自己的服務(wù)端做了。
目前網(wǎng)關(guān)不支持multipart形式的上傳,所以一般我們的上傳API不太適合錄入網(wǎng)關(guān),阿里的說(shuō)法是現(xiàn)在大家的做法普遍是先將文件上傳到文件服務(wù)器,然后通過(guò)調(diào)用接口把文件地址等信息報(bào)錯(cuò)到服務(wù)器的方式,所以,目測(cè)以后也不大可能支持定義multipart形式的上傳API。
每個(gè) API 分組的默認(rèn)流控上限是500QPS,如果你要調(diào)大QPS,需要提交工單并支付相應(yīng)費(fèi)用。另外網(wǎng)關(guān)有個(gè)“流量控制策略”的功能,它是針對(duì)API的,也就是說(shuō)定好策略之后,選中對(duì)哪些API生效,這些API就會(huì)單獨(dú)的受這個(gè)流量控制策略的控制。但是,需要注意的是,如果你要調(diào)大流量控制策略,也必須先調(diào)大API所在分組的QPS才會(huì)生效,否則流量控制策略可以創(chuàng)建但不會(huì)實(shí)際生效。
雖然我們可以在分組的環(huán)境管理中添加不同的環(huán)境變量來(lái)實(shí)現(xiàn)同一個(gè)API分組下可以定義不同服務(wù)域名的API,這樣我們客戶端在發(fā)起請(qǐng)求的時(shí)候,域名只需要配一個(gè)就可以了,非常方便。但是,一旦網(wǎng)關(guān)這一層癱瘓(盡管是小概率事件,但不排除),這個(gè)時(shí)候我們就心有余而力不足了,只能等網(wǎng)關(guān)盡快恢復(fù)了。如果我們一個(gè)分組對(duì)應(yīng)一個(gè)我們真正的服務(wù)域名的話,一旦網(wǎng)關(guān)出問(wèn)題,我們可以快速把該分組綁定的域名指向我們真正的該分組的服務(wù)上。
阿里云cdn的api是基于節(jié)點(diǎn)服務(wù)器協(xié)議實(shí)現(xiàn)的。用了CDN給API來(lái)加速,那移動(dòng)用戶訪問(wèn)API時(shí),請(qǐng)求會(huì)先到距離用戶最近的CDN節(jié)點(diǎn)服務(wù)器上,由這個(gè)節(jié)點(diǎn)服務(wù)器去請(qǐng)求API,這個(gè)CDN節(jié)點(diǎn)服務(wù)器多線接入的,這樣會(huì)盡可能減少用戶到機(jī)房的網(wǎng)絡(luò)故障機(jī)率。
阿里云有很多服務(wù),每個(gè)服務(wù)都有不同的api,基本上都是用http的方式(get/post)來(lái)調(diào)用的,不過(guò)自己調(diào)的話很麻煩,你可以進(jìn)去你需要的服務(wù)的文檔中心那找一下 PHP 對(duì)應(yīng)的 SDK
購(gòu)買云盤后到控制臺(tái)進(jìn)行掛載,掛載到目標(biāo)服務(wù)器上。掛載成功后目標(biāo)服務(wù)器會(huì)出現(xiàn)新的磁盤(未格式化、未分區(qū))這時(shí)候進(jìn)入服務(wù)器格式化、分區(qū)該磁盤、創(chuàng)建邏輯分區(qū)即可使用。注意下Win系統(tǒng)和Linux系統(tǒng)的掛載方法