原文鏈接: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 活動、直播,用戶最佳實踐,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/502846.html
標籤:其他
上一篇:核心應用
