项目不能使用fn标签_无服务器,Java和FN项目的第一步
項(xiàng)目不能使用fn標(biāo)簽
無服務(wù)器不是什么新事物,但是可以說,仍然有很多關(guān)于它的炒作,以及它將如何改變一切,以及未來將如何成為無服務(wù)器。 除了云提供商提供的無服務(wù)器/功能之外,還有越來越多的無服務(wù)器項(xiàng)目正在我們的路上,目的是使我們擺脫供應(yīng)商鎖定,甚至允許我們?cè)趦?nèi)部運(yùn)行無服務(wù)器。 讓我們看一個(gè)這樣的項(xiàng)目FN項(xiàng)目。
什么是FN項(xiàng)目
如果我們?cè)L問FN項(xiàng)目的官方網(wǎng)站http://fnproject.io/,我們可以看到以下內(nèi)容:
“ Fn項(xiàng)目是一個(gè)開源的容器本地?zé)o服務(wù)器平臺(tái),您可以在任何地方運(yùn)行-任何云或內(nèi)部部署。 它易于使用,支持每種編程語言,并且具有可擴(kuò)展性和高性能。”
FN Project是Oracle支持的開源項(xiàng)目,其功能基于容器。 因此,從理論上講,任何可以成為容器并可以從stdin / stdout讀取和寫入的東西都可以成為FN項(xiàng)目中的功能。 這是一個(gè)非常不錯(cuò)的功能,因?yàn)檫@意味著從理論上講,它可以支持任何編程語言,這與云提供商提供的無服務(wù)器/功能不同,在這種情況下,如果不支持您選擇的語言,則無法在無服務(wù)器上使用它。
FN Project的另一個(gè)不錯(cuò)的功能是它可以在本地運(yùn)行,也可以在云中運(yùn)行,也可以在多個(gè)云中運(yùn)行,也可以結(jié)合以上所述運(yùn)行。
初始化設(shè)置
FN項(xiàng)目的唯一先決條件是Docker 17.10.0-ce或更高版本。
要設(shè)置FN項(xiàng)目,我們只需要下載FN二進(jìn)制文件
- https://github.com/fnproject/cli/releases
并將其添加到路徑。 在此之后,我們準(zhǔn)備開始使用FN。
FN項(xiàng)目的初始功能
我們需要做的第一件事是啟動(dòng)FN服務(wù)器。 為此,我們只需要在終端/控制臺(tái)中鍵入
$ fn start為了驗(yàn)證一切正常,我們可以運(yùn)行以下命令
$ fn version這將打印機(jī)器上運(yùn)行的fn服務(wù)器和fn客戶端的版本。 就我的筆記本電腦而言,我得到了這個(gè)值
$ fn versionClient version: 0.5.15Server version: 0.3.595一旦我們確認(rèn)一切都很好,就可以開始創(chuàng)建我們的第一個(gè)功能。
FN項(xiàng)目的第一個(gè)功能
如前所述,FN項(xiàng)目是“不可知論的語言” ,從理論上講,它可以支持任何語言,但這并不意味著它目前支持所有語言。 要查看我們的版本支持哪些語言,我們可以運(yùn)行下一個(gè)命令:
$ fn init --help有–runtime選項(xiàng),它將列出我們計(jì)算機(jī)上所有可用的選項(xiàng)。 就我而言,我將選擇Java編程語言。 因此,要在Java中創(chuàng)建第一個(gè)函數(shù),我們只需要運(yùn)行以下命令:
$ fn init --runtime java --trigger http function1function1是函數(shù)的名稱,在這里我們輸入要使用的名稱。 選項(xiàng)–trigger http表示我們要為函數(shù)創(chuàng)建HTTP觸發(fā)器,該觸發(fā)器將允許我們通過HTTP(例如,通過curl)調(diào)用它。 運(yùn)行此命令后,fn將為我們生成初始函數(shù),并將其放在我們命名為函數(shù)的目錄中,在本例中為function1 。
讓我們看看產(chǎn)生了什么
$ 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項(xiàng)目的依賴項(xiàng)才是測(cè)試部件的依賴項(xiàng),而構(gòu)建或運(yùn)行我們的java fn函數(shù)則沒有依賴項(xiàng)。
如果打開HelloFunction.java ,我們將再次看到它是純Java類,具有零依賴關(guān)系。
package com.example.fn;public class HelloFunction {public String handleRequest(String input) {String name = (input == null || input.isEmpty()) ? "world" : input;return "Hello, " + name + "!";} }只有一個(gè)方法handleRequest將String作為輸入并提供String作為輸出。 這與在云提供程序的實(shí)現(xiàn)中編寫函數(shù)非常不同,因?yàn)樗鼈兛偸翘砑犹囟ǖ膸旎蚱渌愋偷囊蕾囮P(guān)系,以使函數(shù)與系統(tǒng)配合使用。 在FN的情況下,由于沒有依賴關(guān)系,因此它可以在任何地方運(yùn)行而不會(huì)出現(xiàn)任何問題,并且您不會(huì)受到任何關(guān)注。
FN項(xiàng)目的“魔術(shù)”
那么,FN如何運(yùn)作? 它如何知道如何運(yùn)行我們的功能?
所有的魔術(shù)都在func.yaml文件中。 或者更確切地說,在FN項(xiàng)目中創(chuàng)建功能所需的所有配置。 讓我們仔細(xì)看看。
$ 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這里有多個(gè)字段:
- schema_version指出用于生成該文件的Fn版本
- 名稱是我們功能的名稱
- 版本是我們功能的當(dāng)前版本,并且在我們部署時(shí)會(huì)自動(dòng)遞增
- 我們選擇在其中編寫函數(shù)的運(yùn)行時(shí)語言
- build_image用于構(gòu)建函數(shù)的docker鏡像當(dāng)然取決于選擇的語言
- run_image用于運(yùn)行函數(shù)的docker映像
- cmd 入口指向我們的功能,執(zhí)行我們的業(yè)務(wù)邏輯需要調(diào)用
- 此處的觸發(fā)器是用于調(diào)用函數(shù)的已定義觸發(fā)器,在本例中,我們具有HTTP觸發(fā)器
FN項(xiàng)目中的單元測(cè)試
也許您注意到生成的文件之一是HelloFunctionTest.java ,該文件確實(shí)是我們函數(shù)的單元測(cè)試文件,該文件也為我們自動(dòng)生成,并填充了一個(gè)簡單的單元測(cè)試示例。 讓我們看一下該文件。
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依賴關(guān)系和@Rule部分外 ,其他所有內(nèi)容都類似于Java中的任何其他JUnit測(cè)試。 該單元測(cè)試將僅調(diào)用我們的函數(shù)而不傳遞任何參數(shù),并檢查結(jié)果是否為“ Hello world!”。 該測(cè)試的最大好處是我們可以像運(yùn)行其他任何單元測(cè)試一樣運(yùn)行它,可以以任何標(biāo)準(zhǔn)方式從maven或IDE中調(diào)用它。
現(xiàn)在讓我們編寫測(cè)試,在其中傳遞一些參數(shù),并驗(yàn)證我們的功能仍按預(yù)期運(yùn)行。 為此,我們可以將此代碼添加到測(cè)試類中
@Testpublic void shouldReturnGreetingwithBodyValue() {testing.givenEvent().withBody("Java").enqueue();testing.thenRun(HelloFunction.class, "handleRequest");FnResult result = testing.getOnlyResult();assertEquals("Hello, Java!",result.getBodyAsString()); }同樣,我們可以像運(yùn)行其他任何單元測(cè)試一樣運(yùn)行它,并驗(yàn)證一切都很好。
部署和調(diào)用FN功能
現(xiàn)在我們定義了函數(shù),我們了解了生成了哪些文件以及它們的用途,我們還進(jìn)行了單元測(cè)試。 然后是時(shí)候部署和調(diào)用該功能了。 我們可以將功能部署到云和docker注冊(cè)表中,但是僅在本地部署它會(huì)更加容易和快捷,尤其是在我們忙于開發(fā)的時(shí)候。 要部署功能,我們只需要運(yùn)行此命令
$ fn deploy --app myapp1 --local在這里,我們告訴fn將功能部署到應(yīng)用程序myapp1中 ,并通過提供選項(xiàng)–local來僅在本地部署它。 成功部署函數(shù)后,就可以調(diào)用它。 要調(diào)用它,我們可以運(yùn)行下一個(gè)命令
$ fn invoke myapp1 function1我們提供了應(yīng)用程序的名稱和函數(shù)的名稱。 如果我們想為我們的職能提供投入,我們可以通過這種方式做到這一點(diǎn)
$ echo "Java is great" | fn invoke myapp1 function1如果您還記得我們還創(chuàng)建了HTTP觸發(fā)器,那么讓我們使用它來調(diào)用我們的函數(shù)。
$ curl http://localhost:8080/t/myapp1/function1-trigger帶有FN的JSON函數(shù)
我們已經(jīng)可以做很多事情了,但是讓我們進(jìn)入下一個(gè)級(jí)別,在這里我們將使用JSON作為FN函數(shù)的輸入和輸出。 首先,我們需要?jiǎng)?chuàng)建一個(gè)簡單的POJO類,就像這樣
public class Hello {private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;} }現(xiàn)在我們可以修改函數(shù)以將該類作為輸入和輸出,因此該函數(shù)將如下所示
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; }部署函數(shù)后,我們可以像這樣調(diào)用它
$ curl -d '{"message":"JSON Input"}' \http://localhost:8080/t/myapp1/function1-trigger參考資料和將來閱讀
正如我們看到的那樣,開始使用FN項(xiàng)目開發(fā)功能非常容易且有趣,而且在很短的時(shí)間內(nèi)我們就可以創(chuàng)建功能強(qiáng)大的功能。
我們?cè)谶@里看到的只是FN項(xiàng)目可能性的一部分,有關(guān)FN的一般信息以及有關(guān)可能性的更多信息,我建議您訪問下面列出的網(wǎng)站
- 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
項(xiàng)目不能使用fn標(biāo)簽
總結(jié)
以上是生活随笔為你收集整理的项目不能使用fn标签_无服务器,Java和FN项目的第一步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修复电脑不开机蓝屏的三个祖传绝技电脑开机
- 下一篇: java线程池返回线程状态_Java线程