当前位置: 首页 > news >正文

[微服务设计]1_微服务

摘要:微服务设计应当是面向服务、适配团队、循序渐进的设计。

目录

开篇引言

微服务

什么样的服务是健康的服务

什么是微服务

面向服务的架构

微服务较传统单体架构多的行为

微服务行为带来的问题

微服务解决的问题


开篇引言

在之前的工作中,有接触过一些微服务的设计方法,例如按照业务职责划分、设计微服务时该考虑的特性……

享受过微服务带来的好处,如快速修改服务、简化部署。也应对过微服务带来的挑战,追踪一个问题跨越数十个服务等。

也了解过一些微服务设计“哲学”——什么“不追求最佳实践就是最佳实践”、“适合团队的微服务才是最好的微服务”等……零零散散,说出来也结结巴巴。

那么,该怎么成体系更深入的了解微服务呢?

从《微服务设计》这本书开始吧。

文章按照自己的理解进行了内容补充和编排,《微服务设计》阅读起来会更轻松,文章更适合当做综合性笔记用于检索。

微服务

什么样的服务是健康的服务

一个健康的服务应具备:功能正确、性能高效、可用性高、可维护性强、健壮抗压、协作顺畅。它通过技术(如容错、监控)和设计(如自洽、单一职责)实现,既满足业务需求,又能在复杂环境中稳定运行。健康状态需通过指标量化并持续优化。

服务最开始是单体服务,随时间演化,代码库变得臃肿庞大。

所有功能代码耦合在一起。

此时,服务开始变得不健康,会有高耦合、低拓展性、可用性差、维护困哪、开发效率低、健壮性不足的等问题。且所有功能耦合在一起,缺乏隔离和灵活性。

微服务架构正是针对这些问题提出的改进方案。

一些指标定义如下:

1. 功能性(Functional Health)

  • 正确性:服务按预期完成业务功能,无逻辑错误。

    • 例子:订单服务能准确创建订单并返回结果。

  • 一致性:数据和状态符合业务规则。

    • 例子:支付成功后库存同步扣减。

2. 性能(Performance Health)

  • 低延迟:响应时间短,满足用户体验(通常<200ms)。

    • 例子:用户查询订单状态不超过100ms。

  • 高吞吐:能处理预期并发量。

    • 例子:支持每秒1000次请求。

  • 资源利用合理:CPU、内存、I/O不过载。

    • 例子:内存占用稳定在50%以下。

3. 可用性(Availability Health)

  • 高可用:服务 uptime 高(如99.9%),宕机时间少。

    • 例子:年宕机不超过8小时。

  • 容错:单点故障不影响整体功能。

    • 例子:依赖服务超时,触发熔断返回默认值。

  • 自愈:能自动恢复(如重启、重试)。

    • 例子:Kubernetes检测Pod崩溃并重启。

4. 可维护性(Maintainability Health)

  • 清晰边界:职责单一,接口明确。

    • 例子:支付服务只处理支付,不混杂订单逻辑。

  • 可观测:提供日志、指标、追踪,便于诊断。

    • 例子:集成Prometheus监控请求延迟。

  • 易扩展:代码和架构支持快速迭代。

    • 例子:新增支付方式只需改支付服务。

5. 健壮性(Robustness Health)

  • 异常处理:能优雅应对错误,不崩溃。

    • 例子:输入非法参数时返回400而非500。

  • 流量控制:防过载(如限流、降级)。

    • 例子:每秒超1000请求时限流。

  • 安全性:防止攻击(如SQL注入、DDoS)。

    • 例子:使用OAuth认证。

6. 协作性(Collaboration Health)

  • 接口稳定:API契约不随意变更。

    • 例子:/orders接口保持向下兼容。

  • 通信高效:与其他服务协同顺畅。

    • 例子:异步事件通过Kafka可靠传递。

  • 数据自治:不依赖其他服务的数据源。

    • 例子:自带订单数据库。

健康服务的量化指标

  • SLA(服务级别协议):

    • 可用性:99.9%。

    • 响应时间:P95 < 200ms。

  • 错误率:低于0.1%。

  • 资源使用率:CPU<70%,内存<80%。

  • 告警恢复时间:MTTR(平均修复时间)<30分钟。

什么是微服务

微服务就是协同工作的小而自洽的服务。

定义:

“微服务的协作”——是微服务设计中的重要一环,需要考虑因为微服务带来的“微服务通信”、“微服务监控”、“微服务安全”等问题。

“小”——“微服务该多小”的设计是一个很考验领域划分能力的事情,但是据实际工作经验来看,这更多的跟团队架构相关。“组织架构很大程度上决定了软件架构”。

“自洽”——生命周期独立(开发、测试、部署、升级独立)不受其他服务牵制;功能独立;数据自洽(有自己的数据存储)。

面向服务的架构

从个人的经验来看,生产中中小型企业很难做到让所有服务都处于健康的状态。多数企业也不会以技术位驱动进行产品或项目的开发。

从面向服务的角度来说,拥有微服务带来的好处的同时,也拥有了微服务带来的问题,如通信消耗、监控、日志等。

需要铭记的是:系统架构的演变并非一蹴而就,而是一个循序渐进的过程。不要期待一步到位,逐步优化和调整才是正道。

微服务较传统单体架构多的行为

服务拆分:将功能分解为多个独立服务。

分布式部署:每个服务单独运行于不同进程或节点。

接口通信:服务间通过API(如REST、gRPC)或消息队列(如Kafka)交互。

独立数据存储:每个服务拥有自己的数据库。

独立生命周期:服务单独开发、测试、部署。

动态伸缩:按需调整单个服务的实例数。

事件驱动:异步通信和事件订阅(如支付完成通知订单)。

微服务行为带来的问题

复杂度增加:管理多个服务、通信和部署更复杂。

网络开销:服务间调用引入延迟和带宽消耗。

数据一致性挑战:分布式数据难保持强一致性,需依赖最终一致性。

故障排查难:问题跨服务传播,需分布式追踪(如Zipkin)。

运维负担:监控、日志、容器管理(如Kubernetes)成本高。

接口不稳定:服务间契约变更可能导致兼容性问题。

资源分散:多服务运行可能浪费资源。

微服务解决的问题

耦合过高:单体模块紧耦合,微服务解耦为独立单元。

扩展受限:单体全量伸缩,微服务按需扩容。

部署缓慢:单体全量部署耗时,微服务独立快速发布。

单点故障:单体崩溃影响全局,微服务隔离故障。

开发效率低:单体多人冲突,微服务团队自治。

技术僵化:单体技术栈单一,微服务支持多样化。

性能瓶颈:单体资源竞争,微服务分散负载。

总体而言,微服务的设计旨在打造一种低耦合、高内聚、具备容错能力、可扩展性强且适应敏捷开发的架构模式。它带来了“技术异构性”、“弹性伸缩”、“灵活扩展”、“简化部署”、“与组织结构对齐”、“可组合性”以及“优化可替代性”等显著优势。

相关文章:

[微服务设计]1_微服务

摘要&#xff1a;微服务设计应当是面向服务、适配团队、循序渐进的设计。 目录 开篇引言 微服务 什么样的服务是健康的服务 什么是微服务 面向服务的架构 微服务较传统单体架构多的行为 微服务行为带来的问题 微服务解决的问题 开篇引言 在之前的工作中&#xff0c;有…...

Webservice创建

Webservice创建 服务端创建 3层架构 service注解&#xff08;commom模块&#xff09; serviceimpl&#xff08;server&#xff09; 服务端拦截器的编写 客户端拦截器 客户端调用服务端&#xff08;CXF代理&#xff09; 客户端调用服务端&#xff08;动态模式调用&a…...

Unity安卓Android从StreamingAssets加载AssetBundle

在安卓下无法获取StreamingAssets目录下所有目录和文件名&#xff0c;所以需要提前将文件名整理成一个文件filelist.txt。 1.用批处理命令将StreamingAssets下所有文件名输出到filelist.txt中 chcp 65001是使用UTF-8编码&#xff0c;否则中文是乱码。 echo off chcp 65001 d…...

【MySQL_06】表的相关操作

文章目录 一、表的基本操作1.1 创建表1.2 修改表结构1.2.1 添加列1.2.2 删除列1.2.3 修改列1.2.4 重命名列1.2.5 添加约束 1.3 删除表1.4 查询表结构1.5 重命名表1.6 复制表1.6.1 仅复制结构1.6.2 复制结构及数据 1.7 清空表数据 二、数据完整性约束2.1 主键约束2.2 唯一约束2.…...

如何选择开源向量数据库

文章目录 评估维度查询性能索引与存储扩展性数据管理能力生态支持 常见向量数据库对比 评估维度 选择开源向量数据库时&#xff0c;需要综合考虑查询性能、数据规模、索引构建速度、生态支持等多个因素&#xff0c;以下是关键的评估维度&#xff1a;选择开源向量数据库时&…...

c#面试题整理4

1.stirng str"",string strnull&#xff0c;俩者有何区别 空字符串占有存储控件&#xff0c;null不占用 2.class与struct的异同 异同class 可继承 引用类型 1.都可以定义方法字段 2.都可实例化&#xff0c;与类的使用几乎一样 struct 不可继承 值类型 只能声明带…...

智能焊机监测系统:打造工业安全的数字化盾牌

在现代工业生产中&#xff0c;焊机作为核心设备之一&#xff0c;其稳定性和安全性直接关系到生产效率和产品质量。德州迪格特科技有限公司推出的智能焊机监测系统&#xff0c;通过先进的技术手段&#xff0c;为工业生产构筑了一道坚固的安全防线。 智能监测&#xff0c;保障焊…...

Centos的ElasticSearch安装教程

由于我们是用于校园学习&#xff0c;所以最好是关闭防火墙 systemctl stop firewalld systemctl disable firewalld 个人喜欢安装在opt临时目录&#xff0c;大家可以随意 在opt目录下创建一个es-standonely-docker目录 mkdir es-standonely-docker 进入目录编辑yml文件 se…...

一二三应用开发平台——能力扩展:多数据源支持

背景 随着项目规模的扩大&#xff0c;单一数据源已无法满足复杂业务需求&#xff0c;多数据源应运而生。 技术选型 MyBatis-Plus 的官网提供了两种多数据源扩展插件&#xff1a;开源生态的 <font style"color:rgb(53, 56, 65);">dynamic-datasource</fon…...

pandas-基础(数据结构及文件访问)

1 Pandas的数据结构 1.1 Series 特点&#xff1a;一维的数据型对象&#xff0c;包含一个值序列和数据标签(即索引&#xff09; 创建Series&#xff1a; pandas.Series(dataNone, indexNone, dtypeNone, nameNone, copyFalse, fastpathFalse) 参数说明&#xff1a; data&a…...

数据分析与AI丨AI Fabric:数据和人工智能架构的未来

AI Fabric 架构是模块化、可扩展且面向未来的&#xff0c;是现代商业环境中企业实现卓越的关键。 在当今商业环境中&#xff0c;数据分析和人工智能领域发展可谓日新月异。几乎每天都有新兴技术诞生&#xff0c;新的应用场景不断涌现&#xff0c;前沿探索持续拓展。可遗憾的是&…...

如何根据应用需求选择光谱相机

一、按核心参数匹配需求 ‌光谱范围‌ ‌农业监测‌&#xff1a;需覆盖可见光至近红外&#xff08;400-1000nm&#xff09;&#xff0c;以捕捉作物叶绿素、水分等特征‌。 ‌地质勘探‌&#xff1a;需宽光谱&#xff08;350-2500nm&#xff09;及高分辨率&#xff08;3-10nm…...

内存泄漏出现的时机和原因,如何避免?

由于时间比较紧张我就不排版了&#xff0c;但是对于每一种可能的情况都会出对应的代码示例以及解决方案代码示例。 内存泄漏可能的原因之一在于用户在动态分配一个内存空间之中&#xff0c;忘记将这部分内容手动释放。例如&#xff1a;&#xff08;c之中使用new分配内存没有使…...

Python第十六课:深度学习入门 | 神经网络解密

🎯 本节目标 理解生物神经元与人工神经网络的映射关系掌握激活函数与损失函数的核心作用使用Keras构建手写数字识别模型可视化神经网络的训练过程掌握防止过拟合的基础策略一、神经网络基础(大脑的数字化仿生) 1. 神经元对比 生物神经元人工神经元树突接收信号输入层接收特…...

从0到1,带你开启TypeScript的奇妙之旅

目录 一、TypeScript 是什么? 二、为什么要学习 TypeScript? 三、快速上手:环境搭建与 Hello World (一)安装 TypeScript (二)创建第一个 TypeScript 文件 (三)编译 TypeScript 文件 (四)运行编译后的 JavaScript 文件 四、深入 TypeScript 核心语法 (一)…...

如何修复“RPC 服务器不可用”错误

远程过程调用&#xff08;Remote Procedure Call&#xff0c; RPC&#xff09;是允许客户端在不同计算机上执行进程的众多可用网络进程之一。本文将深入探讨RPC如何在不同的软件系统之间实现无缝消息交换&#xff0c;同时重点介绍与RPC相关的常见错误的一些原因。 什么是远程过…...

【redis】五种数据类型和编码方式

文章目录 五种数据类型编码方式stringhashlistsetzset查询内部编码 五种数据类型 字符串&#xff1a;Java 中的 String哈希&#xff1a;Java 中的 HashMap列表&#xff1a;Java 中的 List集合&#xff1a;Java 中的 Set有序集合&#xff1a;除了存 member 之外&#xff0c;还有…...

今日头条文章爬虫教程

今日头条文章爬虫教程 随着互联网的发展&#xff0c;新闻资讯类平台如今日头条积累了海量的数据。对于数据分析师、研究人员等群体来说&#xff0c;获取这些数据进行分析和研究具有重要的价值。本文将介绍如何使用Python编写爬虫&#xff0c;爬取今日头条的文章数据。 一、准…...

使用Modelsim手动仿真

FPGA设计流程 在设计输入之后,设计综合前进行 RTL 级仿真,称为综合前仿真,也称为前仿真或 功能仿真。前仿真也就是纯粹的功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟。在完成一个设计的代码编写工作之后,可以直接对代码进行仿真,…...

从Manus看网络安全:通用AI智能体重构安全运营

当通用AI智能体遇见网络安全 开启主动防御的跃迁 在勒索软件平均潜伏期缩短至3.7天、APT攻击复杂度指数级攀升的当下&#xff0c;传统SOAR产品&#xff08;安全编排、自动化和响应&#xff09;正面临两大困境&#xff1a; 规则依赖症&#xff1a;基于Playbook的响应逻辑&…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...