微服务最佳实践:构建可扩展且高效的系统
微服务架构彻底改变了现代软件开发,提供了无与伦比的敏捷性、可扩展性和可维护性。然而,有效实施微服务需要深入了解最佳实践,以充分发挥微服务的潜力,同时避免常见的陷阱。在这份综合指南中,我们将深入研究微服务的关键最佳实践,提供每个方面的详细见解。
1.定义微服务中的“微”
单一职责原则(SRP)
最佳实践:微服务应遵循单一职责原则 ( SRP ),具有明确定义的职责范围,封装与特定业务领域相关的所有任务。
说明:单一职责原则是软件设计中的基本概念,适用于微服务。每个微服务应该专注于单一职责,封装与特定业务领域相关的所有任务。这种方法确保微服务简洁且可维护,因为它们不会尝试做太多事情,符合 SRP 的类只有一个更改理由的原则。
简化部署
最佳实践:将小型团队与完整的所有权、离散的责任和持续交付的基础设施相结合,以降低部署微服务的成本。
说明:小型、自给自足的团队的组合(每个团队负责特定的微服务)简化了部署过程。凭借支持持续交付的完整所有权和基础设施,将微服务投入生产所需的成本和工作量显著降低。
2.拥抱领域驱动设计(DDD)
最佳实践:应用领域驱动设计 ( DDD ) 原则来设计微服务,重点关注特定业务领域,而不是尝试创建通用解决方案。
说明:领域驱动设计(DDD)是一种设计软件系统的战略方法,强调使软件结构与组织的业务领域保持一致的重要性。在实现微服务时,使用 DDD 原则来确保每个微服务准确地代表特定的业务领域至关重要。这种一致性有助于有效地建模和组织微服务,确保它们反映每个领域的独特需求和上下文。
3. 鼓励可重用性
最佳实践:促进特定领域内微服务的重用,同时允许适应不同环境中的使用。
说明:重用是微服务设计中的一个有价值的原则,但它应该仅限于组织内的特定领域。团队可以协作并商定通信模型,以调整微服务以在其原始上下文之外使用。这种方法可以提高效率和一致性,同时避免不必要的功能重复。
4. 微服务与单体系统的比较
促进服务封装
最佳实践:保持微服务较小,以确保一小群开发人员能够理解单个微服务的整体。
说明:微服务的规模应该足以让一个小团队甚至单个开发人员能够完全理解整个服务。这可以提高敏捷性、降低复杂性并促进更快的开发和维护。
推动接口标准化
最佳实践:通过标准化接口(例如,RESTful API或 AMQP 交换)公开微服务,以实现重用而无需紧密耦合。
说明:微服务应通过抽象底层实现的标准化接口相互通信。这种方法使其他服务和应用程序能够使用和重用微服务,而无需与它们紧密耦合,从而提高灵活性和可维护性。
启用独立扩展
最佳实践:确保微服务作为独立的部署工件存在,从而允许它们独立于其他服务进行扩展。
说明:微服务应设计为可单独部署和扩展的独立单元。这种灵活性使组织能够根据每个微服务的具体需求有效地分配资源,从而提高性能和资源利用率。
自动化部署
最佳实践:在整个软件开发生命周期中实施自动化,包括部署自动化和持续集成。
说明:自动化对于微服务实现快速开发、测试和部署至关重要。持续集成和自动化部署管道使组织能够简化发布流程,减少手动干预并确保部署的一致和可靠。
5. 服务网格和管理实践
命令查询职责分离 (CQRS)
最佳实践:考虑将微服务分为命令和查询职责,特别是对于高流量要求。
说明:在特定业务功能经历高流量的情况下,将负责处理查询(信息检索)的微服务与处理命令(状态更改功能)的微服务分开可能是有益的。这种模式称为命令查询职责分离 (CQRS),可优化性能和可扩展性。
事件溯源
最佳实践:通过将状态更改存储为日志业务事件来实现最终一致性。
说明:为了确保微服务之间的一致性,尤其是异步工作时,请考虑采用事件溯源方法。微服务可以使用发布到消息代理的域事件进行协作,而不是依赖分布式事务。一旦所有微服务完成其工作,这种方法可确保最终的一致性。
组合应用程序的持续交付
最佳实践:对组合微服务应用程序实施持续交付,以确保业务目标的敏捷性和实时验证。
说明:持续交付对于实现敏捷性和验证组合的微服务应用程序是否满足其业务目标至关重要。短发布周期、对构建失败的快速反馈以及自动化部署设施是这种方法的关键组成部分。
使用服务网格降低复杂性
最佳实践:实施服务网格架构以简化微服务管理,确保安全、快速、可靠的服务间通信。
说明:服务网格是一种架构模式,它通过在服务之间提供安全可靠的通信来简化微服务的管理。它抽象了治理注意事项并增强了微服务交互的安全性和性能。
6. 容错和恢复能力
最佳实践:实施容错和弹性机制,确保微服务能够优雅地承受故障并从故障中恢复。
说明:微服务的设计应能够处理故障,而不会造成大范围的中断。这包括断路器、重试机制、优雅降级以及响应故障的自我修复能力等策略。优先考虑容错和恢复能力可确保系统在不利条件下保持稳定和响应能力。
7. 监控和记录
最佳实践:建立全面的监控和日志记录实践,以深入了解微服务的运行状况和性能。
说明:监控和日志记录对于了解微服务在生产中的行为至关重要。实施强大的监控工具和日志记录框架来跟踪关键性能指标、检测异常、解决问题并获得可行的见解。主动监控和日志记录可以及时响应事件并持续改进微服务。
通过整合这两个额外的最佳实践(容错和弹性以及监控和日志记录),组织可以进一步增强其基于微服务的系统的可靠性和可管理性。
8. 分散数据管理
最佳实践:在微服务架构中,每个微服务都应该维护自己的数据副本,避免多个服务访问或共享同一数据库。
说明:微服务受益于数据去中心化,其中每个微服务独立管理自己的数据。重要的是不要设置多个服务来访问或共享同一个数据库,因为这会破坏微服务的自治性。相反,设计微服务来拥有和管理他们的数据。要实现对微服务数据的受控访问,请实现充当其他服务网关的 API。这种方法强制执行集中访问控制,允许开发人员无缝地合并审计日志记录和缓存等功能。争取每个微服务包含一个或两个数据库表的数据结构,确保数据的干净分离和封装。
9. 促进松散耦合策略
最佳实践:采用促进微服务之间松散耦合的策略,无论是在传入还是传出依赖性方面。
说明:在微服务架构中,保持服务之间的松散耦合对于灵活性和可扩展性至关重要。为了实现这一目标,请考虑采用各种鼓励松散耦合的策略:
-
点对点和发布-订阅:利用消息传递模式,例如点对点和发布-订阅。这些模式有助于将发送者和接收者解耦,因为它们彼此不知情。在此设置中,反应式微服务(如 Kafka 消费者)的契约由消息队列的名称和消息的结构定义。这种隔离最大限度地减少了服务之间的依赖关系。
-
API 优先设计:采用契约优先设计方法,其中 API 的设计独立于现有代码。这种做法会阻止创建与特定技术和实现紧密耦合的 API。通过首先定义契约,您可以确保它与技术无关并能够适应变化,从而促进服务之间的松散耦合。
通过整合这些策略,您可以增强微服务之间的松散耦合,使您的架构更具弹性并能够适应不断变化的需求。
结论
上述核心设计原则为构建有效的微服务架构奠定了坚实的基础。虽然遵守这些原则至关重要,但微服务设计的成功不仅仅在于合规性。它需要对质量属性要求的透彻理解,以及在考虑权衡的同时做出明智的设计决策的能力。此外,熟悉符合这些原则的设计模式和架构策略也至关重要。同样重要的是对可用技术选择的深入了解,因为它们在微服务的实施和运营中发挥着关键作用。最终,将这些设计原则与仔细考虑需求、设计模式和技术选项相结合的整体方法为成功的微服务设计和实施铺平了道路。
作者:Lav Kumar
更多技术干货请关注公号【云原生数据库】
squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。
irds.cn,多数据库管理平台(私有云)。
相关文章:
微服务最佳实践:构建可扩展且高效的系统
微服务架构彻底改变了现代软件开发,提供了无与伦比的敏捷性、可扩展性和可维护性。然而,有效实施微服务需要深入了解最佳实践,以充分发挥微服务的潜力,同时避免常见的陷阱。在这份综合指南中,我们将深入研究微服务的关…...
源码赏析: 数据结构转换工具 configor (一)
一、configor 先贴地址 configor,先看configor的特性: Header-only & STL-likeCustom type conversion & serializationComplete Unicode supportASCII & Wide-character support 说白了,这个工具用于自定义类型的转换和序列化…...
使用java调用python批处理将pdf转为图片
你可以使用Java中的ProcessBuilder来调用Python脚本,并将PDF转换为图片。以下是一个简单的Java代码示例,假设你的Python脚本名为pdf2img.py: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader…...
机器学习——自领域适应作业
任务 游戏里面的话有很多跟现实不一样的情况。 想办法让中间的特征更加的接近,让feat A适应feat B,产生相对正常的输出。 在有标签数据和没有数据的上面进行训练,并能预测绘画图像。 数据集 训练5000张总数,每类有500张测试100…...
ValidatorUtil字段验证工具类
字段验证工具类 package com.aa.bb.cc.common.utils;import com.aa.bb.cc.common.exception.BusinessException; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils;import javax.validation.ConstraintViolation; import…...
Python 自动化之处理图片(一)
图片美化与大小调整 文章目录 图片美化与大小调整前言一、基本结构二、引入库三、用户输入模块四、图片美化模块五、大小调整模块总结 前言 本文主要分为两部分。一是图片的美化吧算是,主要从亮度、对比、色彩饱和度、锐度四个方面进行美化;二是图片的像…...
Axure动态面板的应用与ERP系统登录界面、主页左侧菜单栏、公告栏的绘制
目录 一、动态面板 1.1 简介 1.2 使用动态面板的原因 二、动态面板之轮播图实现案例 2.1 完成步骤 2.2 最终效果 三、动态面版之多方式登录案例 四、动态面板之后台主界面左侧菜单栏 五、ERP登录界面 六、ERP主界面菜单栏 七、ERP公告栏 八、登录页面跳转公告栏 一…...
电机(按工作电源分类)介绍
文章目录 一、什么是电机?二、按工作电源分类直流电机1.直流有刷电机结构工作原理:直流减速电机 2.直流无刷电机结构工作原理: 3.总结结构和工作原理:效率和功率损耗:调速性能:寿命和可靠性:应用…...
Web前端JS通过使用AudioWorkletNode() 获取 Video/Audio 视音频声道(左右声道|多声道)
写在前面: 在之前的博文Web前端JS如何获取 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据中,介绍了通过使用AudioContext.createScriptProcessor()方法来获取视音频音轨(声道)数据。但由于W3C不再推荐使用该A…...
力扣LeetCode75题
为了面试,小伙伴们可以平时练下算法题,有备无患。 LeetCode 75 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台...
如何向领导汇报工作?一篇文章告诉你!
给领导汇报工作可以从两个方面考虑:一是工作汇报文件的制作;一是汇报方式。一份全面、清晰且准确的文件,加上一目了然的、科技满满的汇报方式,相比领导不满意都难~下面就让你全部get! 一、工作汇报的文字内…...
GPT-4.5!!!
GPT-4 还没用明白,GPT-4.5 就要发布了。 最近,OpenAI 泄露了 GPT-4.5 的发布页面,除了进一步增强复杂推理和跨模态理解,GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持,也就意味着多模态最后一块版图…...
kafka入门(四):kafka生产者发送消息
创建生产者实例和构建消息之后,就可以开始发送消息了。 发送消息主要有三种模式:发后即忘、同步、异步。 发后即忘: 就是直接调用 生产者的 send方法发送。 发后即完,只管往 kafka中发送消息,而不关心消息是否正确…...
redis集群模糊获取缓存redisKey
redis cluster集群删除指定模糊redisKey的信息 **public int deleteRedisKey(String key){AtomicReference<Integer> result new AtomicReference<>(0);busnessLogger.info("开始删除指定业务的模糊Key,deleteRedisKey:{}",key);try{Set<HostAndPor…...
100GPTS计划-AI翻译TransLingoPro
地址 https://poe.com/TransLingoPro https://chat.openai.com/g/g-CfT8Otig6-translingo-pro 测试 输入: 我想吃中国菜。 预期翻译: I want to eat Chinese food. 输入: 请告诉我最近的医院在哪里。 预期翻译: Please tell me where the nearest hospital is. 输入: 明天…...
Linux install manual 1Panel
前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定;高效管理:通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等;安全可…...
母婴服务品牌网站的效果如何
随着三胎政策落实及人们生活水平提升,母婴市场发展迅速上升,加之以90后、00后适龄生育的人群悦己消费加强,孕前孕后及婴儿本身就会使用相当好的服务,这也为市场带来了较大机会。 近几年,老品牌在不断加力,…...
C语言--有一个3*4的矩阵,求出其中最大值的那个元素的值,以及其所在的行号和列号
一.题目描述 有一个3*4的矩阵,要求求出其中最大值的那个元素的值,以及其所在的行号和列号 比如:给定一个3*4的矩阵如下 输出结果:最大值为 12 ,行号为3, 列号为2 二.思路分析 打擂台算法: 先思考…...
安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换
安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换 本章介绍了共享密钥加密、公开密钥加密,和两种加密方法混合使用的混合加密方法;最后介绍了迪菲-赫尔曼密钥交换。 加密数据的方法可以分为…...
MYSQL练题笔记-高级字符串函数 / 正则表达式 / 子句-简单3题
这个系列先写了三题,比较简单写在一起。 1.修复表中的名字相关的表和题目如下 看题目就知道是有关字符串函数的,于是在书里查询相关的函数,如下图,但是没有完全对口的函数,所以我还是去百度了。 然后发现结合上面的4个…...
vue扭蛋机抽奖游戏
简易扭蛋机demo 这是一个使用CSS3和JavaScript实现的扭蛋机抽奖游戏。该游戏的主要功能是通过点击按钮进行抽奖,抽奖过程中会显示滚动的小球,最终随机停止并显示一个中奖小球。 该游戏的抽奖过程如下: 当用户点击抽奖按钮时,首先检查当前是否正在进行抽奖任务或者当前有小…...
代码随想录27期|Python|Day16|二叉树|104.二叉树的最大深度|111.二叉树的最小深度|222.完全二叉树的节点个数
二叉树专题,重点掌握后续的递归和中间节点的处理。 104. 二叉树的最大深度 - 力扣(LeetCode) 本题在前一章已经解决了层序遍历的解法,现在来聊一下递归法。 首先需要明确两个概念:深度和高度。(注意&…...
༺༽༾ཊ—设计-简介-模式—ཏ༿༼༻
我对设计模式的理解就是一种可复用的且面向对象的设计工具,它与代码无关,我们可以利用设计模式设计出高内聚、低耦合的应用程序,并且最大程度实现程序的复用,以应对复杂的需求变化。 程序的可复用性就是用已存在的程序模块进行更新…...
Matplotlib快速入门,Python通用的绘图工具库上手
Matplotlib是一个用于Python编程语言的综合性绘图库。 它可以生成各种类型的图表,包括折线图、条形图、散点图、直方图、饼图等。Matplotlib支持多种数据格式,包括NumPy数组、Pandas DataFrame和CSV文件。它还可以从URL读取数据。 Matplotlib可以在交互…...
Linux 基本语句_16_Udp网络聊天室
代码: 服务端代码: #include <stdio.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> #include <unistd.h> #include <string…...
使用ffmpeg命令进行视频格式转换
1 ffmpeg介绍 FFmpeg 是一个非常强大和灵活的开源工具集,用于处理音频和视频文件。它提供了一系列的工具和库,可以用于录制、转换、流式传输和播放音频和视频。 FFmpeg 主要特点如下: 格式支持广泛:FFmpeg 支持几乎所有的音频和视…...
Mac安装Adobe AE/pr/LR/ai/ps/au/dw/id 2024/2023报错问题解决(常见错误:已损坏/2700/146/130/127)
1.打开允许“允许任何来源” 如何打开允许任何来源?在 Finder 菜单栏选择 【前往】 – 【实用工具 】,找到【终端】程序,双击打开,在终端窗口中输入:sudo spctl --master-disable 输入代码后,按【return …...
Python三级 每周练习题31
如果你感觉有收获,欢迎给我微信扫打赏码 ———— 以激励我输出更多优质内容 练习一: 作业1:编写程序,在下面的字典中找出身高137的同学并输出姓名,如果没找到, 输出没有 a{‘小赵’:136,‘小钱’:141,‘小孙’:146,‘小李’:13…...
【DataSophon】大数据服务组件之Flink升级
🦄 个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁&am…...
Android笔记(十八):面向Compose组件结合Retrofit2和Rxjava3实现网络访问
一、Retrofit2 Square公司推出的Retrofit2库(https://square.github.io/retrofit/),改变了网络访问的方式。它实现了网络请求的封装。Retrofit库采用回调处理方式,使得通过接口提交请求和相应的参数的配置,就可以获得…...
从零做网站/域名检测查询
tail -f 等同于--followdescriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止 tail -F 等同于--followname --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后ÿ…...
公司法人查询/seo外包
一、简述 最近学习使用Vue实现前端后端分离,在Github上有一个很好的开源项目:mall,正所谓百看不如一练,自己动手实现了一个SpringbootVue的登录操作,在此记录一下踩过的坑。 文章最后补充两端的GitHub代码࿰…...
wordpress 多域名共享数据库/百度指数人群画像哪里查询
点击关注亚洲新能源汽车网,星标公众号专业的行业新闻及深度报道,不容错过深圳市机佳机自动化设备有限公司 副总经理东莞市机佳机科技有限公司 总经理 冯竹梅青出于蓝而胜于蓝随着汽车市场的繁荣和崛起,物联网、车联网概念的兴起,促…...
做NBA网站目的/郑州seo技术代理
cool isnt it?in ruby 1.9.x also has this feature toin java there is a linkedHaspMap do the same thing...
本地赣州网站建设/个人网站
最近去参加了几场面试,分享一下题目。 招银网络2019-03-20社招 1.悲观锁、乐观锁,区别用法? 2.三个项目共用一个数据库,怎么解耦? 3.5分钟之内登录两次以上的用户,给予弹框提醒,怎么设计&…...
重庆神态网站建设/郑州seo培训
python基础篇(一)使用的python版本都是python3.xpython的发展及各种介绍请自行去搜索补脑,这里就不介绍了。第一个程序:一、教你hello,worldprint(Hello,World!!!)二、用户交互程序name input("Your Name:")age input("Your Age:")…...