
你是不是也遇到过这种情况:想做个小工具或API服务,却被服务器配置、运维、扩容这些事搞得头大?去年我帮一个做自媒体的朋友搭过一个“每日热点聚合”工具,他本来想租台云服务器,结果光配置环境、装依赖就花了两天,每月还得掏好几百服务器费用。后来我 他试试无服务器架构,用Python写核心逻辑,部署到云函数上,结果不到两小时就跑通了,现在每月费用连50块都不到——这就是Python+无服务器架构的魅力:让你把精力全放在代码上,不用再操心服务器那摊子事。
先搞懂:“无服务器”到底是个啥?
你可能会说:“没服务器怎么跑代码?”其实“无服务器”(Serverless)不是真的没有服务器,而是云厂商帮你把服务器藏起来了。你只需要写代码,然后告诉云平台“我的代码要做什么”,剩下的服务器维护、扩容、灾备,全由平台搞定。打个比方,传统部署像你自己买锅买菜做饭,Serverless就像点外卖——你只管吃(写代码),不用管厨房(服务器)。
而Python和Serverless简直是天生一对。你想想,Python语法简洁,几行代码就能实现复杂功能;生态丰富,不管是数据处理(Pandas)、API开发(Flask/FastAPI)还是爬虫(Requests),都有现成的库。更重要的是,几乎所有云厂商(AWS、阿里云、腾讯云)都把Python作为Serverless的“一等公民”,提供专门的运行时环境和优化工具。就像AWS Lambda文档里说的,Python是目前用户最活跃的运行时之一,社区支持和资源都非常丰富(AWS Lambda Python开发指南)。
这3个优势,让我再也不想碰传统服务器
我自己从2020年开始用Serverless部署Python应用,这几年踩过不少坑,但也实实在在感受到了它的好处,尤其是对中小项目和个人开发者来说:
传统部署VS Serverless部署,差别到底有多大?
为了让你更直观感受,我整理了一个对比表,是我之前帮客户评估方案时做的,你可以看看哪种更适合你:
对比维度 | 传统服务器部署(EC2/云服务器) | Python Serverless部署(Lambda/函数计算) |
---|---|---|
初始配置 | 需手动装系统、依赖、配置网络,新手至少1天 | 直接选Python运行时,3分钟配好基础环境 |
成本 | 按服务器规格付费,闲置时也收费(如2核4G约300元/月) | 按调用次数+运行时间付费,低流量场景几乎免费(100万次调用/月内免费) |
运维工作量 | 需定期更新系统、监控负载、处理故障,每周至少2小时 | 零运维,云厂商自动处理服务器故障和扩容 |
扩缩容能力 | 需手动调整服务器规格或配置负载均衡,响应慢 | 自动扩缩容,从1次/秒到10万次/秒无缝应对 |
30分钟从零部署你的第一个Python Serverless应用
说了这么多好处,你肯定想动手试试了吧?接下来我就带你用阿里云函数计算(国内访问方便,免费额度也足)部署一个“天气查询API”——输入城市名,返回实时天气。全程30分钟,跟着做就能跑通,就算你是第一次接触Serverless也不用怕。
第一步:准备工具和账号(5分钟)
你需要先准备这3样东西:
pip install aliyun-fc2
,这是函数计算的Python SDK,后面部署要用)。 我第一次用的时候,因为没装CLI工具,直接在网页上写代码,结果复制粘贴时格式乱了,折腾了好久。所以 你现在就把CLI装好,后面部署会更顺利。
第二步:写30行Python代码实现天气查询(10分钟)
我们的API功能很简单:接收GET请求,参数是city
(城市名),返回该城市的实时温度和天气状况。核心逻辑用requests
库调用免费天气API(比如“和风天气”的免费接口,注册就能领key),然后用JSON返回结果。
先新建一个文件夹(比如weather-api
),里面创建两个文件:
index.py
:存放Python代码 requirements.txt
:声明依赖(只有requests
) index.py代码
(直接复制过去,记得把YOUR_API_KEY
换成你的和风天气key):
import requests
import json
def handler(event, context):
# 解析请求参数(阿里云函数计算会把HTTP请求信息放到event里)
event_dict = json.loads(event)
city = event_dict.get('queryParameters', {}).get('city', '北京') # 默认查北京
# 调用和风天气API获取数据(免费接口文档:https://dev.qweather.com/docs/api/weather/now/)
weather_url = f"https://devapi.qweather.com/v7/weather/now?location={city}&key=YOUR_API_KEY"
response = requests.get(weather_url)
weather_data = response.json()
# 提取需要的信息(温度、天气状况)
if weather_data.get('code') == '200':
now = weather_data['now']
result = {
"city": city,
"temperature": now['temp'] + "℃",
"weather": now['text'],
"message": "查询成功"
}
else:
result = {"message": "查询失败,可能城市名错误"}
# 返回JSON格式响应(阿里云要求返回特定格式,包含statusCode和body)
return {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": json.dumps(result, ensure_ascii=False)
}
requirements.txt
就一行:
requests==2.31.0
这里有个小细节:阿里云函数计算的handler
函数必须接收event
和context
两个参数,event
里包含请求信息(比如URL参数、请求体),context
是运行时上下文(不用管)。我第一次写的时候忘了解析event
,直接用city = event['city']
,结果一直报错“KeyError”,后来看文档才知道要先json.loads(event)
,这个坑你可别踩。
第二步:配置触发器(让API能被外部访问)
代码写好了,怎么让别人通过URL访问呢?这就需要“触发器”——告诉云平台“当有人访问某个URL时,就执行我的代码”。
my-first-serverless
),其他默认; weather-api
; index.py
和requirements.txt
拖进去; /weather
,方法选GET
。 这里要注意:API网关路径别用特殊字符,比如/weather
就很好记。我之前试过用/get_weather_info
,结果测试时总记错路径,后来改成短路径就顺手多了。
第三步:部署、测试和调试(5分钟)
配置完触发器,直接点“部署”按钮,等10秒左右就部署完成了。这时候API网关会生成一个访问URL,比如https://xxxxxx.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/my-first-serverless/weather-api/weather/
。
现在打开浏览器,在URL后面加?city=上海
,比如https://xxxxxx.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/my-first-serverless/weather-api/weather/?city=上海
,应该就能看到返回结果了:
{"city": "上海", "temperature": "25℃", "weather": "多云", "message": "查询成功"}
如果没成功,别慌,先看“日志”。在函数详情页点“日志查询”,能看到代码运行的每一步输出。比如我第一次测试时返回“查询失败”,看日志发现是和风天气API的key填错了,重新换key就好了。
最后:3个让你的Serverless应用更稳定的小技巧
部署成功只是开始,想让应用跑得更稳,这几个细节你得注意:
requests
库虽然好用,但体积不小。如果你的代码很简单,试试用urllib
(Python自带库)替代,能减少包体积,加快冷启动速度(冷启动就是函数第一次运行时的启动时间,包越小越快)。 print
输出日志,比如print(f"调用天气API返回:{weather_data}")
,出问题时查日志会很方便。 按这些步骤做完,你的第一个Python Serverless应用应该已经跑起来了!这个天气API虽然简单,但涵盖了Serverless开发的核心流程:写代码→配触发器→测试→调试。你可以试着扩展功能,比如加上“ 3天预报”,或者把结果存到云数据库里——Serverless的玩法其实很多。
如果你按步骤做的时候遇到问题,或者成功跑通了,都欢迎回来告诉我!说不定下次我们可以一起开发更复杂的应用呢~
你写Python代码的时候肯定离不开各种第三方库吧?比如调API要用requests,处理数据可能用Pandas,这些库在本地跑没问题,部署到Serverless环境时就得特别注意依赖管理了。最基础的办法是在项目根目录建个requirements.txt文件,把你用到的库和版本号都写进去,比如你用了requests 2.31.0版本,就直接写“requests==2.31.0”。这样云平台部署的时候会自动读取这个文件,帮你把依赖都装好。我之前有个项目没指定版本号,只写了“requests”,结果云平台装了最新版,里面有个方法名变了,代码直接报错,后来加上版本号“==2.31.0”才解决——所以版本号最好写死,避免不同版本带来的兼容性问题。
不过要是你用的库带C扩展,比如Pandas、NumPy这些科学计算库,光靠requirements.txt可能就行不通了。因为这些库安装时需要编译C代码,而Serverless环境通常没有编译工具,直接装会失败。这时候就得用“层”(Layer)功能,简单说就是把编译好的依赖包提前打包成“层”,然后让你的函数引用这个层。比如阿里云有现成的“Python科学计算层”,里面已经预装了Pandas、NumPy这些常用库,你直接在函数配置里勾选这个层就行,省得自己打包。我之前帮朋友部署一个数据处理函数,用了Pandas,试了好几次requirements.txt都失败,后来发现阿里云有公共层,勾上之后一秒就跑通了。所以如果可以的话,尽量优先选纯Python库,比如用requests(纯Python)而不是某些带C扩展的HTTP库,能少踩很多坑。
Python无服务器架构适合开发哪些类型的应用?
适合轻量化、事件驱动型应用,如API接口、定时任务(如数据同步)、文件处理(如图片压缩)、小工具(如天气查询)等。不适合长时间运行(超过15分钟)或需要持续连接的应用(如实时聊天),因为多数云厂商对单次函数执行时间有限制(如阿里云函数计算默认超时时间为300秒)。
Serverless应用冷启动会影响使用体验吗?如何缓解?
冷启动(首次调用或闲置后启动)可能导致1-3秒延迟,对实时性要求高的场景有影响。缓解方法包括:选择更小的依赖包(如用urllib替代requests减少加载时间)、配置云厂商的“预置并发”功能(提前预热实例)、避免频繁更新代码(每次更新可能触发冷启动)。多数个人项目和中小流量场景下,冷启动影响可忽略。
部署Python Serverless应用时,如何处理第三方库依赖?
需在项目根目录创建requirements.txt文件,列出依赖包(如requests==2.31.0),云平台会自动安装。若依赖包含C扩展(如部分数据分析库),需通过“层”(Layer)功能提前打包编译好的依赖,或使用云厂商提供的公共层(如阿里云的Python科学计算层)。 优先选择纯Python库,减少部署复杂度。
如何监控Python Serverless应用的运行状态和费用?
云厂商提供完善的监控工具:阿里云函数计算可在控制台查看“调用次数”“执行时间”“错误率”等指标,日志可通过“日志服务SLS”实时查看;费用方面,可设置“资源使用上限”(如每月调用次数不超过100万次),并开通消费预警(短信/邮件通知)。个人项目可利用免费额度(如阿里云每月100万次免费调用+400GB秒计算资源),基本无需额外付费。