1.Lambda是什么?
在EC2中我們還需要管理整個(gè)虛擬機(jī)症虑,而到了Lambda缩歪,我們僅需要將代碼上傳,就可以按照配置來(lái)運(yùn)行谍憔,此時(shí)這個(gè)服務(wù)器環(huán)境是由AWS來(lái)管理的匪蝙,我們只需要關(guān)心代碼。所以Lambda又被稱為Serverless Computer
AWS Lambda 原生支持 Java习贫、Go逛球、PowerShell、Node.js苫昌、C#颤绕、Python 和 Ruby 代碼,并提供 Runtime API祟身,可以使用任何其他編程語(yǔ)言來(lái)編寫函數(shù)奥务。
2.什么時(shí)候使用Lambda呢?
Lambda比較適合運(yùn)行在事件響應(yīng)中需要執(zhí)行的代碼(并不是說(shuō)只能是這些場(chǎng)景袜硫,而是這些場(chǎng)景的Lambda優(yōu)先級(jí)比較高)氯葬,舉個(gè)例子:
每五分鐘/每天某個(gè)時(shí)間點(diǎn)需要從數(shù)據(jù)庫(kù)里查數(shù)據(jù)并且發(fā)到其他地方的場(chǎng)景
與CloudWatch集成,當(dāng)超出某個(gè)閾值時(shí)婉陷,可以通過(guò)Alarm發(fā)到SNS Topic帚称,然后通過(guò)Lambda發(fā)到郵箱、手機(jī)等地方
當(dāng)有圖片上傳到S3上秽澳,我們可以通過(guò)lambda來(lái)制作每一張圖片的縮略圖
舉個(gè)不是事件觸發(fā)的例子:
- 因?yàn)長(zhǎng)ambda是可以動(dòng)態(tài)擴(kuò)展的闯睹,我們可以把一些流量(不確定/變化大)的服務(wù)也讓Lambda來(lái)執(zhí)行,這樣我們就可以不用費(fèi)心地去管理EC2的擴(kuò)容了担神。
需要注意的是楼吃,Lambda應(yīng)當(dāng)以無(wú)狀態(tài)的樣式進(jìn)行編寫,即應(yīng)假設(shè)與底層計(jì)算基礎(chǔ)設(shè)施無(wú)密切關(guān)系,用人話來(lái)理解的話,每次Lambda函數(shù)由事件觸發(fā)時(shí)所刀,我們應(yīng)當(dāng)假設(shè)其都會(huì)在全新的環(huán)境中調(diào)用它, 而其應(yīng)當(dāng)無(wú)法訪問(wèn)上一個(gè)事件的執(zhí)行上下文衙荐。
注意是上文中的假設(shè),事實(shí)上如果前一次的請(qǐng)求修改了某個(gè)全局變量浮创,下一次請(qǐng)求過(guò)來(lái)如果還是被路由到這一個(gè)Lambda運(yùn)行的虛擬機(jī)上忧吟,這個(gè)全局變量將不是初始值,虛擬機(jī)緩存了這個(gè)值斩披,這樣一來(lái)就大大加大了開發(fā)的難度溜族,因?yàn)槲覀儾恢浪降讜?huì)不會(huì)去走原來(lái)的那個(gè)虛擬機(jī),所以在這里垦沉,我們建議以無(wú)狀態(tài)的樣式進(jìn)行開發(fā)煌抒。
3.舉個(gè)栗子
- Lambda有很多種上傳代碼的方式,在這里我們介紹一種項(xiàng)目中比較常用的厕倍,在本地開發(fā)完成后上傳jar包運(yùn)行
代碼來(lái)自:https://github.com/awsdocs/aws-lambda-developer-guide
這里再多說(shuō)一句寡壮,Youtube和Github真的是一個(gè)特別好去學(xué)習(xí)不了解的技術(shù)的平臺(tái),發(fā)揮起來(lái)吧讹弯。
1.首先需要引入aws-lambda-java-core
包况既,這個(gè)是必不可少的.
2.實(shí)現(xiàn)上面導(dǎo)入的包中這個(gè)包中
RequestHandler<I, O>
接口,這是Lambda會(huì)通過(guò)這個(gè)接口的實(shí)現(xiàn)方法作為入口來(lái)調(diào)用我們的代碼组民。
在這個(gè)例子中棒仍,我們會(huì)以HandlerInteger
類作為我們要執(zhí)行的代碼。
3.將項(xiàng)目打包成Jar包臭胜。
4.我們可以看到可以有多種部署的方式莫其,還有一些案例代碼,這邊我們選擇第一個(gè)耸三,從頭開始乱陡,并且將環(huán)境選擇為Java8,圖中的執(zhí)行角色有基本的功能吕晌,會(huì)將我們的執(zhí)行結(jié)果記錄到CloudWatch的log group里
5.將我們的Jar包上傳到Lambda上(Jar包中有我們自己的代碼蛋褥,也有這些代碼運(yùn)行的依賴),這里有個(gè)tips就是如果Jar大于10MB睛驳,需要考慮使用先上傳到S3再轉(zhuǎn)到Lambda。
注意下面的紅框框膜廊,在這里我們需要指定Lambda執(zhí)行的入口乏沸,格式為{package name}.{class name}::{method name}
圖中我們的包名為example,類名為HandlerInteger爪瓜,實(shí)現(xiàn)的方法名為handleRequest蹬跃,所以是example.HandlerInteger::handleRequest
6.上傳并且設(shè)置完成后,就可以來(lái)測(cè)試我們的Lambda了,這里我們傳的值是Integer蝶缀,所以直接輸數(shù)字就好丹喻,其他的一些對(duì)象可以用Json表示。
7.在這里我們可以看到執(zhí)行的一些參數(shù)翁都,上面的白框框是我們的返回結(jié)果碍论,因?yàn)榉祷氐氖?code>getRemainingTimeInMillis,所以基本上就是這個(gè)數(shù)值左右的數(shù)字柄慰,下面是一些日志的輸出鳍悠,我們可以在AWS CloudWatch的Log group里看到。