重构笔记系统: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.hqwc.cn/news/511563.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Electron-builder打包安装包——编译篇

突然有一天想打包个桌面程序,没有打包过,经过九牛二虎之力终于打包出来,在此感谢那些热于分享的前辈! 本篇只讲打包运行和出现的问题 一、准备工作:提前下载相关资源包,否则在国内环境下可能因为网络问题…

C语言qsort函数介绍

前言 学到了函数指针,那这篇博客我们可以根据函数指针,了解一个函数qsort的应用与模拟实现 欢迎关注个人主页:小张同学zkf 若有疑问 评论区见 目录 1.回调函数 2.qsort函数使用 3.qsort模拟实现 1.回调函数 讲这个东西之前我们来认识一下…

开发者分享:利用 EMQX Cloud 与 ESP32 微控制器实现智能液冷散热系统

作者:陶德坤,EMQX Cloud 开发者。 作为一名后端开发人员,我经常需要同时运行多个 Jetbrains IDE (集成开发环境),所以经常面临笔记本电脑过热问题。我曾尝试过各种散热方法,从传统的风扇到更先…

《数字图像处理(MATLAB版)》相关算法代码及其分析(3)

目录 1 对边界进行子采样 1.1 输入参数检查 1.2 处理重复坐标 1.3 计算边界最大范围 1.4 确定网格线数量 1.5 构建网格位置向量 1.6 计算曼哈顿距离 1.7 整理输出结果 1.8 返回结果 2 改变图像的存储类别 2.1 函数输入 2.2 数据类型转换 2.3 错误处理 2.4 返回结…

Chrome禁止自动升级

一、关闭计划任务 1、首先我们需要右键点击我的电脑,在打开的选项里选择管理。   2、在打开的对话框中选择任务计划程序。   3、在任务计划程序库中找到两个和chrome自动更新相关的任务计划GoogleUpdateTaskMachineCore与GoogleUpdateTaskMachineUA。     4…

【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱

1 基本定义 滑动平均滤波算法是一种经典的滤波方法,它通过计算信号的移动平均值来消除噪声。该算法的主要思想是对信号进行滑动窗口处理,窗口内的数据进行平均化,以得到平滑后的信号。这样可以有效地去除周期性噪声和高频噪声,同…

【MySQL使用】show processlist 命令详解

show processlist 命令详解 一、命令含义二、命令返回参数三、Command值解释四、State值解释五、参考资料 一、命令含义 对于一个MySQL连接,或者说一个线程,任何时刻都有一个状态,该状态表示了MySQL当前正在做什么。SHOW PROCESSLIST 命令的…

高级大数据技术 实验一 scala编程

​ 高级大数据技术 实验一 scala编程 写的不是很好,大家多见谅! 1. 计算水仙花数 实验目标; (1) 掌握scala的数组,列表,映射的定义与使用 (2) 掌握scala的基本编程 实验说明 …

Spring中Bean的作用域、实例化方式、生命周期、循环依赖问题

Spring中Bean的作用域、实例化方式、生命周期、循环依赖问题 一、Bean的作用域1.singleton2.prototype3.其他scope值 二、Bean的实例化方式1.通过构造方法实例化2.通过简单工厂模式实例化3.通过factory-bean实例化4.通过FactoryBean接口实例化5.BeanFactory和FactoryBean的区别…

Java基础-运算符,表达式和语句

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、Java 运算符 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 条件运算符&#xff…

基于MVO优化的Bi-LSTM多输入时序预测(Matlab)多元宇宙算法优化长短期神经网络时序预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&am…

05. Nginx入门-Nginx访问控制

测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径:/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…