开发微服务的9个最佳实践

微服务架构是一种演进的模式,从根本上改变了服务器端代码的开发和管理方式。这种架构模式涉及将应用程序设计和开发为松散耦合服务的集合,这些服务通过定义良好的轻量级 API 进行交互以满足业务需求。

它旨在通过促进持续交付和开发来帮助软件开发公司加速开发过程,微服务架构模式从根本上改变了服务器端代码的开发和管理方式。

如果我们谈论其基本特征,则特定的微服务本身充当应用程序,与其他微服务形成更大的应用程序,这使得:

  • 更轻松、更快速的开发

  • 可维护性

  • 可扩展性

从本质上讲,这使您可以更有效地管理和维护应用程序。然而,这种模式固有的特定复杂性可以通过使用某些最佳实践来减轻。

我们都知道微服务设计对现代架构的网络弹性有直接影响,当企业决定使用微服务进行构建时,高效且有效地开发它们非常重要,以便它们可以在网络上运行,而不会导致过多的延迟、带宽消耗和数据包丢失。

在本文中,我们将讨论如果您想实现一个没有极端架构复杂性的高效微服务生态系统,您应该考虑的基本微服务最佳实践。那么,事不宜迟,让我们开始吧。

1. 采用单一职责原则

单一职责原则是 OOP 中的任何单个对象都应该针对一个特定功能而创建的概念。基本上,它是罗伯特·马丁提出的编程原则的一部分。就像代码一样,一个类应该只有一个需要更改的理由,从而使软件更易于维护、可扩展且更易于理解。

要在软件开发中采用SRP,您应该确保每个类或模块都有明确定义的职责,并且不会尝试做太多事情。您还应该保持模块解耦,并使用清晰简洁的接口在它们之间进行通信。总结一下,我们有一个有趣的引述:

“将那些因相同原因而变化的事物聚集在一起,并将那些因不同原因而变化的事物分开。”——奥莱利

我们可以说,这是构建良好架构设计的最好、最基本的原则之一,因为它意味着微服务、模块、类、子系统或功能不应该有多个原因进行更改。

让我们通过一个例子来理解这个原理:

电子商务门户可能具有如下微服务架构

图片

在这里,所有服务(例如产品列表服务、订单服务、客户服务、支付服务、购物车服务、愿望清单服务等)都有单一职责。这意味着确保在并非绝对必要的情况下不将一项服务与另一项服务集成非常重要,因为这会使架构的维护和测试变得更加复杂。

2. 建立职责明确的团队

开发微服务架构,需要建立职责明确的团队。这可以通过多种方式完成,例如基于角色的团队、跨职能团队等。在此架构中,每个微服务都作为独立的应用程序运行。

让我们通过一个例子来理解这一点:

组织可以拥有基于角色的团队,例如 UI/UX 开发人员、前端开发人员、后端开发人员、数据库管理员、QA、中间件开发人员等,他们独立工作,但每天通过会议进行互动(无论是面对面的)或者使用各种通讯工具,如 JIRA、Slack 等。

当我们考虑维护时,有时系统中也会出现小错误,有时甚至是大错误。因此,SCRUM 可能是一个可能的解决方案。它帮助每个团队成员缩短无意识的时间。但是,由于团队是根据角色组织的,因此在一个冲刺中集成一个更新可能会成为一项复杂的任务。例如,如果 UI/UX 开发人员没有从服务器人员那里获得有关 API 更改的任何信息,则新 API 将根本没有用处。

那么解决办法是什么呢?

建立职责明确的跨职能团队,帮助协调团队之间的工作

负责整个微服务功能的跨职能团队可能会给您的项目带来重大好处。该团队应由所有基于角色的团队的成员组成,并负责协调应用程序的各个部分,即 UI、开发、数据库,甚至 QA。如果应用程序有两个版本,即网络版本和移动版本,那么两个团队的开发人员都应该出现在该团队中。这种团队的主要好处是可以轻松解决错误、开发新功能并将其部署到生产环境中。

3. 使用正确的工具和框架

至此,您可能已经设计了微服务来独立部署它们,现在您必须实现这些微服务的最佳价值。为此,您需要使用一组良好的 DevOps 工具来自动化构建和部署管理。

使用正确的工具、框架和库将对实现微服务架构大有帮助。如果您计划在 Java 中执行此操作,请考虑Spring Boot 项目。选择正确的工具和框架需要花费大量的时间和精力,因此这里列出了适合该工作的“首选”、经过验证的工具和技术:

  • Jenkins 和 Bamboo 用于部署自动化

  • Docker 用于容器化

  • 用于 API 测试的 Postman

  • 用于容器编排和部署的 Kubernetes

  • Logstash 用于监控

  • DevSecOps 管理软件开发生命周期的整个过程

  • GitHub 用于源代码管理和版本控制

  • Amazon 的简单消息队列服务

  • SonarQube 检查代码质量和安全性

  • Ansible 用于管理您的配置

  • Jira 用于问题跟踪和项目管理

4. 保持微服务之间的异步通信

微服务之间发生两种类型的通信:同步和异步。让我们通过一个例子来理解这一点:

对于电子商务平台来说,同步通信意味着用户将被要求“保持在线”并完成一系列步骤(选择商品、添加送货地址、付款详细信息、订单验证),最终导致客户通知“谢谢”您的订单!我们将于下周交付”。

一旦处理客户通知,也会发生一些异步通信,这些异步通信是订单“履行”阶段的一部分,例如:仓库通知、库存更新等。

在同步通信的情况下,一个服务变得依赖于另一服务。有时,使用多个微服务之间的同步通信来完成整个任务会变得非常耗时。

另一方面,异步通信彼此不依赖,每个服务都可以花一些时间来完成其任务。因此,人们应该尽可能地最大化微服务之间的异步通信,它减少了依赖性并提高了应用程序的整体效率。

您可以在下面看到这样的示例:

图片

5. 采用 DevSecOps 模型并保护微服务

安全性在此架构中非常重要。随着微服务架构在云原生应用程序开发中的发展,DevSecOps 实践越来越多地用于通过增强的安全措施来确保持续集成和持续交付。使用微服务构建的应用程序可以分为以下代码类型:

  • 应用代码(核心逻辑)

  • 应用服务代码(网络连接、会话建立等)

  • 基础设施(数据存储资源、网络、平台等)

  • 监控(应用程序的持续可观察性)

DevSecOps 包含三个概念:开发、安全和操作,并已被证明是具有持续集成、持续交付和持续部署管道等原语的代码类型的促进范例。这些管道是使用开发人员的源代码进行开发、测试、部署以及许多此类操作的工作流程,这些操作由具有反馈机制的自动化工具支持。此外,它还使开发团队能够更快地交付更好、更安全的代码。微服务架构中的 DevSecOps 实践提供了许多好处,例如:

  • 高安全保证

  • 减少代码漏洞

  • 提高产品质量

  • 提高生产力

  • 提高操作速度

  • 更快地交付更好、更高质量的软件

6. 为每个微服务使用单独的数据存储

一项重要的实践是确保尽可能使用单独的数据库来存储数据,而不是为多个微服务使用相同的数据库。然而,更深入的分析可能表明一个微服务仅适用于数据库表的子集,而另一方面,另一个微服务仅适用于全新的表子集。如果两个数据子集都是正交的,则需要将数据库分成单独的服务。

因此,请确保为您的微服务拥有单独的数据存储,以减少延迟并提高安全性。这已经被提到很多次了,但需要强调的是,微服务之间应该尽可能少地依赖。

微服务架构的主要属性之一是每个服务的数据都是私有的,例如,每个服务数据库模式就是如此。

图片

我们还可以使用共享数据库服务器,该服务器可供多个服务使用,并对其数据进行逻辑分离。

7. 单独部署每个微服务

如果您单独部署每个微服务,那么在维护或升级工作的同时,您肯定会节省大量与多个团队协调的时间。此外,如果一个或多个微服务具有相同的资源,我们建议您使用专用基础设施来隔离每个微服务的故障并避免全面中断。

部署微服务的一些最常见和流行的模式是:

  • 每个主机多个服务实例

  • 每个容器的服务实例

  • 每个主机单个服务实例

  • 每个虚拟机的服务实例

8. 编排微服务

微服务的编排是在流程和工具方面取得成功的最有影响力的因素之一。您可以使用 Docker 在虚拟机上运行容器,但它无法提供与容器编排平台相同级别的弹性。在尝试采用微服务架构时,这样的决定很可能会对您的正常运行时间产生负面影响。

以下是一些经过验证的编排平台:

  • K8(Kubernetes)

  • AKS(Azure Kubernetes 服务)

  • ECS(亚马逊弹性容器服务)

  • Azure 容器应用程序

这些平台有助于管理容器配置和部署、负载平衡、扩展、网络通信问题等。

9. 使用有效的监控系统

微服务架构可帮助您对数千个模块化服务进行巨大扩展,并提供提高速度和有组织的监控方法的潜力。然而,重要的是要确保检查所有微服务并定期检查它们是否按预期运行以及是否有效地使用可用资源。根据这些观察结果,如果未达到预期,您可以采取适当的措施。

让我们分析一个示例情况,假设您应用了微服务架构模式,该模式不具备处理请求的能力,但它们仍在运行。例如,如果数据库连接耗尽,监控系统应该能够在实例发生故障时生成警报,并且请求应路由到工作服务实例。

监控微服务并准确解释这些统计数据将帮助您改进决策并在需要时保持微服务可用。

让我们看一下微服务监控工具的几个示例。

  • AWS CloudWatch: 一种监控、可观察性和管理服务,可收集和可视化实时日志,并为 AWS、混合和本地应用程序及基础设施资源提供可操作的见解。

  • Jaeger: 旨在监控和解决微服务环境中的复杂问题的软件。

  • Datagod: 一个适用于云规模应用程序的可观察性、安全性和分析平台,使用基于 SaaS 的数据分析平台为数据库、服务和工具提供全面的解决方案。

  • Graphite: 顾名思义,它是一种开源软件,可以监控数字时间序列数据并绘制图表,并提供对底层系统的深入洞察。

  • Prometheus: 一个免费的开源软件工具,提供监控和修改解决方案。

结论

这就是这篇文章的内容。我希望您觉得这篇文章很有用,并且您将遵循这些微服务的最佳实践,最终得到一个独立的、松散耦合的系统,以便获得该架构的好处。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95541.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95541.shtml

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

相关文章

Karmada v1.15 版本发布

Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。 Karmada v1.15 版本现已…

[GYCTF2020]Ezsqli

文章目录测试过滤找注入点布尔盲注无列名盲注总结测试过滤 xor for distinct information handler binary floor having join pg_sleep bp测试出来禁用了这些。 找注入点 查询回显推断1Nu1Labool(false)1’bool(false)1’#bool(false)不是单引号包裹1"#bool(false)没有引…

Agno 多 Agent 协作框架 - 手把手从零开始教程

本教程将带你从零开始,一步步构建一个完整的多 Agent 协作系统。每一步都有详细的代码示例和解释,让你真正理解 Agno 框架的工作原理。第一步:创建你的第一个 Agent 让我们从最简单的开始 - 创建一个能回答问题的 Agent。 1.1 创建基础文件 首…

数据库查询优化

这篇文章适合刚刚入手项目的小伙伴,为大家如何提高数据库查询效率提供一些建议。1.添加索引1.1 索引是什么对于索引基础薄弱的同学,我们可以从 “索引是什么” 简单类比:索引就像书籍的目录,能帮数据库快速定位到需要的数据&#…

安徽大学概率论期末试卷及答案解析

本文还有配套的精品资源,点击获取 简介:安徽大学的概率论课程围绕随机现象的规律性,覆盖了多个核心概念,如随机事件的概率、条件概率、独立事件、概率分布、期望值、方差、大数定律和中心极限定理。本资源包含期末试卷及答案&a…

HarmonyOS应用开发之界面列表不刷新问题Bug排查记:从现象到解决完整记录

Bug排查在软件开发过程中扮演着至关重要的角色,本文采用日记形式记录了Bug排查的全过程,通过这种方式可以更加真实、详细地记录问题,便于后续追溯和经验沉淀。 Bug背景 在使用HarmonyOS的ArkUI框架开发一个卡片管理应用时,遇到了…

FastVLM-0.5B 模型解析

模型介绍 FastVLM(Fast Vision-Language Model)是苹果团队于2025年在CVPR会议上提出的高效视觉语言模型,专为移动设备(如iPhone、iPad、Mac)优化,核心创新在于通过全新设计的 FastViTHD混合视觉编码器 解决…

集成学习 | MATLAB基于CNN-LSTM-Adaboost多输入单输出回归预测

集成学习 | MATLAB基于CNN-LSTM-Adaboost多输入单输出回归预测 一、主要功能 该代码使用 CNN 提取特征,LSTM 捕捉时序依赖,并通过 AdaBoost 集成多个弱学习器(每个弱学习器是一个 CNN-LSTM 网络),最终组合成一个强预测器,用于回归预测任务。代码完成了从数据预处理、模型…

关于Homebrew:Mac快速安装Homebrew

关于macOS 安装HomebrewHomebrewHomebrew介绍Homebrew 官网地址Homebrew 能安装什么?Mac上安装Homebrew主要步骤:打开终端,执行官网安装脚本注意遇到问题①:脚本在克隆 Homebrew 核心仓库时,​​无法连接 GitHub​​&a…

【前端】使用Vercel部署前端项目,api转发到后端服务器

文章目录Vercel是什么概要Vercel部署分为两种方案:一、使用GitHub构建部署二、通过 Vercel CLI 上传本地构建资源注意事项转发API到后端小结Vercel是什么 Vercel是一款专为前端开发者打造的云部署平台,它支持一键部署静态网站、AI工具和现代Web应用。Ve…

滚珠导轨在工业制造领域如何实现高效运行?

在工业制造领域中滚珠导轨凭借其高精度、低摩擦、高刚性等特点,被广泛应用于多种设备和场景,并在设备性能中起着关键作用,以下是具体应用:加工中心:滚珠导轨用于加工中心的工作台和主轴箱等部件的移动,能保…

大基座模型与 Scaling Law:AI 时代的逻辑与困境

一、背景:为什么大模型一定要“做大”? 在人工智能的发展历程中,有一个不容忽视的“铁律”:更大的模型往往意味着更强的性能。从 GPT-2 到 GPT-4,从 BERT 到 PaLM,从 LLaMA 到 Claude,每一代的…

内网的应用系统间通信需要HTTPS吗

内网是否需要 HTTPS? 虽然内网通常被视为“相对安全”的环境,但仍需根据具体情况决定是否使用 HTTPS,原因如下: 内部威胁风险 ● 内网可能面临内部人员攻击、横向渗透(如黑客突破边界后在内网扫描)、设备…

6.ImGui-颜色(色板)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:5.ImGui-按钮 IMGui中表示颜色的的结构体 ImVec4和ImU32,如下图红框…

【C++】Vector完全指南:动态数组高效使用

0. 官方文档 vector 1. vector介绍 Vector 简单来说就是顺序表,是一个可以动态增长的数组。 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c…

关于无法导入父路径的问题

问题重现 有下面的代码: from ..utils import Config,set_DATA_PATH DATA_PATH set_DATA_PATH()报错如下:from ..utils import Config,set_DATA_PATH ImportError: attempted relative import beyond top-level package解决方案 #获取当前脚本所在目录的…

C/C++包管理工具:Conan

Conan是一个专为C/C设计的开源、去中心化、跨平台的包管理器,致力于简化依赖管理和二进制分发流程。Conan基于Python进行开发,支持与主流的构建系统集成,提供了强大的跨平台和交叉编译能力。通过Conan,开发者可以高效的创建、共享…

核心高并发复杂接口重构方案

核心高并发复杂接口重构方案 一、重构目标与原则 核心目标 提升接口性能:降低响应时间,提高吞吐量,降低资源使用 增强可维护性:拆解复杂逻辑,模块化设计,降低后续迭代成本 保障稳定性:通过架构优化和灰度策略,确保重构过程无服务中断 提升扩展性:设计灵活的扩展点,…

C++容器内存布局与性能优化指南

C容器的内存布局和缓存友好性对程序性能有决定性影响。理解这些底层机制,能帮你写出更高效的代码。 一、容器内存布局概述 不同容器在内存中的组织方式差异显著,这直接影响了它们的访问效率和适用场景。容器类型内存布局特点元数据位置元素存储位置std::…

Beautiful.ai:AI辅助PPT工具高效搞定排版,告别熬夜做汇报烦恼

你是不是每次做 PPT 都头大?找模板、调排版、凑内容,熬大半夜出来的东西还没眼看?尤其是遇到 “明天就要交汇报” 的紧急情况,打开 PPT 软件半天,光标在空白页上晃来晃去,连标题都想不出来 —— 这种抓瞎的…