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

一.微服务有什么好处?

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

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

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

单体项目的缺点:

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 Netflix Spring Cloud Alibaba
开发语音 Java Java Java
服务治理 提供完整的服务治理 提供部分的服务治理 提供完整的服务治理
服务注册与发现 Zookeeper/Nacos Eureka/Consul Nacos
负载均衡 自带负载均衡策略 Ribbon Ribbon(最新版本去掉了)/Dubbo负载均衡
服务调用 RPC方式 RestTemplate/Feign Fegin/RestTemplate/Dubbo
熔断器 Sentinel Hystrix Sentinel/Resilience4j
配置中心 Apollo Spring Cloud Config Nacos Config
API网关 Higress/APISIX Zuul/Gateway Spring Cloud Gateway
分布式事务 Seata 不支持分布式事务 Seata
限流和降级 Sentinel Hystrix Sentinel
分布式追踪和监控 Skywalking Spring Cloud Sleuth Skywalking或
微服务网格 Dubbo Mesh 不支持微服务网格 Service Mesh(Nacos+ Dubbo Mesh)
相关推荐
chuanauc6 分钟前
Kubernets K8s 学习
java·学习·kubernetes
一头生产的驴22 分钟前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao28 分钟前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc78732 分钟前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
YuTaoShao3 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张33 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
llwszx6 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
小马爱打代码6 小时前
微服务外联Feign调用:第三方API调用的负载均衡与容灾实战
微服务·架构·负载均衡
云泽野6 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person7 小时前
Java SE--方法的使用
java·开发语言·算法