全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

层管理

最近更新时间:2022-12-13 10:49:28

概述

如果您的云函数(KCF)拥有较多的依赖库或公共代码文件,您可以使用 KCF 中的层进行管理。使用层管理,您可以将依赖放在层中而不是部署包中,可确保部署或更新函数时保持较小的体积。对于 Java、Python和Node.js函数,只要将部署程序包保持在50MB以下,就可以在 KCF 控制台中在线编辑函数代码。

功能原理

  • 函数代码和依赖库或依赖的静态文件分离,保持函数代码较小体积。在使用IDE开发工具、命令行工具编辑函数时,可以做到快速部署更新。
  • 构建层时,需要将所有内容打包到ZIP文件中。云函数运行时会将层的内容解压并部署在/opt目录下。
  • 当函数配置多个层时,这些层的内容将被合并至/opt目录,多个层按照层绑定时的顺序进行解压。
  • 如果某一文件与其他层中的文件同名,则后配置层中的该文件会覆盖先配置层中的该同名文件。
  • 如果层中的代码依赖二进制的库或可执行文件,则需要使用Linux系统编译构建层。

构建层

各运行时使用层说明

层中的文件均在/opt/目录下,可以在函数代码中通过绝对路径进行访问。除此之外,云函数内置的环境变量添加了运行时语言的依赖包搜索路径,如果在层ZIP包中定义了与其相同的文件夹结构,则函数代码无需指定路径即可访问层。

Python、Node.js 环境变量见下表:

相关环境变量 特定目录
PYTHONPATH /opt/python
NODE_PATH /opt/nodejs/node_modules

各运行环境的层ZIP包文件结构

Python Runtime
使用flask依赖打包后的文件结构 
python-layer-code.zip
└── python
    └── flask

ZIP包解压部署后的路径
/opt
   └── python
       └── flask
Node.js Runtime

使用express依赖打包后的文件结构

nodejs-layer-code.zip
└── nodejs
    ├── node_modules
    │   └── express
        └── function-bind
    ├── package-lock.json
    └── package.json

ZIP包解压部署后的路径
/opt
   └── nodejs
       ├── node_modules
       │   └── express
           └── function-bind
       ├── package-lock.json
       └── package.json
Java Runtime
使用cloudevents-core依赖打包后的文件结构
java-layer-code.zip
└── java
    └── lib
        └── cloudevents-core-2.3.0.jar

ZIP包解压部署后的路径
/opt
   └── java
       └── lib
           └── cloudevents-core-2.3.0.jar

构建层的ZIP包

创建层时,需要将所有内容打包到ZIP文件中。云函数运行时会将层的内容解压并部署在/opt目录下。

构建层的ZIP包的方式和构建代码包的方式类似,为使函数在运行时能正确加载以层发布的库,库的代码目录结构需遵从各个语言标准的目录规范,具体信息,请参见各运行时使用层说明。对于部署于层的函数依赖库,如果按照规范的方式打包,云函数运行时会为您自动添加各语言的依赖库搜索路径,您无需指定全路径。如您想自定义层的目录结构,需要在代码中显式添加依赖库搜索地址。具体操作,请参见函数中引用层的依赖

各运行时构建层ZIP包的操作步骤如下所示

说明:下面创建的工作目录仅为示例,在实际操作过程中您可以按照自身需求创建目录名称。

Python Runtime

1、执行mkdir命令创建工作目录

mkdir python-layer-code

2、进入已创建的工作目录

cd python-layer-code

3、执行pip命令安装依赖库到python-layer-code/python。

pip3 install --target ./python flask   

其中flask是您要安装的依赖包的名称,具体以实际项目需要为准。
安装完成后,目录结构如下:

python-layer-code
└── python
    ├── flask
    ├── Flask-2.2.2.dist-info
    ├── itsdangerous
    └── itsdangerous-2.1.2.dist-info

4、在python-layer-code目录,执行zip命令打包依赖

zip -r python-layer-code.zip python
Node.js Runtime

1、执行mkdir命令创建工作目录

mkdir nodejs-layer-code

2、进入已创建的工作目录

cd nodejs-layer-code

3、执行npm命令安装依赖库到nodejs-layer-code/nodejs。

npm install --prefix ./nodejs --save express   

其中express是您要安装的依赖报的名称,具体以实际安装为准。
安装完成后,目录结构如下:

nodejs-layer-code
└── nodejs
    ├── node_modules
    │   └── express
        └── function-bind
    ├── package-lock.json
    └── package.json

4、在nodejs-layer-code目录,执行zip命令打包依赖

zip -r nodejs-layer-code.zip nodejs
Java Runtime

1、执行mkdir命令创建工作目录

mkdir java-layer-code

2、进入已创建的工作目录

cd java-layer-code

3、使用maven工具安装依赖
在java-layer-code目录创建一个pom文件
pom文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.kcf.demo</groupId>
    <version>1.0</version>
    <artifactId>layer-dependency</artifactId>

    <dependencies>
        <dependency>
               <dependency>
            <groupId>io.cloudevents</groupId>
            <artifactId>cloudevents-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
			     <!-- 项目文件打包 -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <!-- 生成的jar中,不要包含pom.xml和pom.properties这两个文件 -->
                        <addMavenDescriptor>false</addMavenDescriptor>
                        <manifest>
                            <!-- 是否要把第三方jar加入到类构建路径 -->
                            <addClasspath>false</addClasspath>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            <!-- maven依赖打包插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 是否排除间接依赖。默认false,不排除 -->
                    <excludeTransitive>false</excludeTransitive>
                    <!-- 是否消除依赖jar包后缀的版本信息。默认是false,不取消版本信息 -->
                    <stripVersion>false</stripVersion>
                    <!-- 输出文件路径 -->
                    <outputDirectory>target/java/lib</outputDirectory>
                    <stripVersion>false</stripVersion>
                    <includeScope>runtime</includeScope>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project> 

pom文件示例解析如下:

  • 要安装的依赖包为cloudevents-core。

  • 使用maven-jar-plugin将项目文件打包成一个轻量级的jar包。

  • 使用maven-dependency-plugin将需要安装的依赖包拷贝到target/java/lib目录下。

    在java-layer-code目录下执行以下命令安装依赖。

mvn dependency:copy-dependencies

安装完成后,目录结构如下:

java-layer-code
└── target
    └── java
        └── lib
            └── cloudevents-core-2.3.0.jar

4、在java-layer-code/target目录,执行zip命令打包依赖

zip -r java-layer-code.zip java

函数中引用层的依赖

对于部署于层的函数依赖库,如果按照规范的方式打包,函数计算运行时会为您自动添加各语言的依赖库搜索路径,您无需指定全路径。如您想使用自定义层的目录结构,需要在代码中显式添加依赖库搜索地址。

Python Runtime

按照文档构建的层,其依赖库在/opt/python目录下;需要将该目录添加到模块搜索路径中。
方式1:在函数配置中设置PYTHONPATH环境变量,添加层所在的目录。
示例如下。

PYTHONPATH=/opt/python

方式2:在您项目的入口文件里添加以下语句,需要在导入层的依赖库前执行。

#server.py
import json
import os
import logging
import sys
sys.path.append('/opt/python')
# 必须在 import numpy 前执行 
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/health")
def health_check():
    print("python path= ", os.sys.path)
    return "<p>Hello, World Flask!</p>", 200


if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080)

注意:必须在引用层中的模块(如flask)前执行 sys.path.append()

Node.js Runtime

按照文档构建的层,其依赖库在/opt/nodejs/node_modules目录下,需要将该目录添加到模块搜索路径中。

NODE_PATH=/opt/nodejs/node_modules

在函数配置中设置NODE_PATH环境变量,添加层所在的目录。

Java Runtime

在启动命令中设置-cp参数,添加层所在/opt/java/lib/*目录。

java -cp java-slim.jar:/opt/java/lib/* com.example.demo.Application

说明:

  • java-slim.jar: 项目文件构建的轻量级jar包
  • /opt/java/lib/*: 层依赖的路径
  • com.example.demo.Application: mainclass的路径

在函数中使用层

在您准备好层和函数后,可通过KCF控制台完成层的创建和函数中配置。

创建层

  1. 登录云函数控制台
  2. 进入层管理,点击新建层,完成相关配置,进行层的创建。
    • 层名称:设置层的名称。
    • 描述信息:设置层的描述信息。
    • 运行环境:选择层兼容的运行环境,支持多选。
    • 层上传:将您构建好的层以ZIP格式从本地/通过对象存储(KS3)上传。

创建层的压缩文件将按照层的版本进行存储。层创建成功后,将自动生成层的版本,版本号从1开始递增。如需新增版本,可在层的详情页,创建新的版本。

说明:

已创建的层或层版本不支持修改,您可以通过创建新的层或新版本来替代老版本。注意需同步在函数的层配置中进行绑定。

配置层

您可在创建函数时,或函数详情中,为函数配置层。

image20221130185222339.png

层在与函数进行绑定时,将按照具体的层版本与函数版本进行绑定。一个函数目前最多支持绑定5个层的具体版本,并在绑定时有一定顺序。

说明:

  • 层中的文件将会添加到 /opt 目录中,此目录在函数执行期间可访问。
  • 如果您的函数已绑定了多个层,这些层将按顺序合并到 /opt 目录中。如果同一个文件出现在多个层中,KCF 平台将会保留高优先级层里的文件。其中新添加的层优先级数值小,优先级高。
文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈