开发者社区> wxf2305> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

如何把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.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

 

 

1.jpg

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'

 

2.jpg

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 部署到阿里云函数计算了。

3.jpg

发布成功了

4. 绑定自己的域名

https://fcnext.console.aliyun.com/cn-hangzhou/domains/create

4.jpg

把自己的域名cname到上图的 “公网cname”,然后 服务名称 测试函数  版本都对应选择正确。创建即可。

5.jpg

部署成功了,哈哈。

5.谈下自己的感受

函数计算serverless是以后的趋势,开发者能够有更多的精力去关注业务层。从开始预计迁移到代码的修改以及阿里云函数计算文档查阅,到迁移成功,花费了大概3天的时间,对阿里云函数计算有了更深层次的认知,同时也期待迁移过来的项目在下次使用高峰的时候能够稳定运行。我后面也会随时关注阿里云函数计算的动态,同时感谢阿里云函数计算团队能做出来这么优秀的产品。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
⭐️ 高阶指针 ⭐️回调函数(回调型计算器/冒泡排序/qsort函数)
前言 本文主要讲解 回调函数的理解 回调实现计算器 qsort各种功能的使用 冒泡排序各种功能的实现
16 0
阿里云通用型g6和g5ECS服务器的区别以及如何选择配置建议
阿里云ECS云服务器通用型g6和通用型g5实例的区别是什么?本文来说说通用型g6和通用型g5的区别以及选择方法。
348 0
thinkphp项目迁移到函数计算
前言 阿里云函数计算 Function Compute(FC),旨在帮助用户采用弹性伸缩、动态分配资源的方式,来执行业务函数。让用户无需购买部署服务器,无需考虑业务负载,就能快速搭建可处理高并发的后台服务。
23320 0
阿里云新功能:EIP高精度实时互联网流量秒级监控(可能是史上最好用的实时流量监控)
今天,阿里云借助强大的自身研发能力和产品化能力,为用户提供了秒级业务流量监控能力,监控精度提升到1秒,较之前的精度提升了60倍。借助秒级监控功能,用户可以实时的掌控瞬息万变的互联网业务流量波动情况。
8518 0
《VMware Virtual SAN权威指南》一2.3.5 VSAN网络流量
本节书摘来华章计算机《VMware Virtual SAN权威指南》一书中的第2章 ,第2.3.5节, [美] 科马克·霍根(Cormac Hogan)邓肯·埃平(Duncan Epping)  著 徐 炯 译译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1125 0
类型转换异常处理java.lang.RuntimeException
前几天在做一个安卓项目的时候一直报java.lang.RuntimeException错,一直调试不出来,今天突然又灵感是不是文件配置出错了,果然在清单文件中少了一句 android:name=".KXApplication"。 02-05 10:19:52.429: E/AndroidRuntime(16026): java.lang.RuntimeException: Una
1155 0
+关注
13
文章
3
问答
文章排行榜
最热
最新