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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

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

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

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

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

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

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

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

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

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

FaaS的一大優(yōu)點(diǎn)是,您只需為計(jì)算時(shí)間付費(fèi),即代碼運(yùn)行的時(shí)間。 代碼未運(yùn)行時(shí)不收費(fèi)。

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

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

FaaS與PaaS有何不同?

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

如果您的PaaS可以在20毫秒內(nèi)有效地啟動(dòng)實(shí)例并運(yùn)行半秒,則將其稱為無(wú)服務(wù)器。 https://t.co/S3YzvqFYLR

— adrian cockcroft(@adrianco) 2016年5月28日

換句話說(shuō),大多數(shù)PaaS應(yīng)用程序都不適合針對(duì)每個(gè)請(qǐng)求上下移動(dòng)整個(gè)應(yīng)用程序,而FaaS平臺(tái)正是這樣做的。

使用FaaS抽象化后端說(shuō)明了不同* aaS產(chǎn)品的區(qū)別。 博客中的圖像如下所示:

無(wú)服務(wù)器架構(gòu)還提供了關(guān)于什么是FaaS和不是FaaS的詳細(xì)信息。

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

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

什么是AWS Lambda?

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

在代碼運(yùn)行期間,AWS Lambda向您收費(fèi)(以100ms為增量)。 將Lambda函數(shù)存儲(chǔ)在AWS中沒(méi)有任何成本。 每月前一百萬(wàn)個(gè)請(qǐng)求是免費(fèi)的,之后的價(jià)格是名義上的。 閱讀有關(guān)Lambda定價(jià)的更多詳細(xì)信息。 它還通過(guò)向AWS CloudWatch提供實(shí)時(shí)指標(biāo)和日志來(lái)提供對(duì)性能的可見(jiàn)性。 您需要做的就是編寫(xiě)代碼!

快速介紹:

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

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

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

簡(jiǎn)而言之,Lambda是可擴(kuò)展的,無(wú)服務(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)建一個(gè)將JSON文檔存儲(chǔ)到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編寫(xiě)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)境的有用信息。 來(lái)自上下文的某些信息存儲(chǔ)在JSON文檔中。 最后, Couchbase Java SDK API upsert用于將JSON文檔寫(xiě)入已標(biāo)識(shí)的Couchbase實(shí)例。 Amazon EC2上的Couchbase提供了在AWS EC2上安裝Couchbase的完整說(shuō)明。

通過(guò)以下方式獲取有關(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ù)時(shí),將傳遞COUCHBASE_HOST環(huán)境變量。 在我們的案例中,這將指向在AWS EC2上運(yùn)行的單節(jié)點(diǎn)Couchbase集群。 最近在AWS Lambda中引入了環(huán)境變量 。

最后,您需要訪問(wèn)服務(wù)器中的存儲(chǔ)桶:

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; }

存儲(chǔ)桶名稱是serverless ,所有JSON文檔都存儲(chǔ)在其中。

一個(gè)簡(jiǎn)單的Hello World應(yīng)用程序也可以用于創(chuàng)建此功能。

創(chuàng)建AWS Lambda部署程序包

AWS Lambda函數(shù)需要部署程序包。 該軟件包是一個(gè).zip或.jar文件,其中包含該函數(shù)的所有依賴關(guān)系。 我們的應(yīng)用程序是使用Maven打包的,因此我們將使用Maven插件來(lái)創(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)在沒(méi)有任何IDE的情況下使用Maven創(chuàng)建.jar部署程序包的詳細(xì)信息,請(qǐng)參見(jiàn)Maven配置。 maven-shade-plugin允許創(chuàng)建一個(gè)包括所有依賴項(xiàng)的uber-jar。 shade目標(biāo)與package階段有關(guān)。 因此, mvn package命令將生成一個(gè)部署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ì)信息,請(qǐng)參見(jiàn)創(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)建一個(gè)Lambda函數(shù)
  • --function-name提供函數(shù)名稱。 函數(shù)名稱區(qū)分大小寫(xiě)。
  • --role指定Lambda在執(zhí)行您的功能以訪問(wèn)任何其他AWS資源時(shí)承擔(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是開(kāi)始執(zhí)行功能的Java類
  • --publish請(qǐng)求AWS Lambda創(chuàng)建Lambda函數(shù)并將其版本發(fā)布為原子操作。 否則,可能會(huì)創(chuàng)建多個(gè)版本,并可能在以后發(fā)布。

Lambda控制臺(tái)顯示:

測(cè)試AWS Lambda函數(shù)

使用AWS CLI測(cè)試AWS Lambda函數(shù)。

aws lambda invoke \ --function-name HelloCouchbaseLambda \ --region us-west-2 \ --payload '' \ hellocouchbase.out

輸出顯示為:

{"StatusCode": 200 }

命令的輸出存儲(chǔ)在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ù)會(huì)將JSON文檔存儲(chǔ)在Couchbase中。 可以使用Couchbase Web Console查看存儲(chǔ)在Couchbase中的文檔。 密碼為Administrator ,密碼為EC2實(shí)例ID。

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

請(qǐng)注意, serverless存儲(chǔ)桶是手動(dòng)創(chuàng)建的。

單擊文檔顯示存儲(chǔ)在存儲(chǔ)桶中的不同文檔的詳細(xì)信息:

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

Lambda函數(shù)也可以使用控制臺(tái)進(jìn)行測(cè)試:

更新AWS Lambda函數(shù)

如果應(yīng)用程序邏輯發(fā)生更改,則需要為L(zhǎng)ambda函數(shù)上載新的部署程序包。 在這種情況下, mvn package將創(chuàng)建一個(gè)部署軟件包,而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ù)。

在撰寫(xiě)此博客期間,它通常也用于調(diào)試功能。 這是因?yàn)長(zhǎng)ambda函數(shù)沒(méi)有任何狀態(tài)或與之關(guān)聯(lián)的框。 因此,您無(wú)法登錄到框來(lái)檢查功能是否未正確部署。 函數(shù)正常運(yùn)行后,您當(dāng)然可以使用CloudWatch日志語(yǔ)句。

AWS Lambda參考

  • 無(wú)服務(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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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