OpenFaaS實戰之五:大話watchdog

程式設計師欣宸發表於2021-08-04

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;

OpenFaaS實戰系列文章連結

  1. 部署
  2. 函式入門
  3. Java函式
  4. 模板操作(template)
  5. 大話watchdog
  6. of-watchdog(為效能而生)
  7. java11模板解析
  8. OpenFaaS實戰之八:自制模板(maven+jdk8)
  9. OpenFaaS實戰之九:終篇,自制模板(springboot+maven+jdk8)

本篇概覽

  • 作為《OpenFaaS實戰》系列的第五篇,我們們需要一起面對OpenFaaS的關鍵技術:Watchdog,不瞭解它後面就沒法繼續了;
  • 標題為大話watchdog說明本文以理論為主,這也是作者的弱項,但我會努力把關鍵點說得簡潔明白,如果您發現問題請務必及時指出,謝謝!
  • 整篇文章由以下段落構成:
  1. 從faas-netes談起
  2. OpenFaaS的資源
  3. watchdog分析
  4. 小結
  5. java程式設計師的擔憂

接下來一同開啟這段旅程吧,OpenFaaS開發之路上最重要的一站!

從faas-netes談起

  1. 先看Kubernetes下OpenFaaS的整體架構,如下圖,外部請求由Gateway轉發到faas-netes元件:

在這裡插入圖片描述
2. 再來看官方描述,如下圖紅框,在K8S環境,faas-netes就是服務提供者,它提供的服務支援REST API、客戶端、WEB等多種對接方式,另外,還可以用kubectl命令對其進行管理,實現K8S的operator模式(關於K8S的operator,可以先學習Controller,再想象著高度定製CDR和Controller就可以了):

在這裡插入圖片描述

  1. 雖然faas-netes很強大,但是在本文我們們只要關注一點:faas-netes提供了函式服務,也就是說,我們們前面寫過的python、java的Hello world函式,都和faas-netes有關;
  2. 說了一大堆,主角watchdog還不出來?再等等,因為此刻大家都有同樣的疑問:我不就是寫了個python指令碼嗎,裡面只有個Hello world方法,怎麼就成了faas-netes對外提供的函式了呢?
  3. 對上面的疑問,官方內部架構圖應該是最合理的答案,如下圖,API Gateway的請求會到達faas-provider的8080埠,如果是呼叫已經發布的函式,就在左上角的紅框內處理,如果是對資源的增刪改查,就交給右下角的綠框處理:

在這裡插入圖片描述

OpenFaaS的資源

剛才提到了上圖右下角的綠框,其責任是處理資源,這不是本文的重點,但作者好歹算是Kubernetes愛好者,覺得有必要科(xuan)普(yao)一下資源相關的知識點

  1. 在K8S中,Pod、Deployment、Service都是資源,也有對應的Controller根據etcd中儲存的期望狀態來調節和控制這些資源;
  2. 對K8S環境的OpenFaaS來說,它也有自己定義的資源型別(第一篇《安裝》裡面提到過yaml資料夾,那裡面有個crd.yml檔案,記錄了OpenFaaS的資源定義);
  3. OpenFaaS怎麼控制自己的資源呢?faas-netes提供CRUD介面給外面呼叫,而這些介面的內部實現,就是上面圖中你們看到的綠框了,顯然,經典的K8S Controller模式不能滿足OpenFaaS對資源控制的需求,於是就採用了目前流行的Operator模式:更復雜的資源定義、更復雜的資源控制邏輯
  4. 至於OpenFaaS的資源具體有哪些,那要詳細去看crd.yml檔案,以及OpenFaaS Operator的程式碼了,不過上圖還是給我們指明瞭方向:Secret、Deployment、Service,想想也是如此,我們們把業務功能釋出到OpenFaaS,最關注的不就是安全(Secret)、部署配置(Deployment)、對外暴露(Service)這些東西嘛;
  • 經過欣宸的一番梳(chui)理(niu),現在對faas-netes的瞭解是否更進一步了呢?函式的釋出、後期的資源控制和調節,都是faas-netes的Operator在負責,接下來是不是該回到正題了:函式呼叫
  • 主角watchdog已經哭暈了吧...

watchdog分析

  • 還是前面那幅圖,我們們聚焦右上角那部分,我把它截出來如下圖所示:

在這裡插入圖片描述

  • 如果我們們用nodejs模板開發函式,寫了個index.js檔案,那麼響應外部請求時會走到下圖紅框位置,進入Watchdog的8080埠,此時Watchdog會新建node程式,該程式執行index.js檔案:

在這裡插入圖片描述

  • 上面說得不夠清楚麼?那就再詳細一些,我們們開發函式時會做成docker映象,這個映象裡有些啥?再來一副官方圖如下,真相大白:映象裡有個Watchdog,監聽8080埠,收到請求後fork一個程式,通過stdin把請求引數傳給這個程式,程式呼叫我們們自己寫的函式方法,並且把引數傳給此方法,等方法執行完畢後,返回值通過stdout給到Watchdog

在這裡插入圖片描述

  • 現在,相信您在寫完一個函式後,對於外部請求如何呼叫到您寫的那段程式碼應該瞭然於胸,但是,依然有個小小的盲點:我知道了Watchdog能幹啥,但是Watchdog具體是個啥?咋就進了docker映象呢?
  • 上述問題,在模板的Dockerfile檔案中可以找到答案(Dockerfile是製作docker映象的指令碼檔案),我們們開啟node模板的Dockerfile看看;
  • 如下,一開始就從基礎映象openfaas/classic-watchdog:0.18.18裡把檔案fwatchdog複製過來了:
FROM --platform=${TARGETPLATFORM:-linux/amd64} openfaas/classic-watchdog:0.18.18 as watchdog
FROM --platform=${TARGETPLATFORM:-linux/amd64} node:12.13.0-alpine as ship

COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
RUN chmod +x /usr/bin/fwatchdog
  • 這個Dockerfile的結尾如下,也就是說該映象的容器一啟動就會執行fwatchdog
CMD ["fwatchdog"]
  • 至此,您對Watchdog是否有了足夠的瞭解,如果前面的資訊量太大,我們們來做個小結;

小結

  1. 開發函式時,當函式檔案編寫完成後,就開始製作docker映象;
  2. 製作的映象中,包含有fwatchdog檔案,以及我們們編寫的函式,如果是python、nodejs等指令碼語言,就會將指令碼和nodejs或者python都複製到映象中,如果是java型別的,還會涉及到編譯構建;
  3. 部署好函式後,Kubernetes環境會根據此映象建立pod,而pod啟動後,就會執行fwatchdog檔案,也就是啟動了watchdog程式;
  4. 外部訪問函式時,請求先到API Gateway,再到上一步建立的pod的8080埠;
  5. 這個pod裡面,是watchdog在監聽8080埠,收到請求後,建立一個node程式,把請求引數通過stdin傳給node程式;
  6. node程式會執行我們們開發函式時編寫的函式,並且將收到的引數作為函式的入參;
  7. 我們們編寫的函式執行完畢後,node程式將返回值寫入stdout,這時候watchdog通過stdout就會收到函式的返回值;
  8. watchdog將收到的返回值返回給API Gateway,最終返回給使用者;
  • 這回終於說清楚了吧,如果您還意猶未盡想繼續深入,請移步watchdog的原始碼吧,地址是:https://github.com/openfaas/classic-watchdog ,這是golang編寫的,作者欣宸因為是Java背景,就不敢多說了,怕被打;

java程式設計師的擔憂

  1. 如果您是一位java程式設計師,看完以上內容是否和作者一樣湧起一絲擔憂?
  2. 我們們先看看tomcat的架構,如下圖:
    在這裡插入圖片描述
  3. 看完上圖重點就來了,對比如下:
    tomcat:監聽8080,收到請求後,從執行緒池中指定執行緒處理;
    watctdog:監聽8080,收到請求後,啟動一個程式去處理;
  4. 如果您是java程式設計師,應該能感受到這種擔憂:啟動程式意味著建立JVM例項,再建立執行緒,這些相對於業務邏輯都更消耗系統資源(CPU、記憶體),如果通過大量fork程式去處理高併發的話,其代價可想而知,另外連線池、JIT、GC等各種優化手段更無從談起了;
  5. 所以,真相是什麼呢?在OpenFaaS上開發java函式,會不會走watchdog + fork程式那一套?我們們下一篇細說吧,本文沒有貼程式碼,純手動打字,真的太累了...
  6. 先劇透:OpenFaaS很優秀,上述問題已經解決,就看Alex Ellis大神的具體手段了;

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 資料庫+中介軟體系列
  6. DevOps系列

歡迎關注公眾號:程式設計師欣宸

微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos

相關文章