彻底理解微服务的作用和解决方案

一.微服务有什么好处?

微服务优点很多,但是我们通常说一个东西好肯定会跟另一个东西比较,通常说微服务好会和单体项目进行比较,通常情况下微服务都是从单体项目拆分而来的,但是对于有些大型公司,不差钱,也会项目一上来就使用微服务架构,因为对于小公司,在开发人员和开发成本受限的情况下,一上来就是使用微服务,其实是不明智的选择,为什么不明智,后续谈到缺点的时候再来解释。

以下是微服务相对于单体项目的一些显著好处:

首先,让我们讨论单体项目的一些主要缺点:

单体项目的缺点:

1.可扩展性受限:单体应用通常在可扩展性方面受到限制,因为整个应用程序(所有的模块都在一个项目中,包括前端、后端、数据库、缓存等)必须一起扩展,这意味着即使只有一个组件需要更多资源,也必须扩展整个应用程序,这可能会导致资源浪费(比如项目的并发量高,可以使用nginx做代理集群,但是其实只有项目中的一个模块并发高,这种整齐项目做代理就会浪费资源,如果是拆分成微服务的话,就只需要对那一个并发量高的模块做集群代理,其他的并发量小的模块就不需要集群,这样就可以充分的利用服务器的资源);

2.难以维护和更新:随着时间的推移,单体应用程序往往变得越来越庞大和复杂,难以理解、维
护和更新,每次修改都可能引发意想不到的影响
(有可能一个功能经过10多个开发的修改,业务已经变得非常难以理解,这也就是传说中的屎山代码,比如说后期需要在屎山代码中变更一个小功能,刚接手的开发一般是不敢去修改它,修改它就有很大风险导致上线后其他模块出现问题,通常会在屎山代码上再堆一坨屎,这样循环下去,对以后这个项目的发展是非常不好的)。

3.高风险:单体应用程序中的一个小错误或故障可能会导致整个应用程序崩溃,因此存在较高的
风险
,此外,长时间不更新的单体应用可能会受到安全威胁;

4.技术栈限制: 单体应用程序通常使用相同的技术栈,这可能会限制您在项目中使用最新的技术和工具的能力(每当使用一个新的技术,都需要考虑当前系统的架构是不是能和新的技术集成,有可能以前的单体项目用的技术比较老,根本没办法和新项目集成);

5.团队协作复杂: 单体应用程序的所有组件都在一个代码库中,这可能导致开发团队之间的冲突和协作问题,尤其在大型团队中更为突出。

现在,让我们看看微服务项目的一些优点:

微服务项目的优点:

1.可扩展性:微服务架构允许您根据需要独立地扩展单个服务,而不必扩展整个应用程序,这提供了更高的可扩展性(每当有新的模块需求的时,可以单独提一个服务来处理,这样就不要修改原本的业务逻辑);

2.灵活性和快速开发:微服务允许开发团队独立设计、开发和部署服务,这提高了灵活性,允许团队更快地推出新功能和更新

3.故障隔离和容错性:单个微服务的故障通常不会影响其他服务,提高了应用程序的容错性

4.技术栈不受限:每个微服务可以采用不同的技术栈,而且就算是不同的开发语音都行(因为微服务都是独立存在的,比如在开发中发现一个开源项目很好用时,可以直接作为微服务来使用,而不需要考虑与原来的系统架构是否匹配,而且每个微服务都可以使用不同的语言进行开发,他们直接可以通过Restful的方式进行调用);

5.团队协作更简单:开发团队不同人负责不同的微服务,技术特点更突出(比如一个微服务就分配1-2个人去负责,这样在提交代码时,处理冲突的概率会小很多,而且这一两个人只需要精通某个技术,而不需要整理业务都清楚,可以提高开发效率)。

二.微服务代带来了哪些挑战?

1.成本挑战

(1)基础设施成本增加:微服务应用通常需要更多的基础设施资源,例如服务器、容器管理
负载均衡器等,这可能导致运营成本增加
(以前单体项目,可能一台服务器就够了,我不需要太多的内存,现在微服务的服务性能成本要比单体项目服务器的成本高很多,而且这个成本是成倍增加的);

(2)开发和维护成本:管理多个微服务的开发、测试、部署和维护需要更多的工程师资源,这可能导致开发和维护成本上升(如果一家公司只有三四个、四五个开发,这不建议用微服务的,以前单体项目的模块与模块之间的调用,只需要调用接口就行,现在微服务需要用到远程调用,此时需要接口拆分的非常合理,一旦不合理,远程调用就相当复杂,而且微服务的拆分也需要将数据库进行拆分,如果只拆了服务,没拆数据库,那么在写代码的时候,会非常纠结,比如写查询语句,会考虑是按照以后裁拆分的角度去写,还是按照不拆分的角度,正常情况下都是需要按照需要拆分的打算去写语句,但是实际情况又是没有拆分,这是就会觉得还是单体项目好,微服务的查询,如果不是自己本身模块的查询,就还需要通过远程调用去获取)。

2.复杂性挑战

(1)分布式系统复杂性:微服务应用是分布式系统,涉及多个独立运行的服务,这增加了系统的复杂性,包括网络通信、故障处理和事务管理等方面(复杂性体现在分布式事务、分布式ID、分布式缓存等地方,比如以前在单体项目,一个事务使用一个注解就行了,现在使用分布式,如果使用seate,那么还需要部署一个seate的服务,这也增加了系统的复杂性);

(2)服务发现和治理:管理多个微服务的发现、注册、版本控制和路由需要额外的复杂性,例如使用服务网格或API网关

3.部署挑战

(1)自动化部署需求:为了有效地部署多个微服务,需要建立自动化的部署流程,这可能需要额外的工作和资源(单体项目一个jar包直接启动,微服务可能还需要Docker、k8s、安装脚本才能进行自动化部署);

(2)版本控制和回滚:管理不同版本的微服务以及版本之间的兼容性可能会变得复杂,特别是
在需要回滚时。

4.一致性挑战 

(1)数据一致性:不同微服务可能拥有各自的数据存储,确保数据一致性和同步可能需要复杂的解决方案,如分布式事务或事件驱动的一致性;

(2)事务管理:管理跨多个微服务的事务变得复杂,确保事务的一致性和隔离性需要额外的努力和技术。

5.监控和故障排除挑战

(1)性能监控:在微服务环境中,跟踪性能问题和故障排除可能更加困难,因为问题可能涉及多个服务,需要强大的监控和诊断工具(单体项目挂掉后,立马可以感知到,但是微服务中一个服务挂掉了,可能不会立马感知到,所以需要部署更多的监控平台,才能更好的对微服务进行监控);

(2)故障排除:需要有效的方法来跟踪和诊断跨多个服务的故障,以便快速恢复。

总结:

微服务不是万金油,是用来处理海量用户、业务复杂和需求频繁变更场景下的一种架构风格。引
用一句话“好的架构是演化出来的,而不是设计出来的”,任何一种架构的引入,都会带来利弊两个方面的影响,如何平衡才是最重要的。

三.有哪些流行的微服务解决方案?

目前最主流的微服务开源解决方案有三种:

1.Dubbo

(1)Dubbo 是一个高性能、轻量级的 Java 微服务框架,最初由阿里巴巴(Alibaba)开发并于2011年开源,它提供了服务注册与发现、负载均衡、容错、分布式调用等功能,后来一度停止维护,在近两年,又重新开始迭代,并推出了Dubbo3;

(2)Dubbo 使用基于 RPC(Remote ProcedureCal)的通信模型,具有较高的性能和可扩展性,它支持多种传输协议(如TCP、HTTP、Redis)和序列化方式(如JSON、Hessian、Protobuf),可根据需求进行配置;

(3)Dubbo更多地被认为是一个高性能的RPC(远程过程调用)框架,一些服务治理功能依赖于第三方组件实现,比如使用ZooKeeper、Apollo等等。

2.Spring Cloud Netflix

(1)Spring Cloud Netflix 是 Spring Cloud 的一个子项目,结合了 Netflix 开源的多个组件但是Netflix自2018年停止维护和更新Netflix 0SS项目,包括Eureka、Hystrix等组件,所以Spring Cloud Netflix也逐渐进入了维护模式,但是它算是Spring微服务的开端,比较具有代表性;

(2)该项目包含了许多流行的 Netflix组件,如Eureka(服务注册与发现)、Ribbon(客户端负载均衡)、Hystrix(断路器)、Zuul(API网关)等,它们都是高度可扩展的、经过大规模实践验证的微服务组件。

3.Spring Cloud Alibaba

(1)Spring Cloud Alibaba是阿里巴巴结合自身的微服务实践开源的微服务全家桶;

(2)并且对的Spring Cloud组件做了很好的兼容,比如在Spirng Cloud Alibaba中依然可以使用Feign作为服务调用方式,使用Eureak做服务注册发现等等。

三种方案的区别:

特点 Dubbo                Spring Cloud NetflixSpring Cloud Alibaba
开发语音Java       Java       Java       
服务治理提供完整的服务治理提供部分的服务治理提供完整的服务治理
服务注册与发现Zookeeper/NacosEureka/ConsulNacos
负载均衡自带负载均衡策略RibbonRibbon(最新版本去掉了)/Dubbo负载均衡
服务调用RPC方式RestTemplate/FeignFegin/RestTemplate/Dubbo
熔断器SentinelHystrixSentinel/Resilience4j
配置中心ApolloSpring Cloud ConfigNacos Config
API网关Higress/APISIXZuul/GatewaySpring Cloud Gateway
分布式事务Seata不支持分布式事务Seata
限流和降级SentinelHystrixSentinel
分布式追踪和监控SkywalkingSpring Cloud SleuthSkywalking或
微服务网格  Dubbo Mesh不支持微服务网格Service Mesh(Nacos+ Dubbo Mesh)

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

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

相关文章

Harbor安装、HTTPS配置、修改端口后不可访问?

Harbor安装、HTTPS配置、修改端口后不可访问? 大家好,我是秋意零。今天分享Harbor相关内容,安装部分可完全参考官方文档,写的也比较详细。 安装Harbor 官方文档:https://goharbor.io/docs/2.12.0/install-config/ …

表单校验规则

这里简单记录下vue使用表单时候&#xff0c;给表单添加校验规则&#xff0c;直接上代码 <script setup>import { ref } from vue// 定义表单对象const form ref({account: ,password: ,agree: true})// 定义表单验证规则const rules {account: [{required: true, mess…

spf算法、三类LSA、区间防环路机制/规则、虚连接

1.构建spf树&#xff1a; 路由器将自己作为最短路经树的树根根据Router-LSA和Network-LSA中的拓扑信息,依次将Cost值最小的路由器添加到SPF树中。路由器以Router ID或者DR标识。广播网络中DR和其所连接路由器的Cost值为0。SPF树中只有单向的最短路径,保证了OSPF区域内路由计管不…

电子电气架构 -- ASIL D安全实现策略

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

【Unity ShaderGraph实现流体效果之Function入门】

Unity ShaderGraph实现流体效果之Node入门&#xff08;一&#xff09; 前言Shader Graph NodePosition NodeSplit NodeSubtract NodeBranch Node 总结 前言 Unity 提供的Shader Graph在很大程度上简化了开发者对于编写Shader的工作&#xff0c;只需要拖拽即可完成一个视觉效果…

uniop触摸屏维修eTOP40系列ETOP40-0050

在现代化的工业与商业环境中&#xff0c;触摸屏设备已成为不可或缺的人机交互界面。UNIOP&#xff0c;作为一个知名的触摸屏品牌&#xff0c;以其高性能、稳定性和用户友好性&#xff0c;广泛应用于各种自动化控制系统、自助服务终端以及高端展示系统中。然而&#xff0c;即便如…

SpringMVC——简介及入门

SpringMVC简介 看到SpringMVC这个名字&#xff0c;我们会发现其中包含Spring&#xff0c;那么SpringMVC和Spring之间有怎样的关系呢&#xff1f; SpringMVC隶属于Spring&#xff0c;是Spring技术中的一部分。 那么SpringMVC是用来做什么的呢&#xff1f; 回想web阶段&#x…

小白学多线程(持续更新中)

1.线程池技术 1.JDK中的线程池 JDK中创建线程池有一个最全的构造方法&#xff0c;里面七个参数如上所示。 执行流程分析&#xff1a; 模拟条件&#xff1a;10个核心线程数&#xff0c;200个最大线程数&#xff0c;阻塞队列大小为100。 当有小于十个任务要处理时&#xff0c…

UNity将脚本中的文本提示显示在编辑器中

正常情况下我们创建了一个脚本然后挂载到一个对象上只能看到这样的一个面板 如果我们想在编辑器里面添加一段提示就可以这样做 [Header("玩家的基本信息")] 然后就能在编辑器窗口中看到添加的提示了 注意&#xff1a;当参数少的时候确实没必要这样做&#xff0c;但…

数据结构 (8)线性表的应用——一元多项式的表示及应用

一、一元多项式的定义 一元多项式是代数学研究的基本对象之一&#xff0c;可以表示为&#xff1a; P_n(x) p_0 p_1x p_2xn 其中&#xff0c;p_0, p_1, ..., p_n 是数域 F 中的数&#xff0c;n 是非负整数&#xff0c;x 是变量。 二、一元多项式的线性表表示 在计算机中&…

【山大9009算法题】2015-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 线性表使用公式化描述方式存储。编写一个函数&#xff0c;从一给定的线性表A中删除值在x ~ y&#xff08;x到y&#xff0c;x<y&#xff09;之间的所有元素&#xff0c;要求以较高的效率来实现。提示&#…

【Mac】VMware Fusion Pro 安装 CentOS 7

1、下载镜像 CentOS 官网阿里云镜像网易镜像搜狐镜像 Mac M1芯片无法直接使用上述地址下载的最新镜像&#xff08;7.9、9&#xff09;&#xff0c;会一直卡在安装界面&#xff08;在 install 界面按 enter 回车无效&#xff09;&#xff0c;想要使用需要经过一系列操作&#…

机器学习周志华学习笔记-第5章<神经网络>

机器学习周志华学习笔记-第5章<神经网络> 卷王&#xff0c;请看目录 5模型的评估与选择5.1 神经元模型5.2 感知机与多层网络5.3 BP(误逆差)神经网络算法 5.4常见的神经网络5.4.1 RBF网络&#xff08;Radial Basis Function Network&#xff0c;径向基函数网络&#xff0…

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验&#xff0c;同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏&#xff0c;排除了清晰度和功耗之间的平衡问题。该芯片…

Linux之SELinux与防火墙

一、SELinux的说明 开发背景与目的&#xff1a; SELinux由美国国家安全局&#xff08;NSA&#xff09;开发&#xff0c;旨在避免资源的误用。传统的Linux基于自主访问控制&#xff08;DAC&#xff09;&#xff0c;通过判断进程所有者/用户组与文件权限来控制访问&#xff0c;对…

Linux初识进程信号

预备 1&#xff0c;你怎么能认识信号呢&#xff1f; 信号是内置的&#xff0c;进程认识信号&#xff0c;是程序员内置的属性 2&#xff0c;信号产生之后&#xff0c;怎么处理信号&#xff1f; 知道&#xff01;因为在信号产生之前&#xff0c;就已经把处理信号的内容准备好…

如何安全删除 Linux 用户帐户和主目录 ?

Linux 以其健壮性和灵活性而闻名&#xff0c;是全球服务器和桌面的首选。管理用户帐户是系统管理的一个基本方面&#xff0c;包括创建、修改和删除用户帐户及其相关数据。本指南全面概述了如何在 Linux 中安全地删除用户帐户及其主目录&#xff0c;以确保系统的安全性和完整性。…

ubuntu16.04在ros使用USB摄像头-解决could not open /dev/video0问题

首先检查摄像头 lsusb 安装 uvc camera 功能包 sudo apt-get install ros-indigo-uvc-camera 安装 image 相关功能包 sudo apt-get install ros-kinetic-image-* sudo apt-get install ros-kinetic-rqt-image-view运行 uvc_camera 节点 首先输入roscore 然后另外开一个终端输入…

计算机网络socket编程(6)_TCP实网络编程现 Command_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(6)_TCP实网络编程现 Command_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论…

聚水潭与MySQL数据集成案例分享

聚水潭数据集成到MySQL的技术案例分享 在现代数据驱动的业务环境中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接成为企业关注的焦点。本次案例将详细介绍如何通过轻易云数据集成平台&#xff0c;将聚水潭的数据无缝集成到MySQL数据库中&#xff0c;实现从“聚水谭…