无服务器,Java和FN项目的第一步
無服務器不是什么新事物,但是可以說,仍然有很多關于它的炒作,以及它將如何改變一切,以及未來將如何成為無服務器。 除了云提供商提供的無服務器/功能之外,還有越來越多的無服務器項目正在我們的路上,目的是使我們擺脫供應商鎖定,甚至允許我們在內部運行無服務器。 讓我們看一個這樣的項目FN項目。
什么是FN項目
如果我們訪問FN項目的官方網站http://fnproject.io/,我們可以看到以下內容:
“ Fn項目是一個開源的容器本地無服務器平臺,您可以在任何地方運行-任何云或內部部署。 它易于使用,支持每種編程語言,并且具有可擴展性和高性能。”
FN Project是Oracle支持的開源項目,其功能基于容器。 因此,從理論上講,任何可以成為容器并可以從stdin / stdout讀寫的東西都可以成為FN項目中的功能。 這是一個非常好的功能,因為這意味著從理論上講,它可以支持任何編程語言,這與云提供商提供的無服務器/功能不同,在這種情況下,如果不支持您選擇的語言,則無法在無服務器上使用它。
FN Project的另一個不錯的功能是它可以在本地運行,也可以在云中運行,也可以在多個云中運行,也可以結合以上提到的全部運行。
初始化設定
FN項目的唯一先決條件是Docker 17.10.0-ce或更高版本。
要設置FN項目,我們只需要下載FN二進制文件
- https://github.com/fnproject/cli/releases
并將其添加到路徑。 在此之后,我們準備開始使用FN。
FN項目的初始功能
我們需要做的第一件事是啟動FN服務器。 為此,我們只需要在終端/控制臺中鍵入
$ fn start為了驗證一切正常,我們可以運行以下命令
$ fn version這將打印在計算機上運行的fn服務器和fn客戶端的版本。 就我的筆記本電腦而言,我得到了這個值
$ fn versionClient version: 0.5.15Server version: 0.3.595一旦我們確認一切都很好,就可以開始創建我們的第一個功能。
FN項目的第一個功能
如前所述,FN項目是“不可知的語言” ,理論上它可以支持任何語言,但這并不意味著它目前支持所有語言。 要查看我們的版本支持哪些語言,我們可以運行下一個命令:
$ fn init --help有–runtime選項,它將列出我們計算機上所有可用的選項。 就我而言,我將選擇Java編程語言。 因此,要在Java中創建第一個函數,我們只需要運行以下命令:
$ fn init --runtime java --trigger http function1function1是函數的名稱,在這里我們輸入要使用的名稱。 選項–trigger http表示我們想為函數創建HTTP觸發器,該觸發器將允許我們通過HTTP(例如,通過curl)調用它。 運行此命令后,fn將為我們生成初始函數,并將其放置在名為函數的目錄中,在本例中為function1 。
讓我們看看產生了什么
$ cd function1 $ find ../src/main/java/com/example/fn/HelloFunction.java ./src/test/java/com/example/fn/HelloFunctionTest.java ./pom.xml ./func.yaml如果我們打開pom.xml文件,它將看起來像任何其他pom.xml文件。 只有FN項目的依賴項才是測試部件的依賴項,而構建或運行我們的java fn函數則沒有依賴項。
如果打開HelloFunction.java ,我們將再次看到它是純Java類,具有零依賴關系。
package com.example.fn;public class HelloFunction {public String handleRequest(String input) {String name = (input == null || input.isEmpty()) ? "world" : input;return "Hello, " + name + "!";} }只有一個方法handleRequest可以將String作為輸入并提供String作為輸出。 這與在云提供程序的實現中編寫函數非常不同,因為它們總是添加特定的庫或其他類型的依賴項,以使函數與系統配合使用。 在FN的情況下,由于沒有依賴關系,因此它可以在任何地方運行而不會出現任何問題,并且您不會受到任何關注。
FN項目的“魔術”
那么,FN如何運作? 它如何知道如何運行我們的功能?
所有的魔術都在func.yaml文件中。 或者更確切地說,在FN項目中創建功能所需的所有配置。 讓我們仔細看看。
$ cat func.yamlschema_version: 20180708 name: function1 version: 0.0.1 runtime: java build_image: fnproject/fn-java-fdk-build:jdk9-1.0.75 run_image: fnproject/fn-java-fdk:jdk9-1.0.75 cmd: com.example.fn.HelloFunction::handleRequest format: http-stream triggers: - name: function1-trigger type: http source: /function1-trigger這里有多個字段:
- schema_version指出用于生成該文件的Fn版本
- 名稱是我們功能的名稱
- 版本是我們功能的當前版本,并且在我們部署時會自動遞增
- 我們選擇在其中編寫函數的運行時語言
- build_image用于構建函數的docker鏡像當然取決于選擇的語言
- run_image用于運行函數的docker映像
- cmd 入口指向我們的功能,執行我們的業務邏輯需要調用
- 這里的觸發器是調用函數的已定義觸發器,在這種情況下,我們有HTTP觸發器
FN項目中的單元測試
也許您注意到生成的文件之一是HelloFunctionTest.java ,該文件確實是我們函數的單元測試文件,該文件也為我們自動生成,并填充了一個簡單的單元測試示例。 讓我們看一下該文件。
public class HelloFunctionTest {@Rulepublic final FnTestingRule testing = FnTestingRule.createDefault();@Testpublic void shouldReturnGreeting() {testing.givenEvent().enqueue();testing.thenRun(HelloFunction.class, "handleRequest");FnResult result = testing.getOnlyResult();assertEquals("Hello, world!",result.getBodyAsString());} }除了某些fn依賴關系和@Rule的一部分外 ,其他所有內容都類似于Java中的任何其他JUnit測試。 該單元測試將僅調用我們的函數而不傳遞任何參數,并檢查結果是否為“ Hello world!”。 該測試的最大優點是我們可以像運行其他任何單元測試一樣運行它,可以以任何標準方式從maven或IDE調用它。
現在讓我們編寫測試,在其中傳遞一些參數,并驗證我們的功能仍按預期運行。 為此,我們可以將此代碼添加到測試類中
@Testpublic void shouldReturnGreetingwithBodyValue() {testing.givenEvent().withBody("Java").enqueue();testing.thenRun(HelloFunction.class, "handleRequest");FnResult result = testing.getOnlyResult();assertEquals("Hello, Java!",result.getBodyAsString()); }同樣,我們可以像運行其他任何單元測試一樣運行它,并驗證一切都很好。
部署和調用FN功能
現在我們定義了函數,我們了解了生成了哪些文件以及它們的用途,我們還進行了單元測試。 然后是時候部署和調用該功能了。 我們可以將功能部署到云和docker注冊表中,但是僅在本地部署它會更加容易和快捷,尤其是在我們忙于開發的時候。 要部署功能,我們只需要運行此命令
$ fn deploy --app myapp1 --local在這里,我們告訴fn將功能部署到應用程序myapp1中 ,并通過提供選項–local來僅在本地部署它。 成功部署函數后,就可以調用它。 要調用它,我們可以運行下一個命令
$ fn invoke myapp1 function1我們提供了應用程序的名稱和函數的名稱。 如果我們想為我們的職能提供投入,我們可以通過這種方式做到這一點
$ echo "Java is great" | fn invoke myapp1 function1如果您還記得我們還創建了HTTP觸發器,那么讓我們使用它來調用我們的函數。
$ curl http://localhost:8080/t/myapp1/function1-trigger帶有FN的JSON函數
我們已經可以用它做很多事情了,但是讓我們進入下一個級別,在這里我們將使用JSON作為FN函數的輸入和輸出。 首先,我們需要創建一個簡單的POJO類,就像這樣
public class Hello {private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;} }現在我們可以修改函數以將該類作為輸入和輸出,因此該函數將如下所示
public Hello handleRequest(Hello input) {String name = (input == null || input.getMessage().isEmpty()) ? "world" :input.getMessage();Hello hello = new Hello();hello.setMessage(message + ", " + name + "!")return hello; }部署函數后,我們可以像這樣調用它
$ curl -d '{"message":"JSON Input"}' \http://localhost:8080/t/myapp1/function1-trigger參考資料和將來閱讀
正如我們看到的那樣,開始使用FN項目開發功能非常容易且有趣,而且在短時間內我們就可以創建功能強大的功能。
我們在這里看到的只是FN項目可能性的一部分,有關FN的一般信息以及有關可能性的更多信息,我建議您訪問下面列出的網站
- http://fnproject.io/
- https://github.com/fnproject/fn
- https://github.com/vladimir-dejanovic/java-in-fn-project
翻譯自: https://www.javacodegeeks.com/2018/12/serverless-java-fn-project-first-steps.html
總結
以上是生活随笔為你收集整理的无服务器,Java和FN项目的第一步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rp计算机(rpi电脑)
- 下一篇: 索甲仁波切简介 关于索甲仁波切简介