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

05如何做微服务架构设计

一句话导读

        微服务架构设计方法有:领域驱动设计DDD(Domain-Driven-Design)、12因素应用(12-Factor App)、事件驱动架构EDA(Event-Driven Architecture)等等,但是他们都必须遵守微服务架构设计的一些共同特点,本文主要说明微服务架构设计的原则、要点、以及注意事项。

目录

一句话导读

一、先谈谈什么是软件架构

二、再谈谈架构风格

        1. 分层架构风格(Layered Architecture)

        2. 客户端-服务器架构风格(Client-Server Architecture)

        3. 分布式架构风格(Distributed Architecture)

        4. 事件驱动架构风格(Event-Driven Architecture)

        5. 微服务架构风格(Microservices Architecture)

        6. 六边形架构风格(Hexagonal Architecture)

        7. 说说微服务架构设计风格

三、微服务架构设计的原则

        1. 单一职责原则

        2. 自包含性原则

        3. 自治性原则

        4. API 设计原则

        5. AKF拆分原则

        6. 前后端分离原则

        7. 无状态服务原则

四、微服务架构设计的要点

        1. 服务间通信机制

        2. 服务注册与发现

        3. 负载均衡

        4. 容错与熔断

        5. 持续集成和部署

        6. 监控和日志记录

        7. 数据库选择

        8. 版本管理

五、微服务架构设计注意事项

        1. 避免过度细化

        2. 避免过度共享

        3. 强调容错和恢复

        4. 监控和追踪

        5. 安全性和权限

        6. 团队协作


一、先谈谈什么是软件架构

        对于一个程序员来说,他的终极目标,绝大部分可能就是架构师,公司里总会有那么几个神秘人物以架构师的title存在,要想成为架构师,首先得了解神秘是架构,那么到底什么是架构呢?维基百科、百度等都有很多回答,但是我同意《微服务架构模式》这本书的作者克里斯·理查森(Chris Richardson)的观点:计算机系统的软件架构是构建这个系统所需的一组结构,包括软件元素、它们之间的关系以及两者的属性。

        也就是说软件架构师要做的就是将系统拆分成不同的软件元素、设计出它们直接的关系、以及各个元素的属性。对应到我们工作中常见的技术组件、组件属性、组件之间如何调用等。这里我们提下软件架构设计的4+1视图模型,有兴趣的朋友可以自己搜索研究下。

二、再谈谈架构风格

        在软件架构设计中,不同的架构风格决定了系统的组织方式和结构。不同的架构风格适用于不同的场景和需求。以下列举了一些常见的架构风格:

        1. 分层架构风格(Layered Architecture)

        分层架构风格是一种常见的软件架构风格,它将系统划分为多个层次,每个层次负责处理特定的任务。通常包括表示层、业务逻辑层和数据访问层。这种风格的优点是结构清晰、易于维护和扩展,适用于大多数企业应用系统。

        2. 客户端-服务器架构风格(Client-Server Architecture)

        客户端-服务器架构风格是一种基于网络通信的软件架构风格。客户端和服务器之间通过请求-响应的方式进行通信。这种风格的优点是可扩展性和并发性较好,适用于网络通信场景。将系统分为客户端和服务器,客户端发送请求并接收响应,服务器处理请求并提供服务。

        3. 分布式架构风格(Distributed Architecture)

        分布式架构风格将系统划分为多个独立的子系统,每个子系统负责处理一部分业务逻辑。这些子系统之间通过网络通信进行协作。这种风格的优点是可伸缩性较好,适用于大规模、高并发场景。

        4. 事件驱动架构风格(Event-Driven Architecture)

        事件驱动架构风格是一种基于事件驱动的软件架构风格。在这种风格中,系统的执行动力来自于事件,事件驱动系统中的各个组件进行相应的处理。这种风格的优点是系统松耦合、易于扩展和维护,适用于大规模、高并发场景。

        5. 微服务架构风格(Microservices Architecture)

        微服务架构风格是一种将系统划分为多个微服务的软件架构风格。每个微服务负责处理一部分业务逻辑,并与其他微服务进行通信协作。这种风格的优点是灵活性和可伸缩性较好,适用于云端、容器化等新兴技术场景。

        6. 六边形架构风格(Hexagonal Architecture)

       六边形架构风格也称为端口和适配器架构,强调将应用程序核心(领域模型)与外部系统进行隔离,以支持业务需求的变化。

        7. 说说微服务架构设计风格

        上面我们也说了微服务架构风格,微服务架构设计风格强调的是将应用程序拆分成一组微小的、相互解耦的、自治的服务,他的目标就是为了提高系统的灵活性、可扩展性、高可用性等。

三、微服务架构设计的原则

        1. 单一职责原则

        每个微服务应该关注一个特定的业务领域,拥有明确的职责,避免功能的混合和耦合。

        2. 自包含性原则

        每个微服务应该是自包含的,具有独立的数据库和数据存储,减少服务之间的直接依赖。

        3. 自治性原则

        每个微服务应该是自治的,能够独立开发、部署、扩展和维护,不会对其他服务造成影响。

        4. API 设计原则

        定义明确的API接口,确保微服务之间的通信方式一致性和易用性。考虑版本控制和演进。

        5. AKF拆分原则

        AKF扩展立方体(参考《The Art of Scalability》),这些原则由Martin Fowler和他的团队提出的应用扩展的三个维度。理论上按照这三个扩展模式,可以将一个单体系统,进行无限扩展。以AKF为缩写,代表了原则的三个重要维度:可用性(Availability)、扩展性(Scalability)和灵活性(Flexibility)。旨在帮助团队在设计和划分微服务时,考虑到系统的可扩展性、灵活性和性能

        6. 前后端分离原则

        前后端分离原则,简单来讲就是前端和后端的代码分离也就是技术上做分离,我们推荐的模式是最好直接采用物理分离的方式部署,进一步促使进行更彻底的分离。不要继续以前的服务端模板技术,比如JSP ,把Java JS HTML CSS 都堆到一个页面里,稍复杂的页面就无法维护。

        7. 无状态服务原则

        对于无状态服务,首先说一下什么是状态:如果一个数据需要被多个服务共享,才能完成一笔交易,那么这个数据被称为状态。进而依赖这个“状态”数据的服务被称为有状态服务,反之称为无状态服务。

四、微服务架构设计的要点

        1. 服务间通信机制

        选择适合的通信方式,如HTTP、RPC、消息队列等,确保微服务之间的通信畅通。冗余的硬件资源,确保实现故障切换机制。合适的重试机制,确保服务能够正常提供服务。

        2. 服务注册与发现

        使用服务注册与发现工具管理服务实例,实现动态发现和负载均衡。

        3. 负载均衡

        引入负载均衡机制,将请求均匀分布到不同的服务实例,提高性能和可用性。

        4. 容错与熔断

        使用容错和熔断机制,防止故障的蔓延,保护系统的稳定性。

        5. 持续集成和部署

        建立自动化的持续集成和持续部署流程,支持快速迭代和交付。

        6. 监控和日志记录

        建立监控和日志系统,对微服务进行监控和日志记录,帮助问题定位和性能优化。

        7. 数据库选择

        根据业务需求选择适当的数据库类型,避免数据库成为瓶颈。

        8. 版本管理

        管理微服务的版本,确保服务之间的兼容。每个服务应用有自己的版本,应建立合适的版本发布和回滚机制,确保服务的稳定性和可靠性

五、微服务架构设计注意事项

        1. 避免过度细化

        不要将微服务划分得过于细化,以免引入过多的管理和复杂性。

        2. 避免过度共享

        不要让微服务之间的数据共享过多,避免数据的耦合和一致性问题。

        3. 强调容错和恢复

        考虑故障和异常情况,引入容错机制和故障恢复策略,确保系统的稳定性。

        4. 监控和追踪

        建立监控和日志记录系统,对每个微服务进行监控和追踪,方便故障排查和性能优化。

        5. 安全性和权限

        引入身份验证和授权机制,保障微服务之间的通信和数据安全。

        6. 团队协作

        在设计和开发过程中,确保团队成员之间的紧密合作和沟通,协调微服务之间的协作和交互。

相关文章:

05如何做微服务架构设计

一句话导读 微服务架构设计方法有:领域驱动设计DDD(Domain-Driven-Design)、12因素应用(12-Factor App)、事件驱动架构EDA(Event-Driven Architecture)等等,但是他们都必须遵守微服务…...

安卓开发问题记录:需要常量表达式

问题原因 写代码过程中爆出这个错误:需要常量表达式,定位到switch。 解决方法:把switch case,改成if else 错误源代码: public void onClick(View view) {switch (view.getId()) {case R.id.iv_code:RxCaptcha.build(…...

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测预测效果基本介绍研究内容程序设计参考资料…...

配置root账户ssh免密登录并使用docker-machine构建docker服务

简介 Docker Machine是一种可以在多种平台上快速安装和维护docker运行环境,并支持多种平台,让用户可以在很短时间内在本地或云环境中搭建一套docker主机集群的工具。 使用docker-machine命令,可以启动、审查、停止、重启托管的docker 也可以…...

【力扣周赛】第357场周赛

【力扣周赛】第357场周赛 2810. 故障键盘题目描述解题思路 2811. 判断是否能拆分数组题目描述解题思路 2810. 故障键盘 题目描述 描述:你的笔记本键盘存在故障,每当你在上面输入字符 ‘i’ 时,它会反转你所写的字符串。而输入其他字符则可以…...

多线程案例(4)-线程池

文章目录 多线程案例四四、线程池 大家好,我是晓星航。今天为大家带来的是 多线程案例-线程池 相关的讲解!😀 多线程案例四 四、线程池 线程池是什么 虽然创建线程 / 销毁线程 的开销 想象这么一个场景: 在学校附近新开了一家…...

【数据结构OJ题】轮转数组

原题链接:https://leetcode.cn/problems/rotate-array/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 1. 方法一:暴力求解,将数组的第一个元素用临时变量tmp存起来,再将数组其他元素往右挪动一步&…...

现代C++中的从头开始深度学习:【4/8】梯度下降

一、说明 在本系列中,我们将学习如何仅使用普通和现代C编写必须知道的深度学习算法,例如卷积、反向传播、激活函数、优化器、深度神经网络等。 在这个故事中,我们将通过引入梯度下降算法来介绍数据中 2D 卷积核的拟合。我们将使用卷积和上一个…...

Yolov5缺陷检测/目标检测 Jetson nx部署Triton server

使用AI目标检测进行缺陷检测时,部署到Jetson上即小巧算力还高,将训练好的模型转为tensorRT再部署到Jetson 上供http或GRPC调用。1 Jetson nx 刷机 找个ubuntu 系统NVIDIA官网下载安装Jetson 的sdkmanager一步步刷机即可。 本文刷的是JetPack 5.1, 其中包…...

MobaXterm 中文乱码, 及pojie

中文解决方法: 把“连字”去掉! MobaXterm网页,可以生成一个授权文件Custom.mxtpro。放在安装目录就可以了 MobaXterm Keygen (husbin.top)http://b70.husbin.top:5000/...

java: 程序包sun.misc不存在

启动失败,rebuild时也报错:java: 程序包sun.misc不存在 问题出在JDK版本上,这个包在JDK9的时候已经被弃用了,这里改回JDK8即可 步骤如下:...

WSL2Linux 子系统(五)

WLS2Linux 子系统编译 Android 上一篇文章中讲解 《WLS2Linux 子系统迁移/恢复》,从C盘迁移到D盘。既可以防止C盘爆红,又可以释放磁盘空间。有更大存储空间意味大有可为,比如说编译Android系统。本文则以开源 firefly Android10代码为例简单…...

java 企业工程管理系统软件源码 自主研发 工程行业适用 em

​ 工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...

IPO观察丨困于门店扩张的KK集团,还能讲好增长故事吗?

KK集团发起了其IPO之路上的第三次冲击。 近日,KK集团更新了招股书,继续推进港交所上市进程,此前两次上市搁置后终于有了新动向。从更新内容来看,KK集团招股书披露了公司截至2023年一季度的最新业绩,交出一份不错的“成…...

【iOS】RunLoop

前言-什么是RunLoop? 什么是RunLoop? 跑圈?字面上理解确实是这样的。 Apple官方文档这样解释RunLoop RunLoop是与线程息息相关的基本结构的一部分。RunLoop是一个调度任务和处理任务的事件循环。RunLoop的目的是为了在有工作的时候让线程忙起来&#…...

数据包传输方式:单播、多播、广播、组播、泛播

数据包传输方式 单播、多播、广播、组播、泛播 网络中假设X代表所有的机器,Y代表X中的一部分机器,Z代表一组机器,1代表一台机器,那么 1:1 那就是单播;1:Y 那就是多播;1&#xff1…...

WebRTC基础知识

文章目录 基础概念NAT (Network Address Translation) 打洞STUN(Session Traversal Utilities for NAT)基于STUN协议的DDoS反射攻击 # TODO TURN(Traversal Using Relays around NAT)ICE(Interactive Connectivity Est…...

积累常见的有针对性的python面试题---python面试题001

1.考点列表的.remove方法的参数是传入的对应的元素的值,而不是下标 然后再看remove这里,注意这个是,删除写的那个值,比如这里写3,就是删除3, 而不是下标. remove不是下标删除,而是内容删除. 2.元组操作,元组不支持修改,某个下标的内容 可以问他如何修改元组的某个元素 3.…...

在springboot使用websocket时mapper无法注入

直接上代码 package cn.ujoined.combined.utils;import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Componen…...

前端加密与解密的几种方式

1.base64加密方式 1. base64是什么? Base64,顾名思义,就是包括小写字母a-z、大写字母A-Z、数字0-9、符号""、"/"一共64个字符的字符集,(另加一个“”,实际是65个字符,至于…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

网络编程(UDP编程)

思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...