镰仓|如何把 thinkphp5 的项目迁移到阿里云函数计算来应对流量洪峰?

镰仓|如何把 thinkphp5 的项目迁移到阿里云函数计算来应对流量洪峰?

文章图片

镰仓|如何把 thinkphp5 的项目迁移到阿里云函数计算来应对流量洪峰?

文章图片

镰仓|如何把 thinkphp5 的项目迁移到阿里云函数计算来应对流量洪峰?

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.0name: compoent-testaccess: '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