重构笔记系统: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.mzph.cn/news/718300.shtml

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

相关文章

跨时钟信号处理方法

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. 测试步骤…

云计算 2月26号 (进程管理和常用命令)

一、权限扩展 文件权限管理之: 隐藏权限防止root误删除 文件属性添加与查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件属性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ---------------- f…

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引脚的输入输…

【OpenGL编程手册-04】详细解释着色器

着色器 目录 一、说明二、着色器语言GLSL2.1 典型的着色器代码2.2 数据类型2.2.1 向量 2.3 输入与输出2.3.1 顶点着色器2.3.2 片段着色器 2.4 Uniform2.5 函数后缀含义2 .6 更多属性! 三、我们自己的着色器类四、从文件读取五、 编译着色器练习 一、说明 在Hello T…

shopee、美客多、敦煌、国际站卖家如何掌握测评补单的核心要素

对于卖家而言,测评补单是一种经济高效的推广策略,它对于提升商品流量、优化转化率、增强关键词质量分以及加强链接权重都起到了积极的推动作用。然而,要实现自养号测评,需满足以下条件: 首要之务,建立一个稳…

jenkins插件下载失败bug

如果遇到安装jenkins插件经常失败并报以下类似错误,很可能是因为jenkins国外官方插件地址下载速度非常慢,我们可以修改为国内插件地址。 java.io.IOException: Failed to load: SCM API Plugin (scm-api 676.v886669a_199a_a_) - Jenkins (2.361.4) or h…

详细分析Java类调用Service接口失效的注意事项(附Demo)

目录 前言1. 问题所示2. 原理分析3. 解决方法 前言 试错了一小时&#xff0c;发现接口返回null&#xff01;&#xff01; 最后梳理其知识点并总结其原理 1. 问题所示 接口类如下&#xff1a; public interface IInfoService extends BaseService<Info> {错误方式一&a…