BaaS:后端服务化,例如CDN服务、对象存储服务、日志服务、云监控、云数据库、消息队列等
FaaS:函数服务化,即云计算里的函数计算服务,函数可以调用BaaS,函数之间也可以相互调用
Serverless:通过静态文件托管到OSS、后端程序部署到FaaS,FaaS操作BaaS,可以实现一个完整的应用,并且不需要维护任何服务器
阿里云函数计算的限制:
1、函数最大允许运行时间600秒
2、函数长时间(几分钟到几十分钟不等)没被触发,资源(容器)会被释放;再次触发,函数需重新加载(冷启动),耗时较长;可以通过定时触发解决
3、Spring项目中的@Scheduled定时任务无法长时间保持运行,需要改造成函数计算的定时触发器
4、函数会并发执行,需要考虑数据一致性问题
SpringBoot项目 部署到 阿里云函数计算
1、pom.xml
<packaging>jar</packaging>
<properties>
<project.java.version>1.8</project.java.version>
<tomcat.version>8.5.20</tomcat.version>
</properties>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 阿里云函数计算相关依赖 -->
<dependency>
<groupId>com.aliyun.fc.runtime</groupId>
<artifactId>fc-java-core</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>com.aliyun.fc.runtime</groupId>
<artifactId>fc-java-common</artifactId>
<version>2.2.1</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${project.java.version}</source>
<target>${project.java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
2、SpringBootStartApplication.java
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MyApplication.class); // SpringBoot入口类
}
}
3、FcHandler.java
public class FcHandler implements FunctionInitializer, HttpRequestHandler {
private AppLoader fcAppLoader = new FcAppLoader();
private String userContextPath = System.getenv("USER_CONTEXT_PATH"); // 保持默认即可
private String appBaseDir = System.getenv("APP_BASE_DIR"); // 默认为/temp,保持默认即可
@Override
public void initialize(Context context) throws IOException {
FunctionComputeLogger fcLogger = context.getLogger(); // 日志工具
fcAppLoader.setFCContext(context);
if (appBaseDir != null) fcAppLoader.setBaseDir(appBaseDir);
fcAppLoader.loadCodeFromLocalProject("");
boolean initSuccess = fcAppLoader.initApp(userContextPath, FcHandler.class.getClassLoader());
if (!initSuccess) {
throw new IOException("Init web app failed");
}
}
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response, Context context) throws IOException, ServletException {
try {
fcAppLoader.forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、服务配置
专有网络配置:配置了VPC后,才能访问VPC内的BaaS
日志配置:配置了日志项目后,程序中写日志才有地方看
权限配置:访问任何BaaS,都需要添加对应的权限
5、函数配置
触发器:HTTP触发器
认证方式:anonymous // 匿名,无认证
函数入口:com...FcHandler::handleRequest // 即上面的FcHandler类里的方法
函数初始化入口:com...FcHandler::initialize // 即上面的FcHandler类里的方法
网友评论