简介
Spring Cloud是基于Spring Boot的一套微服务框架。他提供了微服务开发所需的服务注册、服务发现、配置管理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话、集群状态管理等组件。
微服务指将单体应用按能力拆分为多个子应用进行独立部署,并采用轻量级通信机制。每个子应用之间解耦,可并行开发,可以进行灵活扩展。
Spring Cloud Alibaba
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
此外,阿里云同时还提供了 Spring Cloud Alibaba 企业版 微服务解决方案,包括无侵入服务治理(全链路灰度,无损上下线,离群实例摘除等),企业级 Nacos 注册配置中心和企业级云原生网关等众多产品。
主要功能
- 服务限流降级:默认支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Zuul、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
- 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
- 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
组件
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
更多组件请参考 Roadmap。Spring Cloud Netflix
Spring Cloud Netflix 由Netflix提供,该项目通过自动配置和绑定到Spring环境和其他Spring编程模型的习惯方式来为Spring Boot应用程序提供Netflix OSS集成。通过几个简单的注释,您可以快速启用和配置应用程序中的常见模式,并通过经过测试的Netflix组件构建大型分布式系统。提供的模式包括服务发现(Eureka),断路器(Hystrix),智能路由(Zuul)和客户端负载平衡(Ribbon)。网关
Zuul
网关,所有的客户端请求通过这个网关访问后台的服务。他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。Gateway
Spring Cloud Gateway是一个Spring Cloud的全新项目,基于Spring 5.0、Spring Boot 2.0和Project Reactor等技术开发的网关,它为微服务架构提供一种简单有效的统一的 API 路由管理方式,目标是替代Zuul。注册中心
Eureka
Eureka由Netflix研发,作为SpringCloud的服务注册组件,系统中的其他服务可以使用Eureka客户端连接到EurekaService中并保持心跳,工作人员可以通过EurekaService来监控各个微服务是否运行正常。Nacos
Nacos由Alibaba提供,其关键特性包括服务发现和服务健康监测、动态配置服务、动态DNS服务、服务及其元数据管理。Eureka比较Nacos
功能差异
| 模块 | Nacos | Eureka | 说明 | | —- | —- | —- | —- | | 注册中心 | 是 | 是 | 服务治理基本功能,负责服务中心化注册 | | 配置中心 | 是 | 否 | Eureka需要配合Config实现配置中心,且不提供管理界面 | | 动态刷新 | 是 | 否 | Eureka需要配合MQ实现配置动态刷新,Nacos采用Netty保持TCP长连接实时推送 | | 可用区AZ | 是 | 是 | 对服务集群划分不同区域,实现区域隔离,并提供容灾自动切换 | | 分组 | 是 | 否 | Nacos可用根据业务和环境进行分组管理 | | 元数据 | 是 | 是 | 提供服务标签数据,例如环境或服务标识 | | 权重 | 是 | 否 | Nacos默认提供权重设置功能,调整承载流量压力 | | 健康检查 | 是 | 是 | Nacos支持由客户端或服务端发起的健康检查,Eureka是由客户端发起心跳 | | 负载均衡 | 是 | 是 | 均提供负责均衡策略,Eureka采用Ribion | | 管理界面 | 是 | 否 | Nacos支持对服务在线管理,Eureka只是预览服务状态 |
部署安装
模块 | Nacos | Eureka | 说明 |
---|---|---|---|
MySql | 是 | 否 | Nacos需要采用MySql进行数据进行持久化 |
MQ | 否 | 是 | Eureka需要采用MQ进行配置中心刷新 |
配置中心 | 是 | 否 | Eureka结合Config或者Consul实现配置中心 |
配置文件 | 在线编辑 | 本地文件或者Git远程文件 | Eureka结合Config或者Consul |
集群 | 是 | 是 | Nacos需要配置集群ip再启动 |
稳定性及扩展性
模块 | Nacos | Eureka | 说明 |
---|---|---|---|
版本 | 1.0.0 | 1.9.9 | Eureka2.0已停止开发,Nacos处于1.x-2.0开发 |
厂商 | 阿里巴巴 | Netflix | Netflix已长期用于生产,阿里刚起步 |
生产建议 | 否 | 是 | Nacos0.8以前不可用于生产,建议生产采用Nacos1.0,便于节省配置中心集群和服务管理 |
未来发展 | 是 | 否 | Nacos 2.0主要关注在统一服务管理、服务共享及服务治理体系的开放的服务平台的建设 |
选型建议
采用Eureka方案的考虑
- 想用Spring Cloud原生全家桶
- 想用本地文件和Git作为配置管理的,将配置与服务分开管理
- 考虑短期的稳定性
采用Nacos方案的考虑
- 想在线对服务进行上下线和流量管理
- 不想采用MQ实现配置中心动态刷新
- 不想新增配置中心生产集群
- 考虑引入Spring Cloud Alibaba生态
服务通讯
Feign
服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。动态配置
Config
Spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持。使用Config Server,可以在一个中心位置管理跨所有环境的应用程序的外部属性。负载均衡
Ribbon
即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。线程隔离以及断路器
Hystrix
监控和断路器。我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能。消息传递
Stream
Spring Cloud Stream是一个框架,用于构建高度可伸缩的事件驱动微服务,该微服务与共享消息传递系统相连。
该框架提供了一个灵活的编程模型,建立在已经建立和熟悉的Spring习惯用法和最佳实践之上,包括对持久发布/订阅语义、消费者组和有状态分区的支持。调用链监控
Sleuth
Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案。
微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题,很快定位。
举个例子,在微服务系统中,一个来自用户的请求,请求先达到前端A(如前端界面),然后通过远程调用,达到系统的中间件B、C(如负载均衡、网关等),最后达到后端服务D、E,后端经过一系列的业务逻辑计算最后将数据返回给用户。对于这样一个请求,经历了这么多个服务,怎么样将它的请求过程的数据记录下来呢?这就需要用到服务链路追踪。
参考文献
spring.io spring-cloud
Spring Cloud netflix概览和架构设计
spring-cloud-netflix中文文档
Spring Cloud Alibaba 新一代微服务解决方案
Spring Cloud - Nacos与Eureka区别及如何选型
Spring Cloud Sleuth超详细实战
干货|Spring Cloud Stream 体系及原理介绍
nacos.io
Spring Cloud | Processon | 小左_流年
大话微服务:(三)Spring Cloud Netflix 和Spring Cloud alibaba服务技术架构
SpringCloud的使用以及五大核心组件