其实广义上的Spring是一个生态体系,是很多技术的集合。而我们常说的Spring仅仅是狭义上的Spring,实际指的是Spring Framework。下面我们会针对Spring(Spring Framework)、Spring Boot和Spring Cloud 进行详细的介绍
Spring Framework最核心的两个特性是提供了IOC容器管理我们的对象和提供了AOP面向切面编程减少重复编码。此外还提供了数据存储、Wbe模块开发、资源管理、数据校验和绑定、类型转换和国际化等功能。
Spring Boot是一个全新的自动化配置解决方案。使用SpringBoot可以快速创建基于Spring生产级的独立应用程序,而无需过多的关注XML配置。
Spring Boot充分利用了JavaConfig的配置模式以及使用“约定优先于配置”(COC,Convension Over Configuration)的设计理念。它提供了针对企业应用开发各种场景的很多spring-boot-starter自动配置依赖模块供我们开箱即用。(官方starter使用spring-boot-starter-xxx命名,而非官方starter使用xxx-spring-boot-starter命名)。
拓展介绍:约定优先于配置COC,Convension Over Configuration)也称为按约定编程,是一种软件设计范式,旨在减少开发人员需做决定的数量,获得简单的好处,而又不是去灵活性。
优点实在太多,这里只列举了部分,大家用了都知道。
Spring Cloud是一系列框架的有序集合,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,提供了很开发工具包以提供服务发现注册、配置中心、智能路由、消息总线、断路器、负载均衡和数据监控等功能。
微服务核心要素 | Spring Cloud技术栈实现 |
---|---|
服务注册与发现 | Spring Cloud Netflix Eureka、 Spring Cloud Alibaba Nacos、 Spring Cloud Consul、 Spring Cloud Zookeeper |
服务配置与管理 | Spring Cloud Config、 Spring Cloud Alibaba Nacos |
服务熔断器 | Spring Cloud Netflix Hystrix、 Spring Cloud Alibaba Sentinel、 Spring Cloud Circuit Breaker Resilience4J |
服务接口调用(客户端调用服务的简化工具) | Spring Cloud OpenFeign |
客户端负载均衡 | Spring Cloud Netflix Ribbon |
服务路由(API网关) | Spring Cloud Netflix Zuul、Spring Cloud Gateway |
全链路追踪 | Spring Cloud Sleuth |
事件消息总线 | Spring Cloud Bus |
分布式事务 | Spring Cloud Alibaba Seata |
消息驱动 | Spring Cloud Stream |
详情请前往链接: spring.io/projects/sp…
注册中心选型对比
Nacos | Eureka | Consul | Zookeeper | Etcd | SOFARegistry | |
---|---|---|---|---|---|---|
语言 | Java | Java | Go | Java | Go | Java |
官网 | nacos.io | github.com/Netflix/eur… | www.consul.io | zookeeper.apache.org | coreos.com/etcd | www.sofastack.tech/projects/so… |
Github | github.com/alibaba/nac… | github.com/Netflix/eur… | github.com/hashicorp/c… | github.com/apache/zook… | github.com/etcd-io/etc… | github.com/alipay/sofa… |
CAP | CP+AP | AP | CP | CP | CP | AP |
服务健康检查 | CP+AP | AP | CP | CP | CP | AP |
kv存储服务 | N/A | N/A | 支持 | 支持 | 支持 | N/A |
使用接口(多语言能力) | gRPC / Dubbo / REST | 客户端 / HTTP | 支持HTTP和DNS | 客户端 | HTTP / gRPC | 客户端(Java) |
Watch支持 | 支持Long Polling/大部分增量 | 支持Long Polling/大部分增量 | 全量/支持Long Polling | 支持 | 支持Long Polling | 支持(服务端推送) |
Spring Cloud集成 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 支持 | 支持 | 支持 |
网关选型对比
Kong | Spring Cloud Zuul(基于Zuul 1.x) | Spring Cloud Gateway | |
---|---|---|---|
介绍 | Nginx(OpenResty) + Lua插件,高性能 | Java + Servlet + Groovy(热更新) | Java + Spring 5.0 + Reactor非阻塞 |
官网 | konghq.com | github.com/Netflix/zuu… | spring.io/projects/sp… |
Github | github.com/Kong/kong | github.com/Netflix/zuu… | github.com/spring-clou… |
开发方 | Kong(Mashape)公司 | Netflix | Pivotal |
主要用途 | 企业级API管理 | 微服务网关 | 微服务网关 |
开发容易度 | Lua脚本语言,比较难 | Java + Servlet,容易 | Reactor异步,比较难 |
是否开源 | 开源/企业版 | 开源 | 开源 |
支持协议 | RESTful API | RESTful API | RESTful API |
API 注册/动态路由 | 通过 Admin API 管理 | 动态路由 | 动态路由 |
限流 | 支持 | 需要开发 | 支持 |
熔断 | 支持 | 需要其他组件 | 支持 |
重试 | 支持 | 支持 | 支持 |
健康检查 | 支持 | 支持 | 支持 |
负载均衡算法 | 轮询,哈希 | 轮询、随机、加权轮询、自定义 | 轮询、随机、加权轮询、自定义 |
权限 | 内置多种方式 | 开发实现 | 开发实现 |
Tracing | 支持 | 需要其他组件 | 需要其他组件 |
支持Yaml | 支持 | 支持 | 支持 |
配置中心选型对比
Nacos | Apollo | Spring Cloud Config | |
---|---|---|---|
语言 | Java | Java | Java |
官网 | nacos.io | github.com/ctripcorp/a… | spring.io/projects/sp… |
Github | github.com/alibaba/nac… | github.com/ctripcorp/a… | github.com/spring-clou… |
配置实时推送 | 支持(HTTP长轮询1s内) | 支持(HTTP长轮询1s内) | 支持(Spring Cloud Bus) |
版本管理 | 支持 | 支持 | 支持(Git) |
配置回滚 | 支持 | 支持 | 支持(Git) |
灰度发布 | 不支持 | 支持 | 支持 |
权限管理 | 不支持 | 支持 | 支持(依赖Git) |
多集群 | 支持 | 支持 | 支持 |
多环境 | 支持 | 支持 | 支持 |
监听查询 | 支持 | 支持 | 支持 |
多语言 | 主流语言,提供了Open API | 主流语言,提供了Open API | 只支持Java |
配置格式校验 | 支持 | 不支持 | 不支持 |
断路器选型对比
Sentinel | Hystrix | Resilience4j | |
---|---|---|---|
语言 | Java | Java | Java |
官网 | sentinelguard.io/zh-cn/ | github.com/Netflix/Hys… | N/A |
Github | github.com/alibaba/Sen… | github.com/Netflix/Hys… | github.com/resilience4… |
主要用途 | 信号量隔离(并发线程数限流) | 线程池隔离/信号量隔离 | 信号量隔离 |
熔断降级策略 | 基于响应时间、异常比率、异常数 | 基于异常比率 | 基于异常比率、响应时间 |
实时统计实现 | 滑动窗口(LeapArray) | 滑动窗口(基于 RxJava) | Ring Bit Buffer |
动态规则配置 | 支持多种数据源 | 支持多种数据源 | 有限支持 |
扩展性 | 多个扩展点 | 插件的形式 | 接口的形式 |
基于注解的支持 | 支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 | Rate Limiter |
流量整形 | 支持预热模式、匀速器模式、预热排队模式(流量规则处可配置) | 不支持 | 简单的 Rate Limiter 模式 |
系统自适应保护 | 支持 | 不支持 | 不支持 |
控制台 | 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 | 简单的监控查看 | 不提供控制台,可对接其它监控系统 |
链路跟踪选型对比
CAT | Zipkin | Pinpoint | Skywalking | |
---|---|---|---|---|
语言 | Java | Java | Java | Java |
官网 | konghq.com | zipkin.io/ | github.com/naver/pinpo… | skywalking.apache.org/zh/ |
Github | github.com/dianping/ca… | github.com/openzipkin/… | github.com/naver/pinpo… | github.com/apache/skyw… |
实现方式 | 代码埋点(拦截器,注解,过滤器等) | 拦截请求,发送(HTTP,MQ)数据至Zipkin服务 | Java探针,字节码增强 | Java探针,字节码增强 |
存储选择 | Mysql , HDFS | In-Memory , Mysql , Cassandra , Elasticsearch | HBase + Mysql | Elasticsearch , H2 , Mysql , TiDB |
通信方式 | 基于Netty来实现的NIO的数据传输 | HTTP , MQ | Thrift | gRPC |
入侵度 | 比较大 | 比较小 | 字节码探针技术,代码无侵入 | 字节码探针技术,代码无侵入 |
MQ监控 | 不支持 | 不支持 | 不支持 | 支持(RocketMQ,Kafka) |
全局调用统计 | 支持 | 支持 | 不支持 | 支持 |
Trace查询 | 不支持 | 支持 | 不支持 | 支持 |
报警 | 支持 | 不支持 | 支持 | 支持 |
JVM监控 | 不支持 | 不支持 | 支持 | 支持 |
优点 | 功能完善。 | Spring-Cloud-Sleuth可以很好的集成Zipkin , 代码无侵入,集成非常简单 , 社区更加活跃。 | 完全无侵入, 仅需修改启动方式,界面完善,功能细致。 | 完全无侵入,界面完善,支持应用拓扑图及单个调用链查询。功能比较完善(Zipkin + Pinpoint) |
缺点 | 1. 代码侵入性较强,需要埋点。 2. 文档比较混乱,文档与发布版本的符合性较低,需要依赖点评私服 (或者需要把他私服上的jar手动下载下来,然后上传到我们的私服上去)。 |
1. 默认使用的是Http请求向Zipkin上报信息,耗性能。 2.跟Sleuth结合可以使用RabbitMQ的方式异步来做,增加了复杂度,需引入RabbitMQ 。 3.数据分析比较简单。 |
1.不支持查询单个调用链, 对外表现的是整个应用的调用生态。 2.二次开发难度较高 |
1. 3.2版本之前BUG较多 ,网上反映兼容性较差 . 3.2新版本的反映情况较少 2.依赖较多。 |
文档 | 网上资料较少,仅官网提供的文档,比较乱 | 文档完善 | 文档完善 | 文档完善 |
Spring Boot的自动化配置实现其实是得益于Spring Framework的@Enable模块驱动。
框架实现 | 注解 | 激活模块 |
---|---|---|
Spring Framework | @EnableTransactionManagement | 事务管理模块 |
@EnableWebMvc | Web Mvc模块 | |
@EnableAspectJAutoProxy | AspectJ模块 | |
@EnableCaching | 缓存模块 | |
@EnableEnableScheduling | 定时任务模块 | |
@EnableAsync | 异步处理模块 | |
@EnableMBeanExport | JMX模块 | |
Spring Boot | @EnableAutoConfiguration | 自动装配模块 |
@EnableConfigurationProperties | 配置属性绑定模块 | |
@EnableOAuth2Sso | OAuth2 单点登陆模块 | |
@EnableManagementContext | Actuator模块 | |
Spring Cloud | @EnableDiscoveryClient | 服务发现模块 |
@EnableFeignCliens | Feign客户端模块 | |
@EnableCircuitBreaker | 服务熔断模块 | |
@EnableEurekaServer | Eureka服务端模块 | |
@EnableEurekaClient | Eureka客户端模块 |
上表是部分Spring Framework、Spring Boot和Spring Cloud的@Enable注解模块,还有很多其他大家可以自行查阅,其实我们也可以使用@Enable注解模块实现自定义的Starter,使自己的项目也能够自动配置化。