天天看點

利用Docker輕松實作雲原生應用: Spring Boot + Redis分布式會話

利用Docker輕松實作雲原生應用: Spring Boot + Redis分布式會話

本文為利用docker和容器服務輕松實作雲原生應用系列的第二篇

<a href="https://yq.aliyun.com/articles/62893">高可用架構設計</a>

spring boot + redis分布式會話 (本文)

前文談到了雲原生應用在部署架構中需要考慮的重要問題。文本将介紹一個常見的應用架構模式來提升應用的可用性和可伸縮性 - 分布式會話管理。

随着業務增長,web應用也從單節點部署演變為叢集部署。這時候除了需要為應用伺服器增加負載均衡之外,也要解決會話(session)管理的問題。session在應用中常被用于存儲使用者相關的資料。在高可用系統中,如果一台應用服務當機,其他伺服器需要能夠接管目前活躍的會話,繼續為使用者提供服務。是以我們必須提供分布式的會話管理能力。

spring/spring boot應用中利用spring session配合redis是一個流行的分布式的會話管理方案,它有如下幾個優點:

将session所持久化狀态從應用伺服器本地記憶體解除安裝到外部redis服務中,可以提升應用的可用性

應用伺服器是無狀态的,滿足 12-factor 的要求,可以更好地支援應用水準擴充

首先從github獲得示例代碼

其中 <code>/src/main/resources/application.properties</code> 内容:

它會配置基于redis的分布式會話存儲支援,會話逾時時間為“5”秒,redis服務域名為“redis”,端口 “6379”。

我們再檢視項目的maven配置檔案<code>pom.xml</code>

我們可以來用maven指令來建構spring boot示例應用(參數是為了跳過單元測試)

也可以利用maven指令建構示例應用的docker鏡像

建構鏡像完成,可以使用如下<code>docker-compose.yml</code>模闆來在本地部署和測試應用。其中<code>web</code>服務會啟動spring boot測試應用,并利用容器連結通過“redis”别名來通路<code>redis</code>服務中的redis容器

執行 <code>docker-compose up</code> 指令之後,我們就會看到“redis”容器和“web”應用容器相繼啟動

我們可以通過浏覽器來通路<code>http://localhost:8080/</code>測試應用。如果會話不存在或會話逾時(5秒鐘),應用會生成一個uuid儲存在會話中并傳回;如果會話存在,則會直接傳回會話中儲存的uuid。

阿裡雲容器服務提供了對分布式的docker應用的部署和管理能力。我們可以簡單地擴充之前的docker compose模闆來在雲端部署應用。

注:

通過<code>aliyun.xxx</code>标簽聲明了,web應用由3個容器組成應用叢集,并可以通過虛拟域名“spring-boot”進行通路

通過路由服務來通路應用是無需使用 <code>ports</code> 對容器端口進行主控端端口映射的

部署之後,web服務在控制台的截圖如下,可以直接點選通路端點來驗證應用。

利用Docker輕松實作雲原生應用: Spring Boot + Redis分布式會話

在雲原生應用中,分布式會話管理是一個重要的應用模式。本文利用docker和阿裡雲容器服務在本地和雲端進行了示例應用的部署和驗證。

繼續閱讀