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

aws faas

什么是无服务器架构?

无服务器架构在由第三方完全管理的临时容器中运行自定义代码。 自定义代码通常只是完整应用程序的一小部分。 也称为函数 。 这为无服务器架构提供了另一个名称,即功能即服务 (FaaS)。 该容器是短暂的,因为它只能持续一次调用。 容器可以重复使用,但这不是您可以依赖的东西。 作为开发人员,您将代码上传到FaaS平台,然后该服务处理基础结构的所有容量,扩展,修补和管理,以运行您的代码。

使用无服务器架构构建的应用程序遵循事件驱动方法。 例如,应用程序中发生了诸如点击之类的活动。

这与经典体系结构非常不同,在经典体系结构中,通常将应用程序代码部署在Tomcat或WildFly等应用服务器中。 扩展应用程序意味着启动应用程序服务器的其他实例,或使用打包的应用程序服务器扩展其他容器。 负载均衡器需要使用新的IP地址进行更新。 操作系统需要打补丁,升级和维护。

无服务器架构解释了经典编程模型与这种新的无服务器架构之间的区别。

FaaS平台将您的应用程序划分为多个功能。 每个功能都部署在FaaS中。 该服务启动其他计算实例,以满足您应用程序的可伸缩性需求。 FaaS平台提供了执行环境,并负责启动和拆除容器以运行您的功能。

阅读无服务器架构,以获取有关这些映像的更多详细信息。

FaaS的一大优点是,您只需为计算时间(即代码运行的时间)付费。 代码未运行时不收费。

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

请注意,Linux容器而非Docker容器被用作AWS Lambda的实现。

FaaS与PaaS有何不同?

如无服务器架构所引用,以下推文提供了一个快速答案:

换句话说,大多数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会按100毫秒的增量向您收费。 与将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 faas

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境商品的进口税额显示

跨境商品的采购类型有三种&#xff1a;直邮、保税、一般贸易&#xff0c;而一般贸易的商品已经清关入境了&#xff0c;虽然是跨境商品&#xff0c;但是无需再清关&#xff0c;所以商品详情页无需显示进口税相关信息。 直邮跨境商品显示的进口税信息如下图所示&#xff1a; 保税…

HH SaaS电商系统的跨境商品展示、下单、清关、出库全流程设计

跨境商品的展示 后补 跨境商品的下单 在订单确认页面就要按SKU拆单&#xff0c;所以跨境销售订单的主单和子单是一对一的关系 多种进口渠道的商品在同个销售主单中&#xff0c;在进口清关、收货、货款结算时会出现问题&#xff0c;假设销售订单中有2种商品&#xff0c;一种…

coreldraw x8段落_CDR X8设置自定义文字为默认字体(二)

通过上一篇文章的介绍&#xff0c;我们已经了解到了在CorelDRAW中如何自定义设置默认字体&#xff0c;相关阅读可参阅&#xff1a;CDR X8设置文字为默认字体。其实在CorelDRAW软件中给用户提供方式不止是一种&#xff0c;本文将介绍更多关于设置默认字体的方法。1. 打开CorelDR…

javaone_代理的JavaOne 2016观察

javaone我无法参加JavaOne 2016&#xff0c;因此很高兴看到在线资源众多&#xff0c;使我能够基于JavaOne 2016内容进行观察。 我在本文中引用并简要描述了其中的一些JavaOne 2016资源&#xff0c;并根据这些资源的使用添加了一些我自己的观察结果。 正如Katharine在JavaOne综述…

组合商品和商品套餐(套装)的设计

文章目录商品套餐创建商品套餐活动的交互设计组合商品创建组合商品的交互设计商品套餐 商品套餐设计成一种促销活动&#xff0c;活动结束时间不设置表示“长期有效”商品套餐是指SKU和SKU的组合套餐&#xff0c;例如&#xff1a;iphone 6s 数据线 白色iphone 6s 充电器 白色&a…

antlr 4.7.1_新ANTLR 4.6的重要更改

antlr 4.7.1自上一个主要版本发布以来&#xff0c;已经过去了将近一年的时间&#xff0c;推出了新的ANTLR版本&#xff1a; 4.6 。 有很多新闻&#xff1a;新的目标&#xff0c;更好的性能&#xff0c;更好的错误处理以及ANTLR本身开发中的一些改进。 新目标 影响最大的新闻可…

电商系统下单时商品库存和销售状态如何处理

文章目录查看购物车时商品库存问题商品被下架了如何处理价格变动了如何处理促销活动到期了如何处理提交订单时库存问题商品被下架了如何处理价格变动了如何处理促销活动到期了如何处理使用的优惠券到期了如何处理选择商品时库存问题商品被下架了如何处理价格变动了如何处理促销…

json怎么读取数据库_如何:使用Json插入数据库并从中读取

json怎么读取数据库在本文中&#xff0c;我们将为Speedment创建一个插件&#xff0c;该插件使用Gson生成序列化和反序列化逻辑&#xff0c;从而使其在数据库实体和JSON字符串之间进行映射非常容易。 这将有助于展示Speedment代码生成的可扩展性&#xff0c;同时探索Gson库的一些…

django连接mysql步骤_使用Django连接Mysql数据库步骤

链接mysql步骤第一步&#xff1a;在终端下载pymysql文件–pip install pymysql第二步&#xff1a;在gjango项目的__init__文件中添加代码import pymysqlpymysql .install_as_MySQLdb()第三步&#xff1a;找到mysql的连接源&#xff0c;然后填信息&#xff0c;如果没有mysql驱动…

HH SaaS电商系统的商品发货策略设计

什么是发货策略 用来指定商品的发货仓库的策略方案&#xff0c;我们在实际的业务开展过程中&#xff0c;同种商品不同的销售渠道也许发货仓库不同&#xff0c;同种商品同个销售渠道在不同的业务开展阶段中也许发货仓库不同&#xff0c;所以需要通过灵活配置发货策略来满足此需…

mysql 上一篇_mysql取上一篇和下一篇的查询

$id 为当前文章 ID获取文章上一篇文章&#xff1a;SELECT id FROM table WHERE id>$id ORDER BY id ASC LIMIT 1获取文章下一篇文章&#xff1a;SELECT id FROM table WHERE id查询思路&#xff1a;获取与该文章同表相连的文章&#xff0c;如果根据分类获取相应的关联文章&a…

jhipster_JHipster入门,第3部分

jhipster欢迎回到本JHipster教程系列&#xff01; 在第一部分中&#xff0c;我们介绍了如何创建整体应用程序。 在第二部分中 &#xff0c;我们逐步创建了一个微服务应用程序&#xff08;这有点复杂&#xff09;。 对于那些正在努力使JHipster正常运转的人&#xff0c;我想着重…

什么是UID、UED、UXD、IXD、UCD、IAD,看这篇就足够了

文章目录UID&#xff1a; User Interface Design 用户界面设计UI&#xff1a;User Interface&#xff08;用户界面&#xff09;UID&#xff08;用户界面设计师&#xff09;UID认知现状UED&#xff1a; User Experience Design 用户体验设计UE or UX&#xff1a; User Experienc…

jhipster_JHipster入门,第2部分

jhipster所以你回来了&#xff01; 在本系列的最后一部分中 &#xff0c;我们采用了单片路线创建了一个JHipster应用程序。 这是红色药丸路线&#xff1b; 生活几乎与您习惯的一样。 但是也许您喜欢挑战。 也许您想超越红色药丸并尝试蓝色药丸。 在这种情况下&#xff0c;Blue…

HH SaaS电商系统的虚拟资金账户(钱包余额)设计

文章目录方案一&#xff0c;将资金账户抽象出来虚拟资金账户余额流水记录实体方案二&#xff0c;用户表直接保存资金余额余额流水记录实体方案一&#xff0c;将资金账户抽象出来 虚拟资金账户 P.S. 如果机构代码和消费代码有区分类型&#xff0c;那么资金账户表中就不必保存“…

jhipster_jHipster入门,第1部分

jhipster因此&#xff0c;您想保持技术的领先地位&#xff0c;但对所有活动部件感到不知所措。 你真幸运&#xff01; 这就是jHipster发光的地方。 如果您喜欢Ruby on Rails或Grails的方法来快速启动和运行应用程序&#xff0c;那么这可能是适合您的选择。 jHipster旨在使设置…

mysql中show属于_mysql show的常见用法

a. show tables或show tables from database_name; // 显示当前数据库中所有表的名称b. show databases; // 显示mysql中所有数据库的名称c. show columns from table_name from database_name; 或show columns from database_name.table_name; // 显示表中列名称d. show gra…

java基准测试_微基准测试进入Java 9

java基准测试我已经几个月没有在这里写文章了&#xff0c;这种例外还会继续。 我计划在明年三月左右恢复写作。 本文末尾的说明。 等待&#xff01; 不完全是最后&#xff0c;因为您可以向下滚动。 它在文章结尾处。 继续阅读&#xff01; 三年前&#xff0c;我在写有关Java编…

python周天为一周的开始_从两个月减肥四十斤说起,不懈坚持,才是一个人最核心的竞争力。...

大学毕业了十年&#xff0c;我的身材失控了十年。我对我的胖身材已经习以为常了十年了&#xff0c;我从来没想过改变&#xff0c;因为我也没有毅力改变。有一句话说的&#xff0c;人越胖&#xff0c;就越懒。因为我胖&#xff0c;所以我不跑步&#xff0c;我也不爱外出。只要你…