阿里云函数计算(一)

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

什么是函数计算

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

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

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

在建立一个函数计算之前,首先要在阿里云开通函数计算的服务。阿里云函数计算目前支持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的测试。

猜你喜欢

转载自blog.csdn.net/weixin_43177109/article/details/82599108