天天看點

阿裡雲函數計算配合SpringBoot項目

作者:DecentAnt

首先要弄清楚,阿裡雲的函數計算項目和SpringBoot項目是兩個完全獨立的項目體系,阿裡雲函數計算項目的打包後的大小不能超過50M,而SpringBoot的項目大小無所謂。

  1. SpringBoot項目

    首先是SpringBoot項目,這個項目和一般的SpringBoot項目一樣,但是資料庫必須是阿裡雲可以連接配接到的資料庫,可以是阿裡雲内網資料庫(我沒試過),也可以是公網能夠通路的資料庫(我用的就是這種),項目配置和普通的SpringBoot項目一模一樣,不用什麼修改。

為了測試友善,我隻用了一個汽車品牌表來做了這個實驗,項目内容非常簡單,其中有兩個接口,一個是CarBrandAdd另一個是CarBrandList,請求方式是POST+Body(raw application/json),也就是直接用Body中的json字元串進行請求。

兩個Controller如下:

阿裡雲函數計算配合SpringBoot項目
阿裡雲函數計算配合SpringBoot項目

其中Service中的業務邏輯我就不貼出來了,就是最最簡單的添加和清單操作

application.properties中資料庫配置如下:

阿裡雲函數計算配合SpringBoot項目

也就是最一般的資料庫配置罷了

之後就是用Maven打包了,我這裡使用了idea的Maven打包方式,注意要打成war包:

war

我這裡采用了阿裡雲文檔中推薦的打包插件:(經過測試發現不用這種也是可以的,隻是這樣打包包的體積比較小罷了)

<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>           

然後就可以打包了,點選IDEA的Maven打包,或者輸入:

阿裡雲函數計算配合SpringBoot項目

mvn package

阿裡雲函數計算配合SpringBoot項目

最後将這個war包上傳到阿裡雲的OSS上去

  1. 阿裡雲函數計算項目

    這個項目是用來調用SpringBoot項目用的,其實相當于用戶端的作用

建立一個Maven項目,注意依賴關系:

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

然後建立HelloWeb類,實作FunctionInitializer, HttpRequestHandler接口,我這裡使用OSS的方式調用SpringBoot的war包,這裡隻要填寫正确就行。

其中最讓我糾結的就是userContextPath這個參數,結果發現這個參數填什麼都沒問題……根本不用管它。

public class HelloWeb implements FunctionInitializer, HttpRequestHandler {

private FcAppLoader fcAppLoader = new FcAppLoader();
private String ossEndPoint = "${YourEndPoint}";
private String bucket = "${YourBucket}";
private String key = "alifc.war";

//    private String userContextPath = "/2016-08-15/proxy/{YourServideName}/{YourFunctionName}";
private String userContextPath = "/2016-08-15/proxy/helloweb.LATEST/testweb3/carBrandList";

@Override
public void initialize(Context context) throws IOException {
    FunctionComputeLogger fcLogger = context.getLogger();
    fcAppLoader.setFCContext(context);
    fcLogger.info("Begin load code: "+key);
    // Load code from OSS
    fcAppLoader.loadCodeFromOSS(ossEndPoint, bucket, key);
    fcLogger.info("End load code");
    // Init webapp from code
    long timeBegin = System.currentTimeMillis();
    fcLogger.info("Begin load webapp");
    fcAppLoader.initApp(userContextPath, HelloWeb.class.getClassLoader());
    fcLogger.info("End load webapp, elapsed: " + (System.currentTimeMillis() - timeBegin) + "ms");
}

@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response, Context context)
        throws IOException, ServletException {
    try {
        fcAppLoader.forward(request, response);
        String requestPath = (String) request.getAttribute("FC_REQUEST_PATH");
        String requestURI = (String) request.getAttribute("FC_REQUEST_URI");
        String requestClientIP = (String) request.getAttribute("FC_REQUEST_CLIENT_IP");

        FunctionComputeLogger logger = context.getLogger();
        logger.info("requestPath is "+requestPath);
        logger.info("requestURI is "+requestURI);
        logger.info("requestClientIP is "+requestClientIP);

        String body = String.format("Path: %s\n Uri: %s\n IP: %s\n", requestPath, requestURI, requestClientIP);
        OutputStream out = response.getOutputStream();
        out.write((body).getBytes());
        out.flush();
        out.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}           

}

這個項目已經建立完成了。

然後同樣的使用Maven進行打包,打包插件使用和SpringBoot一樣的打包插件即可

阿裡雲函數計算配合SpringBoot項目
  1. 阿裡雲增加函數計算

    建立一個函數計算服務:

阿裡雲函數計算配合SpringBoot項目

建立完成服務後,建立一個函數

選擇java8,使用空白函數

阿裡雲函數計算配合SpringBoot項目

觸發器配置中選擇HTTP觸發器,注意:HTTP觸發器隻能在建立函數時建立!建立完成函數後無法再建立了!!

我這裡使用POST請求

阿裡雲函數計算配合SpringBoot項目

基礎管理配置中上傳函數計算打完了war包(不是SpringBoot的war包!!)

最關鍵的是環境配置,注意:一定要打開“是否配置函數初始化入口”

阿裡雲函數計算配合SpringBoot項目
阿裡雲函數計算配合SpringBoot項目
阿裡雲函數計算配合SpringBoot項目

(其中馬賽克掉的是包名)

權限配置可以跳過,最後建立即可。

  1. 執行函數計算

    填入相關請求路徑資訊,然後點選執行即可,注意類型不要選錯了

阿裡雲函數計算配合SpringBoot項目

檢視資料庫是否添加成功:

阿裡雲函數計算配合SpringBoot項目

測試清單接口:

阿裡雲函數計算配合SpringBoot項目

注意:如果要換函數計算的war的話,需要選擇檔案後,點選儲存才行,否則無法生效。