美文网首页
Serverless

Serverless

作者: saoraozhe3hao | 来源:发表于2019-10-16 11:40 被阅读0次

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类里的方法

相关文章

网友评论

      本文标题:Serverless

      本文链接:https://www.haomeiwen.com/subject/uleymctx.html