实操教学|用Serverless 分分钟部署一个 Spring Boot 应用,真香!
昨天,栈长应腾讯云小伙伴邀请参加了Techo Day 技术开放日的线上活动,这一期的主题是”轻量级云开发与云应用“,包括轻量级应用服务器、容器和中间件、云开发、微服务、大数据、安全等领域的应用和原理等。
这其中有一项技术讲解——Serverless让我感触比较深。这门课打破了我对软件开发领域的定义。
在现代越来越强大云计算加持下,我们大量运用了一些云组件,比如:
IaaS(基础设施即服务) PaaS(平台即服务) SaaS(软件即服务)
没错,即使云服务应用再多,我们也仅限在 "SaaS(软件即服务)" 层面的应用。
但这门课程提到的,传统的 "SaaS(软件即服务)" 不再是颗粒度最小的云服务了,取而代之的是,你可以理解为 "方法级别" 的云服务,即可以以方法作为独立载体被部署在云上,颗粒度更小、灵活性更强,可以获得尽可能大的弹性。
大部分人看到 Serverless 仍是一知半解,所以我想有必要给大家做个专题分享,包括 Serverless 的正确理解及实现方案,以及腾讯云的 Serverless 是如何应用的。
Serverless 到底是什么?
Serverless 介绍
现在 Serverless 很火啊,到处都是,包括 Spring 都已经支持 Serverless 适配了,栈长当初看到这个名词的时候以为是指 "无服务器",相信很多人也会这样以为,不过不要理解错了,栈长在这里扫个盲。
Serverless 是指 "无服务器架构",这里的 "无服务器" 并不是指程序不需要服务器运行,而是指我们的开发工作不需要关注服务器底层的资源,比如我们部署应用时,经常遇到以下一些服务器及基础设施的相关工作:
应用需要用多少台服务器? 应用需要用多少带宽? 应用需要用什么操作系统? 应用需要运行多少个实例? 应用需要用到什么容器,怎么调度? 等等……
这些工作在传统的业务中需要运维人员和开发人员一起协调完成,而 Serverless 的到来,我们通通都不用管了,Serverless 帮我们去完成这些,程序员只需要关注业务逻辑本身即可。
来看 Spring Serverless 的一张图就明白了:
Serverless 只需要关注一件事:函数!!
这里的 FaaS 就是 Serverless 最基本的一种表现形式。
Serverless 优势
Serverless 具有资源编排、自动伸缩、事件驱动等能力,覆盖编码-调试-测试-部署等全生命周期,减少维护基础设施的成本和风险,利用云的能力可以更迅速的扩展。
我们来看下面这张图:
我们可以看到,Serverless 始终能满足日益增长的需求,并能对资源做到灵活动态调整,一方面能在闲时减少资源以避免浪费,另一方面,即使流量溢出也能应对。
这里总结下 Serverless 的优势:
高可用: 如多活、容灾、扩容、备份等能力,这些都不在话下;
高弹性: 以方法为部署载体,比微服务更微,获得极致弹性;
轻运维: 免去大量的运维工作,专注核心开发业务,大大节省工作量;
等等……
Serverless 实现方案
Serverless 经常不会单独出现,还有以下两个衍生概念,也是目前最常见的 Serverless 实现方案:
FaaS(函数即服务) + BaaS(后端即服务)
Function as a Service (FaaS)
Function as a Service(FaaS)函数即服务,这也是 Serverless 的基石,它是比 SaaS(软件即服务)/ BaaS(后端即服务) 更小的载体,每一个函数就是一个服务,函数之间相互独立。
我们来看一张基于 FaaS 的架构图:
基于 FaaS 的服务器底层的关系从下到上依次是这样的:
物理服务器(IaaS) > 虚拟机(PaaS) > 容器(PaaS) > 函数(FaaS)
函数(也可说方法)颗粒度更小,可以帮助应用获得极致弹性。
Backend as Service(BaaS)
Backend as a Service(Baas)后端即服务,即为应用提供后端云服务,可以理解为 PaaS 和 SaaS 之间的一种服务,它也是 Serverless 架构中的一种表现形式,大量开箱即用的后端云上功能提升研发效能。
后端服务 BaaS 并不是必须的,FaaS 和 BaaS 都属于 Serverless 架构不同的表现形式,也可以说 FaaS 和 BaaS 是 Serverless 架构,它们是相辅相成的。
腾讯云 Serverless
基本介绍
腾讯云中的 Serverless 是指 Serverless Cloud Function,简称:SCF,也可以叫 "云函数",是腾讯云提供的 Serverless 服务,腾讯云用户无需购买云服务器和虚拟机,代码即可在腾讯云基础设施上弹性、安全地运行,支持所有主流的编程语言。
官方文档:
https://cloud.tencent.com/document/product/583
腾讯云函数的魅力如下:
栈长了解到的情况如下:
按量付费: 没有用户访问时不花钱,可节约服务器开销 30%;
超低运维成本: 无需学习服务器知识,大幅度降低运维成本;
弹性伸缩: 自动弹性伸缩,上不封顶,下可到 0;
超高并发: 每秒最高支持 10 万并发请求数;
整个请求逻辑如下:
虽然我们只需要写云函数,但前面会有一道 API 网关,是云函数的主要入口,它提供 HTTP 接口、参数校验、鉴权、限流、自定义域名、自动化文档等功能,这也是对云函数的强大支撑。
解决方案
通用解决方案
结合 API 网关,腾讯云函数提供基于小程序,H5,WEB 服务,微服务,REST API 等通用 HTTP 解决方案:
云函数无处不在,支持常用的、主流的客户端载体,现在都支持上了云函数。
这也让我联想到的一个云函数的优势:
比如我们写个 JavaScript 函数部署到了云端,然后客户端再调用该云函数,而不是像传统软件开发将函数直接内嵌在客户端代码中,这样在安全方面也能杜绝前端代码被破译的可能。
所以,用上云函数真香!
Serverless 应用中心:
https://cloud.tencent.com/product/sls
弹性微服务 TEM
随着团队和业务规模的发展,后端服务逐渐从单体架构演变成微服务架构,微服务架构提供敏捷开发、灵活部署和高扩展性的同时,也增加了服务治理和运维的复杂度,提高了技术门槛。
弹性微服务(Tencent Cloud Elastic Microservice,TEM)是面向微服务应用的 Serverless 平台,实现 Serverless 与微服务的完美结合,提供开箱即用的微服务解决方案,提供应用托管、服务注册发现、微服务治理、多维度监控等能力,支持 Zookeeper、Nacos、Consul 等注册中心。
产品地址:
https://cloud.tencent.com/product/tem
我们来看官网的架构图:
通过它我们可以快速构建微服务应用,只需要实现我们自己的微服务即可(灰色区域),这样就能大幅提升运维效率,降低服务治理的复杂度与技术门槛,有更多的时间去聚焦核心业务本身。
腾讯云函数初体验
栈长也第一时间拿到了腾讯云小伙伴给我的实验资格,终于体验了一把 Serverless 的魅力!
安装 TCCLI
TCCLI 是管理腾讯云资源的统一工具,可以快速调用腾讯云 API 来管理您的腾讯云资源。
官方文档:
https://cloud.tencent.com/document/product/440/6176
需要安装 Python 环境和 pip 工具,Python 版本必须为 2.7 及以上版本。
这里我们使用使用yum安装Python3:
yum install python3 -y
安装 Python3 会同时安装一些相关的依赖包,比如 pip。
再执行下面的命令安装 TCCLI:
sudo pip3 install tccli
安装完成之后,执行以下命令,检测是否安装成功:
tccli --version
TCCLI 安装成功了。
启用命令自动补全
TCCLI 提供了一个自动补全的功能,可以使用下面的命令进行启用:
echo "$(which tccli_completer)" && complete -C "$(which tccli_completer)" tccli
开通云函数
点击登录腾讯云控制台,开通云函数服务:
完成以后,自动进入概览控制面板,这里可以看到各种 SCF 应用的调用统计信息:
配置 TCCLI
首先要获取访问密钥,访问密钥是构建腾讯云 API 请求的重要凭证,调用任何一个腾讯云 API 都需要提供访问密钥,一对完整的访问密钥包括 SecretId 和 SecretKey 两部分。
进入访问管理控制台,找到【访问密钥】- 【API密钥管理】,并在其中新建一个访问密钥:
再进行 TCCLI 初始化配置,使其完成使用云 API 的必要前提条件:
tccli configure
进入交互模式,TCCLI 会要求提供 SecretId 和 SecretKey 等信息,配置完成后,可测试下使用 CLI 拉取云主机列表:
tccli cvm DescribeInstances
OK,配置成功了。
创建云函数
下面我们来创建一个无服务器云函数,并且调用它。
mkdir -p /data/hello && touch /data/hello/hello.py
这里实验默认用的是 Python,云函数支持所有主流编程语言。
部署云函数
现在开始部署上面的云函数:
tccli scf CreateFunction \
--FunctionName "hello" \
--Code '{"ZipFile":"'$(cd /data/hello && zip -r - * | base64 | tr -d "\n")'"}' \
--Handler "hello.main_handler" \
--Description "My first scf"
部署成功后,会有 Success
的返回。
管理云函数
再次进入控制台,可以看到刚部署好的云函数:
点击该函数进入函数管理页面:
其实在这个控制台页面也可以新建、编辑、上传、部署云函数。
测试云函数
新建一个测试模板发起测试:
点击测试按钮:
成功返回了,日志也输出了,到这里我就全程体验了一把云函数。
回到实验页面,退出实验。
腾讯云函数再体验(Java)
创建云函数
实验默认使用的是 Python,并且会要安装、配置很多东西,那是实验台,而在真实控制台是不需要这么麻烦的流程的,我们到控制台来创建一个 Java 云函数试试。
在函数服务中点击新建按钮,官方有很多内置的 Java 云函数模板,我们选择一个 Java 8 相关的模板进行快速创建,当然也可以从 0 开始。
创建成功了。
部署云函数
现在进去部署吧:
下载示例代码,然后上传部署即可。
Java 云函数的核心代码其实就是一个基于 Spring Boot 的接口:
@RestController
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping("/hello")
public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
return String.format("Hello %s!", name);
}
}
测试云函数
部署成功后,现在发起测试:
Java 云函数也成功了!
云函数的魅力
栈长体验了两把云函数,最大的感受就是不需要自己运维服务器了,包括环境配置、JDK 安装配置、权限、开放端口、日志、网络等设置全都内置或者有自定义配置。
下面我们来看几个配置页面。
各种函数的配置管理:
流量设置,可以做灰度发布:
并发配额,可以设置函数独占配额、函数预置并发数:
还有更多配置,这里就不一一介绍了。
总结
看到这里,想必大家对 Serverless 有了一定程序的认识了,总之,程序员要做的只是上传函数代码而已,其他一切底层资源都可以在云上管理,并且是函数级别的资源管理,再结合腾讯云的各种云能力,简直不要太香了。
当然,这也会产生一定的费用,但都是按量付费的,并且可以按需要自动弹性调整,肯定要比自己全套搞要划算,毕竟连运维和服务器都省了,最重要的是省心、省时间。
另外,腾讯云都提供很多免费额度:
还是很良心的,感兴趣的都去体验看下,完全不一样的开发体验。
这里再次奉上腾讯云 Serverless 地址:
https://cloud.tencent.com/product/sls
通过参与这次腾讯云的 Techo Day 技术开放日活动,栈长最大的感触就是,在技术领域,腾讯云确实走在了前沿,真不是吹,Techo Day活动分享了很多技术热点及解决方案,涵盖了我们平时开发的方方面面,不仅能学习、接触新兴技术,还能对技术有更多、更深入的认识,特别是栈长介绍的 Serverless 云函数,真正让我们释放双手,实现生产力质的提升。本次活动就分享了Severless相关的技术原理解析,更有动手实验室手把手指导如何通过云函数快速构建自定义邀请函,让栈长也受益匪浅。
最后,本次Techo Day 活动上发布和分享的更多产品内容及相关课件,包括如何像用自来水一样使用数据库、使用Lighthouse一键构建云上应用等技术原理解析分享,更有利用PAG十分钟完成 AE动效部署上线各平台的动手实践指导,各种干货都被整理成了一份《腾讯云轻量级工具指南》,可以说是非常实用了,尤其对于程序员、架构师,都是不可或缺的生产利器,能够助你大大提高生产力,有需要的可以点击阅读原文获取。