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

一.微服务有什么好处?

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

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

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

单体项目的缺点:

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)
相关推荐
计算机徐师兄几秒前
Java基于SSM框架的校园综合服务小程序【附源码、文档】
java·微信小程序·小程序·校园综合服务小程序·java校园综合服务小程序·校园综合服务微信小程序
柔弱女子爱java8 分钟前
XML文件(超详细):XML文件概念、作用、写法、如何用程序解析XML、写入XML、dom4j框架、DTD文档、schema文档
xml·java·开发语言·后端
wsd_ontheroad11 分钟前
HTML 转 PDF
java·pdf·html
xmh-sxh-131428 分钟前
redis使用介绍
java
chusheng184030 分钟前
Java 基于SpringBoot+Vue的家政服务管理平台
java·vue.js·spring boot·家政服务·家政服务平台
调皮的木木43 分钟前
Mysql的加锁情况详解
java·数据库·mysql
吹老师个人app编程教学1 小时前
集合Queue、Deque、LinkedList、ArrayDeque、PriorityQueue详解
java
幼儿园里的山大王1 小时前
springboot系列--拦截器执行原理
java·spring boot·后端
扬子鳄0081 小时前
Spring集成测试
java·spring·集成测试
小白不太白9502 小时前
设计模式之 解释器模式
java·设计模式·解释器模式