系统中间件与云虚拟化-serverless-基于阿里云函数计算的简单邮件发送服务设计与体验
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 1. 实验要求
- 2. 实验环境
- 3. 实验步骤
- 3.1 获取函数计算免费额度
- 3.2 创建自定义公共层,提供Python Sanic依赖
- 4. 构建并部署告警邮件发送接口
- 4.1 创建web函数并基于sanic编写接口
- 4.2 获取函数外网访问地址
- 4.3 开启函数日志功能
- 4.4 测试接口
- 5. 体验函数计算FC的弹性收缩能力
- 总结
前言
1. 实验要求
本实验要求学生基于阿里云函数计算FC,设计并部署一个告警邮件发送接口。该接口的具体实现采用Python
并基于PythonWeb框架Sanic构建。发送邮件的相关参数由学生根据自己的常用邮件服务自行确定。
部署完成后,学生需通过命令行指令curI以及诸如Apifox等HTTPAPI调试工具对该服务接口进行功能性测
试,以检验是否可以正确收到邮件。随后学生还需通过压测工具,对该服务接口进行压力测试,以感受该服务的
FC实例在不同负载情况下进行弹性伸缩的Serverless特性表现。
什么是函数计算
2. 实验环境
阿里云FC
Python sanic
Apifox
3. 实验步骤
3.1 获取函数计算免费额度
控制台
购买免费额度
3.2 创建自定义公共层,提供Python Sanic依赖
点到层这里,创建层
点击创建就可以了
4. 构建并部署告警邮件发送接口
4.1 创建web函数并基于sanic编写接口
勾选web函数
然后就会打开这个页面
我们开始修改app.py里面的代码
我们可以先在本地写好,在复制过来
pip install sanic
Sanic 并不是 Anaconda 官方渠道维护的包,所以使用 conda install sanic 通常会提示找不到包。解决方法很简单,直接使用 pip 安装即可,因为 Sanic 是 PyPI 上的标准 Python 包
from sanic import Sanic
from sanic.response import json
from smtplib import SMTP
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartapp = Sanic("EmailSender")
EMAIL_CONFIG = {"host": "smtp.qq.com","port": 587,"username": "3403967908@qq.com","password": "bxrlwkakmonwdbda","sender": "3403967908@qq.com",
}def send_email(recipient,subject,body):#创建好邮件对象msg = MIMEMultipart()msg["From"] = EMAIL_CONFIG["sender"]#谁发送msg["To"] = recipient#发给给谁msg["Subject"] = subject#发送标题#添加邮件正文msg.attach(MIMEText(body,'plain'))#'plain' 表示这是纯文本格式#链接SMTP服务器server = SMTP(EMAIL_CONFIG["host"], EMAIL_CONFIG["port"])server.starttls()#启动TLS加密server.login(EMAIL_CONFIG["username"], EMAIL_CONFIG["password"])#发送邮件server.send_message(msg)#关闭链接server.quit()@app.route("/send",methods=["POST"])
async def send_email_route(request):#获取json数据data = request.jsonrecipient = data.get("recipient")subject = data.get("subject")body = data.get("body")#all([recipient,subject,body])是检验三个是否都有值if not all([recipient,subject,body]):return json({"error":"Missing recipient, subject, or body"},status=400)try:send_email(recipient,subject,body)return json({"status":"success"},status=200)except Exception as e:return json({"error":str(e)},status=500)
if __name__ == "__main__":app.run(host="0.0.0.0",port=9000)
if name == “main”: 的作用:
这是 Python 的一个特殊语法,用于判断当前脚本是否是直接运行的(而不是被其他模块导入)。
当你直接执行这个脚本时(比如 python app.py),name 变量会被自动设置为 “main”,此时这个条件会成立,下面的代码会被执行。
如果这个脚本被其他模块导入(比如 import app),则 name 会被设置为模块名(如 “app”),此时这个条件不成立,下面的代码不会执行。
app.run(host=“0.0.0.0”, port=9000) 的作用:
这是启动 Web 服务器的命令(假设 app 是你创建的 Flask 或 FastAPI 应用实例)。
host=“0.0.0.0” 表示服务器会监听所有可用的网络接口,允许其他设备通过服务器的 IP 地址访问这个服务(而不仅仅是本地 127.0.0.1)。
port=9000 表示服务器运行在 9000 端口(你可以根据需要修改为其他未被占用的端口,如 8080、5000 等)。
if name == “main”: 和 app.run(host=“0.0.0.0”, port=9000) 是 Python 应用程序的常见启动方式
然后复制到app.py
然后点击这个按钮
先删除官方公共层Flask
在添加自定义层,就是我们原来创建的层
最后点击部署
然后点击这个部署代码
4.2 获取函数外网访问地址
我们把鼠标放在这里就可以看到公网访问地址了
访问地址是域名的形式,不是ip的形式
4.3 开启函数日志功能
点击实时日志,一键启用
该买则买
4.4 测试接口
注意我们写的这个函数要鉴权的,我们可以关闭鉴权
点击设置
这样就不用添加请求头来验证了
这样就成功了
这样我们就成功了,实现了serveerless部署
以前是要把服务搞到服务器上,然后才可以,现在我们不需要买一个服务器了,就可以创建接口了
5. 体验函数计算FC的弹性收缩能力
点击实例
发现没有任何实例,但是按理说应该有我们刚刚创建的这个函数的实例的,这个是因为一段时间内(3~5分钟)没有处理任何请求的话,就会自动销毁了
点到这里
修改单实例并发数、
然后我们去apifox上进行压力测试,自动化测试
然后点击添加步骤里面,添加我们原来写的接口
点击运行后边的按钮,配置线程为10
然后点击运行
然后我们点击到实例,发现有五个实例了
所以说意思就是,单实例并发度的意思就是一个实例1s可以处理的线程数为2,那么1s发送10个请求的时候,那么就要创建五个实例,才可以处理这10个请求,然后没有请求再来访问的话,过3~5分钟就会销毁这些实例