日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

带有AWS Lambda和Java的无服务器FaaS

發(fā)布時間:2023/12/3 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 带有AWS Lambda和Java的无服务器FaaS 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是無服務(wù)器架構(gòu)?

無服務(wù)器架構(gòu)在由第三方完全管理的臨時容器中運行自定義代碼。 自定義代碼通常只是完整應(yīng)用程序的一小部分。 也稱為函數(shù) 。 這為無服務(wù)器架構(gòu)提供了另一個名稱,即功能即服務(wù) (FaaS)。 該容器是短暫的,因為它只能持續(xù)一次調(diào)用。 容器可以重復使用,但這不是您可以依賴的東西。 作為開發(fā)人員,您將代碼上傳到FaaS平臺,然后該服務(wù)處理基礎(chǔ)結(jié)構(gòu)的所有容量,擴展,修補和管理,以運行您的代碼。

使用無服務(wù)器架構(gòu)構(gòu)建的應(yīng)用程序遵循事件驅(qū)動方法。 例如,應(yīng)用程序中發(fā)生了諸如點擊之類的活動。

這與經(jīng)典體系結(jié)構(gòu)非常不同,在經(jīng)典體系結(jié)構(gòu)中,通常將應(yīng)用程序代碼部署在Tomcat或WildFly等應(yīng)用服務(wù)器中。 擴展應(yīng)用程序意味著啟動應(yīng)用程序服務(wù)器的其他實例或使用打包的應(yīng)用程序服務(wù)器擴展其他容器。 負載均衡器需要使用新的IP地址進行更新。 操作系統(tǒng)需要打補丁,升級和維護。

無服務(wù)器架構(gòu)解釋了經(jīng)典編程模型與這種新的無服務(wù)器架構(gòu)之間的區(qū)別。

FaaS平臺將您的應(yīng)用程序劃分為多個功能。 每個功能都部署在FaaS中。 該服務(wù)啟動其他計算實例,以滿足您的應(yīng)用程序的可伸縮性需求。 FaaS平臺提供了執(zhí)行環(huán)境,并負責啟動和拆除容器以運行您的功能。

閱讀無服務(wù)器架構(gòu),以獲取有關(guān)這些映像的更多詳細信息。

FaaS的一大優(yōu)點是,您只需為計算時間付費,即代碼運行的時間。 代碼未運行時不收費。

查看功能與VM和容器有何不同的另一種方式:

請注意,Linux容器而非Docker容器被用作AWS Lambda的實現(xiàn)。

FaaS與PaaS有何不同?

如無服務(wù)器架構(gòu)所引用,以下推文提供了快速答案:

如果您的PaaS可以在20毫秒內(nèi)有效地啟動實例并運行半秒,則將其稱為無服務(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的詳細信息。

AWS Lambda , Google Cloud Functions和Azure Functions是運行無服務(wù)器應(yīng)用程序的一些選項。

該博客將展示如何編寫您的第一個AWS Lambda函數(shù)。

什么是AWS Lambda?

AWS Lambda是Amazon Web Services的FaaS服務(wù)。 它在高可用性計算基礎(chǔ)架構(gòu)上運行您的代碼,并執(zhí)行所有計算資源管理,包括服務(wù)器和操作系統(tǒng)維護,容量配置和自動伸縮,代碼監(jiān)視和日志記錄。

在代碼運行期間,AWS Lambda向您收費(以100ms為增量)。 將Lambda函數(shù)存儲在AWS中沒有任何成本。 每月前一百萬個請求是免費的,之后的價格是名義上的。 閱讀有關(guān)Lambda定價的更多詳細信息。 它還通過向AWS CloudWatch提供實時指標和日志來提供對性能的可見性。 您需要做的就是編寫代碼!

快速介紹:

還要從AWS ReInvent 2016中檢查AWS Lambda的新增功能:

還要從AWS ReInvent 2016中檢出無服務(wù)器架構(gòu)模式和最佳實踐:

您在AWS Lambda上運行的代碼稱為Lambda函數(shù)。 您可以將代碼作為zip文件上傳或使用AWS Lambda管理控制臺進行設(shè)計 。 AWS SDK內(nèi)置了支持,這簡化了調(diào)用其他AWS服務(wù)的能力。

簡而言之,Lambda是可擴展的,無服務(wù)器的云計算。

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ù)代碼的更多詳細信息。

我們的Lambda函數(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方法是實現(xiàn)功能代碼的位置。 Context提供有關(guān)Lambda執(zhí)行環(huán)境的有用信息。 來自上下文的某些信息存儲在JSON文檔中。 最后, Couchbase Java SDK API upsert用于將JSON文檔寫入已標識的Couchbase實例。 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集群的主要入口點。 創(chuàng)建Lambda函數(shù)時,將傳遞COUCHBASE_HOST環(huán)境變量。 在我們的案例中,這將指向在AWS EC2上運行的單節(jié)點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部署程序包的詳細信息,請參見Maven配置。 maven-shade-plugin允許創(chuàng)建一個包括所有依賴項的uber-jar。 shade目標與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)建部署程序包的更多詳細信息,請參見創(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資源時承擔的IAM角色的 Amazon資源名稱(ARN)。 如果您已使用AWS Console執(zhí)行Lambda函數(shù),則將為您創(chuàng)建此角色。
  • --zip-file指向在上一步中創(chuàng)建的部署包。 fileb是AWS CLI特定的協(xié)議,用于指示上傳的內(nèi)容是二進制的。
  • --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實例ID。

該Couchbase實例中的所有數(shù)據(jù)存儲區(qū)如下所示:

請注意, serverless存儲桶是手動創(chuàng)建的。

單擊文檔顯示存儲在存儲桶中的不同文檔的詳細信息:

單擊每個文檔將顯示有關(guān)JSON文檔的更多詳細信息:

Lambda函數(shù)也可以使用控制臺進行測試:

更新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)試功能。 這是因為Lambda函數(shù)沒有任何狀態(tài)或與之關(guān)聯(lián)的框。 因此,您無法登錄到框來檢查功能是否未正確部署。 函數(shù)正常運行后,您當然可以使用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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。