重構筆記系統:Docker Compose在微服務架構中的應用與優化

雖然我的筆記系統的開發是基于微服務的思想,但是在服務的配置和編排上感覺還是不太合理,具體來說,在開發上的配置和在生產上的配置差別太大。現在規模小,后面規模變大,估計這一塊會成為系統生長的瓶頸。

因此,我在周末重構了項目結構和docker-compose.yml,本文將分享我在這一過程中的經驗,并探討如何進一步優化基于Docker Compose的微服務架構。

# 所有數據放在data目錄下
version: '3'
networks:notes_network:services:  redis:image: redis:latestcontainer_name: redis-tokennetworks: - notes_networkvolumes:- ./data/redis:/opt/redis/data- ./redis/conf/redis.conf:/etc/redis/redis.confports:- 6379:6379auth2-db:image: postgres:latestcontainer_name: auth2-dbnetworks:- notes_networkvolumes:- ./db/auth2/init:/docker-entrypoint-initdb.d/- ./data/auth2-db:/var/lib/postgresql/dataports:- 5434:5432env_file:- .envnotes-db:image: postgres:latestcontainer_name: notes-dbnetworks:- notes_networkvolumes:- ./db/notes/init:/docker-entrypoint-initdb.d/- ./data/notes-db:/var/lib/postgresql/dataports:- 5433:5432env_file:- .envapi-gate:image: rust:latestcontainer_name: api-gatenetworks:- notes_networkworking_dir: /appvolumes:- ./src/api-gate/app:/appcommand: ["./test.sh"]ports:- 8000:8000auth2:image: rust:latestcontainer_name: auth2working_dir: /appnetworks:- notes_networkports:- 8002:8002volumes:- ./src/auth2/app:/appcommand: ["./test.sh"]notes-api:image: rust:latestcontainer_name: note_book_apinetworks:- notes_networkworking_dir: /appports:- 8003:8003volumes:- ./src/note_book_api/app:/appcommand: ["./test.sh"]auth_app:image: nginx:latestcontainer_name: auth_appnetworks:- notes_networkvolumes:- ./src/auth_app/app/dist/:/usr/share/nginx/htmlports:- 8081:80web_app:image: nginx:latestcontainer_name: web_appnetworks:- notes_networkvolumes:- ./src/web_app/app/dist/:/usr/share/nginx/htmlports:- 8082:80

一、微服務架構的優勢與挑戰

微服務架構將單一體應用拆分成多個小型、獨立的服務,每個服務都圍繞特定的業務功能進行構建和部署。這種架構的優勢在于提高了系統的可伸縮性、靈活性和可維護性。然而,隨著服務數量的增加,配置、部署和管理這些服務成為了一個巨大的挑戰。

二、Docker Compose的應用

為了簡化微服務架構的部署和管理,我引入了Docker Compose。Docker Compose是一個用于定義和運行多容器Docker應用程序的工具,通過YAML文件來配置應用程序的服務、網絡和卷。在我的筆記系統中,我使用Docker Compose將各個微服務編排在一起,形成了一個完整的應用程序。

三、Docker Compose文件解析

我的docker-compose.yml文件包含了多個服務定義,如Redis、Postgres數據庫、API網關、身份驗證服務、筆記API和前端應用等。每個服務都指定了鏡像、容器名稱、網絡、卷、端口映射和環境變量等配置信息。通過這些配置,我可以輕松地啟動、停止和擴展各個服務。

四、優化建議

雖然我的Docker Compose文件已經相對整潔和有序,但仍然存在一些可以優化的地方:

  1. 環境變量管理:對于不同環境(開發、測試、生產),應使用不同的環境變量文件。可以通過在Docker Compose文件中引用多個.env文件來實現這一目的。此外,對于需要共享的環境變量,可以考慮使用Docker的秘密管理功能。
  2. 啟動腳本和命令:盡量避免在服務中使用相同的啟動腳本。每個服務應該有一個獨特的啟動命令或腳本,以確保正確的初始化和啟動順序。同時,要確保這些腳本在容器內具有執行權限。
  3. 網絡和端口映射:在生產環境中,應謹慎使用端口映射功能,只暴露必要的端口以減少安全風險。同時,可以利用Docker的網絡功能實現服務之間的安全通信。
  4. 服務依賴和啟動順序:雖然Docker Compose默認按照文件定義的順序啟動服務,但在某些情況下,可能需要明確指定服務的依賴關系。可以使用depends_on指令來實現這一點。然而,需要注意的是,depends_on并不能保證服務的完全同步啟動。為了解決這個問題,可以考慮使用健康檢查或等待策略來確保依賴服務已準備就緒。
  5. 日志和監控:在生產環境中,應配置適當的日志收集和監控機制。可以使用ELK堆棧(Elasticsearch、Logstash和Kibana)等工具來收集、處理和存儲日志。同時,通過添加健康檢查和性能監控指標,可以確保服務的穩定性和性能。
  6. 數據卷權限:在使用數據卷時,要確保容器內的用戶或進程具有正確的讀寫權限。可以在Dockerfile或啟動腳本中設置適當的權限和所有權。
  7. 資源限制:根據需要,可以為Docker容器設置CPU、內存和磁盤空間等資源限制。這有助于防止單個服務消耗過多資源而影響其他服務的性能。可以使用Docker Compose的deploy指令下的resources選項來配置這些限制(注意:這主要適用于Swarm模式)。對于非Swarm模式或較早版本的Docker Compose,可以考慮使用其他方法(如cgroups)來限制資源使用。
  8. 版本控制:將docker-compose.yml文件納入版本控制系統(如Git)中進行管理,以便跟蹤和回滾更改。同時,可以使用Git的子模塊或分支功能來管理不同環境或版本的配置文件。
  9. 安全性:確保使用最新和最安全的Docker鏡像版本,并定期更新依賴庫以防止已知的安全漏洞被利用。加強服務之間的通信和數據傳輸的安全性,例如使用HTTPS和加密連接。對于敏感信息(如密碼和密鑰),應使用安全的密鑰管理系統進行存儲和訪問。最后,確保Docker守護進程和容器受到適當的訪問控制和防火墻保護以防止未經授權的訪問和攻擊。

五、結語

優化是一個持續的過程,我將繼續關注最佳實踐和技術發展,以進一步提升系統的穩定性、性能和安全性。希望本文的分享能對大家在微服務架構和Docker Compose的應用中有所啟發和幫助。

歡迎大家留言區討論。

2024.3.4

重慶.渝北

----

這篇文章收錄我的Rust-實戰專欄。請關注我,不要錯過更新喲。

筆記系統的gitee地址:https://gitee.com/hanshu_alan/notes

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Web】速談FastJson反序列化中BasicDataSource的利用

目錄 關于BCEL BCEL的惡意利用demo FastJson配合BCEL初始化任意類 parse情況下后天精心構造彌補先天之不足 exp 參考文章: BCEL ClassLoader去哪了 Java動態類加載,當FastJson遇到內網 關于BCEL BCEL(Byte Code Engineering Library)的全名是Apa…

跨時鐘信號處理方法

1. 背景 現在的芯片(比如SOC,片上系統)集成度和復雜度越來越高,通常一顆芯片上會有許多不同的信號工作在不同的時鐘頻率下。比如SOC芯片中的CPU通常會工作在一個頻率上,總線信號(比如DRAM BUS)會…

python+Django+Neo4j中醫藥知識圖譜與智能問答平臺

文章目錄 項目地址基礎準備正式運行 項目地址 https://github.com/ZhChessOvO/ZeLanChao_KGQA 基礎準備 請確保您的電腦有以下環境:python3,neo4j 在安裝目錄下進入cmd,輸入指令“pip install -r requirement.txt”,安裝需要的python庫 打…

貓為什么挑食?可以改善、預防貓咪挑食的主食凍干分享

現在的貓咪主人都把自家的小貓當成了心頭的寶貝,呵護備至。最令人頭疼的就是貓咪挑食不吃貓糧,貓為什么挑食?遇到這類情況怎么辦呢?今天,我要分享一個既能確保貓咪不受苦,又能有效改善挑食問題的方法。 一、…

vue api封裝

api封裝 由于一個項目里api是很多的,隨處都在調,如果按照之前的寫法,在每個組件中去調api,一旦api有改動,遍地都要去改,所以api應該也要封裝一下,將api的調用封裝在函數中,將函數集…

C++實現簡易版http server

mini服務器簡介 mini服務器功能 1.實現了GET和POST方法的HTTP request和HTTP respond的構建和發送,使服務器可以完成基本通信功能。 2.使用了線程池技術,使服務器可以一次接收更多的鏈接和加快了服務器處理數據的速度。 3.實現了簡易的CGI&#xff0…

【MATLAB源碼-第155期】基于matlab的OFDM系統多徑信道LS,LMMSE,SVD三種估計算法的比較誤碼率對比仿真。

操作環境: MATLAB 2022a 1、算法描述 OFDM(Orthogonal Frequency Division Multiplexing,正交頻分復用)是一種高效的無線信號傳輸技術,廣泛應用于現代通信系統,如Wi-Fi、LTE和5G。OFDM通過將寬帶信道劃分…

jmeter 按流量階梯式壓測數據庫

當前版本: jmeter 5.6.3mysql 5.7.39 簡介 JMeter 通過 BZM - Arrivals Thread Group 來模擬并發到達的用戶流量、按時間加壓,可以有效地幫助測試人員評估系統在高壓力和高并發情況下的性能表現。 文章目錄如下 1. 下載插件 2. 界面說明 3. 測試步驟…

C#在并發編程使用Frozen來確保線程安全性

在C#中,Frozen方法通常用于通過不可變對象來確保線程安全性。這通常在并發編程中很有用,特別是在共享狀態的多線程環境中。Frozen方法是Caliburn Micro框架中的一個方法,它用于將對象標記為不可變。 當你調用Frozen方法時,它返回…

云計算 2月26號 (進程管理和常用命令)

一、權限擴展 文件權限管理之: 隱藏權限防止root誤刪除 文件屬性添加與查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件屬性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ---------------- f…

【FAQ】HarmonyOS SDK 閉源開放能力 —Account Kit

1.問題描述 實時驗證和非實時驗證的區別是什么? 解決方案 相同點: “手機號快速驗證”和“實時驗證”都是為了向用戶發起獲取手機號信息的請求。最終目的都是為了獲取到手機號。這兩種獲取方式都需要完成“獲取您的手機號”的Scope權限申請。 區別&…

UDP協議和TCP協議詳解

文章目錄 應用層自定義協議 傳輸層udp協議TCP協議1.確認應答2.超時重傳3.連接管理建立連接, 三次握手斷開連接, 四次揮手tcp的狀態 4.滑動窗口5.流量控制6.擁塞控制7.延時應答8.攜帶應答9.面向字節流10.異常情況 應用層 自定義協議 客戶端和服務器之間往往要進行交互的是“結構…

Eigen-約簡,訪問和廣播

約簡化,訪客和廣播 一、約簡化1. 標準計算2. 布爾約減 二、訪問三、部分約簡1. 將部分約減與其他業務相結合 四、廣播1. 將廣播與其他業務相結合 一、約簡化 在Eigen中,約簡化是一個接受矩陣或數組并返回單個標量值的函數。最常用的約簡方法之一是.sum(…

心法利器[108] | 微調與RAG的優缺點分析

心法利器 本欄目主要和大家一起討論近期自己學習的心得和體會。具體介紹:倉頡專項:飛機大炮我都會,利器心法我還有。 2023年新的文章合集已經發布,獲取方式看這里:又添十萬字-CS的陋室2023年文章合集來襲,更…

修復通達OA 百度ueditor 文件上傳漏動

前些日子,服務器阿里云監控報警,有文件木馬文件,因為非常忙,就沒及時處理,直接刪除了木馬文件了事。 誰知,這幾天對方又上傳了木馬文件。好家伙,今天不花點時間修復下,你都傳上癮了…

PHP【swoole】

前言 Swoole官方文檔:Swoole 文檔 Swoole 使 PHP 開發人員可以編寫高性能高并發的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服務,讓 PHP 不再局限于 Web 領域。Swoole4 協程的成熟將 PHP 帶入了前所未有的時期, 為性能的提升提供了獨一無…

Dynamo初學嘗試梳理

學習Dynamo有一段時間了,最近整理了下自己的筆記,分享一些給初學者,做個備忘吧!(PS:很多資料網上都能搜到,我僅僅是收集整理下筆記,分享給大家) 今天先簡單介紹下Dynamo…

展廳設計中多媒體的常用技術

1、互動投影 可以大大提高展廳和觀眾之間的互動體驗,使觀眾不僅可以享受觀看,還可以在輕松娛樂的氛圍中娛樂的氛圍中享受每個展覽的背景故事和內涵,使整個參觀過程非常輕松愉快。 2、幻影成像 可以全面展示企業產品的生產過程,讓觀…

STM32 (4) GPIO(1)

1.芯片的引腳分布 2.普通IO引腳的命名規則 3.IO復用 IO引腳身兼數職的現象叫做IO復用,可以使芯片擁有更多的功能,例如: PA9和PA10既可以用于GPIO的引腳,也可以用于串口或定時器的引腳 通用:CPU直接控制IO引腳的輸入輸…

Linux:用戶格式顯示進程

簡介 在Linux系統中,ps 命令用于查看當前系統中的進程。ps -aux 是該命令的一個常用選項組合,用于以用戶格式顯示所有進程。 ps -aux 輸出的信息內容及含義: USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND r…