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࿱…...
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个字符,至于…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
