一.微服务有什么好处?
微服务优点很多,但是我们通常说一个东西好肯定会跟另一个东西比较,通常说微服务好会和单体项目进行比较,通常情况下微服务都是从单体项目拆分而来的,但是对于有些大型公司,不差钱,也会项目一上来就使用微服务架构,因为对于小公司,在开发人员和开发成本受限的情况下,一上来就是使用微服务,其实是不明智的选择,为什么不明智,后续谈到缺点的时候再来解释。
以下是微服务相对于单体项目的一些显著好处:
首先,让我们讨论单体项目的一些主要缺点:
单体项目的缺点:
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) |