原文链接: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 活动、直播,用户最佳实践。

如何把thinkphp5的项目迁移到阿里云函数计算来应对流量洪峰?的更多相关文章

  1. 阿里云函数计算 .NET Core 初体验

    体验了一波阿里云函数计算, 已支持 .NET Core 2.1, 那么按照惯例, 来写个 "Hello World" 吧. 作者注: 开发环境 Windows 10 & V ...

  2. 独家对话阿里云函数计算负责人不瞋:你所不知道的 Serverless

    作者 | 杨丽 出品 | 雷锋网产业组 "Serverless 其实离我们并没有那么遥远". 如果你是一名互联网研发人员,那么极有可能了解并应用过 Serverless 这套技术体 ...

  3. 阿里云函数计算发布新功能,支持容器镜像,加速应用 Serverless 进程

    我们先通过一段视频来看看函数计算和容器相结合后,在视频转码场景下的优秀表现.点击观看视频 >> FaaS 的门槛 Serverless 形态的云服务帮助开发者承担了大量复杂的扩缩容.运维. ...

  4. 让 Serverless 更普惠,阿里云函数计算 FC 宣布全面降价,最大幅度达 37.5%

    11月5日,2022 杭州 · 云栖大会上,阿里云宣布函数计算 FC 开启全面降价,vCPU 单价降幅** 11%,其他的各个独立计费项最高降幅达 37.5%**. 本次云栖大会上,阿里云智能总裁张建 ...

  5. 阿里云函数计算上部署.NET Core 3.1

    使用阿里云ECS或者其他常见的VPS服务部署应用的时候,需要手动配置环境,并且监测ECS的行为,做补丁之类的,搞得有点复杂.好在很多云厂商(阿里云.Azure等)提供了Serverless服务,借助于 ...

  6. 阿里云函数计算 VSCode 使用,及部署 Docusaurus

    代码: https://github.com/ikuokuo/start-serverless 使用简介 产品页开通服务.使用流程,如下: 新手示例,如下: 创建函数 阿里云提供了如下几种方式创建函数 ...

  7. javaWeb项目部署到阿里云服务器步骤

    记录web项目部署到阿里云服务器步骤 (使用 web项目.阿里云服务器.Xftp.Xshell),敬请参考和指正 1.将要部署的项目打包成WAR文件格式,可以在MyEclipse.Eclipse都可以 ...

  8. flask项目部署到阿里云 ubuntu16.04

    title: flask项目部署到阿里云 ubuntu16.04 date: 2018.3.6 项目地址: 我的博客 部署思路参考: Flask Web开发>的个人部署版本,包含学习笔记. 开始 ...

  9. 将个人博客从GitHub迁移至阿里云服务器过程总结

    让我们先回顾下前两篇博客: 程序员如何从0到1搭建自己的技术博客 在个人博客中优雅的使用Gitalk评论插件 通过前两篇博客,我们了解了如何快速的从0到1搭建一个个人博客并使用了Gitalk评论插件, ...

  10. 大数据平台Hive数据迁移至阿里云ODPS平台流程与问题记录

    一.背景介绍 最近几天,接到公司的一个将当前大数据平台数据全部迁移到阿里云ODPS平台上的任务.而申请的这个ODPS平台是属于政务内网的,因考虑到安全问题当前的大数据平台与阿里云ODPS的网络是不通的 ...

随机推荐

  1. Go语言数组与切片学习总结

    一.数组 数组的定义:相同类型的数据集合 go语言中数组的索引从0开始 没有赋值的数值型数组,默认值为0 数组一旦被创建,它的大小就是不可改变的 (1)声明数组与打印 var 变量名 [大小]变量类型 ...

  2. python函数定义、调用、参数、返回

    python函数定义语法: 定义: Def foo(): print('bar') print('bar2') 如果函数内容特别少,可以一行定义 : Def foo():   print('bar') ...

  3. JPA动态注册多数据源

    背景 目前已经是微服务的天下,但是随着业务需求的日益增长,部分应用还是出现了需要同时连接多个数据源操作数据的技术诉求. 需要对现有的技术架构进行优化升级,查阅了下网上的文章,基本都是照搬的同一篇文章, ...

  4. [NOI online2022提高C] 如何正确地排序

    题目描述 有一个 \(m\times n\) 的数组 \(a_{i,j}\). 定义: \(f(i,j)=\min\limits_{k=1}^m(a_{k,i}+a_{k,j})+\max\limit ...

  5. MySQL查询语句执行顺序

    注意:理论上select后面的字段别名是不可以在where group by having 等后面使用的,但是MySQL5.7做了相应的优化,group by having 后面可以使用

  6. 经典卷积神经网络LeNet&AlexNet&VGG

    LeNet LeNet-5是一种经典的卷积神经网络结构,于1998年投入实际使用中.该网络最早应用于手写体字符识别应用中.普遍认为,卷积神经网络的出现开始于LeCun等提出的LeNet网络,可以说Le ...

  7. Educational Codeforces Round 26 Problem B

    B. Flag of Berland time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  8. 探究vue的diff算法

    1.diff算法是什么? diff算法是一种通过**同层的树节点**进行比较的高效算法 Diff 算法探讨的就是虚拟 DOM 树发生变化后,生成 DOM 树更新补丁的方式.对比新旧两株虚拟 DOM 树 ...

  9. Hystrix:Spring Cloud服务熔断与降级组件

    Hystrix:Spring Cloud服务熔断与降级组件 问题总结 熔断器? Spring Cloud Hystrix? Hystrix服务降级? 全局降级方法? 解耦降级逻辑? Hystrix服务 ...

  10. Unix 文件权限位

    简介 在 Unix 或者类 Unix 文件系统中,每个文件(或者目录,目录也被视为文件)都有自己的所属对象和一个与之相关的 Unix 用户组关联,可以通过设置对应的文件的权限标记指定对于所属用户.所属 ...