最近接触到了阿里云的函数计算的服务,经过几天的尝试还是有所收获,因此不妨把学习过程中的点滴记录下来,方便以后温习。
根据阿里云的中的相关介绍,可以知道函数计算是事件驱动的全托管计算服务。用户无需管理服务器等基础设施,只需编写代码并上传,函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询、性能监控、报警等功能。从而实现了函数即服务。更多介绍可以参考阿里云函数计算
在建立一个函数计算之前,首先要在阿里云开通函数计算的服务。阿里云函数计算目前支持Java(Java8),NodeJS(nodejs6,nodejs8),Python (Python2.7,Python3.6) 3种语言。本文主要详细记录Java环境下的搭建过程。
首先在IDEA中新建一个Maven项目,若在那个在代码中正常使用函数计算,需要在pom.xml文件中加入对应的依赖:
com.aliyun.fc.runtime
fc-java-core
1.0.0
正常导入依赖后,在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文件中加入如下代码:
maven-assembly-plugin
3.1.0
jar-with-dependencies
false
make-assembly
package
single
org.apache.maven.plugins
maven-compiler-plugin
1.8
然后使用mvn clean package进行打包。打包成功后在target文件夹下生成了可执行的jar包。
jar包生成后,网页打开阿里云函数计算控制台,依照以下几步完成函数计算的创建:
经过上述的步骤,函数计算已经可以成功创建。我们上传的代码包在执行之前,会被解压缩,之后才会被加载,执行,因此不妨解压生成的jar文件,看一下文件结构。
我们可以看到在example文件下有编译后的FCController.class文件,而文件的路径符合之前填写的函数入口。回到函数计算控制台,点击执行来执行我们上传的程序并返回结果。
至此,一个最简单的函数计算已经成功实现。
关于触发器的介绍可以参考阿里云关于触发器
的相关介绍。值得一提的是,文档在关于HTTP触发器的介绍中写道暂不支持HTTP触发器,然而细心的可以在上图中看到服务类型中含有HTTP触发器,并且可以正常选中。选中之后填写触发器的相关信息。请求方法可以选择多个。点击创建后,发现已经添加了HTTP触发器。
回到之前提及到的函数创建的触发器配置步骤中,倘若在此处选择HTTP触发器,在下一步基础配置管理中的运行环境下是无法选择Java运行环境的。
创建好触发器后,回到代码执行窗口,可以看到界面多出来了一个调试HTTP触发器。复制链接,在RestClient中实用Get方法请求,可以看到请求成功并且返回正确的结果。
很明显,看我们不仅创建了文档中所述的不支持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 integerList;
private Map stringIntegerMap;
private Person person;
}
@Data
@Builder
public class Output {
private Integer length;
private String welcome;
private Boolean ifSuccess;
private List integerList;
private Map stringIntegerMap;
private Person person;
@Data
@AllArgsConstructor
public class Person {
private Integer age;
private String gender;
}
public class FCController implements PojoRequestHandler {
@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"
}
}
点击执行,返回结果。
到此我们已经实现了如何编写代码使得在函数计算下来接受参数值完成我们的业务。具体代码见GitHub
,target下的jar包可以直接上传到函数计算中进行PojoRequestHandler的测试。