重构笔记系统:Docker Compose在微服务架构中的应用与优化

news2024/12/24 21:47:41

虽然我的笔记系统的开发是基于微服务的思想,但是在服务的配置和编排上感觉还是不太合理,具体来说,在开发上的配置和在生产上的配置差别太大。现在规模小,后面规模变大,估计这一块会成为系统生长的瓶颈。

因此,我在周末重构了项目结构和docker-compose.yml,本文将分享我在这一过程中的经验,并探讨如何进一步优化基于Docker Compose的微服务架构。

# 所有数据放在data目录下
version: '3'
networks:
  notes_network:

services:  
  redis:
    image: redis:latest
    container_name: redis-token
    networks: 
      - notes_network
    volumes:
      - ./data/redis:/opt/redis/data
      - ./redis/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 6379:6379
  auth2-db:
    image: postgres:latest
    container_name: auth2-db
    networks:
      - notes_network
    volumes:
      - ./db/auth2/init:/docker-entrypoint-initdb.d/
      - ./data/auth2-db:/var/lib/postgresql/data
    ports:
      - 5434:5432
    env_file:
      - .env
  notes-db:
    image: postgres:latest
    container_name: notes-db
    networks:
      - notes_network
    volumes:
      - ./db/notes/init:/docker-entrypoint-initdb.d/
      - ./data/notes-db:/var/lib/postgresql/data
    ports:
      - 5433:5432
    env_file:
      - .env

  api-gate:
    image: rust:latest
    container_name: api-gate
    networks:
      - notes_network
    working_dir: /app
    volumes:
      - ./src/api-gate/app:/app
    command: ["./test.sh"]
    ports:
      - 8000:8000

  auth2:
    image: rust:latest
    container_name: auth2
    working_dir: /app
    networks:
      - notes_network
    ports:
      - 8002:8002
    volumes:
      - ./src/auth2/app:/app
    command: ["./test.sh"]

  notes-api:
    image: rust:latest
    container_name: note_book_api
    networks:
      - notes_network
    working_dir: /app
    ports:
      - 8003:8003
    volumes:
      - ./src/note_book_api/app:/app
    command: ["./test.sh"]

  auth_app:
    image: nginx:latest
    container_name: auth_app
    networks:
      - notes_network
    volumes:
      - ./src/auth_app/app/dist/:/usr/share/nginx/html
    ports:
      - 8081:80

  web_app:
    image: nginx:latest
    container_name: web_app
    networks:
      - notes_network
    volumes:
      - ./src/web_app/app/dist/:/usr/share/nginx/html
    ports:
      - 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.coloradmin.cn/o/1489831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优先级队列(Java )

目录 一、 优先级队列1、概念 二、优先级队列的模拟实现1、堆的概念2、堆的存储方式 三、堆的创建1、堆向下调整2、堆的创建3、建堆的时间复杂度 四、堆的插入与删除1、堆的插入2、堆的删除 五、用堆模拟实现优先级队列 一、 优先级队列 1、概念 优先级队列(Priori…

Windows Docker 部署 Jenkins

一、简介 今天介绍一下在 Windows Docker 中部署 Jenkins 软件。在 Windows Docker 中,分为两种情况 Linux 容器和 Windows 容器。Linux 容器是通常大多数使用的方式,Windows 容器用于 CI/CD 依赖 Windows 环境的情况。 二、Linux 容器 Linux 容器内部…

vue中使用echarts实现人体动态图

最近一直处于开发大屏的项目,在开发中遇到了一个小知识点,在大屏中如何实现人体动态图。然后看了下echarts官方文档,根据文档中的示例调整出来自己想要的效果。 根据文档上发现 series 中 type 类型设置为 象形柱形图,象形柱图是…

[HackMyVM]靶场 Quick3

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (U…

解密Lawnchair:打造个性化极致的Android桌面体验

解密Lawnchair:打造个性化极致的Android桌面体验 1. 简介 Lawnchair是一款知名的Android桌面定制工具,旨在为用户提供个性化极致的桌面体验。作为一个开源项目,Lawnchair融合了简洁、灵活和强大的特点,让用户能够自由定制其Andro…

b站小土堆pytorch学习记录—— P17 土堆说卷积操作

文章目录 一、前置知识什么是卷积操作 二、代码 一、前置知识 什么是卷积操作 推荐几个高赞博客: 卷积最容易理解的解释 卷积神经网络(CNN)详细介绍及其原理详解 还有pytorch官网的动态图: pytorch卷积 二、代码 import t…

免费的ChatGPT网站( 7个 )

ChatGPT 是由 OpenAI 公司研发的一款大型语言模型,它可以实现智能聊天、文本生成、语言翻译等多种功能。以下是 ChatGPT 的详细介绍: 智能聊天:ChatGPT 可以与用户进行自然语言对话,回答用户的问题,提供相关的信息和建…

通义千问1.5(Qwen1.5)大语言模型在PAI-QuickStart的微调与部署实践

作者:汪诚愚(熊兮)、高一鸿(子洪)、黄俊(临在) Qwen1.5(通义千问1.5)是阿里云最近推出的开源大型语言模型系列。作为“通义千问”1.0系列的进阶版,该模型推出…

S4---FPGA-K7板级原理图硬件实战

视频链接 FPGA-K7板级系统硬件实战01_哔哩哔哩_bilibili FPGA-K7板级原理图硬件实战 基于XC7K325TFFG900的FPGA硬件实战框图 基于XILINX 的KINTEX-7 芯片XC7K325FPGA的硬件平台,FPGA 开发板挂载了4 片512MB 的高速DDR3 SDRAM 芯片,另外板上带有一个SODIM…

Python爬虫实战(基础篇)—13获取《人民网》【最新】【国内】【国际】写入Word(附完整代码)

文章目录 专栏导读背景测试代码分析请求网址请求参数代码测试数据分析利用lxml+xpath进一步分析将获取链接再获取文章内容测试代码写入word完整代码总结专栏导读 🔥🔥本文已收录于《Python基础篇爬虫》 🉑🉑本专栏专门针对于有爬虫基础准备的一套基础教学,轻松掌握Py…

深度学习-Pytorch实现经典VGGNet网络

深度学习-Pytorch实现经典VGGNet网络 深度学习中,经典网络引领一波又一波的技术革命,从LetNet到当前最火的GPT所用的Transformer,它们把AI技术不断推向高潮。2012年AlexNet大放异彩,它把深度学习技术引领第一个高峰,打…

数据可视化原理-腾讯-3D网格热力图

在做数据分析类的产品功能设计时,经常用到可视化方式,挖掘数据价值,表达数据的内在规律与特征展示给客户。 可是作为一个产品经理,(1)如果不能够掌握各类可视化图形的含义,就不知道哪类数据该用…

【Leetcode每日一刷】动态规划算法: 62. 不同路径、63. 不同路径 II

博主简介:努力学习和进步中的的22级计科生博主主页: Yaoyao2024每日一句: “ 路虽远,行则将至。事虽难,做则可成。” 前言 前言:动规五部曲 以下是《代码随想录》作者总结的动规五部曲 确定dp数组(dp tab…

IDEA运行大项目启动卡顿问题

我打开了很多项目,然后又启动了一个大型项目时,启动到一半,弹出一个窗口,告诉我idea内存不够,怎么解决这个问题? 1、先把多余的项目关掉,再启动这个大项目, 2、如果还是不行就去修改…

u-boot 基础学习:板级配置 Kconfig 的包含

前言 u-boot 与 Linux 内核在嵌入式Linux开发中占有重要的地位,掌握 u-boot 的基础开发,可以大大提升开发能力,并提高开发的效率。 u-boot 下 如何配置 板级的Kconfig 呢?u-boot 下板级的 Kconfig 是怎么包含到 主目录下 Kconfig…

阿里云2核4G服务器支持多少人在线?多少钱?

阿里云2核4G服务器多少钱一年?2核4G5M带宽优惠价格199元一年,轻量应用服务器2核4G4M带宽165元一年,2核4G服务器30元3个月,可以在阿里云官方活动查看2核4G配置详细报价 https://t.aliyun.com/U/bLynLC 阿里云2核4G服务器价格 2核4G…

Apache SeaTunnel 2.3.4 版本发布:功能升级,性能提升

​Apache SeaTunnel团队自豪地宣布2.3.4版本正式发布!本次更新聚焦于增强核心功能,改善用户体验,并进一步优化文档质量。 此次版本发布带来了多项重要更新和功能增强,包括核心与API的修复、文档的全面优化、Catalog支持的引入&…

一文了解什么是园区网以及如何部署园区网

目录 一、局域网分类 二、园区网的业务部署内容 1、构建高可靠可冗余网络 2、组播业务的快速开展 3、语音业务的部署 4、网络安全的部署 5、网络管理和维护的应用 一、局域网分类 (1)园区网: 目的:让各种服务器提供服务 …

JavaEE之多线程

一.认识线程 1.多进程实现并发编程的不足之处: 引入多个进程的核心:实现并发编程(c的CGI技术就是通过多进程的方式实现的网站后端开发)。因为现在是一个多核cpu的时代,并发编程就是刚需。多进程实现并发编程&#xf…

第 2 个 Java Web 应用工程(JSP JavaBean DB)(含源码)(图文版)

JavaBean 是一种符合特定约定的 Java 类,通常用于在 Java 应用程序中封装数据以及提供对数据的访问和修改方法。 本文示例:建立一个 Tomcat 工程,编写一个 JSP 页面,调用 JavaBean 访问数据库并显示到页面上,发布到 T…