日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

CDN边缘JavaScript敏捷交付实践

發布時間:2024/10/12 javascript 96 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CDN边缘JavaScript敏捷交付实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文由百度智能云-視頻云-內容分發加速技術架構師——高巖 在百度開發者沙龍線上分享的演講內容整理而成。內容從CDN應用Serverless的意義出發,詳細介紹EdgeJS Serverless服務。

文/ 高巖
整理/ 百度開發者中心
視頻回放:https://developer.baidu.com/live.html?id=11

本次分享的主題是:CDN邊緣JavaScript敏捷交付實踐,內容主要分為以下三個方面:

  • CDN應用Serverless的意義
  • EdgeJS Severless服務
  • 沉浸式CDN編程體驗

01 CDN應用Serverless的意義

CDN基本介紹

CDN含義:
是指一組分布在不同地理位置的服務器,協同工作以提供互聯網內容的快速交付。

CDN服務已得到不斷普及。如今,大多數web流量都通過CDN提供服務,幾乎所有的門戶網站、常用的視頻 APP(例如,愛奇藝、抖音)都會用 CDN 架構實現更加快速的內容分發,讓用戶更快地看到視頻內容,帶來更好的用戶體驗。

這是因為 CDN 允許快速傳輸、加載互聯網內容所需要的資源。以門戶網站為例,我們需要加載 HTML 頁面、JavaScript、文件 css 等資源;而視頻網站則需要加載縮略圖、視頻文件。

CDN 還可幫助保護網站免受某些常見的惡意攻擊,例如分布式拒絕服務(DDOS)攻擊。

使用CDN優勢:

  • 縮短網站加載時間
    通過將內容分發到訪問者附近的CDN服務器(以及其他優化措施),訪問者體驗到更快的頁面加載時間。由于訪問者更傾向于離開加載緩慢的網站,CDN 可以降低跳出率并增加人們在該網站上停留的時間。換句話說,網站速度越快,用戶停留的時間越長。

  • 減少帶寬成本
    網站托管的帶寬消耗成本是網站的主要費用。通過緩存和其他優化,CDN 能夠減少源服務器必須提供的數據量,從而降低網站所有者的托管成本。

  • 增加內容可用性和冗余
    大流量或硬件故障可能會擾亂正常的網站功能。由于CDN具有分布式特性,因此與許多源服務器相比,CDN 可以處理更多流量并更好地承受硬件故障。

  • 改善網站安全性
    CDN 可以通過提供鑒權、安全證書的改進以及其他優化措施來提高安全性。

  • vCDN的發展

    早在2009年,伯克利曾針對當時興起的云計算做過評論,并提出了以下6個潛在的優點:

  • (理論上)無限可用的計算資源,可在資源池中實現任意的伸縮。
  • 用戶再也不需要承擔服務器運維的工作和責任。
  • 服務的按需付費成為可能。
  • 超大型數據中心的使用成本顯著降低。
  • 通過可視化資源管理,運維操作的難度大大降低。
  • 分時復用,物理硬件的利用率大大提高。
  • 基于云計算的理念,可以實現一個虛擬化CDN(vCDN), 即可在專有、裸金屬、虛擬化或基于容器的基礎設施上運行CDN。vCDN作為云上的一個應用,是CDN和云緊密結合的產品。其主要功能特性包括:
    硬件虛擬化:虛擬化基礎架構使軟件和硬件功能得以分解,服務器運維大大簡化。
    低延遲:在共享基礎設施上運行CDN功能,可以更快的調起其他應用,比如可以實時進行圖片處理。
    彈性伸縮:可以按需使用CDN,在流量高峰和低峰,進行自動的彈性擴容和縮容。

    但是云計算技術發展到今天,虛擬化并不能解決所有的問題,
    在對性能有特別高要求的場景下,面臨的主要難點如下:

    • 虛擬機/容器,構建業務應用運維成本較高。
    • 不能做到按需付費,仍然需要獨占虛擬機。
    • 開發復雜,需要很多其它的依賴,在開發業務的過程中,需要數據庫、對象存儲等框架。需要自己掌控運維和使用情況,開發難度較高。

    Serverless介紹與特點

    為了解決上述問題,亞馬遜的 AWS 在 2015 年推出了 lambda 服務,提出了Cloud Function的概念,引起了業界對于 Serverless 的關注廣泛。

    Serverless 主要包含 Faas、Baas 兩種形態。其中,Faas 將 Function 作為服務,Baas 將后端服務作為服務。

    在應用了 vCDN 后,也可以用 Baas 的方式運行服務。Serverless 旨在讓開發人員不需要再關注服務器,云會幫自動實現服務器的運維和伸縮。

    具體而言,Serverless 具有以下特點:

  • 計算的無狀態化,服務的儲存和計算完全分開部署的,開發者只需要關心計算的實現,可以通過其它云上的獨立服務進行儲存,容易進行遷移和擴縮容。
  • 資源透明化的,無需要再關心服務器、虛擬機、容器需要多少資源、帶寬、磁盤空間,可以通過調用函數在平臺內實現資源的自動管理。
  • 按需計費,根據調用時長、調用次數進行計費。目前,vCDN 可以為客戶提供 Baas 服務。如果用戶需要更通用的函數計算產品,推薦使用百度云的 CFC,可以配置 CDN 的觸發器。
  • CDN應用Serverless的意義

    早在 2018年,云管理公司 RightScale 開展的一項調查顯示,Serverless 是增長最快的公共云服務。
    據統計,AWS 上超過一半的用戶已經在使用 Serverless 服務。Serverless 一直在高速發展,呈現出越來越大的影響力。
    Serverless 將無處不在,CDN也必須擁抱Serverless理念,提供邊緣可編程能力,使用戶可以在控制臺上通過 API 設置代碼,形成編程能力,更有效地控制 CDN。

    在 CDN 業務中實踐 Serverless 理念可以提供敏捷交付的能力,具有以下優勢:

    • 編程能力 對于剛接觸CDN的客戶來說,可編程能力,即便不理解CDN的具體運作流程,也能快速編寫出可用的代碼。
    • 敏捷交付 對于CDN研發人員,serverless節省了他們部署和運維的時間,讓他們能夠更加專注于解決和優化應用本身的問題。
    • 場景下沉結合編程能力,可以和其他場景更方便的結合在一起。
    • 邊緣計算在CDN的邊緣,可以進行更加自由的計算,節省端上處理的時間和延遲。

    02 EdgeJS Serverless服務

    EdgeJS Serverless服務目標

    Serverless 的目標是使用戶可以更容易地編寫和部署代碼,而無需關注底層結構。盡管目前的 CDN 業務可以實現按需付費,但是仍然不夠靈活。

    為此,我們推出了 EdgeJS Serverless 服務。該服務在百度智能云 CDN 上使用JavaScript 語言去提供的一種可編程的配置能力,實現高并發、低成本的敏捷交付,使 CDN 能夠體現出 serverless 的思想,進行靠攏或者是計劃。

    該服務具有以下特點:

    • 嵌入式 JavaScript runtime,而非獨立的 runtime。出于對性能的考慮,在支持 JS 標準庫的同事,避免了獨立runtime 帶來的冷啟動時間。
    • 提供請求對象 request,可以在代碼中進行隨意更改。
    • 提供對外訪問能力。

    作為一種 Serverless 服務,EdgeJS 需要實現用戶隔離、具備較高的性能,能夠動態編碼。具體而言,EdgeJS 具有以下特性:

  • 動態編碼。
  • 即時編譯。即用戶代碼在邊緣區編譯之后,可以被緩存,無需進行重復編譯,理論上大大提升了執行的效率。
  • 風險隔離。即嚴格隔離不同用戶的代碼,為用戶可以使用的資源設置最高上限。
  • EdgeJS Serverless服務的特性

    EdgeJS致力于讓CDN更易用,向serverless服務能力邁進。所以EdgeJS的定位一開始就是完全免費,在CDN按需使用的帶寬費用之外,不會產生額外的費用。

    在降低CDN使用門檻的初衷下,必須還得保持CDN的高可用、低延遲、就近服務的能力。

    EdgeJS的設計,是完全嵌入到CDN接入層的JavaScriptruntime,無需冷啟動時間,沒有性能損失,并支持標準ES6語法的JavaScriptAPI,各種特性陸續補齊中。

    而且相比傳統交付,開發上線至少周級別的交付周期,EdgeJS真正能做到秒級交付,用戶在控制臺配置上代碼,就可以秒級生效。當然建議在正式發布前,先使用預發布功能來灰度驗證。EdgeJS,可以根據請求進行各種特征處理,這極大豐富了CDN接入的場景。

    為了更好地配合 CDN 業務,EdgeJS 具有以下特性:

    • 使用 EdgeJS 在邊緣進行計算(如一些特殊的鑒權等不能緩存的動態需求),將預計算任務部署在邊緣設備上,大大減輕源站的壓力
    • 做到秒級交付,使用戶在控制臺上配置代碼,秒級生效。
    • 根據請求進行各種特征處理,極大豐富 CDN接入場景(包括不限于跨域訪問、重定向、訪問控制、單請求限速、自定義鑒權、m3u8改寫、請求改寫、A/BTest自定義錯誤頁面等。

    除此之外,EdgeJS還可以利用fetch等能力,和遠端進行協同,包括不限于遠程鑒權、云服務協同和請求畫像打點上傳。這些能力已經遠超CDN的傳統場景,向serverless服務能力靠攏。

    在CDN龐大的算力加持下,可以減輕源站的性能壓力和支出。而且,當增加了新的特征或者增加了新的計算方法,可以隨時修改JavaScript代碼,進行實時控制。

    03 沉浸式CDN編程

    url改寫與復雜文件名改寫

    CDN 控制臺本身支持一些 URL 改寫的基本功能,但這些預定義的功能靈活性較低。我們可以通過 EdgeJS 根據用戶的要求確定配置。EdgeJS 使用標準的 JS 語法,需要用戶建立一個請求對象 request。
    如上圖所示,我們首先將 URL 中的大寫字母轉成小寫,接著我們將請求的 variables 參數改成小寫。variable 映射的是 UNIX 的變量,而這的規則完全一致的。

    EdgeJS 支持復雜的文件名改寫,這里涉及到三種情況:
    (1)參數 attname 存在且不為空字符串
    (2)參數 attname 存在且為空字符串
    (3)參數 attname 不存在。

    回源鑒權頭

    在一些對象存儲場景下,我們可以通過 EdgeJs 構建回源鑒權頭 authorization。首先生成一個隨機數,獲取當前時間,并生成請求 URL。接著,我們利用以上三者根據 crypto 算法生成鑒權頭。
    我們可以通過請求的 headersIn 特性獲取請求頭。有些特殊的請求頭只能存在一份,如果重復則會被忽略(例如,host、connection,詳見官網)。此外,重復的 Cookie 的請求頭會返回所有的重復部分,并以分號分隔開來。如果我們想要獲取所有的請求頭,我們需要使用 rawHeadersIn 特性,如果請求頭有多個,則會輸出數組。

    r.headersIn{}
    請求頭對象,可寫Foo請求頭可以使用r.headersIn.foo或者r.headersIn[‘Foo’]來訪問
    “Host”, “Connection”, “If-Modified-Since”, “If-Unmodified-Since”, “If-Match”, “If-None-Match”, “User-Agent”, “Referer”,
    “Content-Length”, “Content-Range”, “Content-Type”, “Range”, “If-Range”, “Transfer-Encoding”, “TE”, “Expect”,
    “Upgrade”, “Accept-Encoding”, “Via”, “Authorization”, “Keep-Alive”, “X-Real-IP”, “Accept”, “Accept-Language”, “Depth”,
    “Destination”, “Overwrite”, "Date"這些請求頭只能有一個,重復的會被忽略

    重復的“Cookie”請求頭,會返回所有的重復部分,并以分號(;)分隔,
    重復的其他請求頭,會返回所有的重復部分,并以逗號(,)分隔,
    r.headersIn.foo =‘foo’,賦值會覆蓋所有的重復部分。

    r.headersIn [‘Foo’]= [‘a’, ‘b’],賦值數組,會產生兩個重復的請求頭:
    Foo:a和Foo:b

    r.rawHeadersIn{}
    請求頭KV Array,只讀。
    比如請求頭Host:localhost;Foo: bar ;foo: bar2

    r.rawHeadersIn輸出類似于[‘Host’, ‘localhost’], [‘Foo’, ‘bar’], [‘foo’, ‘bar2’]
    獲取所有的請求頭foor.rawHeadersIn.filter(v=>v[0].toLowerCase()
    == ‘foo’).map(v=>v[1])
    輸出[‘bar’, ‘bar2’]

    文件名改寫

    EdgeJS Serverless 服務通過請求的 headersOut 特性可以實現文件名改寫、跨域訪問、設置相同的響應頭等功能。
    如上圖所示,我們可以使用請求參數 filename 命名下載文件,使用請求頭 Origin 賦值給跨域響應頭 Access-Control-A。在設置相同的響應頭時,我們可以通過賦值數組,產生重復的響應頭。

    r.headersOut{}響應頭對象,可寫Foo響應頭可以使用r.headersOut.foo或者r.headersOut[‘Foo’]來訪問。
    “Server”, “Date”, “Content-Length”, “Content-Encoding”,
    “Location”, “Refresh”, “Last-Modified”,
    “Content-Range”, “Accept-Ranges”,
    “WWW-Authenticate”, “Expires”, “E-Tag”, “ETag”, “Content-Type”, “X-Override-Charset”,
    “Cache-Control”, “Link”, “Age”,
    “Retry-After”,這些響應頭只能有一個,重復的會被忽略

    重復的"Set-Cookie"響應頭,會返回一個數組,例如,r.headersOut[‘Set-Cookie’].forEach
    (element=> console.log(element));

    重復的其他響應頭,會返回所有的重復部分,并以逗號(,)分隔
    r.headersOut.foo =‘foo’,賦值會覆蓋所有的重復部分。

    r.headersOut [‘Foo’]= [‘a’, ‘b’],賦值數組,會產生兩個重復的響應頭:
    Foo:a和Foo:b

    r.rawHeadersOut{}
    響應頭KV Array,只讀
    用法類似于r.rawHeadersIn{}

    自定義錯誤頁面

    我們可以使用 EdgeJS 實現自定義的錯誤頁面,當源站返回 404 時,可以重定向到一個對用戶友好的頁面。
    如上圖所示,我們通過 respHeader 回調實現上述功能。類似地,我們可以通過 respHeader 實現 A/B 測試,
    如果源站返回了特殊頭 a,可以命中一個升級的邏輯,重定向到一個應用升級的頁面。

    IP黑名單

    EdgeJS 支持通過百度自有的庫提供一些常用的訪問控制功能:
    (1)IP 黑名單,如果客戶端地址在 192.168.1.1/32 或 192.168.2.1/24 等ip段內,則返回 403。
    (2)Referer 白名單,如果 referer 不匹配某些通配符的形式,則返回 403。
    (3)UA 黑名單,如果 UA 包含 curl 或 AppleWebKit,則返回 403。

    代碼示例:
    r.remoteAddress
    客戶端地址,只讀

    baidu_utils庫
    function ipInCidr(ipv4,cidrs)
    參數:
    ipv4為點分十進制的ipv4地址,比如’192.168.2.100’
    cidrs為CIDR地址列表,比如[‘192.168.1.1/32’,‘192.168.2.1/24’]

    使用示例:
    if (baidu_utils.ipInCidr (‘192.168.2.100’,[‘192.168.1.1/32’,‘192.168.2.1/24’])) {
    r.return(403);
    }
    function matchWildcard(str,rule)

    參數:
    str為待匹配的字符串,比如’http://www.baidu.com/’
    rule為有通配符的字符串,比如’http://.baidu.com/’

    使用示例:
    if (baidu_utils.matchWildcard(‘http://www.baidu.com/’, ‘http://.baidu.com/’)
    {
    r.return(403);
    }

    鑒權

    百度云基于 EdgeJS 提供了 B 類防盜鏈等鑒權功能。原始的 URL 包含協議頭 HTTP、域名、文件名。在加密之后,URL 變成了協議頭、域名、時間戳、MD5 編碼,文件名。
    在上圖的第一段代碼中,CDN 服務器收到請求之后,首先拆分 URL,得到時間戳、MD5 、文件名。
    在第二段代碼中,時間戳的格式并非 Unicode,而是可讀的格式,我們需要進行時間戳格式的轉換,將秘鑰與時間戳、文件名拼接,并進行 MD5 加密編碼的比對。

    子請求

    CDN本身是一個緩存體系,對于hls或者dash來說,其索引文件中包含的防盜鏈信息,在用戶請求的時候很可能過期了,所以在用戶請求的m3u8或者mpd的防盜鏈驗證通過之后,需要將這個請求中的防盜鏈信息改寫到索引文件內容中。

    Fetch

    Fetch
    ngx.fetch(url, [options])
    類似于JavaScript原生的Fetch,請求URL,并返回解析Response對象的Promise。參考Using_Fetch
    目前僅支持http協議,重定向需要調用者處理
    類似于js fetch,options支持body/ headers / method。

    ssl選項如下:
    ssl_name 指定sni,默認為url中的域名
    ssl_verify是否開啟證書校驗,默認開啟

    Response
    標準的JavaScript內置對象

    我們可以通過 EdgeJS Serverless 服務實現 Fetch 功能,請求遠程鑒權服務器,根據遠程服務器的響應進行處理,如果得到非 2xx 狀態碼,則返回 403 禁止訪問。Fetch 返回的是一個 Promise 對象,包含類方法,可以將異步的操作變為序列化的操作,只要需要關心業務邏輯。與 Fetch 一同上線的還有 Await、SubtleCrypto 等功能。

    以上是老師的全部分享內容,有任何問題可以在討論區提出。
    點擊進入獲得更多技術信息~~

    掃描二維碼,備注:音視頻開發,立即加入音視頻開發技術交流群。

    總結

    以上是生活随笔為你收集整理的CDN边缘JavaScript敏捷交付实践的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产亚洲精品久久久久动 | 男人的天堂影院 | 一本大道综合伊人精品热热 | 欧洲在线观看 | www.浪潮av.com | 天天爽天天爽 | 欧美成人精品一区二区综合免费 | 天天综合永久入口 | 国产老女人精品毛片久久 | 欧美极品少妇xxxxⅹ裸体艺术 | 狠狠躁18三区二区一区传媒剧情 | 男女午夜视频在线观看 | 亚洲乱码中文字幕 | 毛片3| 色涩色 | 精品国产无码一区二区三区 | 久久国产精品免费看 | 成年人在线网站 | 麻豆成人91精品二区三区 | 久操视频免费看 | 国产乱码在线观看 | 久久网址| av免费毛片 | 国产清纯在线 | 国产99免费视频 | 国产成人精品影院 | 国产欧美二区 | 欧美性一区 | 欧美亚洲在线播放 | 黄色福利网 | 清纯唯美第一页 | 免费观看毛片网站 | 欧美在线视频一区 | 善良的女朋友在线观看 | 污视频在线播放 | 一区二区三区欧美日韩 | 99国产精品免费 | 日本色悠悠| 91插插插影库永久免费 | 91麻豆精品国产91久久久无需广告 | www.婷婷色| 欧美一区2区 | 日韩久久一级片 | 美国黄色一级毛片 | 亚洲人网| 丰满大肥婆肥奶大屁股 | 四虎网站 | 婷婷的五月 | 欧美波霸影院 | 五月天色丁香 | 成人在线网址 | 精品人妻一区二区三区四区久久 | 国产综合网站 | 人人妻人人澡人人爽欧美一区双 | 国产精品刺激 | 日本少妇色视频 | 亚洲av中文无码乱人伦在线视色 | 国产综合视频在线 | 精品国产伦一区二区三区 | 欧美丰满老熟妇xxxxx性 | 国产精品久久久久久久久免费看 | 麻豆蜜桃av | 性色av一区二区三区红粉影视 | 欧美另类亚洲 | 亚洲制服无码 | 办公室摸腿吻胸激情视频 | 无码人妻丰满熟妇精品 | 国产精品自拍在线观看 | 欧美三日本三级少妇三级99观看视频 | 免费看60分钟黄视频 | 97视频久久 | 男性裸体全身精光gay | 大地资源中文第三页 | 一级片免费在线观看 | 欧美一区二区高清视频 | sm久久捆绑调教精品一区 | 97干干干| 日韩欧美视频网站 | 久久成人精品一区二区 | 日韩五码电影 | 亚洲一区人妻 | 丰满人妻一区二区三区53视频 | 欧美自拍色图 | 九九亚洲精品 | 成 年人 黄 色 片 | 夜夜干天天操 | 免费a在线观看 | 免费黄色在线网站 | 欧美性受xxxx黑人xyx | 午夜精品一区二区三区免费视频 | 91丝袜一区二区三区 | 激情福利在线 | 欧美日韩一区二区三区在线 | 人操人爽 | 一级做a爰片 | 看片免费黄在线观看入口 | 黄网站免费观看 | 91成人在线观看喷潮蘑菇 | 亚洲 日本 欧美 中文幕 |