Serverless应用引擎SAE(Serverless App Engine)是面向应用的Serverless PaaS平台,能够帮助PaaS层用户免运维IaaS、按需使用、按量计费,做到低门槛微服务、PHP应用上云。本文介绍如何使用SAE,帮助您快速了解SAE以及各方面的最佳实践。

背景信息

如果您初次接触SAE,建议您观看入门视频,了解SAE及其基本操作。更多信息,请参见什么是Serverless应用引擎

功能索引

一级分类二级分类
部署启动命令和参数数据库白名单CI/CD升级和回滚权限配置其他
网络阿里云网络基础概念SAE网络访问主要场景与方式SAE网络访问对比项微服务增强
多语言PHP运行时支持静态文件托管远程调试
日志文件日志实时日志
存储NASOSS上传下载文件
监控告警基础监控业务监控告警设置
高可用多vSwitch部署优雅上下线限流降级
弹性(降本增效)手动扩缩定时弹性指标弹性混合弹性定时启停
最佳实践最佳实践

SAE使用流程

SAE使用流程如下图所示。dg_sae_workflow
  1. 在首次部署SAE应用前,需要完成规划VPC、vSwitch、命名空间(区分测试、预发、生产等环境)的准备工作。

    具体操作,请参见准备工作

  2. SAE控制台部署应用。

    具体操作,请参见控制台部署除通过控制台部署应用外,SAE还支持通过Jenkins、IDE插件、Maven插件、Terraform、OpenAPI和云效等多种方式来部署应用。

    说明 如果您是第一次部署应用到SAE,需要在SAE控制台创建应用。
  3. 通过以下方式访问SAE应用。
  4. SAE应用配置更多进阶功能。

    例如,企业级权限控制、弹性(降本增效)、Java微服务增强、高可用、存储等功能。

[回到顶部]

部署

SAE支持代码包部署和镜像部署,当前代码包支持Java的WAR包和JAR包、PHP ZIP包和Python ZIP包。在创建SAE应用时,需要自定义或者自动配置VPC、vSwitch和安全组等,并且需要指定实例规格(创建后可以修改规格)。本文以下列配置为例,介绍SAE的参考部署。

启动命令和参数

  • 镜像部署

    启动命令以及相关参数可以直接写在Dockerfile内,同时也支持在SAE控制台覆盖启动命令,如下图所示。

    sc_set_start_command_image
  • 代码包部署

    以JAR包部署为例,支持在SAE控制台配置启动相关参数,如下图所示。

    sc_set_start_command_java_jar
[回到顶部]

数据库白名单

不同于ECS模式,SAE在容器形态下,每次部署应用时IP地址都有可能变化,但应用绑定的vSwitch的网段不会变化,因此您可以在数据库的白名单内配置vSwitch的网段。更多信息,请参见应用访问阿里云数据库

[回到顶部]

CI/CD

除控制台部署和API部署外,SAE和很多CI/CD工具进行了集成,典型的有云效和Jenkins,可以实现代码提交以后自动部署。更多信息,请参见CI/CD部署

  • 插件部署

    如果您使用Java语言,SAE提供了丰富的插件部署,包括Maven插件、IntelliJ IDEA插件、Eclipse插件等。更多信息,请参见插件部署

  • 端云互联

    在微服务场景下,通常会拆分成很多应用。如果您的测试环境部署在阿里云,联调的时候会是一大痛点。SAE联合Cloud Tookit提供了远程的端云互联能力,可以在本机直接调用云端的Consumer、提供Provider等。更多信息,请参见使用Cloud Toolkit实现端云互联(IntelliJ IDEA)

  • Terraform

    SAE支持Terraform。更多信息,请参见terraform-provider-alicloudTerraform概述

[回到顶部]

升级和回滚

SAE支持丰富的回滚策略,包括单批发布、分批发布、灰度发布和回退历史版本等。更多信息,请参见升级和回滚应用

[回到顶部]

权限配置

SAE支持精细的权限控制,支持命名空间、应用和读写等粒度的权限控制,通过权限助手功能有效简化您的配置过程。更多信息,请参见SAE权限助手

[回到顶部]

其他

  • 环境变量

    应用在系统中运行需要配置特定的环境变量,其相关命令才可以被执行。环境变量以键值对的方式存储,不同应用拥有不同的环境变量,并且互不影响。更多信息,请参见设置环境变量

  • Hosts绑定

    SAE支持应用级别的实例,通过Hosts绑定对主机名进行解析,以便通过主机名访问应用实例。更多信息,请参见设置Hosts绑定

[回到顶部]

网络

将应用部署至SAE后,您可能会有不同的网络访问需求。更多信息,请参见SAE网络相关概念和能力

阿里云网络基础概念

dg_aliyun_cloud_network
  • 专有网络(VPC):基于阿里云创建的自定义私有网络,不同的专有网络之间逻辑上彻底隔离。
    说明 私有网络默认不可访问公网。
  • 交换机(vSwitch):交换机是组成专有网络的基础网络设备,对应实体物理机房。在VPC内创建云资源时,必须指定云资源所连接的交换机。
  • 弹性公网IP(EIP):只能和一个资源(ECS、SAE实例等)绑定,绑定的资源具备出、入公网的能力。
  • NAT网关(NAT Gateway):支持VPC内的资源访问公网(SNAT)。区别于EIP的核心功能,公网NAT网关可用于VPC内的所有资源,而EIP只能用于VPC内的一个资源。
[回到顶部]

SAE网络访问主要场景与方式

将应用部署到SAE后,您可能会遇到以下网络访问需求。概念图如下所示。dg_sae_network

SAE应用之间的内网互相访问(非微服务)

Serverless模式下,每次部署都会产生新的内网IP,但不支持直接基于实例的IP来互相访问应用。您可以通过以下方式实现。

  • SAE Service(CLB):基于阿里云负载均衡产品(私网CLB)实现的SAE服务来访问。更多信息,请参见基于CLB配置应用服务访问
  • SAE Service(Domain):基于SAE的K8s底座,实现的基于域名的应用访问。每个SAE的应用会有一个SAE环境中可供访问的域名。更多信息,请参见基于K8s Service配置应用服务访问
  • SAE Ingress(ALB/CLB):基于阿里云负载均衡产品(私网ALB/CLB)实现的网关路由,可以根据不同的域名、路径路由到不同的SAE应用。更多信息,请参见基于ALB/CLB配置网关路由(Ingress)访问
[回到顶部]

SAE应用需要被公网访问(入口流量)

您可以通过以下方式实现。

[回到顶部]

SAE应用需要访问公网(出口流量)

您可以通过以下方式实现。

[回到顶部]

SAE需要访问VPC内的ECS、RDS、Redis等

  • SAE基于阿里云VPC网络,因此无需额外配置,可以直接访问VPC内的资源(ECS、RDS、Redis等)。
  • 需要确认安全组、产品白名单是否放开。如果遇到问题,请参考常见问题的步骤进行排查。
[回到顶部]

微服务应用访问注册中心以及实例互相访问

更多信息,请参见SAE微服务相关概念和能力

[回到顶部]

SAE网络访问对比项

SAE中服务(Service)和网关路由(Ingress)的区别

SAE基于阿里云SLB(CLB和ALB)实现的网关路由(Ingress),具备根据域名、路径路由到不同应用的能力(如下图),而服务(Service)不具备该能力。因此,在满足需求的前提下,建议您优先考虑使用网关路由。在需要使用4层TCP协议访问或者无法通过域名访问等场景下,您可以考虑使用服务(Service)。dg_slb
[回到顶部]

基于CLB实现的服务和基于域名(K8s Service Domain)实现的服务的区别

K8s服务有两种模式,一种是基于CLB,另一种是基于ClusterIP。SAE没有直接提供ClusterIP,而是提供了一个可供访问的域名。两者的主要区别如下。
对比项CLBDomain(ClusterIP)
费用CLB计费免费
运维CLB作为一个独立的阿里云产品,支持配置相关的监控、告警以及收集访问日志到SLS,提供细粒度的问题排查能力。未提供独立的监控、告警、访问日志等能力,需要应用侧本身配置告警和日志。
[回到顶部]

基于ALB实现的网关路由和CLB网关路由的区别

ALB(Application Load Balancer)是阿里云推出的专门面向HTTP、HTTPS和QUIC等应用层负载场景的负载均衡服务。针对网关路由场景,建议您优先考虑使用ALB。更多信息,请参见负载均衡SLB产品家族介绍

[回到顶部]

基于NAT访问公网和EIP访问公网的区别

EIP访问公网的示例图如下,每个实例都会绑定一个EIP。如果EIP不足,则会创建失败,导致实例无法对外提供服务。dg_eip
NAT和EIP两种模式的主要差异如下。
对比项NATEIP
生效范围NAT可以控制在VPC或者vSwitch级别,为VPC或者vSwitch内所有无公网IP的实例提供访问公网的代理服务。一个VPC或者vSwitch只需要配置一个NAT,其所有实例将具备出公网的能力。EIP为实例级别,例如10个实例就需要10个EIP。一个实例绑定EIP后,将同时具备出网和入网的能力。
是否固定公网IP是。否。新的实例成功绑定EIP后,SAE才会销毁原先的实例并解绑原来的EIP。因此,需保证EIP数量至少为实例数量加一。EIP是变化的,是一个IP池。
典型场景应用会自动弹性扩缩,新的实例默认需要出公网的能力,且需要固定IP(95%的用户都适合该场景)。可接受EIP可变,需要直连实例的场景(例如在线会议),另外还需要自行精细化地控制每个实例的生命周期。
费用计费详情,请参见NAT网关计费计费详情,请参见EIP计费。实例数不超过20个时,EIP成本更优。
[回到顶部]

微服务增强

SAE作为微服务架构Serverless化的最佳实践产品,提供了诸多微服务能力的增强。更多信息,请参见SAE微服务相关概念和能力

注册中心

使用说明

为了让微服务的应用可以快速部署到SAESAE提供了“Serverless”版的Nacos作为注册中心,适用于使用Nacos1.X和2.X客户端的微服务应用。您可以参见在应用中配置SAE内置Nacos,将您的微服务应用部署到SAESAE注册中心的使用说明如下。

  • 选择SAE内置Nacos后,SAE通过自动注入相关环境变量以及借助于Java Agent修改字节码的技术,支持自动修改程序的注册中心地址。因此,您无需对程序做任何修改即可将其直接部署到SAE
  • 不适用于使用非Nacos注册中心的程序,相关逻辑完全由您的程序控制。
  • 该注册中心适用于快速体验或者小规模生产环境,如果您的微服务应用实例总数超过30个,推荐您使用自建注册中心或者MSE注册中心。
[回到顶部]
应用配置

应用配置如何生效,请参见使用SAE内置Nacos

[回到顶部]

配置中心

使用说明

与注册中心一样,SAE也提供了“Serverless”版的Nacos作为配置中心,适用于使用Nacos1.X和2.X客户端的微服务应用。您可以参见在应用中配置SAE内置Nacos,使用SAE的配置中心。SAE配置中心的使用说明如下。

  • 选择SAE内置Nacos后,SAE通过自动注入相关环境变量以及借助于Java Agent修改字节码的技术,支持自动修改程序的配置中心地址。因此,您无需对程序做任何修改即可将其直接部署到SAE
  • 不适用于使用非Nacos配置中心的程序,相关逻辑完全由您的程序控制。
  • 该配置中心的控制台由阿里云应用配置管理(Application Configuration Management,简称ACM)提供,虽然作为独立产品,它已经进入下线状态,但是在SAE中支持继续使用。建议您直接使用MSE提供的Nacos 2.0配置服务。更多信息,请参见Nacos版本特性
[回到顶部]
应用配置

应用配置如何生效,请参见使用SAE内置Nacos。控制台如何管理配置,请参见分布式配置管理

[回到顶部]

微服务开发

IDE自动部署

相比于每次重新打包部署,IDE一键部署可以大大减少您的部署时间,并提升研发效率。

具体操作,请参见使用Alibaba Cloud Toolkit自动化部署微服务至SAE

[回到顶部]
端云互联

采用微服务架构后,您的应用数会增多。在极端情况下,本地开发联调需要启动所有相关的微服务应用。针对该痛点,您可以借助阿里云Cloud Toolkit插件提供的端云互联能力。例如,让您的本地Consumer直接连接到SAE中部署的Provider,从而无需在本地启动Provider,大大减少开发调试成本。

具体操作,请参见使用Cloud Toolkit实现端云互联(IntelliJ IDEA)

[回到顶部]

服务治理

服务列表

对于使用内置Nacos的应用,SAE提供基础的服务列表查询能力。如果您使用自建注册中心或者MSE注册中心,可以登录对应的控制台查询,无需在SAE控制台查看。

具体操作,请参见查询服务列表

[回到顶部]
无损下线

因为Consumer客户端存在缓存,无法及时收到微服务Provider的下线通知,所以通常需要从注册中心摘除Provider实例,等待Consumer缓存刷新。针对上述情况,SAE借助MSE的无损下线将该功能做了产品化的集成。

关于该功能不适用的场景以及相比较于开源Spring Cloud和开源Dubbo优势的更多信息,请参见配置无损下线

SAE中配置无损下线的具体操作,请参见设置微服务无损下线

[回到顶部]
无损上线

微服务的Provider服务只要注册到注册中心即可被Consumer调用,但此时,Provider可能还需要更进一步的初始化,例如数据库连接池的初始化等。因此,对于流量比较大的微服务应用,推荐您开启无损上线功能。

具体操作,请参见设置微服务无损上线

[回到顶部]
微服务灰度

SAE不仅支持应用生命周期托管,还提供了微服务应用发布态的灰度能力。

具体操作,请参见管理灰度规则(Java)灰度发布微服务

[回到顶部]
限流降级

无论是微服务应用还是单体应用,在面对一些突发流量,例如秒杀场景时,应用可能会突然崩溃。如果是微服务应用,可能还会造成雪崩效应,因此有必要去做一些保护措施。SAE集成阿里云应用高可用服务(Application High Availability Service,简称AHAS),能够方便地配置和管理限流降级规则。

具体操作,请参见限流降级

[回到顶部]

应用监控

微服务架构下,如果没有配套的监控系统,不利于发现问题和诊断问题。SAE集成阿里云应用实时监控服务 (Application Real-Time Monitoring Service,简称ARMS) ,提供了应用大盘、JVM监控、慢调用监控、调用链分析和告警等能力,尽可能降低企业落地微服务架构的门槛。

更多信息,请参见应用监控

[回到顶部]

多语言

PHP运行时支持

SAE支持以下部署方式。
  • 镜像:任意PHP架构应用。
  • PHP ZIP包:任意PHP-FPM结合Nginx架构的在线应用。

SAE默认提供PHP运行时环境。更多信息,请参见PHP运行环境说明

[回到顶部]

静态文件托管

借助NAS和OSS,SAE支持独立托管静态文件,对运行过程中的代码、模板、上传的文件进行持久化存储,并实现跨实例共享文件。

[回到顶部]

远程调试

借助SAE的不同功能,SAE支持多种调试能力。

  • PHP远程调试

    SAE内置Xdebug插件,可开启远程调试。

  • 文件下载

    SAE支持通过Webshell登录实例,并借助SAE或OSS等功能下载文件。更多信息,请参见使用Webshell实现文件上传下载

  • 文件上传

    SAE借助NAS和OSS,方便开发调试代码。

[回到顶部]

日志

SAE集成了SLS和Kafka日志采集。SAE实时日志功能支持查看500行日志信息,如果您有更高的查阅需求,建议使用文件日志收集功能。SAE会将业务文件日志(容器内日志路径)、容器标准输出日志(stdout)收集并输入SLS或Kafka中,实现无限制行数查看日志、自行聚合分析日志,方便业务日志对接。

文件日志

SAE集成了SLS日志采集,您只需在SAE控制台开启。与ECS时代手动维护采集的机器列表不同,在SAE配置好采集目录或者采集文件后,后续每当部署、扩容时,SAE都会自动和SLS对接日志采集,支持在SLS控制台根据关键字检索日志。更多信息,请参见设置日志收集至SLS

日志源支持通配符,例如/tmp/log/*.log表示采集/tmp/log目录以及子目录下所有以log结尾的文件。

sc_use_sls_v2

在不便使用SLS采集、RAM用户(子账号)无法查看SLS日志等情况下,您可以选择将日志导入Kafka。在此基础上,您可以结合自身的业务场景,将Kafka的数据投递到例如Elasticsearch等其他持久化库中,便于集中管理和分析日志。更多信息,请参见设置日志收集至KafkaSAE日志导入Kafka最佳实践

同时,您还可以通过环境变量来设置Logtail启动参数。更多信息,请参见设置环境变量提升Logtail采集性能

[回到顶部]

实时日志

SAE会自动采集标准输出的日志,保留最新的500条,并支持在SAE控制台查看。更多信息,请参见日志管理

sc_real_time_logs

如果您希望将标准输出内容也采集到SLS,可以先将标准输出到文件,再配置文件采集。参数如下图所示。

sc_set_args[回到顶部]

存储

SAE自带20 GB的系统盘存储,如果您有读写外部存储需求,建议使用NAS和OSS。诊断SAE应用包括常规检查和上传日志两种方式,其中上传日志不仅可以使用OSS,也可以使用SAE内置的一键上传与下载功能。

说明 日志场景下,建议使用SLS,不建议使用NAS和OSS。更多信息,请参见设置日志收集至SLS

NAS

SAE支持NAS存储功能,解决了应用实例数据持久化和实例间数据分发的问题。NAS存储只有挂载到ECS或者SAE才能访问。更多信息,请参见设置NAS存储

[回到顶部]

OSS

OSS提供了便捷的工具以及控制台,支持可视化地管理Bucket。OSS适合读多写少的场景,例如挂载配置文件或者前端静态文件等。在SAE控制台部署应用时配置了OSS存储后,您可以通过OSS控制台访问数据。更多信息,请参见设置OSS存储

说明 写日志的场景下,无法使用ossfs工具。更多信息,请参见ossfs概述
[回到顶部]

上传下载文件

如果您希望将SAE内的文件下载到本地,您可以使用Webshell自带的文件上传下载功能。更多信息,请参见使用Webshell实现文件上传下载

除使用NAS或者OSS存储外,您还可以使用ossutil工具。关于如何使用阿里云OSS服务进行日志上传下载,请参见通过常规检查诊断应用

[回到顶部]

监控告警

SAE内置了基础监控和ARMS业务监控(Java和PHP)。告警管理提供了可靠的告警收敛、通知、自动升级以及其他功能,帮助您快速检测和修复业务告警。

基础监控

基础监控包含CPU、Load、MEM、磁盘、网络和TCP连接等。更多信息,请参见基础监控。当前基础监控内置的是阿里云云监控产品,所以您也可以登录云监控控制台配置自定义的监控大盘。

[回到顶部]

业务监控

业务监控默认提供了ARMS基础版,可以查看应用大盘、JVM监控、接口QPS RT、线程池和调用链分析等。更多信息,请参见应用详情

pg_monitor[回到顶部]

告警设置

SAE支持对以上各个监控项设置告警。更多信息,请参见应用监控报警

[回到顶部]

高可用

将应用部署在SAE后,针对流量的优雅上线与下线,您可以使用健康检查功能查看应用实例与业务运行是否正常,以便运行异常时定位问题。同时,SAE支持部署多vSwitch以应对机房级别的故障,支持使用AHAS实现Java应用的限流降级,全面保障应用的可用性。

多vSwitch部署

为了应对机房级的故障,建议您对生产级别的SAE应用配置多vSwitch。您可以选择在创建应用时配置多vSwitch,或者在创建应用以后增加vSwitch。创建vSwitch时,建议您设计相对充足的IP地址数(建议100以上),如果IP地址不足则会出现无法创建或者弹性伸缩失败的情况。更多信息,请参见切换vSwitch

  • 创建时选择多vSwitch。sc_choose_vswitch_when_creating_application
  • 创建后增加vSwitch。bt_choose_vswitch_when_application_has_been_created.png
    说明 增加vSwitch时,要注意同步配置数据库白名单。更多信息,请参见应用访问阿里云数据库
[回到顶部]

优雅上下线

SAE部署应用时,一般会经过先扩容再缩容的过程,但是对于流量的优雅上线与下线有以下两大业务痛点。
  • 新扩容的实例是否已经就绪能够承接流量。
  • 如何优雅销毁老实例。

SAE基于Kubernetes,提供了两种健康检查方式,包括应用实例存活检查(Liveness配置)和应用业务就绪检查(Readiness配置)。针对上述两大痛点,SAE支持配置健康检查Readiness。Readiness探针会周期性地检测实例是否就绪,新实例就绪后,SAE才会接入流量。如果检测失败,SAE不会引入流量。开始销毁老实例前,会先从流量侧摘除,并且销毁实例前可以配置下线脚本以及等待时间。更多信息,请参见设置健康检查

健康检查Liveness,也会周期性地检测实例是否已经启动。如果检测失败,SAE会自动重启容器。该特性便于进行异常场景的自动化运维,但可能会造成现场丢失,无法排查失败原因。您可以根据您的实际场景判断是否需要配置Liveness。

除配置Readiness或者Liveness外,微服务场景还需要配置微服务的优雅下线,以解决注册中心存在缓存的问题。更多信息,请参见设置微服务无损下线同时,在生产环境中,可能会出现因使用自动弹性伸缩、回滚升级等能力,而导致短时间内服务不可用、业务监控大量报错等情况。针对上述痛点,SAE支持配置微服务的优雅上线。更多信息,请参见设置微服务无损上线

[回到顶部]

限流降级

对于大流量场景,SAE集成了AHAS限流降级,保障应用的可用性。更多信息,请参见设置限流降级

[回到顶部]

弹性(降本增效)

SAE支持手动扩缩、定时弹性、指标弹性、混合弹性和定时启停等弹性策略。弹性作为云原生架构和应用的典型特点,从机器成本角度能够帮您降低成本,从运维角度能够帮您提升运维效率。

手动扩缩

手动扩缩适用于人工运维的场景。相较于ECS相对较复杂较慢的扩缩过程,SAE扩缩基于容器镜像,更加快速。更多信息,请参见手动扩缩

[回到顶部]

定时弹性

定时弹性适用于流量可预期的场景。例如,餐饮和教育行业每天存在明确的早晚业务高峰,则可以配置在不同的时间段运行不同的实例数,使服务器资源尽量贴合实际业务流量。更多信息,请参见配置弹性伸缩策略

[回到顶部]

指标弹性

指标弹性适用于流量相对不可预期的场景,当前支持CPU、MEM、TCP连接数、QPS和RT等指标。更多信息,请参见配置弹性伸缩策略

[回到顶部]

混合弹性

混合弹性适用于同时有突发流量和定时弹性诉求的场景,例如互联网、教育和餐饮等行业,对已知的时段进行精细粒度的实例数调整。

例如,在工作日弹性的实例最大值配置为max,最小值配置为min,但是实际上在周末又不需要保持min的实例数,则可以针对周末再配置一个实例数,减小min。更多信息,请参见配置弹性伸缩策略

[回到顶部]

定时启停

定时启停功能可以实现按命名空间定时批量启停应用,例如定时启停开发环境或测试环境的全部应用。假设对于开发测试环境,每天只需在08:00~20:00时使用,其余时间处于闲置状态,则可以在SAE配置定时启停,以降低成本。更多信息,请参见管理定时启停规则

[回到顶部]

最佳实践

针对各种业务需求,SAE提供了相关的最佳实践。除本文涉及到的弹性、网络、存储和应用访问阿里云数据库等外,还包括镜像、应用加速、JVM参数配置等。更多常见场景,请参见SAE最佳实践

[回到顶部]