带有AWS Lambda和Java的无服务器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向您收费(以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

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

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

相关文章

python 查找算法_七大查找算法(Python)

查找算法 -- 简介查找(Searching)就是根据给定的某个值&#xff0c;在查找表中确定一个其关键字等于给定值的数据元素。查找表(Search Table)&#xff1a;由同一类型的数据元素构成的集合关键字(Key)&#xff1a;数据元素中某个数据项的值&#xff0c;又称为键值主键(Primary K…

traceroute命令的用法实例

ceroute命令的用法实例traceroute 跟踪数据包到达网络主机所经过的路由工具&#xff1b;traceroute 是用来发出数据包的主机到目标主机之间所经过的网关的工具。traceroute 的原理是试图以最小的TTL发出探测包来跟踪数据包到达目标主机所经过的网关&#xff0c;然后监听一个来自…

去除div最后一个逗号_去除重复值、统计数量,这个公式可以直接套用!

点击上方蓝字关注星标★不迷路本文作者&#xff1a;拉登 Dony来源&#xff1a;拉小登(ID&#xff1a;ladengchupin)本文编辑&#xff1a;小叮、竺兰前段时间遇到这样一个问题&#xff0c;让我很头疼。头疼的原因有 3 点&#xff1a;❶ 问题描述不清晰&#xff0c;理解起来困难&…

spring shell_Spring Shell项目发布

spring shellSpring Source昨天发布了Spring Shell 。 Spring Shell是一个交互式Shell&#xff0c;可以使用基于Spring的编程模型轻松地通过命令进行扩展。 它是通过删除OSGi依赖项从Spring Roo项目中提取的&#xff0c;并变成了一个独立项目。 这使得那些只希望使用交互式外壳…

Word报告自动生成(例如 导出数据库结构)

将很早之前写的一个小组件重新整理优化一下&#xff0c;做成一个通用的功能。适用于导出数据库的结构&#xff08;表、字段等&#xff09;到Word或将体检数据自动生成Word版的体检报告等。代码&#xff1a;Github 一、主要需要完成功能: 1. 灵活的配置规则及word样式设置&#…

马尔科夫随机场

1、相关概念 马尔科夫随机过程&#xff1a;在已知当前状态的情况下&#xff0c;未来的状态只与当前状态有关&#xff0c;与过去状态无关。这种已知“现在”的条件下&#xff0c;“未来”和“过去”彼此独立的特性叫做马尔科夫性&#xff0c;具有这种特性的随机过程叫做马尔科夫…

php上传文件详解

上传文件功能由两个部分组成&#xff0c;HTML页面和PHP处理部分。HTML页面主要是让用户选择所要上传的文件&#xff0c;php部分让我们可以把文件存储到服务器的指定目录。 一&#xff0e;HTML部分 upload.html [html] view plaincopy<html> <head> &…

pythonwhile循环love_input和while循环——Python编程从入门到实践

PythonPython开发Python语言input和while循环——Python编程从入门到实践input( )input()函数&#xff1a;让程序运行暂停&#xff0c;等待用户输入。message input(Tell me something, and I will repeat it back to you:)print(message)运行结果&#xff1a;Tell me somethi…

phpstudy添加redis扩展

操作系统 windows&#xff1b; 直接贴步骤记录下 一. 划重点&#xff0c;运行phpinfo(), 观察第四行 x86 好了记住这个 x86 三. http://pecl.php.net/package/redis php官方redis扩展下载地址&#xff1b; 我需要的是3.1的版本 之前记住的 x86 当然并不是所有人…

高阶图匹配

一、基于结构特征的相似性度量 将特征看作向量空间中的点&#xff0c;通过计算两个点或者两个点组之间的距离来度量他们是否相似。 一阶度量&#xff1a;minkowsky距离、马氏距离 二阶度量&#xff1a;特征点本身有相关性&#xff0c;所以将特征点对之间的关系加入到相似性度量…

visual studio installer可以卸载吗_ArcGIS 怎样彻底删除和卸载

如何完全卸载ArcGIS为大家演示如何完全卸载ArcGIS。方法/步骤1打开控制面板&#xff0c;找到“卸载程序”。或者使用360安全卫士2选择卸载程序&#xff0c;在新界面中找到与ArcGIS有关的程序。3右键单击要卸载的内容&#xff0c;并选择“卸载/更改”。按照此方法&#xff0c;把…

Linux下安装和使用boost库

由于在毕业设计中需要用到C对象序列化工具&#xff0c;所以想利用boost库中的serialization库。Boost库分为两个部分来使用&#xff0c;一是直接使用对应的头文件&#xff0c;二是需要编译安装相应的库才可以使用。下面记录一下今天的安装和使用过程&#xff08;整个boost库全部…

javaone_JavaOne 2012:在JVM上诊断应用程序

javaone值得参加Staffan Larsen &#xff08;Oracle Java Serviceability Architect&#xff09;的演讲“ 在JVM上诊断您的应用程序 ”&#xff08;Hilton Plaza A / B&#xff09;&#xff0c;只是为了学习Oracle JVM 7提供的新jcmd命令行工具。该演示对我来说是“奖金”&…

高斯曲率求表面极值点

1.基本概念 平均曲率、主曲率和高斯曲率是曲率的三个基本要素。 法曲率&#xff1a;曲面在一点沿着不同方向的弯曲程度不同。或者说曲面离开切平面的速度不同。这个弯曲属性可以用这一点的沿着这个方法的法曲率刻画 主曲率&#xff1a;过曲面上某个点上具有无穷个正交曲率&…

g++基础知识

一、编译过程&#xff1a; 1&#xff09;预处理&#xff0c;生成.i文件 2&#xff09;转换成为汇编语言&#xff0c;生成.s文件 3&#xff09;汇编变为目标代码&#xff08;机器代码&#xff09;&#xff0c;生成.o文件 4&#xff09;链接目标代码&#xff0c;生成可执行程…

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

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

C语言pow()函数:求x的y次方(次幂)

1、头文件&#xff1a;#include2、原型&#xff1a;double pow(double x, double y);pow() 函数用来求 x 的 y 次幂&#xff08;次方&#xff09; pow()用来计算以x 为底的 y 次方值&#xff0c;然后将结果返回。设返回值为 ret&#xff0c;则 ret xy。 3、可能导致错误的…

本周学习总结JAVA

6. 为如下代码加上异常处理 byte[] content null; FileInputStream fis new FileInputStream("testfis.txt"); int bytesAvailabe fis.available();//获得该文件可用的字节数 if(bytesAvailabe>0){content new byte[bytesAvailabe];//创建可容纳文件大小的数组…

Day18 226翻转二叉树 101对称二叉树 100相同的树 572另一棵树的子树

226 翻转二叉树 递归前序遍历和后序遍历&#xff1a; class Solution { public:void swap(TreeNode*&a,TreeNode*&b){TreeNode*tmp a;a b;b tmp;}void reverseTree(TreeNode* cur){if(curnullptr) return;swap(cur->left,cur->right);reverseTree(cur->l…

python删除列表中字符串_python - 删除字符串中的字符列表

如果您正在使用python2并且您的输入是字符串(不是unicodes)&#xff0c;那么绝对最好的方法是remove_chars_translate_bytes&#xff1a;>>> chars_to_remove [., !, ?]>>> subj A.B!C?>>> subj.translate(None, .join(chars_to_remove))ABC否则…