我们知道spring cloud可以用来开发微服务,但是应该很少有人真正知道Spring Cloud是什么。
官方的解释是:spring cloud提供了一些可以让开发者快速构建分布式应用的工具,这些服务可以很好的工作在任何分布式环境下。
既然提供的是一些快速构建微服务应用的工具,那么我们需要了解微服务开发过程中需要解决哪些问题?
服务注册发现
远程服务调用
负载均衡
断路器
分布式消息
配置中心
链路监控
所以,spring cloud提供了一些解决这类问题的工具,比如服务注册提供了Eureka/Consoul/zookeeper;远程调用基于RestTemplate针对http协议调用的封装;负载均衡采用Ribbon、断路器采用hystrix;分布式消息基于kafka、rabbitMQ;配置中心基于config;链路监控基于sleuth.
但是,从这些组件中,我们发现了一些问题,这些组件并不是spring提供的啊,比如eureka、ribbon、hystrix是netflix开源的。而kafka、zookeeper是一些独立的组件,和spring似乎没有关系。没错,这就是spring团队的强大之处,他们很少重复早轮子,而是他们利用别人造好的轮子来进行封装使得用户在使用的时候更加方便。
举个简单例子,比如最早spring只提供了IOC和AOP的核心功能,而像ORM框架、缓存、MVC框架,spring只是提供了一种兼容以及支持,所以当时大家说spring是万能胶,可以把各种各样的框架整合进来。
当然,spring也会对一些市面上做得不好的技术进行替代,比如struts2.,我记得当时公司使struts2经常出现各种漏洞,所以spring mvc才被创造出来并且很快代替了struts。成为现在的主流框架。
所以,对于spring cloud来说也是如此,spring cloud并不是一个框架,因为Spring Cloud的核心并没有实现服务注册、熔断、配置中心等功能,它提供了一个标准规范。而Spring Cloud Netflix才是spring Cloud规范的一种实现。
Ø 融合在每个微服务中、依赖其它组件并为其提供服务。
Ribbon,客户端负载均衡,特性有区域亲和、重试机制。
Hystrix,客户端容错保护,特性有服务降级、服务熔断、请求缓存、请求合并、依赖隔离。
Feign,声明式服务调用,本质上就是Ribbon+Hystrix
Stream,消息驱动,有Sink、Source、Processor三种通道,特性有订阅发布、消费组、消息分区。
Bus,消息总线,配合Config仓库修改的一种Stream实现,
Sleuth,分布式服务追踪,需要搞清楚TraceID和SpanID以及抽样,如何与ELK整合。
Ø 独自启动不需要依赖其它组件,单枪匹马都能干。
Eureka,服务注册中心,特性有失效剔除、服务保护。
Dashboard,Hystrix仪表盘,监控集群模式和单点模式,其中集群模式需要收集器Turbine配合。
Zuul,API服务网关,功能有路由分发和过滤。
Config,分布式配置中心,支持本地仓库、SVN、Git、Jar包内配置等模式
Spring Cloud的生态是基于spring boot这个微框架来构建的,所以spring cloud可以说是基于spring boot来对其他框架进行整合,那么什么是spring boot或者为什么要基于spring boot来整合呢?
首先,spring boot并不是一个新的技术,它是基于spring框架下对于“约定由于配置(Convention Over Configuration)”理念下的产物,主要是帮助开发人员更容易更快速的创建独立运行和产品级别的基于spring框架的应用。为什么说springboot是微框架呢?如果大家玩过springboot,那应该很有体会,我们只需要非常少的配置就可以快速构建一个web项目。
而spring boot中并没有新的技术,如果大家对spring框架比较熟悉,那么在学习springboot的时候会更加容易。
围绕springboot构建的spring cloud生态下,目前有两类的比较或的实现,一个是基于netflix、另一个是基于alibaba。
前面一个阶段,我们讲完了Spring Cloud Alibaba生态中的Dubbo组件,当然,我们没有基于spring cloud project的形式来讲解,而是基于组件的形式形式来讲,原因是spring cloud本质上就是对各个组件的集成。
目前Spring Cloud Alibaba这个生态中,已经有相对成熟的体系
Dubbo 用于实现高性能Java RPC 通信
Nacos 服务注册发现、配置管理、服务管理
Sentinel 流量控制、熔断降级、系统负载保护
RocketMQ 分布式消息系统,提供低延时的、高可靠的消息发布与订阅服务
Seata 高性能微服务分布式事务解决方案
Alibaba Cloud OSS 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。
Alibaba Cloud SchedulerX 阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务。
Alibaba Cloud SMS 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
在2019年8月1号,spring-cloud-alibaba发布了第一个毕业版本(从孵化器仓库毕业),发布了V2.1.0.RELEASE版本, 目前最新的的版本是2.2.1.RELEASE,2.2.x 版本适用于 Spring Boot 2.2.x
另外,相比于Spring Cloud Netflix 生态,到2020年,archaus/hystrix/ribbon/zuul/turbine等starter都会进入维护模式,进入维护模式意味着spring cloud团队不会再向这些模块中添加新的功能,但是仍然会修复安全问题和一些block级别的bug。只是没有新的功能迭代了,spring cloud netflix仍然可以继续使用。
文章链接->spring-cloud-netflix-projects-entering-maintenance-mode
进入维护模式的最根本原因还是Netflix对于zuul、ribbon等项目维护投入比较少、所以spring cloud 会在greenwich中把这些项目都进入到维护模式。
当然,这些组件会有相应功能的其他组件代理,有些还在孵化中。有些已经毕业了,比如alibaba这套标准
提起微服务,不得不提 Spring Cloud 全家桶系列,SpringCloud 是若干个框架的集合,包括 spring-cloud-config、spring-cloud-bus 等近 20 个子项目,提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。
Spring Cloud 通过 Spring Boot 风格的封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、容易部署的分布式系统开发工具包。
Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
RocketMQ:开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:这个就不用多说了,在国内应用非常广泛的一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Arthas:开源的Java动态追踪工具,基于字节码增强技术,功能非常强大。
作为一家商业公司,阿里巴巴推出 Spring Cloud Alibaba,很大程度上市希望通过抢占开发者生态,来帮助推广自家的云产品。所以在开源社区,夹带了不少私货,这部分组件我在阿里工作时都曾经使用过,整体易用性和稳定性还是很高的。
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的云存储服务。
Alibaba Cloud SchedulerX:阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准的定时(基于 Cron 表达式)任务调度服务。
Nacos提供了统一配置管理、服务发现与注册。 其中服务注册和发现的功能,相当于dubbo里面使用到的zookeeper、 或者spring cloud里面应用到的consoul以及eureka。
Nacos提供了基于RPC的服务发现,服务提供者可以将自身的服务通过原生API或者openApi来实现服务的注册,服务消费者可以使用API或者Http来查找和发现服务
同时,Nacos提供了对服务的实时监控检查,当发现服务不可用时,可以实现对服务的动态下线从而阻止服务消费者向不健康的服务发送请求。
传统的配置管理,是基于项目中的配置文件来实现,当出现配置文件变更时需要重新部署,而动态配置中心可以将配置进行统一的管理,是的配置变得更加灵活以及高效。
动态配置中心可以实现路由规则的动态配置、限流规则的动态配置、动态数据源、开关、动态UI等场景
国内比较有名的开源配置中心: Aollo / diamond / disconf
Nacos的整体架构还是比较清晰的,我们可以从下面这个官方提供的架构图进行简单分析。
云原生从字面意思上来看可以分成云和原生两个部分。
云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。
原生就是土生土长的意思,我们在开始设计应用的时候就考虑到应用将来是运行云环境里面的,要充分利用云资源的优点,比如️云服务的弹性和分布式优势。