原生SpringCloud
通过对SpringBoot风格进行封装,屏蔽了复杂的配置和实现原理,最终给开发者提供一套简单易懂、容易部署的分布式系统开发工具包。
Eureka:服务注册与发现
- 注册:每个服务都向Eureka注册自己提供服务的元数据,包括服务的ip地址、端口号、版本号、通信协议等;Eureka将各个服务维护在一个服务清单中(双层Map,第一层key是服务名、第二层key是服务的实例名,value是服务地址加端口)。同时对服务维持心跳,剔除不可用的服务。Eureka集群各节点相互注册,每个实例中都有也一样的服务清单;
- 发现:Eureka注册的服务之间调用不需要指定服务地址,而是通过服务名向注册中心咨询,并获取所有服务实例清单(缓存到本地),然后实现服务的请求访问。
Ribbon
服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台【被调用方的服务地址有多个】,Ribbon也是通过发起http请求,来进行调用。通过调用服务名的地址来实现。每调用一个接口都要手动去发起Http请求;
Feign
基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求,简化服务间的调用。在Ribbon的基础上进行进一步的封装。单独抽出一个组件,SpringCloud Feign,只需要创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。远程调用就像调用本地服务一样。
Hystrix
发起请求是通过Hystrix线程池走的,不同服务走不同的线程池,实现不同服务调用的隔离,通过统计接口超时次数返回默认值,实现服务熔断和降级。
Zuul
如果前端、移动端调用后端系统,统一从zuul网关进入,由zuul网关转发请求给对应的服务,通过与Eureka进行整合,将自身注册到Eureka下的应用,从Eureka下获取所有的服务实例,进行服务路由。Zuul提供一套过滤器机制,开发者可以自己指定哪些规则的请求需要执行校验逻辑,只有通过校验的请求才会被路由到具体服务实例上,否则返回错误提示。
Config
分布式配置中心,支持本地仓库、SVN、GIT、Jar包内配置等模式。为分布式系统中的外部化配置提供服务器和客户端支持。使用config服务器,可以在中心位置管理所有环境中应用程序的外部属性。
Bus
消息总线,管理和广播分布式系统中的消息。
SpringCloud Alibaba
阿里旗下的一套微服务解决方案,比原生的SpringCloud具备更多的功能。
主要功能
- 服务限流降级:默认支持WebServlet、WebFlux、OpenFeign、RestTemplate、SpringCloud,Zuul,Dubbo和RocketMQ限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,支持查看限流降级Metrics监控;
- 服务注册与发现:适配springcloud服务注册与发现标准,默认集成Ribbon;
- 分布式配置中心:支持分布式系统中的外部配置,配置更改时自动刷新。
- 消息驱动能力:基于SpringCloud Stream为微服务应用构建消息驱动能力。
- 分布式事务:使用Seata解决微服务的分布式事务。代码中使用@GlobalTransactional注解,高效并且对业务零侵入地解决分布式事务问题;
- 阿里云对象存储:OSS,海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- 分布式任务调度;
- 阿里云短信服务SMS;
相关组件
- Sentinel:把流量作为切入点,从流量控制、熔断降级,系统负载保护等多个维度保护服务稳定性;
- Nacos:易于构建云原生应用的动态服务发现、配置管理和服务管理平台;
- RocketMQ:开源分布式消息系统,基于高可用分布式集群技术,提供低延迟的,高可靠的消息发布与订阅服务。
- Dubbo:高性能Java RPC框架;
- OSS:阿里对象存储服务;
- SchedulerX:分布式任务调度产品;
- SMS:短信服务。
区别
SpringCloud Alibaba致力于提供微服务开发的一站式解决方案。只需要添加一些注解和少量配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿里云中间件来迅速搭建分布式应用系统。并且成套产品搭配完善的可视化界面给开发带来极大的便利。
SpringCloudAlibaba实际上是对SpringCloud2.x的实现和扩展组件。nacos是分布式配置中心+分布式注册中心=Eureka+config。
SpringCloud部分组件停止维护和更新,给开发者带来不便,部分环境搭建复杂,没有完善的可视化界面,需要大量的二开和定制;配置复杂,难以上手,部分配置差别难以区分和合理应用。