【微服务 Spring Cloud 6】服务如何拆分?使用微服务的注意事项?

在这里插入图片描述

目录

    • 一、前言
    • 二、单体服务的弊端
    • 三、微服务化
    • 四、服务如何拆分?
      • 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在线答疑。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百数低代码与AI:实现业务智能化的新途径

今年6月,咨询机构麦肯锡发布了的一份题为《生成式人工智能的经济潜力》的研究报告,在报告中,分析师们通过对47个国家及地区的850种职业(全球80%以上劳动人口)的研究,探讨了在AI成指数级发展背后&#xff0c…

PostgreSQL简介及安装步骤

PostgreSQL简介 PostgreSQL是一款开源的关系型数据库管理系统,具有强大的扩展性、高度的可定制性和可靠的稳定性,因此在企业级应用和开发领域中得到了广泛的应用。本文将介绍PostgreSQL的基本概念以及在各种操作系统上的安装步骤。 安装步骤 1. Window…

05【保姆级】-GO语言的标识符

之前我学过C、Java、Python语言时总结的经验: 先建立整体框架,然后再去抠细节。先Know how,然后know why。先做出来,然后再去一点点研究,才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

CRM客户管理系统究竟是什么?如何实施?

很多销售人员都不是特别喜欢使用信息化软件,然而从销售经理的角度看,信息化又的确提升了团队的管理效率和业绩。追究这些矛盾的原因,无外乎几点: 认知角度 → 销售员:数据没用又浪费我时间 VS 销售经理:数…

聊聊定时器 setTimeout 的时延问题

给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 全局的 setTimeout() 方法设置一个定时器,一旦定时器到期,就会执行一个函数或指定的代码片…

字符函数和字符串函数详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1. 字符分类函数 2. 字符转换函数 3. strlen的使用和模拟实现 3.1strlen的使用: 3.2strlen的模拟实现: 4. strcpy的使用和模拟实现 4.1strc…

漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案

现象 漏刻有时项目开发中的调用了百度地图API,在PC端、IOS和安卓机型测试都没有问题。但是使用华为手机部分型号时,前端在监听点击事件的时候是使用 map.addEventListener(click,function(){...}),无法触发。或 原理 通过监听touchstart和…

Django初窥门径-自定义附件存储模型

前言 Django自带了一个名为FileField的字段,用于处理文件上传。然而,有时我们需要更多的控制权,例如定义文件的存储路径、文件名以及文件类型。在本篇文章中,我们将探讨如何自定义Django附件存储模型。 创建attachment应用 pyt…

Python|OpenCV-图像的添加和混合操作(8)

前言 本文是该专栏的第8篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用OpenCV库对图像操作的时候,有时需要对图像进行运算操作,类似于加法,减法,位操作等处理。而本文,笔者将针对OpenCV对图像的添加,混合以及位操作进行详细的介绍说明和使用。 下面,…

ZKP8.1 Polynomial-IOP and Polynomial Commitment Schemes

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 8: FRI-based Polynomial Commitments and Fiat-Shamir (Justin Thaler) 8.1 Polynomial-IOP and Polynomial Commitment Schemes Recall: build an efficient SNARK Recall: Polynomial-IOP P’s first message in the pro…

YOLOv8轻量化模型:模型轻量化设计 | 轻量级可重参化EfficientRep| 来自YOLOv6思想

💡💡💡本文解决什么问题:在几乎不保证精度下降的前提下,轻量级模型创新设计 EfficientRep 在关键点检测任务中 | GFLOPs从9.6降低至8.5, mAP50从0.921下降至0.912,mAP50-95从0.697提升至0.779 YOLO轻量化模型专栏:http://t.csdnimg.cn/AeaEF 1.YOLOv6介绍 论文…

API接口安全设计

简介 HTTP接口是互联网各系统之间对接的重要方式之一,使用HTTP接口开发和调用都很方便,也是被大量采用的方式,它可以让不同系统之间实现数据的交换和共享。 由于HTTP接口开放在互联网上,所以我们就需要有一定的安全措施来保证接口…

#龙迅视频转换IC LT7911D是一款高性能Type-C/DP/EDP 转MIPI®DSI/CSI/LVDS 芯片,适用于VR/显示应用。

1.说明 应用功能:LT7911D适用于DP1.2转MIPIDSI/MIPICSI/LVDS,EDP转MIPIDSI/MIPICSI/LVDS,TYPE-C转MIPIDSI/MIPICSI/LVDS应用方案 分辨率:单PORT高达4K30HZ,双PORT高达4K 60HZ 工作温度范围:−40C to 85C 产…

webgoat-client side客户端问题

client side Bypass front-end restrictions 用户对 Web 应用程序的前端有很大程度的控制权。 它们可以更改 HTML 代码,有时也可以更改脚本。这就是为什么 需要特定输入格式的应用也应在服务器端进行验证,而不是只在前端做限制。 0x02 先提交请求&am…

win10虚机扩容C盘

需求: 在虚机管理平台上,将win10虚机的C盘空间扩容至200G,当前空间为100G 操作步骤 1.在虚机平台上,将硬盘1的大小增加至200G 如下图 点击保存; 查看win10虚机,发现C盘空间还是100G,如下图…

使用Redis实现缓存及对应问题解决

一、为什么需要Redis作缓存? 在业务场景中,如果有些数据需要极高频的存取,每次都要在mysql中查询的话代价太大,假如有一个存在于客户端和mysql之间的存储空间,每次可以在这空间中进行存取操作,就会减轻mys…

go程序获取工作目录及可执行程序存放目录的方法-linux

简介 工作目录 通常就是指用户启动应用程序时,用户当时所在的文件夹的绝对路径。 如:root用户登录到linux系统后,一顿cd(change directory)后, 到了/tmp文件夹下。此时,用户要启动某个应用程序&#xff0…

mediapipe流水线分析 二

目标检测 Graph 一 流水线上游输入处理 1 TfLiteConverterCalculator 将输入的数据转换成tensorflow api 支持的Tensor TfLiteTensor 并初始化相关输入输出节点 ,该类的业务主要通过 interpreter std::unique_ptrtflite::Interpreter interpreter_ nullptr; 实现…

利用大语言模型(LLM )提高工作效率

日常工作就是面向 google/ 百度编程,除了给变量命名是手动输入,大多时候就是通过搜索引擎拷贝别人的代码,或者找到旧项目一段代码拷贝过来使用。这无疑是开发人员的真实写照;然而,通过搜索引擎搜索答案,无疑…

Go 面向对象,多态

面向对象 工程结构 新建一个oop.go package _oop // Package _oop 引用名称import ("fmt""strconv" )// GIRL 常量 const (// GIRL 自增GIRL Gender iotaFIRSTSECONDTHIRD )type Gender uint8 // 无符号的8位整数类型// User 结构体 type User struct…