项目不能使用fn标签_无服务器,Java和FN项目的第一步

项目不能使用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

项目不能使用fn标签

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

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

相关文章

tomcat目录下创建临时文件,长时间没有使用会被系统清理掉

原因 原因:在linux系统中,spring boot应用服务每次使用java -jar启动后都会在/tmp目录下生成如下目录: hsperfdata_root tomcat.***.9008(中间是一串数字,结尾是应用端口号) tomcat-docbase..9008&#x…

iTerm2的颜色主题/配色主题/配色方案

文章目录直接下载配色方案包使用命令下载安装配色方案直接下载配色方案包 GitHub 主页地址:https://github.com/mbadolato/iTerm2-Color-Schemes 颜色方案下载地址:https://iterm2colorschemes.com/ 下载压缩包后对其进行解压缩,打开目录找…

android 技能标签功能_iOS和Android用户体验设计差异

摘要:iOS和Android用户体验设计差异关键词:iOS,Android,用户体验设计本文将讨论iOS和Android之间的具体设计差异。基本差异1、设计规范 iOS和Android遵循不同的设计规范。2、度量单位 iOS应用程序设计是在pt中开发的,而…

java线程池返回线程状态_Java线程的不同状态

java线程池返回线程状态介绍 在Java中,线程可以具有状态。 Thread.State枚举定义Java线程可以具有的不同状态。 该枚举定义了以下值– 新 可运行 已封锁 等候 TIMED_WAITING 已终止 在随后的部分中,我将简要概述这些状态以及它们之间的可能过渡。…

远程Linux主机安装Oh My Zsh

文章目录介绍安装安装后介绍 Oh My Zsh is an open source, community-driven framework for managing your Zsh configuration. 安装 如果你的服务器没有安装 zsh,则要先安装 zsh: yum install zsh要先安装 git: yum install git然后安…

处理Nginx返回octet-stream数据流的配置

解决 修改Nginx的配置将add_header Content-length 0;删除,处理 Content-Type为application/octet-stream 一、请求报文 二、异常信息 对应前端页面的异常信息为: Network Error epoll_wait() reported that client prematurely closed c…

multi task训练torch_Multi-task Learning的三个小知识

本文译自Deep Multi-Task Learning – 3 Lessons Learned by Zohar Komarovsky在过去几年里,Multi-Task Learning (MTL)广泛用于解决多个Taboola(公司名)的业务问题。在这些业务问题中, 人们使用一组相同的特征以及深度学习模型来…

java8多线程运行程序_线程,代码和数据–多线程Java程序实际运行的方式

java8多线程运行程序有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年。 了解多线程Java程序的执行方式就是其中之一。 您肯定已经听说过线程&am…

zsh命令行界面/zsh终端界面粘贴卡顿的问题

因为安装了某些zsh插件导致,在zsh命令行中粘贴文本非常卡顿,解决方案就是把下面的代码复制到 ~/.zshrc 文件中: pasteinit() {OLD_SELF_INSERT${${(s.:.)widgets[self-insert]}[2,3]}zle -N self-insert url-quote-magic # I wonder if youd…

java连接mongodb的jar包_Java实战之管家婆记账系统(1)——项目简述

项目简述:该项目是一个通过JavaFX实现的管家婆记账系统,具有记账的功能。使用软件:IntelliJ IDEA 2018.3.5(Ultim ate Edition):编写Java项目代码。JavaFX Scene Builder 2.0:生成fxml界面文件。Navicat for MySQL&…

oauth2.0协议流程_正确的工作流程:我应该使用哪个OAuth 2.0流程?

oauth2.0协议流程什么是OAuth 2.0 OAuth 2.0是一个已被广泛采用的委托授权框架,已经存在了很多年,并且似乎已经存在。 如果您不熟悉OAuth 2.0的基本概念,可以使用 川崎孝彦写的优秀文章 。 这只是OAuth 2.0各方的简要提醒: 资源…

远程Linux主机安装zsh插件zsh-syntax-highlighting

安装说明: https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md 根据安装说明: 1.Clone this repository in oh-my-zsh’s plugins directory: git clone https://github.com/zsh-users/zsh-syntax-highlightin…

scare机器人如何手眼标定_基于视觉伺服的工业机器人系统研究(摄像机标定、手眼标定、目标单目定位)...

击上方“新机器视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达标定技术常见的机器人视觉伺服中要实现像素坐标与实际坐标的转换,首先就要进行标定,对于实现视觉伺服控制,这里的标定不仅包括摄像机标定…

单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试

单元测试junit参数大多数人都知道单元测试的重要性和好处,以及为什么要在进行的项目中使用它们。 而且,大多数人不喜欢在他们从事的项目中编写单元测试。 TDD的人当然处于另一面,但根据我的经验,他们在IT行业中是少数派。 说到我…

Linux CentOS安装zsh插件提示/usr/bin/env: python: No such file or directory。

执行 ./install.py 文件时,提示: /usr/bin/env: python: No such file or directory查看系统已安装的 python 版本: ➜ ~ ls -l /usr/bin | grep python lrwxrwxrwx 1 root root 36 11月 2 18:11 python -> /etc/alternativ…

3l如何使用_慢阻肺患者如何选购呼吸机和制氧机,需要注意哪些?

慢阻肺(COPD)是慢性阻塞性肺疾病的简称,进一步发展为肺心病和呼吸衰竭的常见慢性疾病。与有害气体及有害颗粒的异常炎症反应有关,致残率和病死率很高,全球大约有2.1亿人患有慢阻肺,中国大概约有4000-8000万人。慢阻肺已成为全球范…

apache ignite_通过示例获取Apache Ignite Baseline拓扑

apache ignite点燃基准拓扑或BLT代表群集中的一组服务器节点,这些服务器节点将数据持久存储在磁盘上。 其中,N1-2和N5服务器节点是具有本机持久性的Ignite集群的成员,该集群使数据能够持久存储在磁盘上。 N3-4和N6服务器节点是Ignite群集的…

自定义报错返回_MybatisPlus基础篇学习笔记(五)------自定义sql及分页查询

本章目录自定义sql分页查询1. 自定义sql在dao文件中编写自定义接口,并在方法上使用注解形式注入SQL,如图所示:第一种:第二种① application.yml加入下面配置mybatis-plus:mapper-locations: com/ethan/mapper/*② MemberMapper.ja…

精简jdk包_具有JDK 12精简数字格式的自定义精简数字模式

精简jdk包帖子“ 紧凑数字格式出现在JDK 12中 ”已经成为有关Java subreddit线程的讨论主题 。 在那个线程中表达的与紧凑数字格式表示有关的问题涉及显示的精度数字和显示的紧凑数字模式。 可以通过使用CompactNumberFormat.setMinimumFractionDigits(int)来解决精度数字问题&…

两个数相乘积一定比每个因数都大_人教版五年级数学:因数、倍数与分数的整理与复习...

写在前面的话:因数与倍数和分数基本性质之间存在紧密的联系,可以将之放在一起学习,对分数基本性质的学习有促进作用,分数的基本性质对分数的加法和减法也非常重要,因此可以放在一起学习、复习。【整理与复习】因数与倍…