二十六 SpringCloud
1 介绍 SpringCloud
spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
2 SpringCloud 和 Dubbo 区别
① 定位与关注点:
SpringCloud:定位为微服务架构下的一站式解决方案,更关注于构建复杂的分布式系统,提供了一系列开箱即用的功能。
Dubbo:是SOA时代的产物,主要关注于高性能的远程过程调用(RPC)。
② 生态环境与集成性:
SpringCloud:基于Spring Boot开发,继承了其快速构建和自动化配置的优点,与Spring生态系统高度集成。
Dubbo:虽然也能与其他框架集成,但其生态环境相对独立。
③ 调用方式与性能:
SpringCloud:主要使用RESTful API进行通信,适用于跨语言调用,性能相对Dubbo的RPC调用可能稍逊一筹。
Dubbo:采用高性能的基于代理的远程调用,服务以接口为粒度,屏蔽了远程调用的底层细节,性能较高。
④ 组件与功能:
SpringCloud:提供了一套完整的微服务解决方案,包括服务注册与发现(Eureka)、客户端负载均衡(Ribbon)、断路器(Hystrix)、声明式REST客户端(Feign)、API网关(Zuul)以及分布式配置管理(Config)等组件。
Dubbo:提供了丰富的过滤器链以轻松扩展功能,支持多种协议如Dubbo、Hessian、HTTP等,并采用了Zookeeper作为注册中心实现服务的自动注册与发现。同时,Dubbo还提供了管理控制台方便进行服务治理。
⑤ 定制性与灵活性:
SpringCloud:由于其微服务架构的特性,每个服务都是独立的,因此具有很高的定制性和灵活性。
Dubbo:同样具有较高的灵活性,其微内核+插件的设计原则使得所有核心能力如Protocol、Transport、Serialization都被设计为扩展点。
⑥ 学习曲线与上手难度:
SpringCloud:基于Spring Boot的开发模式使得其上手难度相对较低,尤其对于已经熟悉Spring生态系统的开发者来说。
Dubbo:虽然也有其独特之处,但上手难度可能略高于SpringCloud,特别是对于初学者来说。
⑦ 社区支持与维护:
SpringCloud:作为Spring家族的一员,享有强大的社区支持和活跃的开发者群体。
Dubbo:虽然也有稳定的社区支持,但相比之下可能略逊于SpringCloud。
⑧ 总结
SpringCloud和Dubbo在定位、生态环境、调用方式、组件功能、定制性、学习曲线以及社区支持等方面都存在明显的差异。选择哪个框架取决于项目的具体需求和团队的熟悉程度。
3 SpringBoot 和 SpringCloud
SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven 的解决方案,旨在快速搭建单个微服务 而 SpringCloud 专注于解决各个微服务之间的协调与配置,服务之间的通信,熔断,负载均衡等 技术维度并相同, 并 且 SpringCloud 是 依 赖 于 SpringBoot 的 , 而 SpringBoot 并不是依赖与SpringCloud,甚至还可以和 Dubbo 进行优秀的整合开发
总结:
SpringBoot 专注于快速方便的开发单个个体的微服务
SpringCloud 是关注全局的微服务协调整理治理框架,整合并管理各个微服务,为各个微服务之间提供,配置管理,服务发现,断路器,路由,事件总线等集成服务
SpringBoot 不依赖于 SpringCloud,SpringCloud 依赖于 SpringBoot,属于依赖关系
SpringBoot 专注于快速,方便的开发单个的微服务个体,SpringCloud 关注全局的服务治理框架
4 微服务之间是如何独立通讯的
① 同步HTTP通信:微服务之间可以通过HTTP协议进行同步通信。
在这种通信方式中,一个服务作为客户端发起请求,另一个服务作为服务器响应请求。
这种方式简单直接,易于实现和理解,特别适用于RESTful API的设计。
② 异步消息通信:另一种常见的方式是使用消息队列(如Kafka、RabbitMQ等)进行异步通信。
微服务之间通过消息队列发送和接收消息,实现解耦和异步处理。这种方式支持发布-订阅模式,允许消息广播到多个服务中,有助于构建高可伸缩的系统。
③ RPC(远程过程调用):RPC是一种通过网络从远程计算机程序上请求服务的方式,而不需要了解底层网络技术。
在微服务架构中,可以使用RPC框架(如gRPC、Apache Thrift等)进行服务间的调用和返回结果。这种方式通常用于内部微服务之间的方法调用,性能较高。
④ WebSocket通信:WebSocket实现双向通信,常用于实时推送场景。
服务间可以维持长期的TCP连接进行数据交换,适用于对实时性要求较高的场景。
在选择通讯方式时,需要考虑系统的实际需求,例如对实时性的要求、系统的复杂性、可伸缩性等因素。同步通信方式如HTTP和RPC通常用于需要即时响应的场景,而异步通信方式如消息队列则更适合于需要解耦和处理高并发的场景。WebSocket则适用于需要实时数据交换的应用。
5 负载均衡的意义
负载均衡在计算机网络和分布式系统中具有重要意义,能够确保网络系统性能、可用性和可靠性的重要技术手段,可以应对各种网络环境中的挑战,提高系统效率和用户满意度,其主要意义包括:
① 优化资源使用:负载均衡可以确保所有服务器或服务节点的资源得到充分利用,避免某些服务器过载而其他服务器闲置的情况,从而提高整体硬件投资的回报率。
② 提升系统可用性:通过将请求分散到多台服务器,即使某台服务器出现故障或进行维护,其他服务器仍能继续处理请求,保障服务的连续性和稳定性。这种冗余设计有助于减少单点故障的风险。
③ 增强响应速度:将请求分发给处理能力较强或者空闲较多的服务器,能够降低单个服务器的压力,提高用户请求的响应速度,改善用户体验。
④易于扩展:当业务需求增长时,可以通过增加更多的服务器并将其加入负载均衡集群来轻松扩展系统的处理能力,实现水平扩容。
⑤ 提高系统性能:负载均衡通过将工作负载分布到多个服务器上,可以增加吞吐量,提高系统的可伸缩性和性能。
⑥ 节省成本:通过负载均衡,企业可以更有效地利用资源,同时避免过度购买和配置不必要的服务器,从而节省成本。
6 服务熔断与服务降级
在复杂的分布式系统中,微服务之间的相互调用,有可能出现各种各样的原因导致服务的阻塞,在高并发场景下,服务的阻塞意味着线程的阻塞,导致当前线程不可用,服务器的线程全部阻塞,导致服务器崩溃,由于服务之间的调用关系是同步的, 会对整个微服务系统造成服务雪崩为了解决某个微服务的调用响应时间过长或者不可用进而占用越来越多的系统资源引起雪崩效应就需要进行服务熔断和服务降级处理。
所谓的服务熔断指的是某个服务故障或异常一起类似显示世界中的“保险丝"当某个异常条件被触发就直接熔断整个服务,而不是一直等到此服务超时。服务熔断就是相当于我们电闸的保险丝,一旦发生服务雪崩的,就会熔断整个服务, 通过维护一个自己的线程池,当线程达到阈值的时候就启动服务降级,如果其他请求继续访问就直接返回 fallback 的默认值
7 微服务的优缺点
优点:
独立开发和部署:每个微服务都是独立开发、测试、部署和扩展的,可以独立进行版本控制和发布。这使得团队可以快速迭代和交付功能,减少开发的复杂性。
松耦合和可扩展性:微服务通过轻量级的通信机制进行交互,彼此之间的耦合度低。这意味着可以独立地扩展和修改每个微服务,而不会影响其他微服务的运行。
技术多样性:微服务允许使用不同的编程语言、框架和技术栈来实现不同的服务。这使得团队可以根据服务的需求选择最适合的技术,提高开发效率和灵活性。
高可用性和容错性:由于每个微服务都是独立运行的,当一个服务发生故障时,不会影响整个系统的运行。此外,微服务架构可以使用负载均衡和故障转移机制来提高系统的可用性和容错性。
易于维护和测试:微服务的小规模和职责单一,使得代码更加清晰和可维护。同时,每个微服务可以独立进行单元测试和集成测试,减少测试的复杂性。
缺点:
运维要求较高:微服务架构将系统拆分成多个服务,需要管理更多的服务实例和组件,增加了运维的复杂性。
分布式系统的挑战:微服务架构是一个分布式系统,需要解决分布式系统问题,如数据一致性、网络延迟、服务发现等问题。
接口调整成本高:随着业务的发展,微服务之间的接口可能会发生变化。由于微服务之间的依赖关系,一个接口的调整可能需要多个微服务进行联动修改,增加了开发成本。
学习难度曲线加大:微服务架构涉及多个技术栈和工具,需要开发人员具备更广泛的知识和技能,学习曲线较陡峭。
多服务运维难度:随着服务的增加,运维的压力也在增大,需要更多的资源来管理和监控微服务集群。
8 feign的优点
Feign是一个声明式的Web Service客户端,旨在使编写Java HTTP客户端变得更加容易。它的主要目标是简化微服务之间的HTTP调用,让开发者可以更加专注于业务逻辑的实现。以下是Feign的优点:
① 声明式REST客户端:Feign提供了一个简洁的方式来定义REST客户端。开发者只需通过注解定义一个接口,Feign即可动态地实现这个接口,从而调用远程服务。这种方式大大简化了服务间的调用,降低了开发的复杂性。
② 简化HTTP API调用:Feign通过注解和自定义配置来指定请求的URL、参数、请求方法等,使得开发者无需处理诸如构建请求和解析响应等底层任务。这使得代码更加简洁、易读,并提高了开发效率。
③ 集成Ribbon和Hystrix:Feign可以与Ribbon(客户端负载均衡器)和Hystrix(断路器)集成,提供负载均衡和容错能力。这确保了系统的稳定性和可靠性,降低了服务故障对整体业务的影响。
④ 易于使用:Feign的设计使得它很容易被集成和使用,特别是在Spring Cloud环境中。开发者只需简单地配置和定义接口,即可实现对远程服务的调用。
⑤ 支持可插拔的编码器和解码器:Feign支持可插拔的编码器和解码器,可以根据需要选择不同的编码器和解码器来处理不同的数据类型和格式。这使得Feign具有很强的灵活性和扩展性。
⑥ 支持Spring MVC标准注解和HttpMessageConverters:Spring Cloud对Feign进行了封装,使其支持Spring MVC标准注解和HttpMessageConverters。这使得开发者可以更加方便地使用Spring Cloud和Feign进行服务间的调用和通信。
⑦总结,Feign的优点在于其简洁性、易用性、可扩展性和强大的功能。它使得微服务之间的通信变得更加简单和高效,提高了系统的稳定性和可靠性。