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

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

相关文章

推特API(Twitter API)对接说明,用户code To Token换取

前期准备 提前准备、说明:目前对接推特api开发门户分为3个版本,分别是免费的,100美金一个月的基础版以及5000美金一个月的企业版,免费的目前就两个接口可以调用,所以想要对接和使用推特最基本的也需要付100美元一个月…

ETAS工具链ISOLAR-AB重要概念,RTE配置,ECU抽取

RTE配置界面,包含ECU抽取关联 首次配置RTE,出现需要勾选的抽取EXTRACT 创建System System制作SWC到ECU的Mapping System制作System Data 的Mapping

LabVIEW眼结膜微血管采集管理系统

LabVIEW眼结膜微血管采集管理系统 开发一套基于LabVIEW的全自动眼结膜微血管采集管理系统,以提高眼结膜微血管临床研究的效率。系统集成了自动化图像采集、图像质量优化和规范化数据管理等功能,有效缩短了图像采集时间,提高了图像质量&#…

9.WEB渗透测试-Linux基础知识-Linux用户权限管理(上)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:8.WEB渗透测试-Linux基础知识-Linux基础操作(二)-CSDN博客 用户管…

Laravel框架: Call to a member function connect() on null 异常报错处理

Laravel框架: Call to a member function connect() on null 异常报错处理 Date: 2024.03.01 21:03:11 author: lijianzhan 原文链接: https://learnku.com/laravel/t/63721 问题: local.ERROR: Call to a member function connect() on null {"…

【办公类-21-08】三级育婴师 多个二级文件夹的docx合并成PDF

背景需求: 前期制作了单题文件夹 【办公类-21-07】新建文件夹 三级育婴师操作参考题目-CSDN博客文章浏览阅读439次,点赞7次,收藏10次。【办公类-21-07】新建文件夹 三级育婴师操作参考题目https://blog.csdn.net/reasonsummer/article/details/1363360…

Spring Boot项目中不使用@RequestMapping相关注解,如何动态发布自定义URL路径

一、前言 在Spring Boot项目开发过程中,对于接口API发布URL访问路径,一般都是在类上标识RestController或者Controller注解,然后在方法上标识RequestMapping相关注解,比如:PostMapping、GetMapping注解,通…

Gitlab: PHP项目CI/CD实践

目录 1 说明 2 CI/CD 2.1 部署方式一:增量部署 2.1.1 目标服务器准备 2.2.2 Gitlab及Envoy脚本 2.2 部署方式二:镜像构建与部署 2.2.1 推送到私有化容器仓库 准备工作 脚本 要点 2.2.2 推送到hub.docker.com 准备工作 脚本 3 参考&#x…

鸿蒙实战应用开发:【拨打电话】功能

概述 本示例通过输入电话,进行电话拨打,及电话相关信息的显示。 样例展示 涉及OpenHarmony技术特性 网络通信 基础信息 拨打电话 介绍 本示例使用call相关接口实现了拨打电话并显示电话相关信息的功能 效果预览 使用说明 1.输入电话号码后&#…

「滚雪球学Java」:多线程(章节汇总)

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…

STM32F1 - SPI读写Flash

Serial peripheral interface 1> 实验概述2> SPI硬件框图初始化程序 3> STM32的SPI通信时序3.1> 时序图3.2> 文字描述3.3> 注意事项3.4> 流程图表示3.5> 程序表示接收程序:发送程序: 4> SPI的4种模式5> W25Q128存储结构块…

【学习心得】网站运行时间轴(爬虫逆向)

一、网站运行时间轴 掌握网站运行时间轴,有助于我们对“请求参数加密”和“响应数据加密”这两种反爬手段的深入理解。 二、从网站运行的时间轴角度来理解两种反爬手段 1、加载HTML: 这是浏览器访问网站时的第一步,服务器会返回基础…

docker基线安全修复和容器逃逸修复

一、docker安全基线存在的问题和修复建议 1、将容器的根文件系统挂载为只读 修复建议: 添加“ --read-only”标志,以允许将容器的根文件系统挂载为只读。 可以将其与卷结合使用,以强制容器的过程仅写入要保留的位置。 可以使用命令&#x…

基于Springboot的助农管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的助农管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

台式电脑电源各线的电压和电流输出和输出电流

台式电脑电源是电脑硬件的重要组成部分。 它为计算机的各个部件提供所需的电压和电流。 不同的硬件设备和组件有不同的电压和电流输出。 下面详细介绍台式电脑电源各线的电压,包括3.3V、5V、12V、-12V、-5V和5VSB,以及它们的输出电流和用途。 3.3V&#…

Java递归生成本地文件目录树形结构

Java递归生成本地文件目录(树行结构) 1.读取txt文件保存的文件目录结构 2.递归生成本地文件目录树形结构,并修改目录文件前缀进行递增 3.结果截图 4.代码 package com.zfi.server.device;import io.swagger.annotations.Api; import org.springframework.web.bind…

Leaflet 加载高德地图

前言 在前面的文章中,我们学习了如何使用 Leaflet 创建一个基本的地图。在本文中,我们将学习如何在 Leaflet 中加载高德地图,并结合实际应用构建地图点击事件。 一、介绍 高德地图是一款由高德软件提供的数字地图服务,在国内使用…

数学建模【灰色关联分析】

一、灰色关联分析简介 一般的抽象系统,如社会系统、经济系统、农业系统、生态系统、教育系统等都包含有许多种因素,多种因素共同作用的结果决定了该系统的发展态势。人们常常希望知道在众多的因素中,哪些是主要因素,哪些是次要因素;哪些因素…

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

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

【S32DS报错】-7-程序进入HardFault_Handler,无法正常运行

【S32K3_MCAL从入门到精通】合集: S32K3_MCAL从入门到精通https://blog.csdn.net/qfmzhu/category_12519033.html 问题背景: 在S32DS IDE中使用PEmicro(Multilink ACP,Multilink Universal,Multilink FX&#xff09…