带有AWS Lambda和Java的无服务器FaaS
什么是無服務(wù)器架構(gòu)?
無服務(wù)器架構(gòu)在由第三方完全管理的臨時容器中運(yùn)行自定義代碼。 自定義代碼通常只是完整應(yīng)用程序的一小部分。 也稱為函數(shù) 。 這為無服務(wù)器架構(gòu)提供了另一個名稱,即功能即服務(wù) (FaaS)。 該容器是短暫的,因?yàn)樗荒艹掷m(xù)一次調(diào)用。 容器可以重復(fù)使用,但這不是您可以依賴的東西。 作為開發(fā)人員,您將代碼上傳到FaaS平臺,然后該服務(wù)處理基礎(chǔ)結(jié)構(gòu)的所有容量,擴(kuò)展,修補(bǔ)和管理,以運(yùn)行您的代碼。
使用無服務(wù)器架構(gòu)構(gòu)建的應(yīng)用程序遵循事件驅(qū)動方法。 例如,應(yīng)用程序中發(fā)生了諸如點(diǎn)擊之類的活動。
這與經(jīng)典體系結(jié)構(gòu)非常不同,在經(jīng)典體系結(jié)構(gòu)中,通常將應(yīng)用程序代碼部署在Tomcat或WildFly等應(yīng)用服務(wù)器中。 擴(kuò)展應(yīng)用程序意味著啟動應(yīng)用程序服務(wù)器的其他實(shí)例或使用打包的應(yīng)用程序服務(wù)器擴(kuò)展其他容器。 負(fù)載均衡器需要使用新的IP地址進(jìn)行更新。 操作系統(tǒng)需要打補(bǔ)丁,升級和維護(hù)。
無服務(wù)器架構(gòu)解釋了經(jīng)典編程模型與這種新的無服務(wù)器架構(gòu)之間的區(qū)別。
FaaS平臺將您的應(yīng)用程序劃分為多個功能。 每個功能都部署在FaaS中。 該服務(wù)啟動其他計(jì)算實(shí)例,以滿足您的應(yīng)用程序的可伸縮性需求。 FaaS平臺提供了執(zhí)行環(huán)境,并負(fù)責(zé)啟動和拆除容器以運(yùn)行您的功能。
閱讀無服務(wù)器架構(gòu),以獲取有關(guān)這些映像的更多詳細(xì)信息。
FaaS的一大優(yōu)點(diǎn)是,您只需為計(jì)算時間付費(fèi),即代碼運(yùn)行的時間。 代碼未運(yùn)行時不收費(fèi)。
查看功能與VM和容器有何不同的另一種方式:
請注意,Linux容器而非Docker容器被用作AWS Lambda的實(shí)現(xiàn)。
FaaS與PaaS有何不同?
如無服務(wù)器架構(gòu)所引用,以下推文提供了快速答案:
如果您的PaaS可以在20毫秒內(nèi)有效地啟動實(shí)例并運(yùn)行半秒,則將其稱為無服務(wù)器。 https://t.co/S3YzvqFYLR
— adrian cockcroft(@adrianco) 2016年5月28日
換句話說,大多數(shù)PaaS應(yīng)用程序都不適合針對每個請求上下移動整個應(yīng)用程序,而FaaS平臺正是這樣做的。
使用FaaS抽象化后端說明了不同* aaS產(chǎn)品的區(qū)別。 博客中的圖像如下所示:
無服務(wù)器架構(gòu)還提供了關(guān)于什么是FaaS和不是FaaS的詳細(xì)信息。
AWS Lambda , Google Cloud Functions和Azure Functions是運(yùn)行無服務(wù)器應(yīng)用程序的一些選項(xiàng)。
該博客將展示如何編寫您的第一個AWS Lambda函數(shù)。
什么是AWS Lambda?
AWS Lambda是Amazon Web Services的FaaS服務(wù)。 它在高可用性計(jì)算基礎(chǔ)架構(gòu)上運(yùn)行您的代碼,并執(zhí)行所有計(jì)算資源管理,包括服務(wù)器和操作系統(tǒng)維護(hù),容量配置和自動伸縮,代碼監(jiān)視和日志記錄。
在代碼運(yùn)行期間,AWS Lambda向您收費(fèi)(以100ms為增量)。 將Lambda函數(shù)存儲在AWS中沒有任何成本。 每月前一百萬個請求是免費(fèi)的,之后的價格是名義上的。 閱讀有關(guān)Lambda定價的更多詳細(xì)信息。 它還通過向AWS CloudWatch提供實(shí)時指標(biāo)和日志來提供對性能的可見性。 您需要做的就是編寫代碼!
快速介紹:
還要從AWS ReInvent 2016中檢查AWS Lambda的新增功能:
還要從AWS ReInvent 2016中檢出無服務(wù)器架構(gòu)模式和最佳實(shí)踐:
您在AWS Lambda上運(yùn)行的代碼稱為Lambda函數(shù)。 您可以將代碼作為zip文件上傳或使用AWS Lambda管理控制臺進(jìn)行設(shè)計(jì) 。 AWS SDK內(nèi)置了支持,這簡化了調(diào)用其他AWS服務(wù)的能力。
簡而言之,Lambda是可擴(kuò)展的,無服務(wù)器的云計(jì)算。
AWS Lambda提供了幾種執(zhí)行環(huán)境:
- Node.js – v0.10.36,v4.3.2(推薦)
- Java – Java 8
- Python – Python 2.7
- .NET Core – .NET Core 1.0.1(C#)
該博客將顯示:
- 構(gòu)建一個將JSON文檔存儲到Couchbase的Java應(yīng)用程序
- 使用Maven創(chuàng)建Java應(yīng)用程序的部署包
- 創(chuàng)建Lambda函數(shù)
- 更新Lambda函數(shù)
該博客中的完整代碼可在github.com/arun-gupta/serverless/tree/master/aws/hellocouchbase中找到 。
適用于AWS Lambda的Java應(yīng)用程序
首先,讓我們看一下將用于此Lambda函數(shù)的Java應(yīng)用程序。 Java Lambda函數(shù)編程模型提供了有關(guān)如何用Java編寫Lambda函數(shù)代碼的更多詳細(xì)信息。
我們的Lambda函數(shù)將實(shí)現(xiàn)預(yù)定義的接口com.amazonaws.services.lambda.runtime.RequestHandler 。 代碼如下:
public class HelloCouchbase implements RequestHandler<Request, String> {CouchbaseCluster cluster;Bucket bucket;LambdaLogger logger;@Overridepublic String handleRequest(Request request, Context context) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");String timestamp = dateFormat.format(Calendar.getInstance().getTime());logger = context.getLogger();logger.log("Request received: %s" + timestamp);ButtonDocument buttonDocument = new ButtonDocument();buttonDocument.setId(context.getAwsRequestId());buttonDocument.setRequestId(context.getAwsRequestId());buttonDocument.setTimestamp(String.valueOf(timestamp));getBucket().upsert(buttonDocument.toJson());return buttonDocument.toString();}handleRequest方法是實(shí)現(xiàn)功能代碼的位置。 Context提供有關(guān)Lambda執(zhí)行環(huán)境的有用信息。 來自上下文的某些信息存儲在JSON文檔中。 最后, Couchbase Java SDK API upsert用于將JSON文檔寫入已標(biāo)識的Couchbase實(shí)例。 Amazon EC2上的Couchbase提供了在AWS EC2上安裝Couchbase的完整說明。
通過以下方式獲取有關(guān)Couchbase服務(wù)器的信息:
public CouchbaseCluster getCluster() {if (null == cluster) {logger.log("env: " + System.getenv("COUCHBASE_HOST"));cluster = CouchbaseCluster.create(System.getenv("COUCHBASE_HOST"));}return cluster; }再次使用Couchbase Java API CouchbaseCluster作為Couchbase集群的主要入口點(diǎn)。 創(chuàng)建Lambda函數(shù)時,將傳遞COUCHBASE_HOST環(huán)境變量。 在我們的案例中,這將指向在AWS EC2上運(yùn)行的單節(jié)點(diǎn)Couchbase集群。 最近在AWS Lambda中引入了環(huán)境變量 。
最后,您需要訪問服務(wù)器中的存儲桶:
public Bucket getBucket() {while (null == bucket) {logger.log("Trying to connect to the database");bucket = getCluster().openBucket("serverless", 2L, TimeUnit.MINUTES);try {Thread.sleep(3000);} catch (Exception e) {logger.log("Thread sleep Exception: " + e.toString());throw new RuntimeException(e);}}return bucket; }存儲桶名稱是serverless ,所有JSON文檔都存儲在其中。
一個簡單的Hello World應(yīng)用程序也可以用于創(chuàng)建此功能。
創(chuàng)建AWS Lambda部署程序包
AWS Lambda函數(shù)需要部署程序包。 該軟件包是一個.zip或.jar文件,其中包含該函數(shù)的所有依賴關(guān)系。 我們的應(yīng)用程序是使用Maven打包的,因此我們將使用Maven插件來創(chuàng)建部署包。
該應(yīng)用程序具有pom.xml和以下插件片段:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.3</version><configuration><createDependencyReducedPom>false</createDependencyReducedPom></configuration><executions><execution><phase>package</phase><goals><goal>shade</goal></goals></execution></executions> </plugin>有關(guān)在沒有任何IDE的情況下使用Maven創(chuàng)建.jar部署程序包的詳細(xì)信息,請參見Maven配置。 maven-shade-plugin允許創(chuàng)建一個包括所有依賴項(xiàng)的uber-jar。 shade目標(biāo)與package階段有關(guān)。 因此, mvn package命令將生成一個部署jar。
使用mvn package命令打包應(yīng)用程序。 這將顯示輸出:
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hellocouchbase --- [INFO] Building jar: /Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar [INFO] [INFO] --- maven-shade-plugin:2.3:shade (default) @ hellocouchbase --- [INFO] Including com.amazonaws:aws-lambda-java-core:jar:1.1.0 in the shaded jar. [INFO] Including com.couchbase.client:java-client:jar:2.3.6 in the shaded jar. [INFO] Including com.couchbase.client:core-io:jar:1.3.6 in the shaded jar. [INFO] Including io.reactivex:rxjava:jar:1.1.8 in the shaded jar. [INFO] Replacing original artifact with shaded artifact. [INFO] Replacing /Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar with /Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT-shaded.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------target/hello-couchbase-1.0-SNAPSHOT.jar是將部署到AWS Lambda的陰影jar。
有關(guān)創(chuàng)建部署程序包的更多詳細(xì)信息,請參見創(chuàng)建部署程序包 。
創(chuàng)建AWS Lambda函數(shù)
使用AWS CLI創(chuàng)建AWS Lambda函數(shù)。 在這種情況下,CLI命令如下所示:
aws lambda create-function \ --function-name HelloWorld \ --role arn:aws:iam::<account-id>:role/service-role/myLambdaRole \ --zip-file fileb:///Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar \ --handler org.sample.serverless.aws.couchbase.HelloCouchbaseLambda \ --description "Hello Couchbase Lambda" \ --runtime java8 \ --region us-west-2 \ --timeout 30 \ --memory-size 1024 \ --publish在此CLI中:
- create-function創(chuàng)建一個Lambda函數(shù)
- --function-name提供函數(shù)名稱。 函數(shù)名稱區(qū)分大小寫。
- --role指定Lambda在執(zhí)行您的功能以訪問任何其他AWS資源時承擔(dān)的IAM角色的 Amazon資源名稱(ARN)。 如果您已使用AWS Console執(zhí)行Lambda函數(shù),則將為您創(chuàng)建此角色。
- --zip-file指向在上一步中創(chuàng)建的部署包。 fileb是AWS CLI特定的協(xié)議,用于指示上傳的內(nèi)容是二進(jìn)制的。
- --handler是開始執(zhí)行功能的Java類
- --publish請求AWS Lambda創(chuàng)建Lambda函數(shù)并將其版本發(fā)布為原子操作。 否則,可能會創(chuàng)建多個版本,并可能在以后發(fā)布。
Lambda控制臺顯示:
測試AWS Lambda函數(shù)
使用AWS CLI測試AWS Lambda函數(shù)。
aws lambda invoke \ --function-name HelloCouchbaseLambda \ --region us-west-2 \ --payload '' \ hellocouchbase.out輸出顯示為:
{"StatusCode": 200 }命令的輸出存儲在hellocouchbase.out ,如下所示:
"{\"id\":\"e6bbe71a-ca4f-11e6-95a7-95f2ed410493\",\"installationId\":null,\"requestId\":\"e6bbe71a-ca4f-11e6-95a7-95f2ed410493\",\"identityId\":null,\"timestamp\":\"2016-12-25 03:12:01.157\"}"調(diào)用此函數(shù)會將JSON文檔存儲在Couchbase中。 可以使用Couchbase Web Console查看存儲在Couchbase中的文檔。 密碼為Administrator ,密碼為EC2實(shí)例ID。
該Couchbase實(shí)例中的所有數(shù)據(jù)存儲區(qū)如下所示:
請注意, serverless存儲桶是手動創(chuàng)建的。
單擊文檔顯示存儲在存儲桶中的不同文檔的詳細(xì)信息:
單擊每個文檔將顯示有關(guān)JSON文檔的更多詳細(xì)信息:
Lambda函數(shù)也可以使用控制臺進(jìn)行測試:
更新AWS Lambda函數(shù)
如果應(yīng)用程序邏輯發(fā)生更改,則需要為Lambda函數(shù)上載新的部署程序包。 在這種情況下, mvn package將創(chuàng)建一個部署軟件包,而aws lambda CLI命令用于更新功能代碼:
aws lambda update-function-code \ --function-name HelloCouchbaseLambda \ --zip-file fileb:///Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar \ --region us-west-2 \ --publish顯示結(jié)果:
{"CodeSha256": "w510ejw/OoVsQt2JiLG2bPZPAaFvQCRrYYYlQWctCQE=", "FunctionName": "HelloCouchbaseLambda", "CodeSize": 6978108, "MemorySize": 1024, "FunctionArn": "arn:aws:lambda:us-west-2:<account-id>:function:HelloCouchbaseLambda:8", "Environment": {"Variables": {"COUCHBASE_HOST": "ec2-35-165-249-235.us-west-2.compute.amazonaws.com"}}, "Version": "8", "Role": "arn:aws:iam::<account-id>:role/service-role/myLambdaRole", "Timeout": 30, "LastModified": "2016-12-25T04:17:38.717+0000", "Handler": "org.sample.serverless.aws.couchbase.HelloCouchbaseLambda", "Runtime": "java8", "Description": "Java Hello Couchbase" }然后可以再次調(diào)用該函數(shù)。
在撰寫此博客期間,它通常也用于調(diào)試功能。 這是因?yàn)長ambda函數(shù)沒有任何狀態(tài)或與之關(guān)聯(lián)的框。 因此,您無法登錄到框來檢查功能是否未正確部署。 函數(shù)正常運(yùn)行后,您當(dāng)然可以使用CloudWatch日志語句。
AWS Lambda參考
- 無服務(wù)器架構(gòu)
- AWS Lambda:工作原理
- Couchbase服務(wù)器文檔
- Couchbase論壇
- 在@couchbasedev上關(guān)注我們
翻譯自: https://www.javacodegeeks.com/2016/12/serverless-faas-aws-lambda-java.html
總結(jié)
以上是生活随笔為你收集整理的带有AWS Lambda和Java的无服务器FaaS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 绝地求生被ddos攻击怎么办(绝地求生被
- 下一篇: 苹果安卓图片互传(苹果安卓图片)