1.4.2 框架
本节将介绍Spring Cloud Function框架和Serverless Framework框架。
1.4.2.1 跨平台开发框架Spring Cloud Function
Java语言的设计目标Write Once、Run Anywhere提升了语言的可移植性。虽然Serverless编程提升了开发者的开发效率,但是在可移植性上却不尽如人意,函数代码需要进行改造才能在其他平台运行,对需要多云或需要在云服务商间迁移的开发者来说增加了移植的成本。
以AWS Lambda和Azure Function文档代码为例,Java函数代码写法如下。
二者的编程风格和接口的差异较大,如果有成百上千个函数需要在AWS Lambda和Azure Function上部署,其修改和维护的成本会很高。
Pivotal(Spring的母公司)推出了Spring Cloud Function,用于解决Java函数跨多个Serverless平台(如Lambda、Azure、OpenWhisk、Google Cloud Function等)的运行。它支持统一的编程模型,并且可以独立运行,如图1-24所示。此外,Spring Cloud Function致力于推广通过函数的方式实现业务逻辑,将函数开发和运行时解耦,保持SpringBoot的开发特性(自动配置),以方便Spring生态的开发者进行跨平台的Java函数开发。
图1-24 Spring Cloud Function可以用一套代码跨多平台或独立运行
Spring Cloud Function抽象了三种核心函数接口:Function、Consumer、Supplier,支持响应式和命令式的编码方式。
下面是一段Spring Cloud Function文档中的示例代码,用于将输入字符串转换为大写。这段代码从直观上看就是一个普通的SpringBoot函数,可以直接在本地打包运行并进行测试。开发者可以像SpringBoot应用一样,访问本地的8080端口测试函数。
如果想要将这个函数部署到Google Cloud Function,只需要在Pom文件中加入对Google Cloud Function的适配依赖,然后使用mvn package命令对函数进行打包,将其发布到Google Cloud Function后就可以运行了,代码如下所示。
由上可见,Spring Cloud Function为当前基于Serverless开发Java函数的调测和跨平台移植带来了一定的便利,开发者可以继承原有基于Spring的生态和多种编程模式,不会产生新的学习成本。Serverless支持多语言开发,未来其他语言也会有对应的开发框架对跨平台的函数开发进行支持。
1.4.2.2 跨平台部署工具Serverless Framework
除开发框架外,自动化部署工具也必不可少。2014年AWS在推出Lambda时,缺乏与函数配套的部署模型(函数配置定义)及自动化的本地测试工具。AWS CLI仅支持将函数打包、上传、发布,要实现函数的“基础设施即代码”,只能依赖AWS Cloud Formation的能力,这对于开发人员并不友好。此外,CLI缺乏函数管理的功能,这也是对Lambda最主要的质疑之一。
2015年,个人开发者Austen Collins使用Node.js独立开发了Serverless Framework。Serverless Framework支持AWS Lambda的开发测试和部署发布,之后又提供了对主流商用及开源Serverless平台的支持,其在Github的star数接近4万,是当前流行的Serverless开发框架之一。Serverless Framework提供了从开发、CI/CD到发布、监控的端到端完整功能,为函数定义了统一的基础设施即代码模型,且支持多个Serverless平台的部署发布和本地测试,其开源的版本支持开发、本地测试、发布及插件等功能。Serverless Framework部署模型中的主要概念如下。
• Service:可以映射到微服务的概念,一个服务可以管理多个不同配置的函数。比如对于用户管理的服务,可能会覆盖CRUD四个函数。
• Provider:部署的目标Serverless平台,当前支持主流的商用Serverless平台,如AWS Lambda、Azure Function、Google Function及Knative等。每个Provider的配置项可能会有所不同。Provider在配置项中提供了默认的函数配置。
• Functions:一个或一组函数的配置,如果不重写配置项,则可以直接使用Provider中的配置。使用不同的配置,如采用不同大小的内存,可以覆写此项对应的函数配置。
• Plugins:开发者引入的可复用的组件,如平台的其他Serverless服务等。
• Custom:为插件提供自定义的配置。
如下代码是Serverless Framework文档中面向AWS部署多个函数的配置文件的一个样例。
开发者完成函数编辑和本地测试后,使用sls deploy命令就可以将所有函数发布。
通常,商用或开源的Serverless平台都会提供自己的基础设施即代码模型和自动化部署工具。对于未提供这些工具的Serverless平台,或者需要跨平台部署时,可以考虑采用Serverless Framework的开源版本。