您好,登錄后才能下訂單哦!
本篇文章為大家展示了Springboot中如何進行Serverless的訂單應用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
這是一個 JAVA 開發的訂單后臺應用(沒錯!就是那個讓無數大學生痛不欲生的訂單后臺系統),結合 Serverless 這一無服務器思想,嘗試通過云函數 + API 網關 + 云數據庫的組合來部署 Springboot 的成功之作。
本文作者:Freeeeeedom
該應用提供了完整的用戶登錄驗證、接口數據驗證、訂單流 (CRUD) 等強大的功能,而且在本地開發調試時也能模擬 API 網關調用云函數(本地 Java 開發云端部署不是問題),還兼容了云消息隊列 CMQ 的調用,以便后續開發引入云中間件。
同時,這種部署方式也能讓其他的 Springboot 很快地轉換為云函數部署。
為響應國家「十四五計劃」的環保計劃,特地的研究了一下傳說中的 Serverless 方案(省服務器 ????),于是便有了這次嘗試。
JAVA 天下第一**,當然 c/c++/c#/node/python/go/php/vb 這些也不錯
JAVA 的單體應用還能選什么呢?只能是 Springboot 啊
注冊個騰訊云賬號
開通以下產品權限(云函數、API 網關、對象存儲)
財力允許的話還可以購買數據庫服務(因為年少輕狂打折時我購買了這倆很長很長時間)
訂單應用來說的話,必然是提供 restful 的接口,所以在統一 VPC 內采用了云函數 + API 網關的模式提供接口,于是就有了以下方案:
應用主體部署在云函數
使用 API 網關作為函數入口
頁面則是使用了對象存儲部署
數據庫方面則使用了同一 vpc 下的云數據庫(財力有限只嘗試了 mysql、redis,理論上其他應該都可行)
要讓 JAVA 工程部署到云函數上,首先了解什么是云函數(以下摘自微信開放文檔)
云函數即在云端(服務器端)運行的函數。在物理設計上,一個云函數可由多個文件組成,占用一定量的 CPU 內存等計算資源;各云函數完全獨立;可分別部署在不同的地區。開發者無需購買、搭建服務器,只需編寫函數代碼并部署到云端即可在小程序端調用,同時云函數之間也可互相調用。
云函數其實就是將業務拆分成函數粒度部署在云上,那么就寫了個簡單的 demo 部署到云函數上,并且配上了 API 網關嘗試調用。
/** * 純javascf快速開發部署(不走springboot) * * @author Freeeeeedom * @date 2020/10/24 10:31 */ public class Scf { /** * log Object */ private static Logger log = LoggerFactory.getLogger(Scf.class); private static DruidDataSource dataSource1 = new DruidDataSource(); static { //此處加載或修改數據源 多數據源配置多個 dataSource1.setUsername("Freeeeeedom"); dataSource1.setUrl("jdbc:mysql://Freeeeeedom?autoReconnectForPools=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"); dataSource1.setPassword("Freeeeeedom"); dataSource1.setMinIdle(1); dataSource1.setMaxActive(5); dataSource1.setMaxWait(10000); dataSource1.setValidationQuery("SELECT 1 from dual"); log.info("數據源加載ok~"); } /** * 純scf入口參數 * * @param insertParam 入參 * @return java.lang.Object 執行結果 * @author Freeeeeedom * @date 2020/10/24 10:31 */ public Object pure(Map<String, Object> insertParam) { log.info("param:{}", gson.toJson(insertParam); Gson gson = new GsonBuilder().disableHtmlEscaping().create(); try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { log.error("內部處理異常", e); } Map response = new HashMap(); JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource1); Map order = jdbcTemplate.queryForMap("select order_id,create_time from `order` limit 1"); log.info(order.toString()); return buildResponse(gson, gson.toJson(order), response); } private Object buildResponse(Gson gson, String json, Map response) { Map<String, String> headers = new HashMap(1); headers.put("Content-Type", "application/json"); response.put("statusCode", HttpStatus.OK.value()); response.put("headers", headers); response.put("body", json); return gson.toJson(response); } }
只需要打包好代碼,然后將入口函數設置為 scf.Scf::pure
就實現了接收數據,然后從數據庫查詢了第一個訂單的 id 和創建時間并且返回的能力:
每一次通過 API 網關觸發云函數都會觸發 pure 這個方法(調用者 > 調用 API 網關 > 云函數 --> pure),但經測試發現 static 的數據源初始化并不會被重復加載,這也奠定了 springboot 可部署基礎。
其中通過 log 打印 API 網關帶來的參數,直接將其復制為 json,然后通過 main 函數模擬調用,這樣就實現了本地模擬 serverless 部署后的調用。
log.info("param:{}", gson.toJson(insertParam);
有了這些基礎,那么只需要有一個入口類模擬 springboot 啟動的加載,然后再映射一下 API 網關過來入口參數,即可實現 springboot 在云函數上部署(其實就是上面 SCF 類的超級 plus 版本)。
** API 網關配置**
這里的路徑參數對應 springboot 里的 mapping 路徑
有了上面那些 demo 后,可得知我們模擬云端部署運行已經不是問題。那么怎么在本地調試呢?答案很簡單,直接啟動 springboot 然后調正常就完事了。
沒錯,就是直接用原生的 springboot 玩法即可。把 springboot 部署到云函數其實就是外掛了一個 springboot 的啟動類(設計模式上叫適配器模式?(+_+)?
完整的 springboot,能用 springboot 做的都能實現,我只是編寫了一些小功能驗證這個應用。
[x] 與本地服務器數據庫連接
[x] 云數據庫連接
[x] vpc數據庫連接
[x] 外部接口調用(發短信驗證碼)
[x] 實現簡單的訂單流 (crud)
[x] 實現簡單的登錄能力
[x] 實現簡單的數據驗證能力
整個項目功能簡單但代碼卻不少。
首先 "serverless"、"騰訊"、"云服務" 這幾個詞就足以代表安全了,但為了功能完整性我還是嘗試加了點東西。
在這個系統中,我選擇了 header 中加簽名的方式驗證數據,原因是啥,操作簡單,有效唄。加密手段和方案暫且不說,就從流程上來看,是很方便的:
從 API 網關調用參數中獲取到 header,body
驗證數據有效性
請求轉入業務模塊
驗證數據有效性
參數進入功能模塊
驗證數據有效性
………………
其實只有 123 步驟是最有效的,后面的 45678 如果你想的話……更不用說 API 網關本身提供的鑒權功能了。
內存的話對于訂單系統來說單次請求加上 JVM 也才 300mb,而云函數單個函數執行內存能拉到 3GB,哪怕有點量的分布式計算應該問題也不大。
并發的話云函數上的預置并發上限 200 個,訂單系統嘛,QPS1000?10000?100000? ezpz了,再怎么也比自家機柜服務器強幾百幾千個量級了。
內存算力不夠服務器擴容?不存在的。
生成個 VUE 項目,改改鏈接調調頁面,然后上傳到存儲桶上,一鍵打開 CDN ~( ̄▽ ̄)~*完美!
察覺到了到了科技的進步,時代的發展,Serverless 的強大。
上述內容就是Springboot中如何進行Serverless的訂單應用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。