自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring Boot與Docker:解鎖高效部署新姿勢

云計(jì)算 云原生
我們已經(jīng)成功地將 Spring Boot 項(xiàng)目實(shí)現(xiàn)了 Docker 容器化部署。從前期的開發(fā)環(huán)境搭建,到編寫 Dockerfile 構(gòu)建鏡像,再到運(yùn)行容器,每一步都緊密相連,共同打造出一個(gè)高效、可靠的部署方案。

一、Spring Boot 與 Docker,為何 “鎖死”?

圖片圖片

在當(dāng)今的軟件開發(fā)領(lǐng)域,Spring Boot 和 Docker 無疑是兩顆璀璨的明星,各自閃耀著獨(dú)特的光芒。但你是否想過,為什么越來越多的開發(fā)者選擇將它們 “捆綁” 在一起,讓 Spring Boot 項(xiàng)目實(shí)現(xiàn) Docker 容器化部署呢???

先來說說 Spring Boot,它就像是一個(gè)貼心的助手,基于 Spring 框架,為開發(fā)者帶來了一系列令人心動的特性。它采用 “約定優(yōu)于配置” 的原則,就像給你規(guī)劃好了一條清晰的道路,讓你無需在繁瑣的配置中迷失方向。比如,以往在搭建一個(gè) Spring 項(xiàng)目時(shí),可能需要花費(fèi)大量時(shí)間去配置各種 XML 文件,而有了 Spring Boot,許多配置都能自動完成,大大減少了開發(fā)的工作量,讓開發(fā)效率直線上升??。而且,它內(nèi)置了 Tomcat、Jetty 等 Web 服務(wù)器,使得應(yīng)用可以獨(dú)立運(yùn)行,直接通過命令行或 Java Main 方法就能啟動,方便快捷。

再看看 Docker,它則是一個(gè)神奇的 “搬運(yùn)工”,能夠?qū)?yīng)用程序及其依賴項(xiàng)打包成一個(gè)獨(dú)立的容器。這個(gè)容器就像是一個(gè)密封的盒子,里面裝著應(yīng)用運(yùn)行所需的一切,包括操作系統(tǒng)、庫、代碼等。無論在開發(fā)環(huán)境、測試環(huán)境還是生產(chǎn)環(huán)境,只要有 Docker 的支持,這個(gè)容器都能以相同的方式運(yùn)行,完美地解決了 “在我機(jī)器上運(yùn)行正常,到了其他環(huán)境就出問題” 的尷尬情況,確保了應(yīng)用部署的一致性和可靠性??。

當(dāng) Spring Boot 遇上 Docker,就像是找到了最佳拍檔。Spring Boot 簡化了應(yīng)用的開發(fā)過程,讓開發(fā)者專注于業(yè)務(wù)邏輯;而 Docker 則解決了應(yīng)用部署的難題,實(shí)現(xiàn)了快速、高效的部署。兩者結(jié)合,不僅能提高開發(fā)效率,還能降低運(yùn)維成本,為開發(fā)者帶來前所未有的開發(fā)體驗(yàn)。在接下來的內(nèi)容中,我將詳細(xì)介紹如何一步步將 Spring Boot 項(xiàng)目實(shí)現(xiàn) Docker 容器化部署,讓你親身體驗(yàn)這對黃金組合的魅力??。

二、前期準(zhǔn)備:搭建 “戰(zhàn)場”

圖片圖片

(一)開發(fā)環(huán)境 “大檢查”

在開始我們的容器化之旅前,先確保開發(fā)環(huán)境已經(jīng) “武裝” 到位??。我們需要安裝以下工具:

  • Java 環(huán)境:Spring Boot 項(xiàng)目基于 Java 開發(fā),所以需要安裝 Java Development Kit(JDK)。強(qiáng)烈推薦安裝 JDK 1.8 及以上版本,以享受更多新特性和性能優(yōu)化。安裝教程可以參考這篇文章,按照步驟一步步來,輕松搞定 Java 環(huán)境配置。
  • Maven:它是項(xiàng)目管理和構(gòu)建工具,能幫我們管理項(xiàng)目依賴、構(gòu)建項(xiàng)目等。Maven 3.3+ 要求 JDK 1.7 及以上,可從Maven 官網(wǎng)下載安裝包。詳細(xì)安裝步驟可查看史上最詳細(xì)的 Maven 安裝教程,還能了解如何配置阿里云鏡像加速下載依賴,讓構(gòu)建速度飛起??。
  • Docker:作為容器化的核心工具,必不可少。Docker 支持多種操作系統(tǒng),在 Linux 上安裝,可參考菜鳥教程的 CentOS Docker 安裝教程 ;Windows 和 Mac 系統(tǒng)也有對應(yīng)的安裝方法,根據(jù)系統(tǒng)版本在Docker 官網(wǎng)下載安裝包,按提示安裝即可。安裝完成后,還能配置阿里云鏡像加速,解決拉取鏡像緩慢的問題。

(二)Spring Boot 項(xiàng)目 “初登場”

環(huán)境準(zhǔn)備就緒,接下來創(chuàng)建一個(gè) Spring Boot 項(xiàng)目??。我們可以使用 Spring Initializr 快速創(chuàng)建項(xiàng)目,它就像一個(gè)魔法工廠,能根據(jù)我們的需求生成項(xiàng)目骨架。

  1. 訪問 Spring Initializr:打開瀏覽器,輸入https://start.spring.io/ ,進(jìn)入 Spring Initializr 頁面。如果這個(gè)地址無法訪問,也可以使用阿里云提供的地址https://start.aliyun.com/ 。
  2. 配置項(xiàng)目信息:在頁面上,進(jìn)行如下配置:
  • Project:選擇項(xiàng)目構(gòu)建工具,這里選 Maven Project。
  • Language:選擇 Java 作為編程語言。
  • Spring Boot:選擇合適的 Spring Boot 版本,建議選最新穩(wěn)定版,能體驗(yàn)新功能和修復(fù)的漏洞。
  • Project Metadata:填寫項(xiàng)目元數(shù)據(jù),Group 一般是公司或組織域名反轉(zhuǎn),如 com.example;Artifact 是項(xiàng)目名稱,如 my - spring - boot - app;Name 可與 Artifact 相同;Description 填寫項(xiàng)目描述;Package name 會根據(jù) Group 和 Artifact 自動生成,也可自行修改。
  • Packaging:選 Jar,Spring Boot 項(xiàng)目默認(rèn)打包成 Jar 文件,方便運(yùn)行和部署。
  • Java:選擇 Java 版本,要與安裝的 JDK 版本一致。
  1. 選擇依賴:點(diǎn)擊 “Add Dependencies”,添加項(xiàng)目所需依賴。如果是 Web 項(xiàng)目,添加 Spring Web 依賴,用于構(gòu)建 Web 應(yīng)用;若要操作數(shù)據(jù)庫,添加 Spring Data JPA 或?qū)?yīng)數(shù)據(jù)庫驅(qū)動依賴。比如構(gòu)建簡單 Web 應(yīng)用,添加 Spring Web 和 Spring Boot DevTools(開發(fā)時(shí)的便利工具,如自動重啟和調(diào)試功能)依賴即可。
  2. 生成項(xiàng)目:配置完成,點(diǎn)擊頁面底部 “Generate” 按鈕,Spring Initializr 會生成一個(gè) ZIP 文件,包含預(yù)配置好的 Spring Boot 項(xiàng)目。
  3. 解壓并導(dǎo)入項(xiàng)目:下載 ZIP 文件,解壓到工作目錄,然后導(dǎo)入到 IDE 中。以 IntelliJ IDEA 為例,點(diǎn)擊 “File” -> “Open”,選擇解壓后的項(xiàng)目目錄,點(diǎn)擊 “OK”,IDEA 會自動檢測到這是一個(gè) Maven 項(xiàng)目,并提示導(dǎo)入 Maven 項(xiàng)目配置,點(diǎn)擊 “Auto Import” 或 “Import Maven Projects” 即可。

創(chuàng)建好的項(xiàng)目中,pom.xml文件是關(guān)鍵,它管理項(xiàng)目依賴和構(gòu)建信息。以下是關(guān)鍵依賴配置示例:

<dependencies><!-- Spring Boot核心依賴,包含自動配置支持、日志和YAML --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- 對全棧Web開發(fā)的支持,包括Tomcat和spring-webmvc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 開發(fā)時(shí)的便利工具,如自動重啟和調(diào)試功能 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!-- 測試依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

這樣,一個(gè)基礎(chǔ)的 Spring Boot 項(xiàng)目就創(chuàng)建完成啦??!接下來,就可以對它進(jìn)行 Docker 容器化部署了。

三、核心步驟:Docker 容器化部署 “全攻略”

圖片圖片

(一)編寫 Dockerfile,打造 “魔法配方”

Dockerfile 是構(gòu)建 Docker 鏡像的關(guān)鍵,它就像是一份詳細(xì)的 “魔法配方”,指導(dǎo) Docker 如何構(gòu)建包含 Spring Boot 應(yīng)用的鏡像。下面我們來深入剖析 Dockerfile 中的常見指令,并展示一個(gè)簡單的編寫示例。

  • FROM:指定基礎(chǔ)鏡像,這是 Dockerfile 的第一行,必須首先指定。例如FROM openjdk:11-jre-slim,表示基于 OpenJDK 11 的運(yùn)行時(shí)環(huán)境且使用精簡版的基礎(chǔ)鏡像,這樣可以減少鏡像體積,提高構(gòu)建和部署效率。
  • MAINTAINER(已逐漸廢棄,可用 LABEL 替代):用于聲明鏡像的維護(hù)者信息,比如LABEL maintainer="yourname@example.com" ,方便后續(xù)維護(hù)和溝通。
  • COPY:將本地文件或目錄復(fù)制到鏡像中。如COPY target/my - spring - boot - app.jar /app.jar,它會把項(xiàng)目打包生成的my - spring - boot - app.jar文件復(fù)制到鏡像中的/app.jar位置。
  • WORKDIR:設(shè)置工作目錄,后續(xù)指令都將在這個(gè)目錄下執(zhí)行。例如WORKDIR /app,則后續(xù)的操作都在/app目錄中進(jìn)行,如果該目錄不存在,Docker 會自動創(chuàng)建。
  • EXPOSE:聲明容器運(yùn)行時(shí)要監(jiān)聽的端口,比如EXPOSE 8080,表示容器內(nèi)部應(yīng)用監(jiān)聽 8080 端口,這主要用于文檔說明和與docker run時(shí)的端口映射配合。
  • CMD:指定容器啟動時(shí)要執(zhí)行的命令,通常作為 Dockerfile 的最后一行。對于 Spring Boot 應(yīng)用,一般是CMD ["java", "-jar", "/app.jar"] ,表示使用 Java 命令運(yùn)行/app.jar文件。

下面是一個(gè)完整的 Spring Boot 項(xiàng)目的 Dockerfile 示例:

# 使用OpenJDK 11運(yùn)行時(shí)環(huán)境的基礎(chǔ)鏡像FROM openjdk:11-jre-slim# 聲明維護(hù)者信息LABEL maintainer="yourname@example.com"# 設(shè)置工作目錄WORKDIR /app# 將項(xiàng)目打包生成的jar文件復(fù)制到鏡像中COPY target/my - spring - boot - app.jar /app.jar# 聲明容器監(jiān)聽的端口EXPOSE 8080# 容器啟動時(shí)執(zhí)行的命令,運(yùn)行Spring Boot應(yīng)用CMD ["java", "-jar", "/app.jar"]

通過這個(gè) Dockerfile,我們就為構(gòu)建 Spring Boot 應(yīng)用的鏡像制定好了 “魔法配方”。

(二)構(gòu)建 Docker 鏡像,“鑄造” 應(yīng)用容器

編寫好 Dockerfile 后,就可以使用docker build命令來構(gòu)建 Docker 鏡像了,這個(gè)過程就像是 “鑄造” 應(yīng)用容器。

在命令行中,切換到包含 Dockerfile 的目錄,然后執(zhí)行以下命令:

docker build -t my - spring - boot - app:1.0.0.

這里的-t參數(shù)用于指定鏡像的標(biāo)簽(tag),格式為鏡像名:版本號,my - spring - boot - app是我們給鏡像取的名字,1.0.0是版本號,你可以根據(jù)實(shí)際情況修改。最后的.表示當(dāng)前目錄,它指定了構(gòu)建上下文(build context),即 Docker 在構(gòu)建鏡像時(shí)會讀取當(dāng)前目錄下的文件,包括 Dockerfile 以及需要復(fù)制到鏡像中的文件。

執(zhí)行docker build命令后,Docker 會讀取 Dockerfile 中的指令,逐步構(gòu)建鏡像。這個(gè)過程中,你會看到一系列的輸出信息,顯示每一步的執(zhí)行情況,比如安裝依賴、復(fù)制文件等。如果構(gòu)建過程中出現(xiàn)錯誤,需要仔細(xì)查看錯誤信息,檢查 Dockerfile 的語法和相關(guān)配置是否正確。

構(gòu)建完成后,可以使用docker images命令查看本地已構(gòu)建的鏡像列表:

docker images

輸出結(jié)果類似如下:

REPOSITORY          TAG       IMAGE ID       CREATED         SIZEmy - spring - boot - app  1.0.0    1234567890ab  5 minutes ago   200MB

可以看到,我們剛剛構(gòu)建的my - spring - boot - app:1.0.0鏡像已經(jīng)在列表中,IMAGE ID 是鏡像的唯一標(biāo)識,CREATED 顯示了鏡像的創(chuàng)建時(shí)間,SIZE 則表示鏡像的大小。

(三)運(yùn)行 Docker 容器,讓應(yīng)用 “跑起來”

有了構(gòu)建好的 Docker 鏡像,接下來就可以使用docker run命令來運(yùn)行容器,讓 Spring Boot 應(yīng)用真正 “跑起來”。

運(yùn)行容器的基本命令如下:

docker run -d -p 8080:8080 --name my - spring - boot - app - container my - spring - boot - app:1.0.0

這里的參數(shù)含義如下:

  • -d:表示以守護(hù)進(jìn)程(detached)模式運(yùn)行容器,即容器在后臺運(yùn)行,不會占用當(dāng)前命令行終端。
  • -p 8080:8080:進(jìn)行端口映射,將宿主機(jī)的 8080 端口映射到容器的 8080 端口。這樣,我們就可以通過訪問宿主機(jī)的 8080 端口來訪問容器內(nèi)部運(yùn)行的 Spring Boot 應(yīng)用。如果宿主機(jī)的 8080 端口已被占用,可以將其替換為其他未使用的端口,如-p 8081:8080,表示將宿主機(jī)的 8081 端口映射到容器的 8080 端口。
  • --name my - spring - boot - app - container:為容器指定一個(gè)名稱,這里是my - spring - boot - app - container,方便后續(xù)對容器進(jìn)行管理和操作。
  • my - spring - boot - app:1.0.0:指定要運(yùn)行的鏡像及標(biāo)簽。

執(zhí)行上述命令后,容器就會啟動并運(yùn)行 Spring Boot 應(yīng)用。你可以通過瀏覽器訪問http://localhost:8080(如果端口映射有變化,需相應(yīng)修改端口號),如果一切正常,就可以看到 Spring Boot 應(yīng)用的界面啦??。

如果想要查看容器的運(yùn)行狀態(tài),可以使用docker ps命令:

docker ps

輸出結(jié)果類似如下:

CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                    NAMES1234567890ab   my - spring - boot - app:1.0.0   "java -jar /app.jar"   1 minute ago   Up 1 minute   0.0.0.0:8080->8080/tcp   my - spring - boot - app - container

其中,CONTAINER ID是容器的唯一標(biāo)識,IMAGE顯示了容器使用的鏡像,COMMAND是容器啟動時(shí)執(zhí)行的命令,CREATED和STATUS分別表示容器的創(chuàng)建時(shí)間和當(dāng)前狀態(tài),PORTS展示了端口映射情況,NAMES是容器的名稱。

到這里,我們就成功地將 Spring Boot 項(xiàng)目實(shí)現(xiàn)了 Docker 容器化部署,是不是很有成就感???

四、實(shí)戰(zhàn)演練:問題 “大破解”

圖片圖片

(一)常見問題 “狙擊戰(zhàn)”

在將 Spring Boot 項(xiàng)目進(jìn)行 Docker 容器化部署的過程中,難免會遇到各種問題,就像游戲中的小怪獸,需要我們一一 “狙擊”。下面來看看一些常見問題及解決方法。

構(gòu)建鏡像時(shí)依賴缺失:在構(gòu)建鏡像過程中,可能會遇到依賴缺失的問題,導(dǎo)致構(gòu)建失敗。比如在執(zhí)行mvn package命令時(shí),出現(xiàn)找不到某個(gè)依賴包的錯誤。這可能是因?yàn)榫W(wǎng)絡(luò)問題導(dǎo)致依賴下載失敗,或者pom.xml中依賴配置有誤。解決方法是先檢查網(wǎng)絡(luò)連接,確保能正常訪問 Maven 倉庫;然后仔細(xì)檢查pom.xml中的依賴配置,確保依賴的坐標(biāo)(groupId、artifactId、version)正確無誤。如果是因?yàn)榫W(wǎng)絡(luò)不穩(wěn)定,可以配置阿里云鏡像加速,在settings.xml文件中添加如下配置:

<mirrors><mirror><id>aliyunmaven</id><mirrorOf>central</mirrorOf><name>阿里云公共倉庫</name><url>https://maven.aliyun.com/repository/central</url></mirror></mirrors>

配置完成后,重新構(gòu)建鏡像即可。

運(yùn)行容器時(shí)端口沖突:當(dāng)使用docker run命令運(yùn)行容器時(shí),如果出現(xiàn)端口沖突,會導(dǎo)致容器無法正常啟動。比如報(bào)錯信息中提示 “Address already in use”,這表明指定映射的宿主機(jī)端口已被其他進(jìn)程占用。解決辦法是使用netstat命令查找占用該端口的進(jìn)程,然后停止該進(jìn)程或者修改容器的端口映射。例如,在 Linux 系統(tǒng)中,可以使用以下命令查找占用 8080 端口的進(jìn)程:

netstat -tlnp | grep 8080

如果查找到占用進(jìn)程的 PID,使用kill命令停止該進(jìn)程:

kill -9 [PID]

然后重新啟動容器。如果不想停止占用進(jìn)程,也可以修改容器的端口映射,如將-p 8080:8080改為-p 8081:8080 ,將容器的 8080 端口映射到宿主機(jī)的 8081 端口。

(二)優(yōu)化技巧 “大放送”

優(yōu)化在容器化部署中也非常重要,它能讓我們的應(yīng)用跑得更快、更穩(wěn)。下面為大家分享一些實(shí)用的優(yōu)化技巧。

優(yōu)化鏡像大小:較小的鏡像可以減少部署時(shí)間和存儲空間占用。使用多階段構(gòu)建是一個(gè)很好的方法,它可以將構(gòu)建過程分為多個(gè)階段,每個(gè)階段使用不同的基礎(chǔ)鏡像和構(gòu)建工具。例如:

# 第一階段:使用Maven構(gòu)建應(yīng)用程序FROM maven:3.6.3-jdk-11 AS buildWORKDIR /appCOPY pom.xml.RUN mvn dependency:resolveCOPY src./srcRUN mvn package -DskipTests# 第二階段:使用OpenJDK構(gòu)建最終鏡像FROM adoptopenjdk:11-jre-hotspotWORKDIR /appCOPY --from=build /app/target/myapp.jar.EXPOSE 8080CMD ["java", "-jar", "myapp.jar"]

在這個(gè)示例中,第一階段使用 Maven 鏡像構(gòu)建應(yīng)用程序,生成可執(zhí)行的 JAR 文件;第二階段使用 OpenJDK 運(yùn)行時(shí)鏡像,將第一階段生成的 JAR 文件復(fù)制過來,這樣最終的鏡像就只包含運(yùn)行時(shí)所需的內(nèi)容,大大減小了鏡像體積。另外,選擇輕量級的基礎(chǔ)鏡像,如 Alpine Linux,也能有效減小鏡像大小。因?yàn)?Alpine Linux 是一個(gè)非常小的 Linux 發(fā)行版,基于它構(gòu)建的鏡像體積會小很多。

設(shè)置資源限制:為容器設(shè)置合理的資源限制,可以避免資源浪費(fèi),提高資源利用率,同時(shí)也能防止某個(gè)容器占用過多資源影響其他容器或系統(tǒng)的正常運(yùn)行。在運(yùn)行容器時(shí),可以使用--memory和--cpus參數(shù)來限制容器的內(nèi)存和 CPU 使用。例如,限制容器的內(nèi)存為 512MB,CPU 為 1 核:

docker run -d -p 8080:8080 --memory=512m --cpus=1 --name my - spring - boot - app - container my - spring - boot - app:1.0.0

如果使用docker-compose來管理容器,也可以在docker-compose.yml文件中進(jìn)行資源限制配置:

version: '3'services:my - spring - boot - app:image: my - spring - boot - app:1.0.0ports:- "8080:8080"deploy:resources:limits:memory: 512Mcpus: '1'

通過設(shè)置資源限制,能確保容器在有限的資源下穩(wěn)定運(yùn)行,提高整個(gè)系統(tǒng)的性能和穩(wěn)定性。

五、總結(jié)與展望:未來可期

圖片圖片

通過前面的步驟,我們已經(jīng)成功地將 Spring Boot 項(xiàng)目實(shí)現(xiàn)了 Docker 容器化部署。從前期的開發(fā)環(huán)境搭建,到編寫 Dockerfile 構(gòu)建鏡像,再到運(yùn)行容器,每一步都緊密相連,共同打造出一個(gè)高效、可靠的部署方案。

Spring Boot 項(xiàng)目 Docker 容器化部署帶來的優(yōu)勢顯而易見。它不僅實(shí)現(xiàn)了環(huán)境的一致性,讓應(yīng)用在開發(fā)、測試和生產(chǎn)環(huán)境中都能穩(wěn)定運(yùn)行,就像一個(gè)萬能鑰匙,無論插入哪個(gè)鎖孔都能順利打開;還大大提高了部署的效率,快速的鏡像構(gòu)建和容器啟動,讓應(yīng)用能夠迅速上線,就像一輛高性能的跑車,隨時(shí)準(zhǔn)備飛馳而出;而且,容器化的方式使得應(yīng)用的可移植性更強(qiáng),無論是在本地開發(fā),還是在云端部署,都能輕松應(yīng)對,仿佛擁有了一個(gè)神奇的傳送門,可以瞬間到達(dá)任何地方。

對于想要深入學(xué)習(xí)和實(shí)踐的讀者,我鼓勵大家親自上手,嘗試將自己的 Spring Boot 項(xiàng)目進(jìn)行容器化部署。在實(shí)踐過程中,你可能會遇到各種問題,但不要害怕,每一次解決問題都是一次成長的機(jī)會。就像玩游戲打怪升級一樣,每戰(zhàn)勝一個(gè)困難,你的技能就會提升一分。

同時(shí),隨著容器技術(shù)的不斷發(fā)展,容器編排工具也應(yīng)運(yùn)而生,如 Kubernetes。它就像是一個(gè)智能的指揮官,能夠?qū)Χ鄠€(gè)容器進(jìn)行高效的管理和調(diào)度。當(dāng)應(yīng)用需要擴(kuò)展時(shí),Kubernetes 可以自動增加容器的數(shù)量;當(dāng)某個(gè)容器出現(xiàn)故障時(shí),它又能迅速進(jìn)行修復(fù)或替換,確保應(yīng)用的高可用性。未來,我們可以進(jìn)一步探索 Kubernetes 在 Spring Boot 項(xiàng)目容器化部署中的應(yīng)用,實(shí)現(xiàn)更強(qiáng)大的自動化部署和管理。

相信通過不斷地學(xué)習(xí)和實(shí)踐,你一定能夠掌握 Spring Boot 項(xiàng)目 Docker 容器化部署的精髓,為自己的開發(fā)工作帶來更多的便利和創(chuàng)新。讓我們一起在技術(shù)的海洋中繼續(xù)探索前行吧??!

責(zé)任編輯:武曉燕 來源: 程序員conan
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號