热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于Oracle开源平台Fn,快速开发ServerlessFunction

Oracle在2017年开源了ServerlessPlatformFn——一个Docker原生的Serverless平台,可以运行在任何支持Docker的云上或在本地运行,您可以在

Fn项目(http://fnproject.io/)是一个采用Apache2.0许可证的容器原生Serverless平台,您可以在各个地方(任何云或本地环境)来运行。它易于使用,支持每一种编程语言,而且易于扩展,具有高性能。

Fn专注于让用户很容易上手,在短短几分钟内就能试用它,然后随着您不断熟悉,可以逐渐使用更高级的功能。

Fn在开发和运维方面有一大堆出色的功能特性:

  • 易于使用的命令行工具,便于开发、测试和部署函数。

  • 只依赖一个对象:Docker。

  • 支持高性能应用的热门函数。

  • 与Lambda代码兼容――可以导出您的Lambda代码,并在Fn上面运行。

  • 支持许多流行语言的FDK(函数开发工具包)。

  • 先进的Java FDK,随带JUnit测试框架。

  • 可以用您青睐的编排工具,比如Kubernetes、Mesosphere和Docker Swarm,部署Fn。

  • 智能负载均衡系统专为将流量传送到函数而设计。

  • 可扩展、模块化,支持自定义附件和整合。

搭建Fn环境并开发部署Function

1Fn环境准备

基础环境配置如下:

  • 物理机操作系统:Win10;

  • 虚拟机软件:VirtualBox 5.2,并安装对应版本的Extension Pack;

  • 虚机操作系统环境:Oracle Linux 7.2。

为操作方便,建议配置虚机yum环境,修改/etc/yum.repos.d/public-yum-ol7.repo文件,建议修改以下红色部分enabled=1:

Fn需要使用Docker Hub账号,请提前注册好DockerHub账号。

 1、通过yum安装Docker

sudo yum install docker-engine

 

2、启动Docker 

[root@docker ~]# service docker start

Redirecting to bin/systemctl start  docker.service

 

3、登录Docker Hub

使用自己的Docker Hub账号登录。

[root@docker ~]# docker login

Login with your Docker ID to push and pull imagesfrom Docker Hub. If you don't have a Docker ID, head over tohttps://hub.docker.com to create one.

Username ():

Password:

Login Succeeded

在虚机上设定FN_REGISTRY变量:

export FN_REGISTRY=

 

4、安装CLI Tools

Linux使用以下命令:

curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh

5、启动Fn Server

出现以下信息,Fn Server启动成功:

通过docker ps,可以看到Fn Server已经启动。

[root@docker~]# docker ps

CONTAINERID   IMAGE          COMMAND      CREATED           STATUS             PORTS                         NAMES

f58972b570ac  fnproject/fnserver   "./fnserver"    8 minutes ago       Up 8 minutes        2375/tcp,0.0.0.0:8080->8080/tcp   fnserver

2创建自己的Function

以下我们使用Java语言创建我们的FunctionFn 提供了多个语言的FDK(Fn Development Kit),包括fdk-node,fdk-java,fdk-go,fdk-Python,fdk-ruby等。通过CLIfdk,Fn可以帮助我们简单、快速实现Function的创建。

 

[root@docker ~]# fn init --runtime javamyhelloworld

Creating function at: myhelloworld

Runtime: java

Function boilerplate generated.

func.yaml created.

其中,--runtime 指定使用的语言。

通过tree命令,查看生成的文件。

可以看到除生成对应的Java文件外,还帮助我们生成了JUnit test文件。

修改function及对应的yaml文件,我们把HelloFunction.java的方法从handleRequest修改为callMe,如下代码:

public class HelloFunction {

 

    public String callMe(String input) {

       String name = (input == null || input.isEmpty()) ?"world"  : input;

 

        return "Hello, " + name +" fromFnproject!";

    }

 

}

对应的,把func.yaml中的cmd修改为callMe,如下:

name: myhelloworld

version: 0.0.1

runtime: java

cmd: com.example.fn.HelloFunction::callMe

build_image:fnproject/fn-java-fdk-build:jdk9-1.0.59

run_image: fnproject/fn-java-fdk:jdk9-1.0.59

format: http

cmd定义的是当function激活时,外部可以调用的方法,我们可以编辑它对应到我们实现的function。对应语法如下:

cmd: ::

 

对应的需要Junittest文件,修改function名称及断言:

public class HelloFunctionTest {

 

    @Rule

    publicfinal FnTestingRule testing = FnTestingRule.createDefault();

 

    @Test

    publicvoid shouldReturnGreeting() {

       testing.givenEvent().enqueue();

        testing.thenRun(HelloFunction.class, "callMe");

 

       FnResult result = testing.getOnlyResult();

        assertEquals("Hello, world from Fnproject!",result.getBodyAsString());

    }

如果不修改test文件,build会失败。也可以简化处理,删除test目录。

3创建App并部署Function

接下来我们创建一个app,并把我们的function部署到本地。

确认当前目录在myhelloworld,并执行如下命令:

fn deploy --app myapp-java --local

出现以下信息:

[root@docker myhelloworld]# fn --verbose deploy--app myapp-java --local

Deploying myhelloworld to app: myapp-java atpath: myhelloworld

Bumped to version 0.0.2

Building image myhelloworld:0.0.2

Sending build context to Docker daemon  14.34kB

Step 1/11 : FROMfnproject/fn-java-fdk-build:jdk9-1.0.59 as build-stage

 --->90ef02b5e180

Step 2/11 : WORKDIR function

 --->Using cache

 --->c3f347186d62

……..

Successfully built 0ad99a9ac273

………..

 

查看部署的appendpoint。

[root@docker ~]# fn apps l

demoapp

myapp-java

tutorials

[root@docker ~]# fn routes list myapp-java

path               image                                 endpoint

/myhelloworld myhelloworld:0.0.2         localhost:8080/r/myapp-java/myhelloworld

4调用部署的Function

通过Fn call调用:

[root@docker ~]# echo -n "Jeff" | fncall myapp-java myhelloworld

Hello, Jeff from Fnproject![root@docker ~]#

 

通过cURL调用:

[root@docker ~]# curl -d "Jeff"http://localhost:8080/r/myapp-java/myhelloworld

Hello, Jeff from Fnproject![root@docker ~]#

5使用Fn UI

Fn还提供了UI,我们可以安装和启动UI,进一步简化我们的操作。

[root@docker ~]# docker run --rm -it --linkfnserver:api -p 4000:4000 -e "FN_API_URL=http://api:8080"fnproject/ui

 

> FunctionsUI@0.0.26 start app

> node server

 

WARNING: NODE_ENV value of 'production' did matchany deployment config file names.

WARNING: Seehttps://github.com/lorenwest/node-config/wiki/Strict-Mode

info: Using API url: api:8080

info: Server running on port 4000

 

在firefox浏览器输入http://localhost:4000,出现以下界面:

点击myapp-java,点击”Run Function”Payload中输入需要的字符,点击Run,执行结果如下:

拷贝cURL执行,如下:

注意:修改api:8080localhost:8080

[root@docker~]# curl -X POST -d 'Jeff' http://localhost:8080/r/myapp-java/myhelloworld

Hello,Jeff from Fnproject![root@docker ~]#

6Function对应的Docker Container及Image

查看Docker Container:

查看Docker Images:

我们使用Java创建的第一个Function已经成功完成所有开发部署和测试!

  总结  


更多信息及功能请参考:http://fnproject.io及https://github.com/fnproject/fn




作者简介

王军丰,甲骨文云平台PaaS高级咨询顾问,专注于甲骨文PaaS相关产品及解决方案,具有18+年中间件技术、方案和项目实施经验。熟悉金融行业。您可以通过junfeng.wang@oracle.com与他联系。



了解更多,敬请关注甲骨文开发者社区......





推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloudRibbon部分源码相关的知识,希望对你有一定的参考价值。1:ribbon是提供通过servi ... [详细]
author-avatar
星汇半岛车位销售
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有