带有AWS Lambda和Java的无服务器FaaS
什么是無服務器架構?
無服務器架構在由第三方完全管理的臨時容器中運行自定義代碼。 自定義代碼通常只是完整應用程序的一小部分。 也稱為函數 。 這為無服務器架構提供了另一個名稱,即功能即服務 (FaaS)。 該容器是短暫的,因為它只能持續一次調用。 容器可以重復使用,但這不是您可以依賴的東西。 作為開發人員,您將代碼上傳到FaaS平臺,然后該服務處理基礎結構的所有容量,擴展,修補和管理,以運行您的代碼。
使用無服務器架構構建的應用程序遵循事件驅動方法。 例如,應用程序中發生了諸如點擊之類的活動。
這與經典體系結構非常不同,在經典體系結構中,通常將應用程序代碼部署在Tomcat或WildFly等應用服務器中。 擴展應用程序意味著啟動應用程序服務器的其他實例或使用打包的應用程序服務器擴展其他容器。 負載均衡器需要使用新的IP地址進行更新。 操作系統需要打補丁,升級和維護。
無服務器架構解釋了經典編程模型與這種新的無服務器架構之間的區別。
FaaS平臺將您的應用程序劃分為多個功能。 每個功能都部署在FaaS中。 該服務啟動其他計算實例,以滿足您的應用程序的可伸縮性需求。 FaaS平臺提供了執行環境,并負責啟動和拆除容器以運行您的功能。
閱讀無服務器架構,以獲取有關這些映像的更多詳細信息。
FaaS的一大優點是,您只需為計算時間付費,即代碼運行的時間。 代碼未運行時不收費。
查看功能與VM和容器有何不同的另一種方式:
請注意,Linux容器而非Docker容器被用作AWS Lambda的實現。
FaaS與PaaS有何不同?
如無服務器架構所引用,以下推文提供了快速答案:
如果您的PaaS可以在20毫秒內有效地啟動實例并運行半秒,則將其稱為無服務器。 https://t.co/S3YzvqFYLR
— adrian cockcroft(@adrianco) 2016年5月28日
換句話說,大多數PaaS應用程序都不適合針對每個請求上下移動整個應用程序,而FaaS平臺正是這樣做的。
使用FaaS抽象化后端說明了不同* aaS產品的區別。 博客中的圖像如下所示:
無服務器架構還提供了關于什么是FaaS和不是FaaS的詳細信息。
AWS Lambda , Google Cloud Functions和Azure Functions是運行無服務器應用程序的一些選項。
該博客將展示如何編寫您的第一個AWS Lambda函數。
什么是AWS Lambda?
AWS Lambda是Amazon Web Services的FaaS服務。 它在高可用性計算基礎架構上運行您的代碼,并執行所有計算資源管理,包括服務器和操作系統維護,容量配置和自動伸縮,代碼監視和日志記錄。
在代碼運行期間,AWS Lambda向您收費(以100ms為增量)。 將Lambda函數存儲在AWS中沒有任何成本。 每月前一百萬個請求是免費的,之后的價格是名義上的。 閱讀有關Lambda定價的更多詳細信息。 它還通過向AWS CloudWatch提供實時指標和日志來提供對性能的可見性。 您需要做的就是編寫代碼!
快速介紹:
還要從AWS ReInvent 2016中檢查AWS Lambda的新增功能:
還要從AWS ReInvent 2016中檢出無服務器架構模式和最佳實踐:
您在AWS Lambda上運行的代碼稱為Lambda函數。 您可以將代碼作為zip文件上傳或使用AWS Lambda管理控制臺進行設計 。 AWS SDK內置了支持,這簡化了調用其他AWS服務的能力。
簡而言之,Lambda是可擴展的,無服務器的云計算。
AWS Lambda提供了幾種執行環境:
- Node.js – v0.10.36,v4.3.2(推薦)
- Java – Java 8
- Python – Python 2.7
- .NET Core – .NET Core 1.0.1(C#)
該博客將顯示:
- 構建一個將JSON文檔存儲到Couchbase的Java應用程序
- 使用Maven創建Java應用程序的部署包
- 創建Lambda函數
- 更新Lambda函數
該博客中的完整代碼可在github.com/arun-gupta/serverless/tree/master/aws/hellocouchbase中找到 。
適用于AWS Lambda的Java應用程序
首先,讓我們看一下將用于此Lambda函數的Java應用程序。 Java Lambda函數編程模型提供了有關如何用Java編寫Lambda函數代碼的更多詳細信息。
我們的Lambda函數將實現預定義的接口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方法是實現功能代碼的位置。 Context提供有關Lambda執行環境的有用信息。 來自上下文的某些信息存儲在JSON文檔中。 最后, Couchbase Java SDK API upsert用于將JSON文檔寫入已標識的Couchbase實例。 Amazon EC2上的Couchbase提供了在AWS EC2上安裝Couchbase的完整說明。
通過以下方式獲取有關Couchbase服務器的信息:
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集群的主要入口點。 創建Lambda函數時,將傳遞COUCHBASE_HOST環境變量。 在我們的案例中,這將指向在AWS EC2上運行的單節點Couchbase集群。 最近在AWS Lambda中引入了環境變量 。
最后,您需要訪問服務器中的存儲桶:
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應用程序也可以用于創建此功能。
創建AWS Lambda部署程序包
AWS Lambda函數需要部署程序包。 該軟件包是一個.zip或.jar文件,其中包含該函數的所有依賴關系。 我們的應用程序是使用Maven打包的,因此我們將使用Maven插件來創建部署包。
該應用程序具有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>有關在沒有任何IDE的情況下使用Maven創建.jar部署程序包的詳細信息,請參見Maven配置。 maven-shade-plugin允許創建一個包括所有依賴項的uber-jar。 shade目標與package階段有關。 因此, mvn package命令將生成一個部署jar。
使用mvn package命令打包應用程序。 這將顯示輸出:
[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。
有關創建部署程序包的更多詳細信息,請參見創建部署程序包 。
創建AWS Lambda函數
使用AWS CLI創建AWS Lambda函數。 在這種情況下,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創建一個Lambda函數
- --function-name提供函數名稱。 函數名稱區分大小寫。
- --role指定Lambda在執行您的功能以訪問任何其他AWS資源時承擔的IAM角色的 Amazon資源名稱(ARN)。 如果您已使用AWS Console執行Lambda函數,則將為您創建此角色。
- --zip-file指向在上一步中創建的部署包。 fileb是AWS CLI特定的協議,用于指示上傳的內容是二進制的。
- --handler是開始執行功能的Java類
- --publish請求AWS Lambda創建Lambda函數并將其版本發布為原子操作。 否則,可能會創建多個版本,并可能在以后發布。
Lambda控制臺顯示:
測試AWS Lambda函數
使用AWS CLI測試AWS Lambda函數。
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\"}"調用此函數會將JSON文檔存儲在Couchbase中。 可以使用Couchbase Web Console查看存儲在Couchbase中的文檔。 密碼為Administrator ,密碼為EC2實例ID。
該Couchbase實例中的所有數據存儲區如下所示:
請注意, serverless存儲桶是手動創建的。
單擊文檔顯示存儲在存儲桶中的不同文檔的詳細信息:
單擊每個文檔將顯示有關JSON文檔的更多詳細信息:
Lambda函數也可以使用控制臺進行測試:
更新AWS Lambda函數
如果應用程序邏輯發生更改,則需要為Lambda函數上載新的部署程序包。 在這種情況下, mvn package將創建一個部署軟件包,而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顯示結果:
{"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" }然后可以再次調用該函數。
在撰寫此博客期間,它通常也用于調試功能。 這是因為Lambda函數沒有任何狀態或與之關聯的框。 因此,您無法登錄到框來檢查功能是否未正確部署。 函數正常運行后,您當然可以使用CloudWatch日志語句。
AWS Lambda參考
- 無服務器架構
- AWS Lambda:工作原理
- Couchbase服務器文檔
- Couchbase論壇
- 在@couchbasedev上關注我們
翻譯自: https://www.javacodegeeks.com/2016/12/serverless-faas-aws-lambda-java.html
總結
以上是生活随笔為你收集整理的带有AWS Lambda和Java的无服务器FaaS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 绝地求生被ddos攻击怎么办(绝地求生被
- 下一篇: javaone_JavaOne 2012