无服务器,Java和FN项目的第一步

无服务器不是什么新事物,但是可以说,仍然有很多关于它的炒作,以及它将如何改变一切,以及未来将如何成为无服务器。 除了云提供商提供的无服务器/功能之外,还有越来越多的无服务器项目正在我们的路上,目的是使我们摆脱供应商锁定,甚至允许我们在内部运行无服务器。 让我们看一个这样的项目FN项目。

什么是FN项目

如果我们访问FN项目的官方网站http://fnproject.io/,我们可以看到以下内容:

“ Fn项目是一个开源的容器本地无服务器平台,您可以在任何地方运行-任何云或内部部署。 它易于使用,支持每种编程语言,并且具有可扩展性和高性能。”

FN Project是Oracle支持的开源项目,其功能基于容器。 因此,从理论上讲,任何可以成为容器并可以从stdin / stdout读写的东西都可以成为FN项目中的功能。 这是一个非常好的功能,因为这意味着从理论上讲,它可以支持任何编程语言,这与云提供商提供的无服务器/功能不同,在这种情况下,如果不支持您选择的语言,则无法在无服务器上使用它。

FN Project的另一个不错的功能是它可以在本地运行,也可以在云中运行,也可以在多个云中运行,也可以结合以上提到的全部运行。

初始化设定

FN项目的唯一先决条件是Docker 17.10.0-ce或更高版本。

要设置FN项目,我们只需要下载FN二进制文件

  • https://github.com/fnproject/cli/releases

并将其添加到路径。 在此之后,我们准备开始使用FN。

FN项目的初始功能

我们需要做的第一件事是启动FN服务器。 为此,我们只需要在终端/控制台中键入

$ fn start

为了验证一切正常,我们可以运行以下命令

$ fn version

这将打印在计算机上运行的fn服务器和fn客户端的版本。 就我的笔记本电脑而言,我得到了这个值

$ fn versionClient version: 0.5.15Server version: 0.3.595

一旦我们确认一切都很好,就可以开始创建我们的第一个功能。

FN项目的第一个功能

如前所述,FN项目是“不可知的语言” ,理论上它可以支持任何语言,但这并不意味着它目前支持所有语言。 要查看我们的版本支持哪些语言,我们可以运行下一个命令:

$ fn init --help

–runtime选项,它将列出我们计算机上所有可用的选项。 就我而言,我将选择Java编程语言。 因此,要在Java中创建第一个函数,我们只需要运行以下命令:

$ fn init --runtime java --trigger http function1

function1函数的名称,在这里我们输入要使用的名称。 选项–trigger http表示我们想为函数创建HTTP触发器,该触发器将允许我们通过HTTP(例如,通过curl)调用它。 运行此命令后,fn将为我们生成初始函数,并将其放置在名为函数的目录中,在本例中为function1

让我们看看产生了什么

$ cd function1
$ find ../src/main/java/com/example/fn/HelloFunction.java
./src/test/java/com/example/fn/HelloFunctionTest.java
./pom.xml
./func.yaml

如果我们打开pom.xml文件,它将看起来像任何其他pom.xml文件。 只有FN项目的依赖项才是测试部件的依赖项,而构建或运行我们的java fn函数则没有依赖项。

如果打开HelloFunction.java ,我们将再次看到它是纯Java类,具有零依赖关系。

package com.example.fn;public class HelloFunction {public String handleRequest(String input) {String name = (input == null || input.isEmpty()) ? "world" : input;return "Hello, " + name + "!";}
}

只有一个方法handleRequest可以将String作为输入并提供String作为输出。 这与在云提供程序的实现中编写函数非常不同,因为它们总是添加特定的库或其他类型的依赖项,以使函数与系统配合使用。 在FN的情况下,由于没有依赖关系,因此它可以在任何地方运行而不会出现任何问题,并且您不会受到任何关注。

FN项目的“魔术”

那么,FN如何运作? 它如何知道如何运行我们的功能?

所有的魔术都在func.yaml文件中。 或者更确切地说,在FN项目中创建功能所需的所有配置。 让我们仔细看看。

$ cat func.yamlschema_version: 20180708
name: function1
version: 0.0.1
runtime: java
build_image: fnproject/fn-java-fdk-build:jdk9-1.0.75
run_image: fnproject/fn-java-fdk:jdk9-1.0.75
cmd: com.example.fn.HelloFunction::handleRequest
format: http-stream
triggers:
- name: function1-trigger
type: http
source: /function1-trigger

这里有多个字段:

  • schema_version指出用于生成该文件的Fn版本
  • 名称是我们功能的名称
  • 版本是我们功能的当前版本,并且在我们部署时会自动递增
  • 我们选择在其中编写函数的运行时语言
  • build_image用于构建函数的docker镜像当然取决于选择的语言
  • run_image用于运行函数的docker映像
  • cmd 入口指向我们的功能,执行我们的业务逻辑需要调用
  • 这里的触发器是调用函数的已定义触发器,在这种情况下,我们有HTTP触发器

FN项目中的单元测试

也许您注意到生成的文件之一是HelloFunctionTest.java ,该文件确实是我们函数的单元测试文件,该文件也为我们自动生成,并填充了一个简单的单元测试示例。 让我们看一下该文件。

public class HelloFunctionTest {@Rulepublic final FnTestingRule testing =   FnTestingRule.createDefault();@Testpublic void shouldReturnGreeting() {testing.givenEvent().enqueue();testing.thenRun(HelloFunction.class, "handleRequest");FnResult result = testing.getOnlyResult();assertEquals("Hello, world!",result.getBodyAsString());}
}

除了某些fn依赖关系和@Rule的一部分 ,其他所有内容都类似于Java中的任何其他JUnit测试。 该单元测试将仅调用我们的函数而不传递任何参数,并检查结果是否为“ Hello world!”。 该测试的最大优点是我们可以像运行其他任何单元测试一样运行它,可以以任何标准方式从maven或IDE调用它。

现在让我们编写测试,在其中传递一些参数,并验证我们的功能仍按预期运行。 为此,我们可以将此代码添加到测试类中

@Testpublic void shouldReturnGreetingwithBodyValue() {testing.givenEvent().withBody("Java").enqueue();testing.thenRun(HelloFunction.class, "handleRequest");FnResult result = testing.getOnlyResult();assertEquals("Hello, Java!",result.getBodyAsString());
}

同样,我们可以像运行其他任何单元测试一样运行它,并验证一切都很好。

部署和调用FN功能

现在我们定义了函数,我们了解了生成了哪些文件以及它们的用途,我们还进行了单元测试。 然后是时候部署和调用该功能了。 我们可以将功能部署到云和docker注册表中,但是仅在本地部署它会更加容易和快捷,尤其是在我们忙于开发的时候。 要部署功能,我们只需要运行此命令

$ fn deploy --app myapp1 --local

在这里,我们告诉fn将功能部署到应用程序myapp1中 ,并通过提供选项–local来仅在本地部署它。 成功部署函数后,就可以调用它。 要调用它,我们可以运行下一个命令

$ fn invoke myapp1 function1

我们提供了应用程序的名称和函数的名称。 如果我们想为我们的职能提供投入,我们可以通过这种方式做到这一点

$ echo "Java is great" | fn invoke myapp1 function1

如果您还记得我们还创建了HTTP触发器,那么让我们使用它来调用我们的函数。

$ curl http://localhost:8080/t/myapp1/function1-trigger

带有FN的JSON函数

我们已经可以用它做很多事情了,但是让我们进入下一个级别,在这里我们将使用JSON作为FN函数的输入和输出。 首先,我们需要创建一个简单的POJO类,就像这样

public class Hello {private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

现在我们可以修改函数以将该类作为输入和输出,因此该函数将如下所示

public Hello handleRequest(Hello input) {String name = (input == null || input.getMessage().isEmpty()) ? "world" :input.getMessage();Hello hello = new Hello();hello.setMessage(message + ", " + name + "!")return hello;
}

部署函数后,我们可以像这样调用它

$ curl -d '{"message":"JSON Input"}' \http://localhost:8080/t/myapp1/function1-trigger

参考资料和将来阅读

正如我们看到的那样,开始使用FN项目开发功能非常容易且有趣,而且在短时间内我们就可以创建功能强大的功能。

我们在这里看到的只是FN项目可能性的一部分,有关FN的一般信息以及有关可能性的更多信息,我建议您访问下面列出的网站

  • http://fnproject.io/
  • https://github.com/fnproject/fn
  • https://github.com/vladimir-dejanovic/java-in-fn-project

翻译自: https://www.javacodegeeks.com/2018/12/serverless-java-fn-project-first-steps.html

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

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

相关文章

php中可以实现分支,PHP中的分支及循环语句

这次实践的都是PHP7的语法。感觉是以前的5差别不是那么大,只是希望越来越快吧。$looking isset($_GET[title]) || isset($_GET[author])?>BookStoreecho "Befor the conditional.";if (2 > 2) {echo "Inside the conditional.";} elsei…

【渝粤题库】陕西师范大学500000 数理方法 作业(专升本)

《数理方法》作业 复数z1i 的指数表达式为( ) A. B. C. D. 在解析函数论中,区域是满足下列( )条件的点集 A.由内点组成;不一定有连通性。 B&…

【渝粤题库】陕西师范大学700004 植物生理学

《植物生理学》作业 一、 名词解释 1.必需元素 2.原初反应 3.三重反应   4.水势 5.光呼吸 6.植物生长物质   7&#xff…

linux结束所有任务命令行,Linux基础命令(15)定时任务

释放双眼,带上耳机,听听看~!crontadLinux定时任务Crontab命令详解linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设…

国家开放大学2021春1026西方经济学(本)题目

教育 教育 试卷代号: 1026 2021年春季学期期末统一考试 西方经济学(本) 试题 2021年7月 一、单项选择题(在下列各题的备选答案中选择一个正确的,并将其序号字母填入题后的括号里。每题2分,共30分&#xf…

国家开放大学2021春1127实用卫生统计学题目

教育 教育 试卷代号: 1127 2021年春季学期期末统一考试 实用卫生统计学 试题(开卷) 2021年7月 一、单项选择题(每题2分,共20分) 1.若要通过样本进行统计推断,样本应该是( )。 A.总体中典型的一…

【渝粤题库】广东开放大学 C语言程序设计 形成性考核

选择题 题目:C语言的基本构成单位是: 。 答案: A、函数 B、函数和过程 C、超文本过程 D、子程序 题目:一个 C语言程序总是从 开始执行。 答案: A、主过程 B、主函数 C、主程序 D、子程序 题目:C语言的程序一…

如何修复无效的目标版本:Maven Build中的1.7、1.8、1.9或1.10错误

如果您正在使用Maven构建Java项目,可能是在Eclipse中,或者是通过运行mvn install在命令提示符下构建的,并且构建失败并显示诸如“无效的目标发行版:1.7”或“无效的目标发行版:1.8”之类的错误,那么您来了到…

【渝粤题库】广东开放大学 Linux 形成性考核

选择题 题目:以下描述正确的是? 答案: A、Linux就是批处理系统 B、批处理系统出现早于分时系统 C、Windows是批处理操作系统 D、批处理系统可以同时执行多个任务 题目:以下哪个是移动操作系统? 答案: A、Li…

Linux查看时间段文件,Linux查看特定时间段内修改过的文件

一.Linux系统日志的一些信息,日志配置文件syslog.conf系统日志一般都存在/var/log下常用的系统日志如下:核心启动日志:/var/log/dmesg系统报错日志:/var/log/messages邮件系统日志:/var/log/maillogFTP系统日志:/var/log/xferlog安全信息和系统登录与网络连接的信息…

【渝粤题库】广东开放大学 公共政策学 形成性考核

选择题 题目:公共政策学涵盖了社会学、经济学、政治学、历史学、心理学、人类学、法学和行政学等学科的理论与方法,这体现了公共政策学的()。 答案: A、实践性 B、科学性 C、发展性 D、综合性 题目:&#x…

linux系统四个组成部分,Linux系统由哪几部分组成?系统详解(干货)

原标题:Linux系统由哪几部分组成?系统详解(干货)我们常说的Linux一般指的是系统内核,基于Linux系统内核的操作系统叫Linux发行版操作系统,像redhat、centos、ubuntu和安卓等都是Linux发行版操作系统。Linux一般有4个主要部分&…

【渝粤题库】广东开放大学 发展与教育心理学 形成性考核

选择题 题目:无意义音节的首创者和遗忘曲线的最先提出者是 答案: A、冯特 B、艾宾浩斯 C、巴甫洛夫 D、弗洛伊德 题目:影响心理发展的因素中,下列说法正确的是 答案: A、生理成熟制约着心理发展的顺序和规律 B、环境和…

【渝粤题库】广东开放大学 岭南文化概论 形成性考核

选择题 题目:号称祖先曾是"中原望族”的是( )。 答案: A、雷州人 B、广府人 C、潮汕人 D、客家人 题目:岭南可以成为广东的代名词,是因为( )。 答案: A、岭南全部的…

linux c 多文件编译,Linuxc - 多c文件程序编译执行

多文件使用,一起编译定义max.hint max(int a,int b);定义max.c#include "max.h"int max(int a,int b){if (a > b) {return a;} else {return b;}}定义主c文件#include #include "max.h"int main(){int a1 22;int a2 33;int maxNum max(a1…

Spring Boot微服务,Docker和Kubernetes研讨会–第一部分

在本系列研讨会中,我们将使用spring boot,docker构建一些微服务,然后将它们部署到kubernetes中。 因此,让我们开始吧。 首先,我们需要定义一个问题陈述。 可以说我们要建立一个订单管理系统。 识别域 第一步将是了解…

【渝粤题库】广东开放大学 建筑设备 形成性考核

选择题 题目:对于以防止触电为目的的漏电保护器宜选用( )。(难度系数:易) 答案: A、动作时间0.1秒,动作电流15毫安 B、动作时间0.5.秒,动作电流30毫安 C、动作时间0.1秒&…

linux 信号量锁 内核,Linux内核信号量互斥锁应用

主要介绍了Linux 内核关于信号量,互斥锁等的应用内核同步机制-信号量/互斥锁/读-写信号量 sema ,mutex ,rwsem信号量通用信号量用户类进程之间使用信号量(semaphore)进行同步,内核线程之间也使用了信号量,一个线程完成了某一个动作就通过信号量告诉别的线程&#xf…

【渝粤题库】广东开放大学 标准化法律法规 形成性考核

​选择题 题目:WTO/TBT协议即《技术性贸易壁垒协议》是WTO对缔约国标准化工作的规定,因次也称为( )。 题目:对于违法犯罪行为的制裁和惩罚,体现了法律的( ) 题目:《上海市标准化条例》、《广东省产品质量监督条例》都属…

【渝粤题库】广东开放大学 电算化会计 形成性考核

选择题 题目: 会计作为一个提供( )为主的信息系统,长期以来在企业的经营管理中起着非常重要的作用 题目: 会计作为一个提供( )为主的信息系统,长期以来在企业的经营管理中起着…