Serverless 应用引擎 SAE(Serverless App Engine)是面向应用的Serverless PaaS平台,能够帮助PaaS层用户免运维IaaS、按需使用、按量计费,做到低门槛微服务、PHP应用上云。本文介绍如何使用SAE,帮助您快速了解SAE以及各方面的实践教程。
背景信息
如果您初次接触SAE,建议您观看入门视频,了解SAE及其基本操作。更多信息,请参见什么是Serverless应用引擎。
功能索引
一级分类 | 二级分类 |
SAE使用流程
SAE使用流程如下图所示。
在首次部署SAE应用前,需要完成规划VPC、vSwitch、命名空间(区分测试、预发、生产等环境)的准备工作。
具体操作,请参见准备工作。
在SAE控制台部署应用。
具体操作,请参见应用托管概述。除通过控制台部署应用外,SAE还支持通过Jenkins、IDE插件、Maven插件、Terraform、OpenAPI和云效等多种方式来部署应用。
说明如果您是第一次部署应用到SAE,需要在SAE控制台创建应用。
通过以下方式访问SAE应用。
方式一:绑定CLB访问,一个端口支持绑定一个应用。具体操作,请参见为应用绑定CLB。
方式二:配置网关路由访问,一个端口支持绑定多个应用。具体操作,请参见为应用配置网关路由(CLB)。
方式三:绑定EIP访问,一个实例支持绑定一个EIP。具体操作,请参见基于EIP配置SAE实例公网访问和访问公网的能力。
为SAE应用配置更多进阶功能。
例如,企业级权限控制、弹性(降本增效)、Java微服务增强、高可用、存储等功能。
部署
SAE支持代码包部署和镜像部署,当前代码包支持Java的WAR包和JAR包、PHP ZIP包和Python ZIP包。在创建SAE应用时,需要自定义或者自动配置VPC、vSwitch和安全组等,并且需要指定实例规格(创建后可以修改规格)。本文以下列配置为例,介绍SAE的参考部署。
启动命令和参数
镜像部署
启动命令以及相关参数可以直接写在Dockerfile内,同时也支持在SAE控制台覆盖启动命令,如下图所示。
代码包部署
以JAR包部署为例,支持在SAE控制台配置启动相关参数,如下图所示。
数据库白名单
不同于ECS模式,SAE在容器形态下,每次部署应用时IP地址都有可能变化,但应用绑定的vSwitch的网段不会变化,因此您可以在数据库的白名单内配置vSwitch的网段。更多信息,请参见应用访问阿里云数据库。
CI/CD
除控制台部署和API部署外,SAE和很多CI/CD工具进行了集成,典型的有云效和Jenkins,可以实现代码提交以后自动部署。更多信息,请参见应用托管概述。
升级和回滚
SAE支持丰富的回滚策略,包括单批发布、分批发布、灰度发布和回退历史版本等。更多信息,请参见升级和回滚应用。
权限配置
SAE支持精细的权限控制,支持命名空间、应用和读写等粒度的权限控制,通过权限助手功能有效简化您的配置过程。更多信息,请参见SAE权限助手。
其他
网络
将应用部署至SAE后,您可能会有不同的网络访问需求。更多信息,请参见SAE网络相关概念和能力。
阿里云网络基础概念
专有网络(VPC):基于阿里云创建的自定义私有网络,不同的专有网络之间在逻辑上彻底隔离。
说明私有网络默认不可访问公网。
交换机(vSwitch):交换机是组成专有网络的基础网络设备,对应实体物理机房。在VPC内创建云资源时,必须指定云资源所连接的交换机。
弹性公网IP(EIP):只能和一个资源(ECS、SAE实例等)绑定,绑定的资源具备出、入公网的能力。
NAT网关(NAT Gateway):支持VPC内的资源访问公网(SNAT)。区别于EIP的核心功能,公网NAT网关可用于VPC内的所有资源,而EIP只能用于VPC内的一个资源。
SAE网络访问主要场景与方式
将应用部署到SAE后,您可能会遇到以下网络访问需求。概念图如下所示。
SAE应用之间的内网互相访问(非微服务)
Serverless模式下,每次部署都会产生新的内网IP,但不支持直接基于实例的IP来互相访问应用。您可以通过以下方式实现。
SAE Service(CLB):基于阿里云负载均衡产品(私网CLB)实现的SAE服务来访问。更多信息,请参见基于CLB配置应用服务访问。
SAE ServiceName:基于SAE的K8s底座,实现的基于域名的应用访问。每个SAE的应用会有一个SAE环境中可供访问的域名。更多信息,请参见基于K8s ServiceName配置应用服务访问。
SAE Ingress(ALB/CLB):基于阿里云负载均衡产品(私网ALB/CLB)实现的网关路由,可以根据不同的域名、路径路由到不同的SAE应用。更多信息,请参见基于ALB/CLB配置网关路由(Ingress)访问。
SAE应用需要被公网访问(入口流量)
您可以通过以下方式实现。
SAE Service(CLB):基于阿里云负载均衡产品(公网CLB)实现的SAE服务访问。更多信息,请参见基于CLB配置应用服务访问。
SAE Ingress(ALB/CLB):基于阿里云负载均衡产品(公网CLB/ALB)实现的网关路由,可以根据不同的域名、路径路由到不同的SAE应用。更多信息,请参见基于ALB/CLB配置网关路由(Ingress)访问。
SAE EIP:为SAE应用的每个实例绑定一个EIP,使该实例能够同时具备出、入公网的能力。更多信息,请参见基于EIP配置SAE实例公网访问和访问公网的能力。
SAE应用需要访问公网(出口流量)
您可以通过以下方式实现。
NAT网关:为SAE应用关联的VPC或者vSwitch配置NAT网关,则所有相关的SAE应用都具备了访问公网的能力。更多信息,请参见配置NAT网关使SAE应用能访问公网。
SAE EIP:为SAE应用的每个实例绑定一个EIP,则该实例会同时具备出、入公网的能力。更多信息,请参见基于EIP配置SAE实例公网访问和访问公网的能力。
SAE需要访问VPC内的ECS、RDS、Redis等
SAE基于阿里云VPC网络,因此无需额外配置,可以直接访问同一VPC内的资源,如ECS、云数据库RDS和云数据库 Tair(兼容 Redis)等。反之,同一VPC内的阿里云资源也可以访问SAE。
需要确认安全组、产品白名单是否放开。如果遇到问题,请参考常见问题的步骤进行排查。
微服务应用访问注册中心以及实例互相访问
更多信息,请参见SAE微服务相关概念和能力。
SAE网络访问对比项
SAE中服务(Service)和网关路由(Ingress)的区别
SAE基于阿里云SLB(CLB和ALB)实现的网关路由(Ingress),具备根据域名、路径路由到不同应用的能力(如下图),而ServiceName不具备该能力。因此,在满足需求的前提下,建议您优先考虑使用网关路由。在需要使用4层TCP协议访问或者无法通过域名访问等场景下,您可以考虑使用ServiceName。
更多信息,请参见以下文档:
基于CLB实现的服务和基于域名(K8s Service Domain)实现的服务的区别
K8s服务有两种模式,一种是基于CLB,另一种是基于ClusterIP。SAE没有直接提供ClusterIP,而是提供了一个可供访问的域名。两者的主要区别如下。
对比项 | CLB | Domain(ClusterIP) |
费用 | 免费 | |
运维 | CLB作为一个独立的阿里云产品,支持配置相关的监控、告警以及收集访问日志到SLS,提供细粒度的问题排查能力。 | 未提供独立的监控、告警、访问日志等能力,需要应用侧本身配置告警和日志。 |
基于ALB实现的网关路由和CLB网关路由的区别
ALB(Application Load Balancer)是阿里云推出的专门面向HTTP、HTTPS和QUIC等应用层负载场景的负载均衡服务。针对网关路由场景,建议您优先考虑使用ALB。更多信息,请参见负载均衡SLB产品家族介绍。
基于NAT访问公网和EIP访问公网的区别
EIP访问公网的示例图如下,每个实例都会绑定一个EIP。如果EIP不足,则会创建失败,导致实例无法对外提供服务。
NAT和EIP两种模式的主要差异如下。
对比项 | NAT | EIP |
生效范围 | 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微服务相关概念和能力。
注册中心
使用说明
为了让微服务的应用可以快速部署到SAE,SAE提供了“Serverless”版的Nacos作为注册中心,适用于使用Nacos1.X和2.X客户端的微服务应用。您可以参见在应用中配置SAE内置Nacos,将您的微服务应用部署到SAE。SAE注册中心的使用说明如下。
选择SAE内置Nacos后,SAE通过自动注入相关环境变量以及借助于Java Agent修改字节码的技术,支持自动修改程序的注册中心地址。因此,您无需对程序做任何修改即可将其直接部署到SAE。
不适用于使用非Nacos注册中心的程序,相关逻辑完全由您的程序控制。
该注册中心适用于快速体验或者小规模生产环境,如果您的微服务应用实例总数超过30个,推荐您使用自建注册中心或者MSE注册中心。
应用配置
应用配置如何生效,请参见使用SAE内置Nacos。
配置中心
使用说明
与注册中心一样,也提供了“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集成 应用实时监控服务 ARMS(Application Real-Time Monitoring Service),提供了应用大盘、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
结尾的文件。
在不便使用SLS采集、RAM用户(子账号)无法查看SLS日志等情况下,您可以选择将日志导入Kafka。在此基础上,您可以结合自身的业务场景,将Kafka的数据投递到例如Elasticsearch等其他持久化库中,便于集中管理和分析日志。更多信息,请参见设置日志收集至Kafka和SAE日志导入Kafka最佳实践。
同时,您还可以通过环境变量来设置Logtail启动参数。更多信息,请参见设置环境变量提升Logtail采集性能。
实时日志
SAE会自动采集标准输出的日志,保留最新的500条,并支持在SAE控制台查看。更多信息,请参见日志管理。
如果您希望将标准输出内容也采集到SLS,可以先将标准输出到文件,再配置文件采集。参数如下图所示。
存储
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、线程池和调用链分析等。更多信息,请参见应用详情。
告警设置
SAE支持对以上各个监控项设置告警。更多信息,请参见应用监控报警。
高可用
将应用部署在SAE后,针对流量的优雅上线与下线,您可以使用健康检查功能查看应用实例与业务运行是否正常,以便运行异常时定位问题。同时,SAE支持部署多vSwitch以应对机房级别的故障,支持使用AHAS实现Java应用的限流降级,全面保障应用的可用性。
多vSwitch部署
为了应对机房级的故障,建议您对生产级别的SAE应用配置多vSwitch。您可以选择在创建应用时配置多vSwitch,或者在创建应用以后增加vSwitch。创建vSwitch时,建议您设计相对充足的IP地址数(建议100以上),如果IP地址不足则会出现无法创建或者弹性伸缩失败的情况。更多信息,请参见切换vSwitch。
创建时选择多vSwitch。
创建后增加vSwitch。
说明增加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参数配置等。更多常见场景,请参见实践教程。