概括
Cloud Functions,是一项Serverless计算服务,提供FaaS(Function as a Service)能力,一方面云函数将开发测试的对象聚焦到函数级别,可以帮助大幅简化应用开发与运维相关的事务,另一方面可以通过在应用中集成云函数SDK,便捷操作云数据库、云存储等,提升业务功能构建的便利性。云函数可以根据函数的实际流量对函数进行弹性伸缩,无需对服务器资源进行管理,解决了开发者运维管理的难题。
传统难点与限制
①开发难度高,版本周期长
·引入复杂的框架,例如Spring Boot、.SpringCloud
·引入多种中间件,比如数据中间件、日志中间、版本发布周期长
②运维工作专业性强、成本高
包括资源创建、中间件部署、业务部署
③资源使用成本问题
租用/购买多少资源是合适的,流量不确定如何应对
全新方案
Serverless极简开发、零运维,提供了极简编程框架,无需申请资源即可轻松操作云数据库和云存储。同时,它支持自动部署,并拥有丰富的触发器体系,可以与周边服务无缝联通。此外,它还提供了日志和指标监控功能,保证高可用性。而且,按使用量付费的模式,使得资源的成本控制更加灵活,同时还能够实现自动弹性伸缩,调用次数和资源使用时间均按需按量伸缩,毫秒级冷启动功能更是能够有效节省成本。
Cloud Function工作原理
简单说:Cloud Function是一种无服务器计算服务,它允许开发人员编写和部署单独的函数,以响应特定的事件和触发器。Cloud Function的工作原理是基于事件驱动的,当特定的事件发生时,Cloud Function会自动触发相应的函数执行。这些事件可以是来自云平台的操作,如存储桶的文件上传、数据库的更新或者消息队列的消息等。当事件触发时,Cloud Function会自动创建一个运行环境,并执行相应的函数代码。这种无服务器的架构可以根据实际需求动态扩展和缩减资源,从而实现高效的计算资源利用和成本控制。
如下图所示:
除了事件驱动的工作原理之外,Cloud Function还涉及到以下几个方面的工作原理:
1. 弹性扩展:Cloud Function可以根据负载自动扩展和缩减计算资源,确保在高负载时能够提供足够的计算能力,而在低负载时可以节省成本。
2. 无状态执行:每个Cloud Function都是独立且无状态的,它们不会保留任何本地状态或数据,这意味着它们可以随时被启动、停止和重新启动,而不会影响其它函数的执行。
3. 平台管理:Cloud Function的部署、监控和管理都由云平台自动完成,开发人员无需关心底层的基础设施管理,可以专注于函数的编写和业务逻辑的实现。
4. 多语言支持:Cloud Function支持多种编程语言,如JavaScript、Python、Go等,开发人员可以根据自己的喜好和需求选择最适合的语言来编写函数。
5. 事件触发器:Cloud Function可以与各种云平台服务集成,如存储、数据库、消息队列等,通过这些服务的事件触发器来触发函数的执行,实现不同服务之间的协同工作。
总的来说,Cloud Function的工作原理是基于事件驱动和无服务器计算的理念,通过弹性扩展、无状态执行、平台管理、多语言支持和事件触发器等特性,实现高效、灵活和成本效益的计算资源利用。
Cloud Functions.应用场景
开通服务
- 登录AppGallery Connect网站,点击"我的项目"。
- 在项目列表中选择您需要开通云函数服务的项目。
- 在左侧导航栏选择"构建 > 云函数"。
- 点击页面右上角"立即开通"。
集成SDK
针对DevEco Studio开发环境,华为提供了maven仓集成方式的SDK包,开发前需集成SDK到您的DevEco Studio项目中。
- 登录在AppGallery Connect网站点击"我的项目",在项目下的应用列表中选择您需要开通云函数的应用。
- 在项目设置的"常规"页签下,点击"应用"栏下的"agconnect-services.json"下载配置文件。
- 将"agconnect-services.json"文件拷贝到entry模块目录下。
4.打开entry模块下的build.gradle文件,添加如下代码集成Cloud Functions SDK。
dependencies
{
...
implementation 'com.huawei.agconnect:agconnect-function:1.2.2.300'
...
}
5.点击界面上的"Sync Now"链接同步已完成的配置。
创建云函数
1.开通云函数服务后,在云函数界面,点击"+创建函数"。
2.在创建函数中,完成函数定义,包括函数基本信息,函数部署信息及函数代码等内容的填写。
3.在handler.js的输入框中输入以下代码,来实现加法计算
let myHandler = function(event, context) {
var sum;
if (event.body) {
var reqBody = JSON.parse(event.body)
var number1=reqBody.number1
var number2=reqBody.number2
sum = number1+number2
}else {
sum = 0
}
var obj={"result":sum}
var res = new context.HTTPResponse(obj, {
"res-type": "context.env",
"faas-content-type": "json"
}, "application/json", "200");
//send info log
context.logger.info("this is message of debug log");
//send info log
context.logger.info("this is message of error log");
//send error log
context.logger.error("Test error log");
//send response
context.callback(res);
};
module.exports.myHandler = myHandler;
测试函数
- 您可以通过两种方式进入函数测试页面。
- 点击函数详情界面右上角的"测试"按钮。
- 在Cloud Functions主界面上左侧导航栏点击"函数",在函数页面点击"测试"页签。
- 选择刚刚创建的函数及其版本,在事件中输入如下代码:
3.在执行结果中查看结果,与结果一致:
{
"headers":{
"faas-content-type":"json",
"res-type":"context.env"
},
"isBase64Encoded":false,
"body":"{\"result\":0}",
"contentType":"application/json",
"statuscode":"200"
}
添加触发器
- 在函数列表中点击函数名称进入函数详情页面。如果是函数别名,则进入函数别名配置页面。
- 点击配置页签下的"+添加触发器"。
- 在"配置触发器"区域配置"触发器类型"等信息,此处以HTTP触发器类型和POST请求方式为例。
- 完成后点击"添加"并点击"保存"。
- 将详细信息中的触发URL的后缀保存,作为客户端请求时的触发器标识。
此外,具体的界面可以自行设计,这里不展开
具体函数开发
- 在应用启动的onStart方法中获取控件实例并设置按钮的点击事件。
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
textFieldNum1 = (TextField)findComponentById(ResourceTable.Id_editText_number1);
textFieldNum2 = (TextField)findComponentById(ResourceTable.Id_editText_number2);
textView = (Text)findComponentById(ResourceTable.Id_textView_result);
Button btn_add = (Button)findComponentById(ResourceTable.Id_btn_add);
btn_add.setClickedListener(listener -> testFunctionAdd());
}
2.初始化云函数服务。
AGConnectFunction function = AGConnectFunction.getInstance();
3.生成云函数所需要的事件的map对象,这里因为我们的云函数中设置的事件的key值为"number1"和"number2",所以我们设置map的key值为"number1"和"number2"。
HashMap<String, Integer> number = new HashMap();
number.put("number1", Integer.parseInt(textFieldNum1.getText()));
number.put("number2", Integer.parseInt(textFieldNum2.getText()));
4.调用云函数SDK中的wrap方法指定触发器,call方法传入事件的map作为参数,发送事件的HTTP请求并使用云函数进行计算,并且添加请求的回调,将接收到云函数的返回结果显示到textView中。
HarmonyTask task = function.wrap("test-function-$latest").call(number);
task.addOnCompleteListener(new OnHarmonyCompleteListener<FunctionResult>() {
@Override
public void onComplete(HarmonyTask<FunctionResult> task) {
if (task.isSuccessful()) {
String val = task.getResult().getValue(String.class);
textView.setText(val);
} else {
textView.setText("");
AGCLogger.e(TAG, "exception", task.getException().getMessage());
}
}
});
最后打包测试:运行DevEco Studio工程生成HAP包,并在测试手机中安装HAP包,在两个输入框中分别输入两个数字,点击"求和"按钮就可以查看界面显示出两数之和了。
此外,云函数的应用范围非常广泛,除了计算之外,还可以运用到服务扩展,Web构建,ETL等等。