- 最新动态
- 功能总览
- 产品介绍
- 计费说明
- 快速入门
- 用户指南
-
最佳实践
- FunctionGraph最佳实践汇总
-
数据处理类实践
- 使用FunctionGraph函数对OBS中的图片进行压缩
- 使用FunctionGraph函数为OBS中的图片打水印
- 使用FunctionGraph函数对DIS数据进行格式转换并存储到CloudTable
- 使用FunctionGraph函数实现通过API方式上传文件
- 使用FunctionGraph函数对IoTDA中的设备坐标数据进行转换
- 使用FunctionGraph函数对OBS中的文件进行加解密
- 使用FunctionGraph函数识别LTS中的异常业务日志并存储到OBS
- 使用FunctionGraph函数对LTS中的日志进行实时过滤
- 使用FunctionGraph函数流对OBS中的图片进行旋转
- 使用FunctionGraph函数流对图片进行压缩和打水印
- 功能应用类实践
- 函数构建类实践
- 开发指南
- API参考
- SDK参考
- 场景代码示例
-
常见问题
-
产品咨询
- 使用FunctionGraph是否需要开通计算、存储、网络等服务?
- 使用FunctionGraph开发程序之后是否需要部署?
- FunctionGraph为函数分配的磁盘空间有多少?
- 是否支持在函数中启动TCP的监听端口,通过EIP接收外部发送过来的TCP请求?
- 函数发起HTTP请求的源地址如何获取?
- FunctionGraph是否支持对上传的zip文件进行反编译?
- FunctionGraph的函数是否支持功能扩展?
- FunctionGraph中的代码是如何隔离的?
- 函数常规信息中的“应用”如何理解?
- 用户需要为函数的冷启动时间付费吗?
- 函数计费中的调用次数,是某一账号下在不同region的所有函数的调用次数总和吗?
- Python语言的函数从V1版本迁移到V2版本时需注意哪些兼容性问题?
- FunctionGraph函数支持哪些编程语言?
- 创建函数
-
配置函数
- 能否在函数环境变量中存储敏感信息?
- FunctionGraph的函数如何读写上传的文件?
- 为函数挂载文件系统时,报“failed to mount exist system path”
- FunctionGraph如何实现域名解析?
- FunctionGraph如何通过域名访问专享版APIG中注册的接口?
- FunctionGraph函数通过域名访问APIG中注册的接口时,报域名无法解析?
- 使用定制运行时语言的函数能操作哪些目录?
- FunctionGraph的函数支持哪些中文字体?
- 能否在函数代码中使用线程和进程?
- 函数如何访问MySQL数据库?
- 函数无法通过VPC连接对应的Redis?
- 如何读取函数的请求头?
- Python语言的函数中,中文注释报乱码错误
-
调用函数
- FunctionGraph的函数执行需要多长时间?
- FunctionGraph的函数执行包含了哪些过程?
- FunctionGraph函数长时间不执行时,相关的实例会如何处理?
- 如何获取函数运行过程中的内存使用量信息?
- 为什么首次调用函数时速度会比较慢?
- 为什么函数实际使用内存大于预估内存,甚至触发内存溢出OOM?
- 函数执行失败返回“runtime memory limit exceeded”时,如何查看内存占用大小?
- 自定义镜像函数执行失败报“CrashLoopBackOff”
- 同步调用函数时,未收到调用响应的可能原因?
- 函数中os.system("command &")命令的执行日志未采集,应如何处理?
- 函数执行超时的可能原因有哪些?
- 使用APIG触发器调用一个返回String的FunctionGraph函数时,报500错误
- Python2.7在执行reload(sys)后无法通过print打印日志
- 运行函数时报错error while loading shared libraries时如何处理?
- 配置触发器
- 配置依赖包
-
产品咨询
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
构建程序
- 通过Web托管方式改造微服务。改造过程中,如果微服务是基于spring框架,则需要使用FunctionGraph提供的SDK,即在pom.xml文件中添加步骤1中依赖。此时,您只需修改配置以及打包方式即可将微服务改造成serverless函数。具体操作步骤如下:
- 配置微服务依赖。
- 配置微服务打包配置。
- 在微服务的pom.xml(即步骤1中的pom)文件中配置maven-assembly-plugin作为打包插件。
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.2</version> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> </manifest> </archive> <appendAssemblyId>false</appendAssemblyId> </configuration> <executions> <execution> <id>auto-deploy</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptors> <descriptor>src/main/assembly/zip_file.xml</descriptor> </descriptors> <finalName>${package.finalName}</finalName> <outputDirectory>${package.outputDirectory}</outputDirectory> <archiverConfig> <directoryMode>0700</directoryMode> <fileMode>0600</fileMode> <defaultDirectoryMode>0700</defaultDirectoryMode> </archiverConfig> </configuration> </execution> </executions> </plugin> </plugins>
- 在微服务项目创建src/main/assembly/zip_file.xml,并写入如下代码:
<?xml version="1.0" encoding="UTF-8"?> <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" > <id>auto-deploy</id> <baseDirectory></baseDirectory> <formats> <format>zip</format> </formats> <!--配置统一打包到config目录,不要修改,不然找不到--> <fileSets> <fileSet> <directory>src/main/resources/</directory> <outputDirectory>config</outputDirectory> <includes> <include>**</include> </includes> <fileMode>0600</fileMode> <directoryMode>0700</directoryMode> </fileSet> </fileSets> <!--jar包统一打包到lib目录,不要修改,不然找不到--> <dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly>
- 在微服务的pom.xml(即步骤1中的pom)文件中配置maven-assembly-plugin作为打包插件。
- 构建出包。
完成后会在target目录下,生成一个${project.parent.artifactId}-${project.version}-serverless.zip包,如图3所示。
- 部署函数。
若zip包超过40M,需要通过OBS方式上传,如图6所示。
- 配置函数常规配置,如图9所示。
- 通过托管方式改造的函数入口统一固定为:com.huawei.yuanrong.function.Handler.handleRestRequest。
- 执行超时时间和内存可以根据业务属性配置。超时时间表示,当请求执行超过该配置时间时,该次请求会因为超时而失败;内存根据业务运行过程中所需的内存大小配置,当内存使用超过该配置值时,函数实例可能会被迫停止而导致请求失败。
- 配置环境变量。
- spring_start_class:SpringBoot的启动类名,如图10所示。
- cxf_enabled:CXF应用(典型的有Jalor)为true,否则为false。
- mfa-services的启动类是MfaMainApplication。
- 配置其他环境变量。
用户后续可以通过System.getProperty(“key”)的方式,获取到这里配置的环境变量。在传统微服务启动时,支持指定命令行参数,如java -Dfoo=bar xxx.jar。在Serverless函数部署时,可以通过环境变量的方式配置这些参数。
以上环境变量参数配置,如下图11所示。
- 配置函数初始化入口。
可选操作,在开启“快照式冷启动”或“预留实例”功能时为必选。函数初始化入口为固定配置:com.huawei.yuanrong.function.Handler.initializer,如图12所示。
- 开启预留实例或者快照式冷启动。
通过预留实例,或者快照式冷启动功能,可以加速函数启动时间,减少请求时延。预留实例使用可参考预留实例管理,快照式冷启动使用可参考配置快照式冷启动。
- 通过独立函数方式改造微服务。
直接函数化改造,是将微服务业务代码迁移到云函数内,基于spring框架的微服务需要剥离spring才能将微服务改造成serverless函数。
- 新建一个全新的maven工程,如图13所示。
- 业务代码迁移。
将原项目代码迁移至新项目,文件目录与原项目相同,删除使用的spring框架自动注入的标签。自动注入的类,需要用户自己创建对象。新创建的pom.xml中dependency应该为空,迁移过程中根据需要添加依赖,不用的jar包尽量不引入,根据需要在pom.xml中添加jar包依赖。
- 新增函数平台依赖,引入请求参数和响应类。
- 编写函数执行入口类。
以新建AdjustmentHandler类为例,原有接口为executeQueryAndUploadWithParam,将去spring之后的原有的executeQueryAndUploadWithParam接口逻辑放到AdjustmentHandler类中的executeQueryAndUploadWithParam方法中进行调用。
- 本地测试。
- 配置函数。
- 参照准备中创建函数的步骤,创建以mfa-import-serverless命名的函数。
- 重复托管方式改造中2-4步骤,上传函数代码包。
- 配置函数入口,入口为包名.类名.方法名,举个例子:com.huawei.xxxx.xxx.AdjustmentHandler.executeQueryAndUploadWithParam。
- 配置函数环境变量:无需再配置spring_start_class和cxf_enabled,业务按需配置其它的环境变量。
- 配置函数初始化入口。可选,用户可以自定义函数初始化时(接收请求之前)需要进行的操作。一个例子:
public void initFunction(Context context) {
// 业务自身逻辑,可以去远程拉取一些配置数据等
}
配置初始化入口:包名.类名.方法名,如图17所示。
- 开启预留实例/快照式冷启动功能,与步骤8相同。