微服务架构之路1,服务如何拆分?使用微服务的注意事项?

在这里插入图片描述

目录

    • 一、前言
    • 二、单体服务的弊端
    • 三、微服务化
    • 四、服务如何拆分?
      • 1、拆分原则
      • 2、拆分时机和拆分方法
      • 3、拆分实践
    • 五、使用微服务的注意事项
      • 1、确保相关业务和利益相关者的支持
      • 2、确定微服务的拆分粒度
      • 3、遵循微服务架构的原则
      • 4、确保接口的稳定性
      • 5、关注数据一致性
      • 6、考虑安全性
      • 7、做好监控和日志记录
      • 8、做好容错处理

大家好,我是哪吒。

在这里插入图片描述

一、前言

微服务已经是Java开发的必备技能,甲方不管项目大小,都想上微服务,感觉上了就高大上了,牛逼了。

微服务确实给我们带来了一定的便利性,但是也带来了麻烦,比如学习成本高,存在很多不可预见的问题。

我是做互联网项目的,刚开始的时候,用的是springboot+vue的单体架构,虽然也用了很多中间件,云服务器,数据库集群等,但终究还是单体服务,存在着一定的限制,随着业务架构的不断扩大,每次功能发布上线,都需要每个开发负责人对代码进行打包,再进行最后的代码合并,这时候,就会遇到各种各样的问题,代码忘记提交了,提交了忘记打包了,提交的时候忘记更新了,代码冲突了,jar包版本不统一、jar包版本冲突等各式各样的问题。

有一次项目部署测试,后台通过SVN提交记录进行增量打包,然后通过xshell进行Linux服务器程序更新,再重启。一套下来,差不多需要半个多小时的时间,而且因为缺少class文件的原因,反反复复更新了三次,我都要崩溃了~

你是否也遇到过同样的问题?

如果也是这样,是时候将架构升级为微服务了。分功能开发,每个小团队负责一个功能,然后部署为微服务,引入Docker容器技术。

系统架构经历了单体服务 -> 微服务架构 -> 容器化应用-> DevOps的发展历程。

微服务的概念是在2014年由Martin Fowler和James Lewis共同提出的,他们定义了微服务是由单一应用程序构成的小服务,拥有自己的进程和轻量化处理,按照业务功能分别处理,以全自动的方式部署,与其它服务使用HTTP API通讯。同时,服务会使用最小规模的集中管理(比如Docker),每个服务可以使用自己的语言和数据库。

二、单体服务的弊端

  1. 部署成本高,效率低下
  2. 团队协作开发成本高,两个人同时编写一个类,谁先提交谁舒服,哈哈
  3. 系统高可用性差,因为所有功能最后都部署在一个war包里,运行在同一个Tomcat进程中,一旦某一功能出现问题,就会导致整个系统的崩盘,虽然还有其它机器提供服务,但因为一个小问题,就挂了一个机器,这不蛋疼吗?
  4. 线上发布变慢,一般单体服务都是通过人工去更新代码,然后再重启,一个服务部署了16个机器,就要手动替换16次,而且可能还会有更多的服务。

想要解决以上问题,微服务应运而生。

三、微服务化

微服务化,在我看来就是将 传统的单机应用中通过jar包依赖产生的本地调用 改造成 通过RPC远程接口调用。对于一些通用的业务逻辑,想办法将其抽象并独立成专门的模块,因此对代码复用、分小组开发、单业务理解都大有裨益。

在最近的项目经历里,我深有体会,比如将一个项目分为公共模块、注册中心、网关模块、管理模块、某个单业务模块等。一个人一个模块,自己开发自己的,互不干预,每个模块独立开发,独立部署、独立测试、独立上线、独立运维,与其它模块基本上零联系。

可见,通过微服务化,可以解决应用单体膨胀,团队开发耦合度高、测试难、部署难的问题。

四、服务如何拆分?

微服务的拆分需要遵循一定的原则和考虑因素,包括以下几点:

1、拆分原则

  1. 体量较轻:每个微服务的规模应该适中,避免过于复杂或过于庞大。
  2. 支持跨平台、跨语言通信协议:微服务应该具备跨平台、跨语言的通信能力,以便能够与其他服务进行有效的交互和集成。
  3. 操作性强、易于测试:微服务应该具备易于操作和测试的特性,以便能够快速、准确地实现业务需求。
  4. 明确接口要实现的内容:在拆分微服务时,需要明确每个服务接口要实现的功能和业务逻辑,避免出现接口依赖的情况。
  5. 持续演进原则:在拆分微服务时,应该考虑到服务的可扩展性和可靠性,以便能够适应业务需求的变化和容错处理。

2、拆分时机和拆分方法

(1)根据负责一个微服务原则进行拆分

在拆分微服务时,可以根据业务领域和实际需求来决定拆分的时机。通常情况下,如果团队规模较小,可以将多个业务功能整合成一个微服务;如果团队规模较大,则可以将一个业务功能拆分成多个微服务。

(2)基于可扩展性拆分

在拆分微服务时,可以考虑将系统中业务模块按照稳定性进行排序,将已经成熟且稳定性高的服务拆分为稳定服务,将经常变化和迭代的服务拆分为变动服务。这样可以提升项目的迭代速度,避免对已有成熟功能产生影响。

(3)基于可靠性拆分

在拆分微服务时,可以考虑将系统中业务模块按照优先级排序,将可靠性要求高的核心服务和可靠性要求低的服务拆分出来。这样可以保障核心服务的可用性。

3、拆分实践

(1)持续演进

在微服务的拆分过程中,应该遵循持续演进的原则,逐步拆分细化,而不是一次性拆分成无数个微服务。这样可以避免微服务数量瞬间爆炸性增长,降低开发、测试、运维等环节的难度。

(2)非业务因素考虑

在微服务的拆分过程中,除了要遵循拆分原则和考虑业务因素外,还需要关注非业务因素,如需求变更的频率、高性能、安全性、团队规模以及技术异构等因素。这些因素对于最终落地也会起到决定性的作用。

(3)最佳实践

根据实际情况和实践经验,可以采用一些最佳实践来指导微服务的拆分。例如,可以根据团队规模来决定服务的拆分粒度;根据业务领域和实际需求来确定服务的拆分时机;根据稳定性、优先级等因素来确定服务的拆分方法等。

微服务的拆分需要结合实际情况和实践经验来进行综合考虑和分析。只有在明确了业务需求、团队规模、技术栈等因素后,才能制定出合适的拆分方案,实现微服务的有效拆分和管理。

五、使用微服务的注意事项

1、确保相关业务和利益相关者的支持

在决定是否使用微服务架构之前,需要与所有利益相关者进行沟通和合作,确保他们理解并支持这个决策。同时,需要评估组织的技术专业知识水平,并准备相应的资源来支持微服务架构的实施和运维。

2、确定微服务的拆分粒度

微服务的拆分应该根据业务领域和实际需求来确定,同时需要考虑服务的稳定性、优先级、可靠性等因素。拆分粒度应该适当,避免过度拆分或拆分不足。

3、遵循微服务架构的原则

微服务架构需要遵循一系列原则,例如单一职责原则、接口隔离原则、服务自治原则等。这些原则可以帮助设计出更好的微服务架构,并减少潜在的问题。

4、确保接口的稳定性

微服务之间的通信依赖于接口,因此需要确保接口的稳定性。接口需要遵循一定的规范,例如RESTful API、RPC等,以确保不同微服务之间的通信可靠性和性能。

5、关注数据一致性

在微服务架构中,不同的服务可能由不同的团队开发和维护,因此需要关注数据的一致性。需要设计适当的数据存储方案,并确保不同服务之间的数据一致性和完整性。

6、考虑安全性

微服务架构中的安全性是一个重要的问题。需要确保每个微服务的安全性,包括身份认证、访问控制、数据加密等方面。同时,需要考虑到跨域请求的安全性,以避免潜在的安全漏洞。

7、做好监控和日志记录

微服务架构中的每个服务都需要进行监控和日志记录。需要确保每个服务都具备适当的监控和日志记录机制,以便及时发现和解决问题。

8、做好容错处理

微服务架构中的每个服务都可能出现故障或异常情况。因此,需要设计适当的容错处理机制,以避免故障或异常情况对整个系统造成严重影响。

使用微服务需要注意多个方面的问题,包括业务支持、拆分粒度、原则遵循、接口稳定性、数据一致性、安全性、监控和日志记录以及容错处理等。只有在全面考虑并处理好这些问题后,才能实现微服务的成功实施和运维。


🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/117234.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

postMessage

A:端口3000 import React, { useEffect } from react;function App() {useEffect(() > {const childWindow document.getElementById(child).contentWindow;const sendMessageToChild () > {childWindow.postMessage("主页面消息", "http://localhost:…

【QT5之QFtp模块】编译及使用

下载 传送门:https://github.com/qt/qtftp 或者 git clone https://github.com/qt/qtftp.git 下载ZIP,解压待用。 编辑 使用QtCreator打开qtftp.pro; 修改如下: qtftp.pro中,将第21行注释; src/qftp.pro中,将第4行…

Java程序设计2023-第四次上机练习

8-1 三子棋 编写程序,实现简单的三子棋游戏。在三子棋中,双方在33的棋盘中轮流下棋,一方用*示,另一方用O表示。如果一方的3个棋子占据了同一行,同一列或者对角线,则该方获胜。如果棋盘已被棋子占满&#x…

设置DevC++支持c++11标准

1.点击编译选项 2. 设置语言标准 3.点击确认 4.测试代码 使用auto成功 测试!

【漏洞复现】Apache_HTTPD_多后缀解析漏洞

感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞复现1、基础环境2、漏洞验证 1.3、深度利用GetShell 1.4、修复建议 1.1、漏洞描述 Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执…

统计学习方法 条件随机场

文章目录 统计学习方法 条件随机场随机场马尔可夫随机场定义因子分解 条件随机场定义参数化形式简化形式矩阵形式 概率预测问题前向-后向算法概率的计算期望值的计算 学习问题改进的迭代尺度法拟牛顿法 解码问题 统计学习方法 条件随机场 学习李航的《统计学习方法》时&#x…

STM32 IAP应用开发--bootloader升级程序

STM32 IAP应用开发--bootloader升级程序 Chapter1 STM32 IAP应用开发——通过串口/RS485实现固件升级(方式2)前言什么是IAP?什么是BootLoader? 方案介绍:1)bootloader部分:2)APP部分…

基于单片机的胎压监测系统的设计

收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、系统整体设计方案二、 系统设计4.1 主流程图 三 系统仿真5.1 系统仿真调试实物 四、 结论 概要 本文以STC89C52单片机为控制核心,通过气压传感器模块对汽车各轮胎的胎压进行实时数据的采集与处理&…

【数据结构】树与二叉树(二):树的表示C语言:树形表示法、嵌套集合表示法、嵌套括号表示法 、凹入表示法

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示1.树形表示法2.嵌套集合表示法结构体创建树主函数 3.嵌套括号表示法结构体创建树嵌套括号表示法主函数 4.凹入表示法结构体创建树凹入表示法…

IDEA 设置代码注释模板

功能简介: 每次看别人代码时,面对毫无注释的类,除了头大还是头大, 以下提供了一种代码类注释模板 新建java类的时候,自动增加类注释,养成代码开发好习惯 效果展示: 代码模板: #if (…

多媒体应用设计师 2023年(含答案回忆版)

以下是小红书上的回忆版 软考考完疯狂回忆,多媒体应用设计师选择题 1.pattern 2.effective 3.merge 4.applications 5.graphic 6.udp 7.rtp 8.rtsp 9.10cm 10.永久 11…97 12.工作技术管理标准 13.管理型元数据 14.premiere 15.wave 16.500km/h 17.3M 18.44000 19.…

Capto2024专为Mac电脑设计的屏幕录制和视频编辑软件

不得不说视频编辑功能:Capto提供了多种视频编辑功能,例如剪辑、旋转、裁剪、调整音频和视频的音量、加入水印、添加注释等,你能够使用Capto编辑你的视频,使之更加专业和生动。有目共睹的是录制完成后,你能够使用Capto提…

深入理解WPF中的依赖注入和控制反转

在WPF开发中,依赖注入(Dependency Injection)和控制反转(Inversion of Control)是程序解耦的关键,在当今软件工程中占有举足轻重的地位,两者之间有着密不可分的联系。今天就以一个简单的小例子&…

Paddle炼丹炉炸了Unexpected BUS error encountered in DataLoader worker

Paddle训练报错,内存不足 python train.py -c config/ResNet_W18.yaml修改配置文件config/ResNet_W18.yaml # 原配置 loader:num_workers: 4use_shared_memory: True# 修改后 loader:num_workers: 2use_shared_memory: False

数据分析实战 | 关联规则分析——购物车分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据预处理 七、生成频繁项集 八、计算关联度 九、可视化 一、数据及分析对象 数据集链接:Online Retail.xlsx 该数据集记录了2010年12月01日至2011年12月09日…

ChinaSoft 论坛巡礼 | 安全攸关软件的智能化开发方法论坛

2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

贝锐向日葵亮相阿里云“云栖大会”:独创专利算法赋能全新云桌面

2023年10月31日-11月2日,一年一度的云栖大会如期举办,国产远程连接服务创领者贝锐受邀参与。活动现场,贝锐CTO张小峰进行了分享,宣布贝锐旗下国民级远程控制品牌“贝锐向日葵”与无影展开合作,同时全新的“云桌面”将于…

Docker 学习路线 4:Docker 基础知识

Docker是一个平台,简化了在轻量、可移植的容器中构建、打包和部署应用程序的过程。在本节中,我们将介绍Docker的基础知识、其组件以及您需要开始使用的关键命令。 容器是什么? 容器是一个轻量级、独立的可执行软件包,包含运行应…

数据结构--前缀树(Trie)

1. 简介 前缀树是一种数据结构&#xff0c;常用来字符搜索。 2. 实现 包含的操作主要是: 加入串搜索串 代码实现&#xff0c;直接用leetcode_208的题解咯。 代码 class Trie { public:Trie():isEnd(false){for ( int i 0; i < 26;i)child[i] nullptr;}~Trie() {fo…

python强大的hook函数

什么是hook&#xff1f; 钩子函数&#xff08;hook function&#xff09;&#xff0c;可以理解是一个挂钩&#xff0c;作用是有需要的时候挂一个东西上去。具体的解释是&#xff1a;钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。 hook应用场景&#xff…