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; 保税…

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

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

jhipster_JHipster入门,第3部分

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

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旨在使设置…

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

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

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

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

java实现线程的方式_java多线程实现的四种方式

java多线程实现的四种方式1、继承Thread类&#xff0c;重写run方法(其实Thread类本身也实现了Runnable接口)2、实现Runnable接口&#xff0c;重写run方法3、实现Callable接口&#xff0c;重写call方法(有返回值)4、使用线程池(有返回值)1、继承Thread类&#xff0c;重写run方法…

本地运行flowable_在CockroachDB上运行Flowable

本地运行flowable什么是CockroachDB&#xff1f; CockroachDB是一个我一直关注了很长时间的项目。 这是一个开放源代码的Apache 2许可数据库&#xff08; Github链接 &#xff09;&#xff0c;该数据库在很大程度上汲取了Google Spanner白皮书的启发 。 它的核心是可水平扩展的…

win10禁用驱动程序强制签名_图文细说 win10系统未检测到第三个监视器的途径 -win10使用教程...

据统计调查&#xff0c;好多朋友都在为图文细说 win10系统未检测到第三个监视器的途径 的问题而烦恼&#xff0c;小编决定将解决的办法分享给大家。对于电脑菜鸟而言看到图文细说 win10系统未检测到第三个监视器的途径 是很无奈的&#xff0c;试着独自一个人解决图文细说 win10…

安装openstack_午餐前如何安装OpenStack Cloud

安装openstack图1. QuickStart的内部工作原理 云安装程序 如果我告诉您可以在必须停下来吃午餐之前进行OpenStack Cloud环境设置&#xff0c;该怎么办&#xff1f; 您会感到惊讶吗&#xff1f; 你今天可以做吗&#xff1f; 在大多数情况下&#xff0c;我敢打赌您的答案是不…

5e怎么绑定一键跳投_怎么开通淘宝亲情账号 淘宝亲情账号申请步骤【详解】

据官方消息&#xff0c;淘宝将在2月1日上线“亲情账号”功能。那么 淘宝亲情账号怎么开通?在哪申请? 下面为大家介绍下&#xff0c;一起来看看。亲情账号用户在淘宝账号中可以创建“父亲”或“母亲”角色关系&#xff0c;对父母发出注册邀请或直接绑定他们的账号。完成亲情关…

windows功能_你的Windows杀毒软件有这个功能吗?

安全软件首推-火绒&#xff0c;良心之作。比起360安全卫士、腾讯电脑管家&#xff0c;它无广告&#xff0c;无捆绑&#xff0c;无劫持&#xff0c;无弹窗&#xff0c;还免费。我认为最喜人最贴心的功能属它的‘弹窗拦截’了&#xff0c;可以拦截程序推送烦人的弹窗。五大浓缩亮…

base64 二进制流java_读取和base64编码二进制文件

我m trying to read a binary file from the filesystem and then base64 encode it in JavaScript. I使用FileReader API读取数据并找到base64编码器here .我的代码似乎接近工作&#xff0c;问题是生成的base64数据是错误的 . 这是我到目前为止所得到的&#xff1a;function s…

drools dmn_使用Drools的DMN运行时示例

drools dmn正如去年宣布的那样 &#xff0c;Drools 7.0将在合规级别3对DMN模型提供全面的运行时支持。 在撰写本文时&#xff0c;运行时实现已完成&#xff0c;并且该团队现在正在努力进行改进&#xff0c;以进行错误修复和用户友好。 不幸的是&#xff0c;对于7.0版本&#…

笔记本电脑关机后指示灯还亮_汽车仪表常见指示符号之清洗液指示灯,灯亮了怎么办?...

清洗液指示灯就是玻璃水指示灯&#xff0c;用来显示玻璃水的储存量的&#xff0c;平时为熄灭状态&#xff0c;当玻璃水不足时就会点亮提醒驾驶员该添加了。添加后清洗液指示灯还亮的说明出现故障&#xff0c;检查玻璃水电机&#xff0c;相关线路保险丝等&#xff0c;行车中此灯…

xxx钻石商城功能开发需求

文章目录1. 买家小程序端1.1. 首页1.2. 店铺1.2.1. 搜索门店1.2.2. 门店信息1.2.3. 预约试戴1.3. 购物袋1.3.1. 加入购物车1.3.2. 编辑购物车1.4. 个人中心1.4.1. 个人信息1.4.2. 实名认证1.4.3. 我的等级1.4.4. 查看收益1.4.4.1 门店收益1.4.4.1.1查看结算单1.4.4.2 分享收益1…