基于php的個人博客系統(tǒng)的實現什么是函數?剛剛考完數學沒多久的我,腦力里立馬想到的是自變量基于html5和css3做的個人博客
2022-12-31
什么是函數? 數學考完不久,我立馬想到了自變量、因變量、函數值,即y=f(x)。 當然,在計算機中,函數往往是指定義好的代碼程序。 我們可以通過傳遞參數來調用這個定義好的函數來實現我們需要的功能。 那么,今天的函數計算FC是什么?
在當前云計算時代,容器化技術和各種工具的發(fā)展,對開發(fā)運維進行了全新的統(tǒng)籌。 開發(fā)者完成代碼編寫后,可以直接提交到各種流水線,無需考慮環(huán)境。 可以完成微服務的測試、開發(fā)、部署、項目搭建,環(huán)境的打包可以由容器來完成。 但是很多時候我們還是需要把精力放在業(yè)務上線的集群上。 它是私有云環(huán)境還是公共云? 是裸機服務器還是云實例ECS? 是自購還是租賃?
當然,服務器\集群的落地和運維都需要耗費大量的資源和精力。 這是一條捷徑,但不是唯一的出路。 因此,函數計算FC的出現帶來了架構,讓開發(fā)者在開發(fā)部署時不再有復雜部署服務的感覺,對服務端沒有任何影響基于php的個人博客系統(tǒng)的實現,讓開發(fā)者真正專注于自己的代碼。 優(yōu)越的。 阿里云函數式極簡編程,可以專注于業(yè)務創(chuàng)新,無采購和部署成本,提供完整的監(jiān)控、告警等可觀察性能力。 函數計算是一種事件驅動的全托管計算服務。 服務器的運維管理真的不用考慮。 您只需要上傳開發(fā)的代碼。 函數計算將通過角色策略規(guī)劃計算資源,靈活執(zhí)行函數,最終實現高效。 執(zhí)行部署。 優(yōu)雅!
會有那些適用場景? 是人嗎? 還是生產?所以這次我會部署兩個不同方向的應用來評估
1.通知系統(tǒng)和觸發(fā)器和聊天機器人。 推送功能涉及到很多系統(tǒng),如郵件、短信、. 當然,能力不僅僅是信息通知,這里所說的通知功能必須需要基礎設施,即服務器來支持運行。 如果直接操作這些功能,我們就不需要支付服務器的運維費用,節(jié)省了很多工作量。 收費。 同樣,我們可以使用事件驅動模型來實現定時自動觸發(fā)任務,自動簽到,自動發(fā)送。
第二,其次,當然是Web類的應用。 基于各種web框架的應用部署,基于Java、PHP等語言搭建站點 ,很容易在線實現這樣的博客應用。 配合其他云產品、OSS、RDS等,可以實現高可用、高性能的Web應用,比如Kod官方的云盤系統(tǒng)。
1.用于實現B站日常登錄簽到
作為b站的老用戶,b站的水平無疑是一張妥妥的“名片”。 當然,我已經是六級boss的一員了。 b站升級所需的經驗值是關鍵。 登錄、投幣、觀看都會積累經驗。 為了快速升級,這次我會使用阿里云實現b站的日常登錄體驗Get,看視頻體驗Get,看直播銀瓜子Get(賣淫的直播禮物道具),配合釘釘機器人實現消息推送。
1.創(chuàng)建服務和功能
進入函數計算FC控制臺,選擇【服務和函數】,點擊【創(chuàng)建服務】
在【創(chuàng)建服務】頁面,輸入服務名稱網站優(yōu)化,選擇開啟日志功能。 日志可以幫助我們更好的排查錯誤
這里當然要標注服務的功能,即實現的日常登錄簽到。
進入【 】頁面,選擇【Use to from 】
配置函數名,運行環(huán)境選擇為,選擇從文件夾上傳代碼。
注意這里如果有依賴包需要提前下載到代碼包中。 這里需要用到包,需要執(zhí)行 pip -t 。 本地。不過也可以稍后在控制臺執(zhí)行下載命令
這里函數實現的腳本是定時觸發(fā)類型,所以我們選擇請求處理類型為【 】
下面配置觸發(fā)器,選擇定時觸發(fā)器,輸入名稱,選擇【指定時間】。 這里我選擇每天23:00運行腳本
腳本內容
# -*- coding: utf8 -*-
import requests
import json
import time
import re
import sys
import codecs
from bs4 import BeautifulSoup
from json.decoder import JSONDecodeError
# B站登陸Cookie
cookie = ""
# Webhook地址
webhook = "https://oapi.dingtalk.com/robot/send?access_token=xxxx"
# 自動觀看的BV號,杰倫新專-最偉大的作品
bid = 'BV1ua411p7iA'
uid=re.match('(?<=DedeUserID=).*?(?=;)',cookie)
sid=re.match('(?<=sid=).*?(?=;)',cookie)
csrf=re.match('(?<=bili_jct=).*',cookie)
# 部分編碼問題
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
# bv轉為av
def bv_to_av(bv):
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
}
r = requests.get('https://api.bilibili.com/x/web-interface/view', {'bvid': bv}, headers=headers)
response = decode_json(r)
try:
return str(response['data']['aid'])
except (KeyError, TypeError):
return '883409884'
# json解析
def decode_json(r):
try:
response = r.json()
except JSONDecodeError:
return -1
else:
return response
# 自定義釘釘機器人推送
def pushinfo(info,specific):
# 定義推送內容,格式參考https://open.dingtalk.com/document/group/message-types-and-data-format
# 注意機器人的關鍵詞
data = {
"msgtype": "text",
"text": {
"title":"Taoreset",
"content": "【Taoreset-Serverless推送】\n"+info+specific
}
}
headers = {'content-type': 'application/json'} # 請求頭
r = requests.post(webhook, headers=headers, data=json.dumps(data))
r.encoding = 'utf-8'
print (r.text)
# 阿b登錄,得登陸經驗
def login():
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
'Cookie':cookie
}
response = requests.session().get('http://api.bilibili.com/x/space/myinfo',headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
msg = rejson['message']
if code == 0:
print('登錄成功')
return True
else:
print('登錄失?。?#39;+msg)
return False
# 獲取用戶信息
def get_user_info():
headers = {
'Cookie':cookie
}
response = requests.session().get('http://api.bilibili.com/x/space/myinfo?jsonp=jsonp',headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
msg = rejson['message']
if code == 0:
userInfo=['賬號:'+str(rejson['data']['silence']),
'硬幣:'+str(rejson['data']['coins']),
'經驗:'+str(rejson['data']['level_exp']['current_exp'])+"/"+str(rejson['data']['level_exp']['next_exp']),
'等級:'+str(rejson['data']['level']),
'昵稱:'+str(rejson['data']['name'])
]
print(userInfo[0])
print (userInfo[1])
print(userInfo[2])
print(userInfo[3])
print(userInfo[4])
return userInfo
else:
print("用戶信息獲取失?。?+msg)
return "用戶信息獲取失?。?+msg
# 直播簽到,賺銀瓜子兒
def do_sign():
headers = {
'Cookie':cookie
}
response = requests.session().get('https://api.live.bilibili.com/sign/doSign',headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
msg = rejson['message']
if code == 0:
print('直播簽到成功!')
return True
else:
print("直播簽到失?。?+msg)
return False
# 看BV號視頻,得觀看經驗
def watch():
aid=bv_to_av(bid)
headers = {
'Cookie':cookie
}
response = requests.session().get('http://api.bilibili.com/x/web-interface/view?aid='+str(aid),headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
#print(response.text)
if code == 0:
cid = rejson['data']['cid']
duration = rejson['data']['duration']
else:
print('視頻信息解析失敗')
return False
payload = {
'aid': aid,
'cid': cid,
'jsonp': "jsonp",
'mid': uid,
'csrf': csrf,
'played_time': 0,
'pause': False,
'realtime': duration,
'dt': 7,
'play_type': 1,
'start_ts': int(time.time()),
}
response = requests.session().post('http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
if code == 0:
time.sleep(5)
payload['played_time'] = duration - 1
payload['play_type'] = 0
payload['start_ts'] = int(time.time())
response = requests.session().post('http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
if code == 0:
print(f"av{aid}觀看成功")
return True
print(f"av{aid}觀看失敗 {response}")
return False
def main(*args):
if login():
ui = get_user_info()
desp='直播簽到:'+str(do_sign())+'\n\n'+'觀看視頻:'+str(watch())+'\n\n'+ui[0]+'\n\n'+ui[1]+'\n\n'+ui[2]+'\n\n'+ui[3]+'\n\n'+ui[4]+'\n\n'
pushinfo('嗶哩嗶哩簽到成功',desp)
else:
pushinfo('嗶哩嗶哩簽到失敗','')
if __name__ == '__main__':
main()
2.修改功能配置
創(chuàng)建函數后,會進入函數管理界面。 這里的功能代碼展示的是我們上傳的代碼文件,所有代碼執(zhí)行的本地路徑都在/code目錄下。
如果有依賴模塊提示,也可以在下面的控制臺終端輸入命令完成模塊的安裝和下載。 工作目錄下所有代碼修改完成后,需要點擊 Code進行部署上傳。
點-t.bs4
對于其余的,您需要修改功能的配置。 點擊【功能配置】,找到【環(huán)境信息】進行編輯,修改【 】,修改功能入口。 我這里的腳本文件名是.py,代碼中的main函數是main,所以函數入口是
3.完成功能功能測試
選擇【測試功能】立即觸發(fā)功能,點擊測試功能進行測試
測試完成后會在下方顯示日志輸出內容,方便查看結果和排查問題
完成效果,觸發(fā)23點定時準時完成簽到,釘釘機器人推送消息
嘿嘿,一起跑劇本,早日迎來B站六級會員! ! !
腳本參考,由
2、農產品電商網站云化改造
這里我以隔壁軟件專業(yè)(本人是網絡技術專業(yè))的一個大作業(yè)項目作為部署案例。 項目非常簡單,功能單一,但也是一個非常經典的前后端分離項目。 由于本人不太擅長開發(fā),所以項目具體技術就不難看了。 據說有版權,就不放源碼了hhhh
改造前相信是很多中小騰云網絡業(yè)務的經典架構,將業(yè)務涉及的所有服務中間件運行在一臺服務器/虛擬機上,雖然現在可能完全是實驗室環(huán)境,但是在事實上,還有很多項目是這樣做的。 劣勢不用多說,部署維護困難,資源難以擴展,后續(xù)改造復雜,沒有應用高可用技術性能差等等。
云上農產品電商平臺,項目比較簡單,同區(qū)域規(guī)劃。 主要是前端的HTML頁面和后端的Jar包分別由兩個獨立的函數來完成運行計算。 其余的配套服務都是通過相應的云產品在云端實現的。 由于我已經在自己的ECS上運行服務,不再需要單獨購買云數據庫版本。 當然還是推薦使用阿里云的云數據庫產品。
1.服務創(chuàng)建
進入函數計算控制臺,選擇【服務與函數】,點擊【創(chuàng)建服務】
輸入要創(chuàng)建的服務的名稱和描述,開啟日志功能,點擊確定完成服務的創(chuàng)建
服務創(chuàng)建完成后,進入【服務詳情】,找到【網絡配置】,點擊【編輯】
選擇 to VPC,選擇 ,選擇VPC, , ,這里需要和其他支持的云產品(數據庫等)保持在同一個VPC下。 因此,需要在云端規(guī)劃網絡,查看該地區(qū)的產品是否有貨。
2.前端頁面功能創(chuàng)建
服務創(chuàng)建完成后seo優(yōu)化,點擊【創(chuàng)建函數】進入函數創(chuàng)建頁面
選擇【Use 】,輸入函數名,運行環(huán)境選擇【】,上傳前端html代碼和配置文件,監(jiān)聽端口選擇80,即原中間件的服務端口.
創(chuàng)建函數后,進入函數詳情界面,可以在函數代碼中編輯修改代碼。 代碼更改后,需要點擊 Code重新上傳。 上面說了服務配置需要一起上傳,還有一個/etc//mime. 需要將文件復制到當前目錄,以避免 mime 文件類型映射錯誤。
把關鍵的配置放在這里,根據自己的業(yè)務情況修改,注意配置中的端口監(jiān)聽需要和函數創(chuàng)建監(jiān)聽端口保持一致,網頁代碼的路徑設置為/code
http {
include mime.types; #注意引入此文件
keepalive_timeout 900;
server {
listen 80;
server_name localhost;
location / {
root /code;
index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /users {
proxy_pass http://serverless.后端函數訪問地址.run;
#Nginx反代傳給后端的函數,地址在后續(xù)后端函數創(chuàng)建完可以拷貝
}
location /items {
proxy_pass http://serverless.后端函數訪問地址.run;
#Nginx反代傳給后端的函數,地址在后續(xù)后端函數創(chuàng)建完可以拷貝
}
可以在通話記錄中查詢相關日志
當函數被觸發(fā)運行時,實例會根據訪問請求自動啟動。 在這里,您可以手動登錄實例查看中間件服務和運行環(huán)境的日志,并進行故障排查。
3.后臺功能創(chuàng)建
回到函數服務界面,再次點擊【創(chuàng)建函數】,進入函數創(chuàng)建頁面
選擇【使用自定義運行時平滑遷移】,輸入函數名,運行環(huán)境選擇【Java】,上傳打包好的Jar包文件。
根據具體業(yè)務修改【啟動命令】和【監(jiān)聽端口】。 這里我需要監(jiān)聽的業(yè)務端口為8080,運行時需要傳入數據庫連接的參數。 這里配置的數據庫源用戶名和密碼連接地址會在后續(xù)的云數據庫RDS中設置。
后臺功能創(chuàng)建完成后,進入功能詳情界面,其余功能與上述前端功能相同,不再贅述
點擊【觸發(fā)器管理】,其中HTTP觸發(fā)器提供公網和內網訪問地址,我們復制內網地址基于php的個人博客系統(tǒng)的實現,在前端中間件反向生成配置中填寫這個域名,實現前端訪問和后端觸發(fā)-結束功能
4.云數據庫RDS創(chuàng)建及遷移導入
原有的架構并沒有做到數據庫服務的獨立性和高可用。 在本次云部署中,我們將使用阿里云公測中的云數據庫版本。 RDS提供了CPU和內存的實時彈性能力,具有資源占用低、易用、靈活、價格低廉等優(yōu)點。 合理優(yōu)化使用成本,進一步降本增效。
RDS實例創(chuàng)建
進入云數據庫RDS控制臺,點擊【創(chuàng)建實例】開始實例創(chuàng)建過程,在【基礎資源】設置界面選擇版本,其余根據實際情況選擇
【實例配置】創(chuàng)建RDS時,需要注意網絡VPC的設置,必須與服務設置的VPC一致,才能實現內網數據互通。確定順序后,等待實例上線即??可被創(chuàng)造
RDS數據庫用戶設置
創(chuàng)建實例后,選擇管理實例。 選擇左側任務欄【賬戶管理】,點擊【創(chuàng)建賬戶】創(chuàng)建數據庫賬戶,連接供應商平臺后臺。
輸入賬戶名和密碼,選擇普通賬戶,點擊確定完成用戶創(chuàng)建
RDS業(yè)務數據庫創(chuàng)建
選擇左側欄的【數據庫管理】,選擇【創(chuàng)建數據庫】
輸入農產品電商業(yè)務所需的庫名,并將賬號授權給上一步設置的用戶,點擊創(chuàng)建完成庫設置。
RDS服務連接地址
我們函數中需要連接的庫的地址可以在rds實例中的【數據庫】連接處找到,但是需要提前設置好白名單。
我們復制內網地址,同樣完成連接用戶、密碼、庫的配置,然后我們就可以在函數或者后臺代碼中配置了
RDS業(yè)務數據庫的導入與恢復
數據庫上云的關鍵是數據內容的遷移。 本次部署的業(yè)務數據庫少且小,遷移方式采用簡單的備份SQL腳本文件。 /的數據導出方式有很多種,可以根據實際需要進行備份導出。 當然,大型業(yè)務數據庫也有專門的備份和遷移工具,這里不再贅述。
進入DMS數據管理服務,選擇【數據庫開發(fā)】,點擊【數據變更】下的【數據導入】。
根據具體的備份方式導入數據庫。 這里我選擇上傳備份sql腳本,提交申請開始導入數據。
數據導入完成,數據遷移完成
5、服務云和靜態(tài)資源CDN
上一篇文章提到,由于我已經在自己的ECS上運行服務,所以不再需要單獨購買云數據庫版本。 ECS也在同一個VPC下,可以實現內網互通。 當然還是推薦使用阿里云的云數據庫產品。
靜態(tài)資源的CDN,包括css\js\的加速,在阿里的CDN服務上,在原有的架構中已經有了,這里就不做改動了。
6.公網業(yè)務訪問域名配置
最后一步,用戶最終訪問了前端功能。 正如阿里云給出的提示,訪問默認公網地址不會進行任何中間件解析,而是直接下載首頁html靜態(tài)文件,所以需要我們自己配置訪問域名。
返回函數計算控制臺,選擇【域名管理】,點擊【添加自定義域名】
輸入自定義域名,配置路由,選擇對應功能的服務名、功能名、版本號(最新)
復制需要解析的值
復制記錄值,點擊【云解析DNS控制臺】,進入解析設置,點擊【添加記錄】
選擇記錄類型【】,輸入主機頭,填寫復制的記錄值,確認完成添加
七、農產品電商項目上云效果