原文链接:https://developer.aliyun.com/article/982746
1. 为什么要迁徙到阿里云函数?
我的我的项目是一个节日礼品支付我的项目,过节的时候会有短时间的流量洪峰。平时访问量很低。之前的架构是购买的阿里云 alb+ 多台 ecs+ 云 msyql+ 云 redis。最大的问题就是老本问题。平时流量低的时候 ecs 老本也无奈缩减。
阿里云函数计算是 serverless,即无服务架构,就比方你的业务流量短时间忽然很多。函数计算就会毫秒级别启动多个实例(阿里云函数计算 FC 用来运行函数的最小单元),如果没人拜访能够没有实例运行,做到 0 费用。然而有人拜访的时候第一次冷启动就略微慢一点,能够依据理论状况设置起码保留一个实例。
部署到阿里云函数计算,还能缩小运行环境搭建的老本。之前的模式须要在 ecs 装置 nginx,而后装置 php,以及装置 php 的驱动程序 redis 等。看了下阿里云函数计算官网文档,目前 custom runtime Debian 9 内置 php7.4 并且看了下内置的 php 的扩大整好也反对到了我整好须要的 redis。不仅剩下了买服务器钱,而且还不必装置 php 环境了,不仅如此每个月还有收费的算力额度。
迁徙起因总结下:1 老本升高了很多 2 免去了环境部署 3 主动扩容,天生应答高并发
2. 革新旧我的项目适配函数计算。
代码改变:
尽管说免去了环境部署,然而我之前的代码还是有些不适配的中央,比方之前代码的日志都是寄存到服务器的某个目录的。如果迁徙到函数计算的话,实例会随时销毁重建,导致日志失落。解决办法就是把日志写入到阿里云 oss 下面,或者应用阿里云的日志服务写到那个外面去。
这里还有一点要留神,我的我的项目不是前后端拆散的,鉴权还是穿透的 session 和 cookie 模式。如果 session 是保留在服务端的文件的话也会存在下面的问题,倡议存储的 redis 外面,我的我的项目本省就是存到 redis 外面的,所以这块不须要改变,如果你的我的项目存在这样的问题那就须要改良下了。
函数计算和云 msyql 和云 redis 通信的时候肯定要采纳 vpc 内网互通的准则缩小链路传输的开销以及链路劫持危险。
3. 减少 s.yml 以及启动 shell 脚本
配置 s.yml 应用 Serverless Devs 客户端工具公布到阿里云函数计算,Serverless Devs 这个工具并非阿里云的客户端工具,而是一个开源凋谢的 Serverless 开发者平台,致力于为开发者提供弱小的工具链体系。通过该平台,开发者不仅能够一键体验多云 Serverless 产品,极速部署 Serverless 我的项目,还能够在 Serverless 利用全生命周期进行我的项目的治理,并且非常简单疾速的将 Serverless Devs 与其余工具 / 平台进行联合,进一步晋升研发、运维效力。
它的官网地址:https://www.serverless-devs.com/
而后看下我的 s.yml 外面的配置信息,具体的说下重要项是干嘛的。
edition: 1.0.0
name: compoent-test
access: 'default'
services:
cn-hangzhou-test1002-func-3i3c0f95:
component: devsapp/fc
props:
region: cn-hangzhou
service:
logConfig:
enableRequestMetrics: true
enableInstanceMetrics: true
logBeginRule: DefaultRegex
project: aliyun-fc-cn-hangzhou-ae3ef8b8-db4a-5b7a-a040-7012789ad20f
logstore: function-log
role: acs:ram::1621341641365186:role/AliyunFcDefaultRole
internetAccess: true
name: test1002
function:
customRuntimeConfig:
command:
- bash
args:
- '-c'
- 'chmod 777 /code/start.sh && /code/start.sh'
handler: index.handler
instanceType: e1
runtime: custom
timeout: 5
instanceConcurrency: 20
memorySize: 512
caPort: 9000
environmentVariables: {}
internetAccess: true
name: func-3i3c0f95
asyncConfiguration: {}
codeUri: ./test1002/func-3i3c0f95
triggers:
- name: defaultTrigger
description: ''
type: http
qualifier: LATEST
config:
methods:
- GET
- POST
- PUT
- DELETE
authType: anonymous
codeUri: ./test1002/func-3i3c0f95 这个指定的是我的我的项目代码的地位,会把这个目录上面的代码拷贝到 debain 零碎的 /code 目录上面。
customRuntimeConfig:
command:
- bash
args:
- '-c'
- 'chmod 777 /code/start.sh && /code/start.sh'
这句话的是我的项目启动脚本,其实就是执行这个 start.sh 的 shell 脚本,先给予一个 777 的权限,而后在执行。翻译成 shell 脚本其实就是 bash -c ‘chmod 777 /code/start.sh && /code/start.sh’
caPort: 9000
监听端口 9000 肯定要和启动脚本 start.sh 外面的一样
#!/usr/bin/env bash
cd /code/tp5/public
php -S 0.0.0.0:9000 router.php
这里我感觉我还是要说下这个启动脚本,先 cd 到 public 目录,thinkphp5 的入口在 public 上面这个和我的项目框架有关系。而后就是这个启动脚本,下面这是 thinkphp5 特有的写法。
其余项就不具体说了大略看看应该能看懂。
4. 应用客户端工具公布
工具的装置就疏忽了不说了,看下官网文档说的很具体
https://docs.serverless-devs.com/serverless-devs/quick_start
Serverless Devs 这个工具装置好后,配置配置上阿里云的 AccessKey ID 和 AccessKey Secret,在我的项目根目录建设 s.yml,以及在代码目录建设下面的启动脚本 start.sh 而后就能够应用客户端工具的 s deploy 部署到阿里云函数计算了。
公布胜利了
4. 绑定本人的域名
https://fcnext.console.aliyun.com/cn-hangzhou/domains/create
把本人的域名 cname 到上图的“公网 cname”,而后 服务名称 测试函数 版本都对应抉择正确。创立即可。
部署胜利了,哈哈。
5. 谈下本人的感触
函数计算 serverless 是当前的趋势,开发者可能有更多的精力去关注业务层。从开始预计迁徙到代码的批改以及阿里云函数计算文档查阅,到迁徙胜利,破费了大略 3 天的工夫,对阿里云函数计算有了更深层次的认知,同时也期待迁徙过去的我的项目在下次应用顶峰的时候可能稳固运行。我前面也会随时关注阿里云函数计算的动静,同时感激阿里云函数计算团队能做进去这么优良的产品。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),会集 Serverless 技术最全内容,定期举办 Serverless 流动、直播,用户最佳实际。