阿里云函数计算(一)

最近接触到了阿里云的函数计算的服务,经过几天的尝试还是有所收获,因此不妨把学习过程中的点滴记录下来,方便以后温习。

什么是函数计算

根据阿里云的中的相关介绍,可以知道函数计算是事件驱动的全托管计算服务。用户无需管理服务器等基础设施,只需编写代码并上传,函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询、性能监控、报警等功能。从而实现了函数即服务。更多介绍可以参考阿里云函数计算

快速建立一个函数计算服务

新建项目并引入相关的依赖

在建立一个函数计算之前,首先要在阿里云开通函数计算的服务。阿里云函数计算目前支持Java(Java8),NodeJS(nodejs6,nodejs8),Python (Python2.7,Python3.6) 3种语言。本文主要详细记录Java环境下的搭建过程。
首先在IDEA中新建一个Maven项目,若在那个在代码中正常使用函数计算,需要在pom.xml文件中加入对应的依赖:

<dependency>
    <groupId>com.aliyun.fc.runtime</groupId>
    <artifactId>fc-java-core</artifactId>
    <version>1.0.0</version>
</dependency>

创建实现函数计算接口的类

正常导入依赖后,在java目录下新建一个实现函数计算预定义接口的类FCController。函数计算目前有 2 个预定义的接口可以实现,StreamRequestHandler以及PojoRequestHandler。我们先以StreamRequestHandler举例,查看StreamRequestHandler接口的代码:

public interface StreamRequestHandler {
    void handleRequest(InputStream var1, OutputStream var2, Context var3) throws IOException;
}

StreamRequestHandler接口只定义了一个无返回值的方法,输入以及输出均以流的方式实现,而context 是函数计算在运行时生成的一个包含一些运行时的信息对象。在FCController中重写该方法:

package example;
import ...
public class FCController implements StreamRequestHandler{

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)throws IOException{
    outputStream.write("Hello Function Compute".getBytes());
    }
}

到目前为止,一个最简单的函数计算的代码已经编写完成。

将代码打包

我们在开发中通常会使用到自定义的模块,因此在打jar包时需要将它们一起打包。Maven下可以通过使用maven-assembly-plugin 插件来进行打包。在pom.xml文件中加入如下代码:

  <build>
     <plugins>
         <plugin>
             <artifactId>maven-assembly-plugin</artifactId>
             <version>3.1.0</version>
             <configuration>
                 <descriptorRefs>
                     <descriptorRef>jar-with-dependencies</descriptorRef>
                 </descriptorRefs>
                 <appendAssemblyId>false</appendAssemblyId> <!-- this is used for not append id to the jar name -->
             </configuration>
             <executions>
                 <execution>
                     <id>make-assembly</id> <!-- this is used for inheritance merges -->
                     <phase>package</phase> <!-- bind to the packaging phase -->
                     <goals>
                         <goal>single</goal>
                     </goals>
                 </execution>
             </executions>
         </plugin>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-compiler-plugin</artifactId>
             <configuration>
                 <source>1.8</source>
                 <target>1.8</target>
             </configuration>
         </plugin>
     </plugins>
 </build>

然后使用mvn clean package进行打包。打包成功后在target文件夹下生成了可执行的jar包。

配置函数计算

jar包生成后,网页打开阿里云函数计算控制台,依照以下几步完成函数计算的创建:

  • 新建服务:填写服务的名称。
  • 新建函数:函数模板下选择语言环境,本例选择Java8,选择空白函数进入下一步。
  • 触发器配置:根据需要选择触发器。每个函数只可以配置一种触发器。此处选择了不设置触发器。尽管如此,触发器依然可以在后面进行添加。
  • 基础管理配置:填写新建的函数名称,注意选择正确的运行环境。运行环境选择Java后,下方会有进一步的配置,可以通过OSS或者直接上传代码包上传代码。直接上传限制上传文件的大小不得超过5M。环境配置中输入正确的函数入口,依照"[package].[class]::[method]"的格式进行配置,如上文代码中,包名为example,类名为FCController,方法名为handleRequest,因此函数入口应当为example.FCController::handleRequest 。
  • 权限配置:此处跳过。
  • 核对信息:最后核对配置的信息,无误即可点击创建。

执行函数计算

经过上述的步骤,函数计算已经可以成功创建。我们上传的代码包在执行之前,会被解压缩,之后才会被加载,执行,因此不妨解压生成的jar文件,看一下文件结构。
根目录.png

example目录.png

我们可以看到在example文件下有编译后的FCController.class文件,而文件的路径符合之前填写的函数入口。回到函数计算控制台,点击执行来执行我们上传的程序并返回结果。

执行结果.png

至此,一个最简单的函数计算已经成功实现。

触发器配置

在已经创建的函数界面可以看到如下四个窗口:


window.png
  • 概览 在概览中可以对函数的属性进行修改,例如我们在代码中修改了类名,对应的函数入口也应当进行变更。
  • 代码执行 在代码执行中可以执行已上传的代码,查看执行结果等。除此也可以上传新的代码包,注意上传之后需要点击保存才能是刚刚上传的代码包生效,否则函数计算执行的依然是之前的程序代码。
  • 触发器 显而易见,尽管之前没有配置触发器,我们依然可以在建立函数之后有选择的创建。
  • 日志查询 在日志查询中可以配置相关的日志查询服务。

我们进入到触发器窗口中,并且点击创建触发器,如图:


trigger.png

关于触发器的介绍可以参考阿里云关于触发器的相关介绍。值得一提的是,文档在关于HTTP触发器的介绍中写道暂不支持HTTP触发器,然而细心的可以在上图中看到服务类型中含有HTTP触发器,并且可以正常选中。选中之后填写触发器的相关信息。请求方法可以选择多个。点击创建后,发现已经添加了HTTP触发器。

HTTPTrigger.png

回到之前提及到的函数创建的触发器配置步骤中,倘若在此处选择HTTP触发器,在下一步基础配置管理中的运行环境下是无法选择Java运行环境的。
NO JAVA 8.png

创建好触发器后,回到代码执行窗口,可以看到界面多出来了一个调试HTTP触发器。复制链接,在RestClient中实用Get方法请求,可以看到请求成功并且返回正确的结果。
response.png

很明显,看我们不仅创建了文档中所述的不支持Java运行环境的HTTP触发器,并且验证了创建的这个HTTP触发器是可以正常使用的。因此,目前如果你想创建一个HTTP触发器的Java运行环境的函数计算,切记在创建函数时选择不创建触发器,在函数创建成功后再添加HTTP触发器。

函数计算进阶

在实际开发中,我们的服务往往会接受一些参数,对这些参数或根据这些参数来进行下一步的代码编写,因此,Java写的函数计算若要实现此功能需要实现PojoRequestHandler。PojoRequestHandler需要我们提供两个Pojo类,分别用于输入以及输出。先上代码:

@Data
public class Input {
    private Integer num;
    private String name;
    private Boolean tag;
    private List<Integer> integerList;
    private Map<String,Integer> stringIntegerMap;
    private Person person;
}

@Data
@Builder
public class Output {
    private Integer length;
    private String welcome;
    private Boolean ifSuccess;
    private List<Integer> integerList;
    private Map<String, Integer> stringIntegerMap;
    private Person person;
}

@Data
@AllArgsConstructor
public class Person {
    private Integer age;
    private String gender;
}

public class FCController implements PojoRequestHandler<Input, Output> {

    @Override
    public Output handleRequest(Input input, Context context){
        return Output.builder()
            .length(input.getIntegerList().size())
            .welcome("Hello "+ input.getName())
            .ifSuccess(!input.getTag())
            .integerList(input.getIntegerList().stream().map(l -> l+2).collect(Collectors.toList()))
            .stringIntegerMap(input.getStringIntegerMap())
            .person(new Person(100,"female")).build();
    }

    public static void main(String[] args){}
}

Input类用于接收参数,定义了一些常用类型的属性。Output类用于返回结果。FCController类实现了预定义的PojoRequestHandler接口,并重写了handleRequest方法,接收Input类为输入,并以Output类为输出。打包后上传函数计算控制台,上传后记得点击保存保证计算使用最近更新的包。HTTP触发器中请求选择选择POST方法,Body的row下填入要传入的参数。例如:

{
"num": 10,
"name": "lwf",
"tag": false,
"integerList": [1, 2, 3, 4, 5, 6, 7],
"stringIntegerMap": {
    "key": 10
},
"person": {
    "age": 50,
    "gender": "male"
}
}

点击执行,返回结果。

success.png

到此我们已经实现了如何编写代码使得在函数计算下来接受参数值完成我们的业务。具体代码见GitHub,target下的jar包可以直接上传到函数计算中进行PojoRequestHandler的测试。

转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • 函数计算作为云计算中新一代的计算单元,有着不需要管理服务器设施和更精准的计费方式的优势。它依托于云服务商的多种云资...
    FrancisW阅读 1,353评论 0 2
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,858评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 不中央空调 只暖你 喜欢清风喜欢烈酒喜欢你 会说情话 会撩妹 有点精分 有点偏颜控 不喜欢挥之即去的人 如果你理解...
    顾苏白_阅读 240评论 12 8
  • 读书是让自己更加了解自己和外面的世界,读书又有什么方法呢? 1.边问边读 问自己有什么想知道或想解决的问题,能提供...
    萧雅琴子阅读 279评论 0 0