SpringCloud总结

介绍

  1. SpringCloud是什么?

    SpringCloud是依附于SpringBoot的一系列实用框架的集合,俗称微服务“全家桶”。
    核心组件:Eureka,Ribbon,Feign,Hystrix,Zuul
    Eureka:提供服务注册功能。
    Ribbon:提供负载均衡功能。
    Feign:提供远程调用功能。
    Hystrix:提供线程熔断功能。
    Zuul:提供统一网关功能。在这里插入图片描述

🔴 Eureka

Eureka是Netflix公司的一个服务发现组件,包含注册中心(Eureka Server)和eureka客户端,
主要功能是实现服务治理(服务的注册与发现)。

服务注册中心:Eureka客户端会把自身服务注册到注册中心,为其他Eureka客户端提供服务,Eureka客户端通过注册中心相互发现对应服务并进行调用。

Eureka客户端:相对注册中心而言,所有注册到服务注册中心的服务都可以表述为Eureka客户端;但是站在提供方和消费方的角度看,Eureka客户端又可以称之为服务端。

如何判断服务可用?

Eureka通过心跳来判断服务是否可用。客户端通过轮询算法向所有服务器发送心跳,如果服务器多个心跳周期未收到心跳,就会把这个节点从服务列表移除,这也可以称为服务续约。

如何创建集群?

修改yml配置文件里的defaultZone,配置多个注册中心地址即可在多个注册中心注册。

⭐️Eureka和ZooKeeper的区别?
  • 设计原则不同

    分布式系统有一个CAP原则,就是一致性、可用性、分区容错性只能同时保持2个。

    Eureka遵循的是AP原则,即放弃强一致性,保证可用性和分区容忍性;

    ZooKeeper遵循的是CP原则,即强调一致性和分区容忍性,放弃对可用性的维持,性能稍低。

  • 节点地位不同

    Eureka各个节点平等,保证了服务可用性,数据不一定是最新的;

    ZooKeeper有Leader和Follower角色,在选取期间服务不可用,可用性略低。

  • 保护机制不同

    Eureka采用自我保护机制解决分区问题;ZooKeeper采用过半数存活原则。

  • 本质不同

    Eureka本质上是一个工程,而ZooKeeper只是一个进程。

🔴 Zookeeper

Zookeeper是一个分布式协调工具,可以实现注册中心功能。

使用方式与Eureka大同小异。

🔴Ribbon

Ribbon是Netflix公司的一个基于HTTP和TCP等协议负载均衡的组件。
为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。

什么是负载均衡?有哪些方式?

负载均衡(Load Balance),顾名思义,就是为了均衡负载。其中分为集中式LB进程内LB

  • 集中式LB

    在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;

  • 进程内LB

    将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。

Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

Ribbon的负载算法有哪些?

Ribbon负载算法默认是轮询算法,其他还有随机分配、设置权重、根据性能分配等等方式,具体这一块了解的不是太多。

  • RoundRobinRule: 默认轮询的方式
  • RandomRule: 随机方式
  • WeightedResponseTimeRule: 根据响应时间来分配权重的方式,响应的越快,分配的值越大。
  • BestAvailableRule: 选择并发量最小的方式
  • RetryRule: 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
  • ZoneAvoidanceRule: 根据性能和可用性来选择。
  • AvailabilityFilteringRule: 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)

🔴 Feign

Feign是一个声明式的web service客户端,它让微服务之间的调用变得更简单了,就如同controller去调用service一样的简单。
Feign内置了Ribbon,自带负载均衡的功能。

Feign的使用采用接口的方式,创建一个接口,在上面添加@FeignClient的注解,然后将需要调用的其他服务的方法定义成抽象方法即可,然后就可以像调用自身工程的方法一样去调用。

Feign本身不支持Spring MVC的注解,它有一套自己的注解。

🔴 OpenFeign

OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

使用方法是主启动类增加 @EnableFeignClients 注解,

然后在业务上面直接标注如:@FeignClient(name = “user-center”)

⭐️Ribbon和Feign的区别?
  1. Ribbon和Feign都是调用其他服务的,但方式不同。
  2. 启动类注解不同,Ribbon是@RibbonClient feign的是@EnableFeignClients
  3. 服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
  4. 调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign需要将调用的方法定义成抽象方法即可。

🔴 Hystrix

Hystrix是一个断路器。Hystrix能够保证在一个依赖出问题的情况下,不会导致整个服务失败,避免级联故障,以提高分布式系统的弹性。
当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。

“断路器”本身是一种开关设置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出服务方无法处理的异常,这样就保证服务方调用线程不会被长时间、不必要的占用,从而避免故障在在分布式系统中的绵延,乃至雪崩。

一个服务失败,导致整条链路的服务都失败的情形,我们称之为服务雪崩

服务降级

服务器忙,请稍后再试,返回一个友好提示,fallback,或者启动备用方案

服务熔断

保险丝达到最大服务访问后,拉闸限电,然后调用服务降级的方法并返回友好提示

服务限流

秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行

使用方法:主启动类 添加@EnableCircuitBreaker注解,业务类标注如下

@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000") //3秒钟以内就是正常的业务逻辑
解决代码膨胀

@DefaultProperties(defaultFallback = “”) //在controller类上标注,如果配置了兜底方法,就按照自己的来,如果没有的话就按照这里配置的

🔴 gateway

SpringCloud在之前是使用的netflix公司zuul,后来zuul的性能表现不是很理想,而且zuul2.0连续跳票,所以催生了spring团队开发了Gateway项目。Gateway也是作为服务网关的功能而存在。

API网关封装了系统内部架构,为每个客户端提供一个定制的API。

它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理等。API网关方式的核心要点是:所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。

🔴 Zuul

在微服务架构中,通常会有多个服务提供者。设想一个电商系统,可能会有商品、订单、支付、用户等多个类型的服务,而每个类型的服务数量也会随着整个系统体量的增大也会随之增长和变更。作为UI端,在展示页面时可能需要从多个微服务中聚合数据,而且服务的划分位置结构可能会有所改变。网关就可以对外暴露聚合API,屏蔽内部微服务的微小变动,保持整个系统的稳定性。

Nginx和gateway的区别?

  • Nginx适合做那种门户网关,是作为整个全局的网关,是对外的,处于最外层的;而Gateway这种,更像是业务网关,主要用来对应不同的客户端提供服务的,用于聚合业务的。各个微服务独立部署,职责单一,对外提供服务的时候需要有一个东西把业务聚合起来。
  • 像Nginx这类网关,都是用不同的语言编写的,不易于扩展;而Gateway就不同,它是用Java写的,易于扩展和维护
  • Gateway这类网关可以实现熔断、重试等功能,这是Nginx不具备的

其它问题

Dubbo是什么?和SpringCloud有什么区别?

Dubbo也是一种微服务框架,和SpringCloud一样。不过它是使用ZooKeeper作为服务注册中心,通过RPC服务调用方式进行远程调用。
SpringCloud使用Eureka来支持服务注册,服务调用方式为REST API。同时还集成了各类其他的类似于balabala…的组件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值