Alibaba Dragonwell 11提供多种可以加速应用启动的技术,为了让函数计算的客户能方便的使用Alibaba Dragonwell的启动加速技术,我们开发了此工具,封装了相关的流程和细节,并提供简单的使用方式,目前已经支持AppCDS和EagerAppCDS技术。需要特别说明的是,启动加速的作用是提升应用的启动速度,不会对您的代码逻辑做任何更改,您可以放心使用本工具。
下面对AppCDS和EagerAppCDS启动加速技术做简单的说明。
CDS全称是Class-Data Sharing,其原理是让类可以被预处理放到一个归档文件中,后续Java程序启动时,JVM将这个归档文件映射到内存中,类加载器从内存获取对应的Class数据,避免从文件中读取,以节约应用启动的时间。CDS只能作用于Boot Class Loader加载的类。
在JDK 10中,CDS扩展为AppCDS,AppCDS不仅能够作用于Boot Class Loader,也能够对App Class Loader和Custom Class Loader(客户自定义类加载器)起作用,大大增加CDS技术的适用范围。
AppCDS技术对于Custom Class Loader加载的类优化效果并不明显。为此阿里JVM团队在Alibaba Dragonwell 11中研发了EagerAppCDS技术,针对特定的Custom Class Loader加载类的过程进行优化,可以进一步降低应用启动时间。
当您执行s deploy时,s工具会自动首先执行您配置的pre-deploy,进而调用到本工具。本工具会自动在您的云账号中创建一个辅助函数,这个辅助函数会被调用并生成加速相关的文件,然后会下载加速相关的文件到您的本地,这些文件会随同您的代码一起被部署到云上创建正式函数。
辅助函数和您定义在s.yaml中的函数相比,initializer完全相同,handler不同。您定义的函数的handler是您的业务逻辑,而辅助函数的handler则是用于生成和下载加速文件相关的逻辑,和您的业务逻辑完全无关。在辅助函数的handler执行之前,您的业务函数的initializer会先执行。为了提升启动加速的效果,建议您把类加载和初始化工作放到initializer中。更具体的概念可以参考函数计算 官方文档
当您调用调用正式函数时,我们会检测您的代码目录中是否存在加速相关文件,如果存在则自动打开启动加速特性;如果代码目录中不存在启动加速相关相关文件,则会以常规方式正常执行,不会对影响您的业务逻辑。
需要说明的是,本工具自动创建辅助函数并调用,会导致额外的费用,价格和正式函数相同。因为仅调用1次或者数次,可以认为费用很低。
目前 本工具 与 Serverless Devs 实现了集成,可以通过 Serverless Devs 的 s cli
直接使用,具体步骤如下:
-
在
s.yaml
中的 service actions 中添加pre-deploy
,配置 run 命令为s cli pgo gen --lang=java --module=helloworld
。 -
在
s.yaml
中的 service actions 中添加post-deploy
,配置 run 命令为s cli pgo gen --lang=java --module=helloworld --enable
。 -
将
s.yaml
中的 runtime 改为java11
,并且修改codeUri为固定值target/artifact -
在
s.yaml
中为service
配置logConfig和role,便于把函数产生的日志发送到您的SLS Logstore中 -
部署函数
部署时(s deploy)会优先使用s build的产物,这些产物存放在项目根目录下的.s目录。由于我们在上文中配置了codeUri为target/artifact,所以为了让s deploy读取到target/artifact目录中的文件,必须删除掉.s目录中的文件和文件夹。如果您没有执行过s build,则无需执行下面的删除命令。
rm -rf .s/*
执行部署命令
s deploy
- 调用函数
- http trigger调用方式
curl 'curl http://135******1392103.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/hello-world-service/http-trigger-java11-springboot/'
- event trigger调用方式
s cli fc-api invokeFunction --serviceName hello-world-service --functionName http-trigger-java11-springboot --event '{}'
- 附带一个完整的yaml文件,您可以用此文件快速开始
edition: 1.0.0
name: hello-world-app
access: "default"
vars:
service:
services:
helloworld:
component: fc
actions:
pre-deploy:
- run: s cli pgo gen --lang=java --module=helloworld --downloader=oss
post-deploy:
- run: s cli pgo gen --lang=java --module=helloworld --enable
props:
region: cn-hongkong
service:
name: springboot-hello-world-service
logConfig:
project: fc-project-yibo-hongkong
logstore: fc-logstore-hongkong
enableRequestMetrics: true
enableInstanceMetrics: true
logBeginRule: DefaultRegex
role: acs:ram::1351XXXXXX39XXX3:role/AliyunFCDefaultRole
function:
name: http-trigger-springboot-demo
instanceType: c1
description: 'hello world by serverless devs'
runtime: java11
codeUri: target/artifact
handler: com.example.demo.DemoApplication::handleRequest
memorySize: 8192
timeout: 60
initializationTimeout: 60
initializer: com.example.demo.DemoApplication::initialize
environmentVariables:
triggers:
- name: httpTrigger
type: http
config:
authType: anonymous
methods:
- GET
- POST
Alibaba JVM 团队