作者:DecentAnt
首先要弄清楚,阿裡雲的函數計算項目和SpringBoot項目是兩個完全獨立的項目體系,阿裡雲函數計算項目的打包後的大小不能超過50M,而SpringBoot的項目大小無所謂。
-
SpringBoot項目
首先是SpringBoot項目,這個項目和一般的SpringBoot項目一樣,但是資料庫必須是阿裡雲可以連接配接到的資料庫,可以是阿裡雲内網資料庫(我沒試過),也可以是公網能夠通路的資料庫(我用的就是這種),項目配置和普通的SpringBoot項目一模一樣,不用什麼修改。
為了測試友善,我隻用了一個汽車品牌表來做了這個實驗,項目内容非常簡單,其中有兩個接口,一個是CarBrandAdd另一個是CarBrandList,請求方式是POST+Body(raw application/json),也就是直接用Body中的json字元串進行請求。
兩個Controller如下:
其中Service中的業務邏輯我就不貼出來了,就是最最簡單的添加和清單操作
application.properties中資料庫配置如下:
也就是最一般的資料庫配置罷了
之後就是用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打包,或者輸入:
mvn package
最後将這個war包上傳到阿裡雲的OSS上去
-
阿裡雲函數計算項目
這個項目是用來調用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一樣的打包插件即可
-
阿裡雲增加函數計算
建立一個函數計算服務:
建立完成服務後,建立一個函數
選擇java8,使用空白函數
觸發器配置中選擇HTTP觸發器,注意:HTTP觸發器隻能在建立函數時建立!建立完成函數後無法再建立了!!
我這裡使用POST請求
基礎管理配置中上傳函數計算打完了war包(不是SpringBoot的war包!!)
最關鍵的是環境配置,注意:一定要打開“是否配置函數初始化入口”
(其中馬賽克掉的是包名)
權限配置可以跳過,最後建立即可。
-
執行函數計算
填入相關請求路徑資訊,然後點選執行即可,注意類型不要選錯了
檢視資料庫是否添加成功:
測試清單接口:
注意:如果要換函數計算的war的話,需要選擇檔案後,點選儲存才行,否則無法生效。