阿里云函數(shù)計(jì)算(一)

最近接觸到了阿里云的函數(shù)計(jì)算的服務(wù),經(jīng)過(guò)幾天的嘗試還是有所收獲,因此不妨把學(xué)習(xí)過(guò)程中的點(diǎn)滴記錄下來(lái),方便以后溫習(xí)帚桩。

什么是函數(shù)計(jì)算

根據(jù)阿里云的中的相關(guān)介紹,可以知道函數(shù)計(jì)算是事件驅(qū)動(dòng)的全托管計(jì)算服務(wù)嘹黔。用戶(hù)無(wú)需管理服務(wù)器等基礎(chǔ)設(shè)施账嚎,只需編寫(xiě)代碼并上傳,函數(shù)計(jì)算會(huì)為您準(zhǔn)備好計(jì)算資源,以彈性郭蕉、可靠的方式運(yùn)行您的代碼乏悄,并提供日志查詢(xún)、性能監(jiān)控恳不、報(bào)警等功能。從而實(shí)現(xiàn)了函數(shù)即服務(wù)开呐。更多介紹可以參考阿里云函數(shù)計(jì)算

快速建立一個(gè)函數(shù)計(jì)算服務(wù)

新建項(xiàng)目并引入相關(guān)的依賴(lài)

在建立一個(gè)函數(shù)計(jì)算之前烟勋,首先要在阿里云開(kāi)通函數(shù)計(jì)算的服務(wù)。阿里云函數(shù)計(jì)算目前支持Java(Java8)筐付,NodeJS(nodejs6卵惦,nodejs8),Python (Python2.7瓦戚,Python3.6) 3種語(yǔ)言沮尿。本文主要詳細(xì)記錄Java環(huán)境下的搭建過(guò)程。
首先在IDEA中新建一個(gè)Maven項(xiàng)目较解,若在那個(gè)在代碼中正常使用函數(shù)計(jì)算畜疾,需要在pom.xml文件中加入對(duì)應(yīng)的依賴(lài):

<dependency>
    <groupId>com.aliyun.fc.runtime</groupId>
    <artifactId>fc-java-core</artifactId>
    <version>1.0.0</version>
</dependency>

創(chuàng)建實(shí)現(xiàn)函數(shù)計(jì)算接口的類(lèi)

正常導(dǎo)入依賴(lài)后,在java目錄下新建一個(gè)實(shí)現(xiàn)函數(shù)計(jì)算預(yù)定義接口的類(lèi)FCController印衔。函數(shù)計(jì)算目前有 2 個(gè)預(yù)定義的接口可以實(shí)現(xiàn)啡捶,StreamRequestHandler以及PojoRequestHandler。我們先以StreamRequestHandler舉例奸焙,查看StreamRequestHandler接口的代碼:

public interface StreamRequestHandler {
    void handleRequest(InputStream var1, OutputStream var2, Context var3) throws IOException;
}

StreamRequestHandler接口只定義了一個(gè)無(wú)返回值的方法瞎暑,輸入以及輸出均以流的方式實(shí)現(xiàn),而context 是函數(shù)計(jì)算在運(yùn)行時(shí)生成的一個(gè)包含一些運(yùn)行時(shí)的信息對(duì)象与帆。在FCController中重寫(xiě)該方法:

package example;
import ...
public class FCController implements StreamRequestHandler{

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)throws IOException{
    outputStream.write("Hello Function Compute".getBytes());
    }
}

到目前為止了赌,一個(gè)最簡(jiǎn)單的函數(shù)計(jì)算的代碼已經(jīng)編寫(xiě)完成。

將代碼打包

我們?cè)陂_(kāi)發(fā)中通常會(huì)使用到自定義的模塊玄糟,因此在打jar包時(shí)需要將它們一起打包勿她。Maven下可以通過(guò)使用maven-assembly-plugin 插件來(lái)進(jìn)行打包。在pom.xml文件中加入如下代碼:

  <build>
     <plugins>
         <plugin>
             <artifactId>maven-assembly-plugin</artifactId>
             <version>3.1.0</version>
             <configuration>
                 <descriptorRefs>
                     <descriptorRef>jar-with-dependencies</descriptorRef>
                 </descriptorRefs>
                 <appendAssemblyId>false</appendAssemblyId> <!-- this is used for not append id to the jar name -->
             </configuration>
             <executions>
                 <execution>
                     <id>make-assembly</id> <!-- this is used for inheritance merges -->
                     <phase>package</phase> <!-- bind to the packaging phase -->
                     <goals>
                         <goal>single</goal>
                     </goals>
                 </execution>
             </executions>
         </plugin>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-compiler-plugin</artifactId>
             <configuration>
                 <source>1.8</source>
                 <target>1.8</target>
             </configuration>
         </plugin>
     </plugins>
 </build>

然后使用mvn clean package進(jìn)行打包茶凳。打包成功后在target文件夾下生成了可執(zhí)行的jar包嫂拴。

配置函數(shù)計(jì)算

jar包生成后,網(wǎng)頁(yè)打開(kāi)阿里云函數(shù)計(jì)算控制臺(tái)贮喧,依照以下幾步完成函數(shù)計(jì)算的創(chuàng)建:

  • 新建服務(wù):填寫(xiě)服務(wù)的名稱(chēng)筒狠。
  • 新建函數(shù):函數(shù)模板下選擇語(yǔ)言環(huán)境,本例選擇Java8箱沦,選擇空白函數(shù)進(jìn)入下一步辩恼。
  • 觸發(fā)器配置:根據(jù)需要選擇觸發(fā)器。每個(gè)函數(shù)只可以配置一種觸發(fā)器。此處選擇了不設(shè)置觸發(fā)器灶伊。盡管如此疆前,觸發(fā)器依然可以在后面進(jìn)行添加。
  • 基礎(chǔ)管理配置:填寫(xiě)新建的函數(shù)名稱(chēng)聘萨,注意選擇正確的運(yùn)行環(huán)境竹椒。運(yùn)行環(huán)境選擇Java后,下方會(huì)有進(jìn)一步的配置米辐,可以通過(guò)OSS或者直接上傳代碼包上傳代碼胸完。直接上傳限制上傳文件的大小不得超過(guò)5M。環(huán)境配置中輸入正確的函數(shù)入口翘贮,依照"[package].[class]::[method]"的格式進(jìn)行配置赊窥,如上文代碼中,包名為example狸页,類(lèi)名為FCController锨能,方法名為handleRequest,因此函數(shù)入口應(yīng)當(dāng)為example.FCController::handleRequest 芍耘。
  • 權(quán)限配置:此處跳過(guò)址遇。
  • 核對(duì)信息:最后核對(duì)配置的信息,無(wú)誤即可點(diǎn)擊創(chuàng)建。

執(zhí)行函數(shù)計(jì)算

經(jīng)過(guò)上述的步驟斋竞,函數(shù)計(jì)算已經(jīng)可以成功創(chuàng)建傲隶。我們上傳的代碼包在執(zhí)行之前,會(huì)被解壓縮窃页,之后才會(huì)被加載跺株,執(zhí)行,因此不妨解壓生成的jar文件脖卖,看一下文件結(jié)構(gòu)乒省。
根目錄.png

example目錄.png

我們可以看到在example文件下有編譯后的FCController.class文件,而文件的路徑符合之前填寫(xiě)的函數(shù)入口畦木⌒淇福回到函數(shù)計(jì)算控制臺(tái),點(diǎn)擊執(zhí)行來(lái)執(zhí)行我們上傳的程序并返回結(jié)果十籍。

執(zhí)行結(jié)果.png

至此蛆封,一個(gè)最簡(jiǎn)單的函數(shù)計(jì)算已經(jīng)成功實(shí)現(xiàn)。

觸發(fā)器配置

在已經(jīng)創(chuàng)建的函數(shù)界面可以看到如下四個(gè)窗口:


window.png
  • 概覽 在概覽中可以對(duì)函數(shù)的屬性進(jìn)行修改勾栗,例如我們?cè)诖a中修改了類(lèi)名惨篱,對(duì)應(yīng)的函數(shù)入口也應(yīng)當(dāng)進(jìn)行變更。
  • 代碼執(zhí)行 在代碼執(zhí)行中可以執(zhí)行已上傳的代碼围俘,查看執(zhí)行結(jié)果等砸讳。除此也可以上傳新的代碼包琢融,注意上傳之后需要點(diǎn)擊保存才能是剛剛上傳的代碼包生效,否則函數(shù)計(jì)算執(zhí)行的依然是之前的程序代碼簿寂。
  • 觸發(fā)器 顯而易見(jiàn)漾抬,盡管之前沒(méi)有配置觸發(fā)器,我們依然可以在建立函數(shù)之后有選擇的創(chuàng)建常遂。
  • 日志查詢(xún) 在日志查詢(xún)中可以配置相關(guān)的日志查詢(xún)服務(wù)纳令。

我們進(jìn)入到觸發(fā)器窗口中,并且點(diǎn)擊創(chuàng)建觸發(fā)器克胳,如圖:


trigger.png

關(guān)于觸發(fā)器的介紹可以參考阿里云關(guān)于觸發(fā)器的相關(guān)介紹泊碑。值得一提的是,文檔在關(guān)于HTTP觸發(fā)器的介紹中寫(xiě)道暫不支持HTTP觸發(fā)器毯欣,然而細(xì)心的可以在上圖中看到服務(wù)類(lèi)型中含有HTTP觸發(fā)器,并且可以正常選中臭脓。選中之后填寫(xiě)觸發(fā)器的相關(guān)信息酗钞。請(qǐng)求方法可以選擇多個(gè)。點(diǎn)擊創(chuàng)建后来累,發(fā)現(xiàn)已經(jīng)添加了HTTP觸發(fā)器砚作。

HTTPTrigger.png

回到之前提及到的函數(shù)創(chuàng)建的觸發(fā)器配置步驟中,倘若在此處選擇HTTP觸發(fā)器嘹锁,在下一步基礎(chǔ)配置管理中的運(yùn)行環(huán)境下是無(wú)法選擇Java運(yùn)行環(huán)境的葫录。
NO JAVA 8.png

創(chuàng)建好觸發(fā)器后,回到代碼執(zhí)行窗口领猾,可以看到界面多出來(lái)了一個(gè)調(diào)試HTTP觸發(fā)器米同。復(fù)制鏈接,在RestClient中實(shí)用Get方法請(qǐng)求派阱,可以看到請(qǐng)求成功并且返回正確的結(jié)果矗漾。
response.png

很明顯榕吼,看我們不僅創(chuàng)建了文檔中所述的不支持Java運(yùn)行環(huán)境的HTTP觸發(fā)器,并且驗(yàn)證了創(chuàng)建的這個(gè)HTTP觸發(fā)器是可以正常使用的熬苍。因此,目前如果你想創(chuàng)建一個(gè)HTTP觸發(fā)器的Java運(yùn)行環(huán)境的函數(shù)計(jì)算袁翁,切記在創(chuàng)建函數(shù)時(shí)選擇不創(chuàng)建觸發(fā)器柴底,在函數(shù)創(chuàng)建成功后再添加HTTP觸發(fā)器。

函數(shù)計(jì)算進(jìn)階

在實(shí)際開(kāi)發(fā)中粱胜,我們的服務(wù)往往會(huì)接受一些參數(shù)柄驻,對(duì)這些參數(shù)或根據(jù)這些參數(shù)來(lái)進(jìn)行下一步的代碼編寫(xiě),因此焙压,Java寫(xiě)的函數(shù)計(jì)算若要實(shí)現(xiàn)此功能需要實(shí)現(xiàn)PojoRequestHandler凿歼。PojoRequestHandler需要我們提供兩個(gè)Pojo類(lèi)褪迟,分別用于輸入以及輸出。先上代碼:

@Data
public class Input {
    private Integer num;
    private String name;
    private Boolean tag;
    private List<Integer> integerList;
    private Map<String,Integer> stringIntegerMap;
    private Person person;
}

@Data
@Builder
public class Output {
    private Integer length;
    private String welcome;
    private Boolean ifSuccess;
    private List<Integer> integerList;
    private Map<String, Integer> stringIntegerMap;
    private Person person;
}

@Data
@AllArgsConstructor
public class Person {
    private Integer age;
    private String gender;
}

public class FCController implements PojoRequestHandler<Input, Output> {

    @Override
    public Output handleRequest(Input input, Context context){
        return Output.builder()
            .length(input.getIntegerList().size())
            .welcome("Hello "+ input.getName())
            .ifSuccess(!input.getTag())
            .integerList(input.getIntegerList().stream().map(l -> l+2).collect(Collectors.toList()))
            .stringIntegerMap(input.getStringIntegerMap())
            .person(new Person(100,"female")).build();
    }

    public static void main(String[] args){}
}

Input類(lèi)用于接收參數(shù)答憔,定義了一些常用類(lèi)型的屬性味赃。Output類(lèi)用于返回結(jié)果。FCController類(lèi)實(shí)現(xiàn)了預(yù)定義的PojoRequestHandler接口虐拓,并重寫(xiě)了handleRequest方法心俗,接收Input類(lèi)為輸入,并以O(shè)utput類(lèi)為輸出蓉驹。打包后上傳函數(shù)計(jì)算控制臺(tái)城榛,上傳后記得點(diǎn)擊保存保證計(jì)算使用最近更新的包。HTTP觸發(fā)器中請(qǐng)求選擇選擇POST方法态兴,Body的row下填入要傳入的參數(shù)狠持。例如:

{
"num": 10,
"name": "lwf",
"tag": false,
"integerList": [1, 2, 3, 4, 5, 6, 7],
"stringIntegerMap": {
    "key": 10
},
"person": {
    "age": 50,
    "gender": "male"
}
}

點(diǎn)擊執(zhí)行,返回結(jié)果瞻润。

success.png

到此我們已經(jīng)實(shí)現(xiàn)了如何編寫(xiě)代碼使得在函數(shù)計(jì)算下來(lái)接受參數(shù)值完成我們的業(yè)務(wù)喘垂。具體代碼見(jiàn)GitHub,target下的jar包可以直接上傳到函數(shù)計(jì)算中進(jìn)行PojoRequestHandler的測(cè)試绍撞。

轉(zhuǎn)載請(qǐng)注明出處正勒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市傻铣,隨后出現(xiàn)的幾起案子章贞,更是在濱河造成了極大的恐慌,老刑警劉巖非洲,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸭限,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡两踏,警方通過(guò)查閱死者的電腦和手機(jī)里覆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缆瓣,“玉大人喧枷,你說(shuō)我怎么就攤上這事」耄” “怎么了隧甚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渡冻。 經(jīng)常有香客問(wèn)我戚扳,道長(zhǎng),這世上最難降的妖魔是什么族吻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任帽借,我火速辦了婚禮珠增,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砍艾。我一直安慰自己蒂教,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布脆荷。 她就那樣靜靜地躺著凝垛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜓谋。 梳的紋絲不亂的頭發(fā)上梦皮,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音桃焕,去河邊找鬼剑肯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛观堂,可吹牛的內(nèi)容都是我干的让网。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼型将,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了荐虐?” 一聲冷哼從身側(cè)響起七兜,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎福扬,沒(méi)想到半個(gè)月后腕铸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铛碑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年狠裹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汽烦。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涛菠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撇吞,到底是詐尸還是另有隱情俗冻,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布牍颈,位于F島的核電站迄薄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏煮岁。R本人自食惡果不足惜讥蔽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一涣易、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冶伞,春花似錦新症、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至金抡,卻和暖如春瀑焦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梗肝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工榛瓮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巫击。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓禀晓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坝锰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粹懒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)計(jì)算作為云計(jì)算中新一代的計(jì)算單元,有著不需要管理服務(wù)器設(shè)施和更精準(zhǔn)的計(jì)費(fèi)方式的優(yōu)勢(shì)顷级。它依托于云服務(wù)商的多種云資...
    FrancisW閱讀 1,346評(píng)論 0 2
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,526評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理凫乖,服務(wù)發(fā)現(xiàn),斷路器弓颈,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 不中央空調(diào) 只暖你 喜歡清風(fēng)喜歡烈酒喜歡你 會(huì)說(shuō)情話(huà) 會(huì)撩妹 有點(diǎn)精分 有點(diǎn)偏顏控 不喜歡揮之即去的人 如果你理解...
    顧蘇白_閱讀 239評(píng)論 12 8
  • 讀書(shū)是讓自己更加了解自己和外面的世界帽芽,讀書(shū)又有什么方法呢? 1.邊問(wèn)邊讀 問(wèn)自己有什么想知道或想解決的問(wèn)題翔冀,能提供...
    蕭雅琴子閱讀 276評(píng)論 0 0