【微服务 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…

Shaderlab属性块

文档 官方文档 作用 参数显示在外部,可自定义调节。 语法 _Name(“Display Name”,type)defaultvalue _Name:必须使用下划线开始 Display Name:材质面板上显示的内容 type:属性的类型 dafaultvalue:类型的默认值 必须赋值 常用类型 Float:浮点数 …

PostgreSQL简介及安装步骤

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

18、Flink的SQL 支持的操作和语法

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

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

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

vscode + cmake + opencv example

nice try on macos CMakeLists.txt cmake_minimum_required(VERSION 3.20) #添加OPENCV库 #指定OpenCV版本,代码如下 #find_package(OpenCV 3.3 REQUIRED) #如果不需要指定OpenCV版本,代码如下 find_package(OpenCV REQUIRED)#添加OpenCV头文件 includ…

智能语音和自然语言处理技术

一、定义 智能语音和自然语言处理技术是指通过计算机技术实现人机交互的一种技术。它可以让计算机和人类之间进行自然而流畅的交流,从而实现更高效、更便捷、更智能的信息交流和处理。 智能语音和自然语言处理技术主要包括语音识别、语音合成、自然语言理解、自然…

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

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

openssl交叉编译 (ubuntu+arm)

1.下载安装包 wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz 2.解压安装包 tar -zxvf openssl-1.1.1l.tar.gz 3.进入源码文件夹-修改编译器 CCarm-linux-gnueabihf-gcc 4.配置编译参数 ./config no-asm -shared --prefix/home/alientek/sp_test/openssl/sp…

Springboot 集成 mongodb

一、引入依赖 1.1 Maven <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 二、yml 配置文件 data:mongodb:# 基础链接参数# 连接的库database: mongo…

单例模式读取配置文件

单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点以获取该实例。当你需要在应用程序中读取配置文件时&#xff0c;使用单例模式可以确保你只创建一个配置对象&#xff0c;以避免重…

聊聊定时器 setTimeout 的时延问题

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

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

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

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

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

FreeRTOS_低功耗Tickless模式

目录 1. STM32F4 低功耗模式 1.1 睡眠(Sleep)模式 1.2 停止(Stop)模式 1.3 待机(Standby)模式 2. Tickless 模式详解 2.1 如何降低功耗 2.2 Tickless 具体实现 2.2.1 宏 configUSE_TICKLESS_IDLE 2.2.2 宏 portSUPPRESS_TICKS_AND_SLEEP() 2.2.3 宏 configPRE_SLEEP_…

利用Caddy实现http反向代理

利用Caddy实现http反向代理 1 Caddy是什么 Caddy是一个开源的&#xff0c;使用Golang编写的&#xff0c;支持HTTP/2的Web服务端。它的一个显著特征就是默认启用HTTPS。 和nginx类似。 2 多个后端服务 假如现在有3个后端http服务&#xff1a;分别在启动在 app1 http://10…

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

前言 Django自带了一个名为FileField的字段&#xff0c;用于处理文件上传。然而&#xff0c;有时我们需要更多的控制权&#xff0c;例如定义文件的存储路径、文件名以及文件类型。在本篇文章中&#xff0c;我们将探讨如何自定义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介绍 论文…