当前位置: 首页 > 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个字符,至于…...

详解Spring Bean的生命周期

详解Spring Bean的生命周期 Spring Bean的生命周期包括以下阶段: 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进…...

详解Shell 脚本中 “$” 符号的多种用法

通常情况下,在工作中用的最多的有如下几项: $0:Shell 的命令本身 1到9:表示 Shell 的第几个参数 $? :显示最后命令的执行情况 $#:传递到脚本的参数个数 $$:脚本运行的当前进程 ID 号 $*&#…...

Redis如何实现Session存储

在Redis中实现Session存储,主要有两种方式:使用Spring Session和手动存储。 使用Spring Session:Spring Session是Spring框架提供的一个模块,用于简化Session管理,并将Session数据存储到外部数据存储中,如Redis。使用Spring Session,你只需要在Spring Boot项目中添加相应…...

安防视频监控汇聚EasyCVR平台接入Ehome告警,公网快照不显示的原因排查

智能视频监控汇聚平台TSINGSEE青犀视频EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,视频监控管理平台…...

【Springboot】@ComponentScan 详解

文章目录 ComponentScanComponentScan ANNOTATION 和 REGEXComponentScan CUSTOMComponentScan ASSIGNABLE_TYPE ComponentScan ComponentScan 是 Spring 框架中的一个注解,用于自动扫描和注册容器中的组件。 使用 ComponentScan 注解可以告诉 Spring 在指定的包或…...

flask-----信号

安装: flask中的信号使用的是一个第三方插件,叫做blinker。通过pip list看一下,如果没有安装,通过以下命令即可安装blinker: pip install blinker flask其中有内置的信号 template_rendered _signals.signal(temp…...

10_Vue3 其它的组合式API(Composition API)

Vue3 中的其它组合式API 1.shallowReactive 与 shallowRef 2. readonly 与 shallowReadonly 3.toRaw 与 markRaw 4.customRef 5.provide 与 inject 6.响应式数据的判断...

COCOS项目运行的时候图片模糊的原因

1、首先。用X坐标来分析,如果size*Anchor Position有小数,如上图57*0.5667695.5。这样就会导致x模糊。如果y同样计算结果包含小数,那么y也会模糊。xy同时模糊的情况是最模糊的。 2、如果当前node没有问题,那么就要检查上级node是…...

Python中搭建IP代理池的妙招

在Python的爬虫世界里,你是否也想搭建一个功能强大的IP代理池,让你的爬虫无忧无虑地畅游各大网站?今天,我就来教你使用Scrapy框架搭建IP代理池,让你的爬虫更加智能、高效!跟着我一步一步来,轻松…...

学习pytorch 2

学习pytorch 2 2. dataset实战代码数据集 2. dataset实战 B站小土堆视频 代码 from torch.utils.data import Dataset from PIL import Image #import cv2 import osclass MyData(Dataset):def __init__(self, root_dir, label_dir):self.root_dir root_dirself.label_dir …...

wap浏览器免费下载/百度seo关键词排名 s

标题中的substring方法指的是字符串的substring(int beginIndex, int endIndex)方法,这个方法在jdk6,7是有差异的。 substring有什么用? substring返回的是字符串索引位置beginIndex开始,endIndex-1结束的字符串。 来看这个例子&#xff1…...

企业注册公司/南京百度快速排名优化

这是这两天刚出的一篇文章(cvpr),在DGfont里面改进而来的。 Abstract 内容与样式的分离是实现少镜头字体生成的有效途径。它允许将源域中的字体图像的样式转换为目标域中由一些参考图像定义的样式。但是,使用代表性字体提取的内容特征可能不是最佳的。基于此,我们提出了一…...

wordpress插件导出/seo网站内部优化方案

1、修改自己的shellchsh [shell路径] 2、修改其它人的shellchsh [shell路径] [用户登陆名]...

网站网页设计的要求/seo霸屏软件

创建数据 create table tab_pk ( id int, name varchar(9), primary key(id)) engineinnodb; insert into tab_pk values(1,‘a’); insert into tab_pk values(2,‘b’); 在主键上的查询 下面做过实验 可以看到在主键上的update是行级锁,在其它键是的update是表…...

wordpress替换头像/个人主页网页设计

Linux Mint 19.2 “Tina” 在 2019 年 8 月 2 日发布,它是一个基于 Ubuntu 18.04 LTS (Bionic Beaver) 的长期支持版本。-- 2daygeek(作者)Linux Mint 19.2 “Tina” 在 2019 年 8 月 2 日发布,它是一个基于 Ubuntu 18.04 LTS (Bi…...

网站备案关闭/新手怎么做网络销售

“没有缘创派,可能我如今还在迷茫的找职业定位。”事隔七八年。当我昨天中午再次见到老朋友冉红宇的时候,他第一句话是这样说的。冉红宇,丰羽创业孵化器的合伙人。这个位于最知名的北京创业一条街上的孵化器,正在孵化三个项目。当…...