SpringCloud理论轻松入门

前言

在学习SpringCloud之前,先解释几个概念:分布式、微服务、集群。

N年前,单体应用还是市场上的主流架构,可是随着网民越来越多、流量越来越大,单个服务器逐渐无法承受压力,于是分布式出现了。

所谓的分布式,就是将原来的单体应用拆开来,形成数个应用,这些应用运行在不同的服务器上(当然也可以是一个)、也能连接不同的数据库,采用不同的持久层框架。他们是完全分离的足以自我运行的应用,但是在业务上又存在着千丝万缕的关系……这种被拆分出来的应用,被称为“微服务”。

也许最开始使用微服务就足够了,可是流量的增长超乎了人们的预料,于是集群随之而出。

什么叫集群呢,比如虽然支付服务被拆开了,可是在双十一时仍然是捉襟见肘,无法承受大量的流量。如果一个不够,那就来两个、三个……三个支付服务同时运行,一号挂了还有二号,二号挂了还有三号。这下,就算是双十一也能轻松应对了。

一、Eureka

Eureka是较老的注册中心,是Spring Cloud的东家——Netflix公司开发的服务治理模块。什么是服务治理?在分布式项目中,微服务们各自为战,乱糟糟的一团,甚至某些微服务挂掉了也没人知道。所以需要一个军师来统筹大家,来实现服务调用、负载均衡、容错等,这个军师就是服务治理的注册中心了。

Eureka是比较老的家伙,并且在2021年的今天已经停更了,于是市面上出现了替代他的新技术zookeeper、consul以及阿里巴巴的nacos,这些技术各有优劣,不过都大差不差。

但是在理念上,他们还是有所区别的。

这里要说到分布式系统的经典CAP理论,CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性(Consistency),可用性(Availability)和分区容错性(Partition Tolerance)这三个需求。

这里的一致性我理解为数据一致性,或者说准确性。

比如,一个微服务因为网络波动,无法向注册中心发出持续的信号,如果是CP的注册中心,为了数据准确性,就会无情地将这个微服务踢出,而AP的注册中心,则是会挽留一下,直到确定微服务宕机,才会剔除。

显然,一致性和可用性是完全相反的,不可能两者兼顾。所以这几个服务治理组件也各有所长。

AP:Eureka。

CP:zookeeper、consul

nacos较为特殊,他默认为ap,但也可以调整为cp模式,可以说是强无敌了。

二、Ribbon

SpringCloud微服务之间通过RestTemplate(底层是Http)互相调用,这就有一个问题,如果调用的不是一个应用,而是一个微服务集群那该怎么办呢?

Ribbon应运而生,它可以实现调用的负载均衡,也就是通过ribbon,这一次可以请求集群一号,下一次请求集群二号……Ribbon有轮询、随机、过滤等负载均衡算法可以供你选择,当然你也可以自定义自己的算法。

三、Feign

和RestTemplate一样,是用来实现服务间相互调用的组件,但是不同的是,RestTemplate是很传统的创建对象、调用对象方法来访问接口这样的方式,而Feign是声明式、模板化的,通过简单的注解声明,Feign就能让这个接口类中的所有方法去调用对应的外部系统接口。没错,除了其他的微服务外Feign也能调用外部系统的接口。

并且,Feign也能伙同Ribbon实现负载均衡,就像Ribbon和RestTemplate一样。

四、Hystrix

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

通常,hystrix用来实现服务熔断、服务降级、服务限流。

服务熔断和服务降级都是由于服务不可用,为了避免整个系统出现雪崩,给出其他的备选方法。

这两者不同的是触发原因的不同,服务熔断是因为下游的微服务自身出现故障而引起,而服务降级一般是从效率考虑。比如当前系统压力太大,返回提示请稍等,等压力小了之后再恢复服务。

五、Zuul

我们不妨设想,一个系统中有很多微服务业务提供者,他们IP地址、端口都不同,客户端很难去调用,所以这个时候需要路由网关Zuul登场了,Zuul不单可以实现路由映射的功能,使客户端仅仅调用Zuul的地址,就能访问其他业务提供者的接口,而且还能实现负载均衡、过滤等功能。

六、SpringCloud Config配置中心、Bus消息总线、Stream

因为微服务太多,配置文件不好维护管理,所以有了Config。

Config可以将配置文件托管到git上,从git拉取并同步到其他微服务中,方便项目维护管理。

而Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。

至于Stream?

个人感觉Steam就像Mybatis一样,不管底层数据库是Mysql还是Oracle亦或是PostgreSQL,Mybatis都可以屏蔽底层的差异,供你使用。Stream也是这样,它可以屏蔽底层RabbitMQ、kafka的差异,为开发者提供统一的调度方法,减少了不必要的学习,方便进行开发。

七、其他组件

因为上述的组件很多都停更了,所以现在又出现了新的取代者,不过原理都差不多,甚至使用起来还更方便,所以我觉得只要稍作了解,项目中再去学习也差不多了。

Eureka→Nacos

Config→Nacos

Bus→Nacos

Histryx→Sentinel

Zuul→GateWay

你可能感兴趣的:(spring,cloud,spring,后端)