一、SpringCloud
SpringCloud是一系列框架的有序集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。SpringCloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过SpringBoot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
二、SpirngCloud的五大核心组件
- 服务注册中心:Eureka
- 客户端负载均衡:Ribbon
- 熔断器:Hystrix
- 声明式的Http客户端:Fegin
- 服务网关:Zuul
三、五大组件详解:
1.Eureka注册中心
简述:
Eureka是一个REST (Representational State Transfer)服务,它主要用于AWS云,用于定位服务,以实现中间层服务器的负载平衡和故障转移,我们称此服务为Eureka服务器。Eureka也有一个基于java的客户端组件,Eureka客户端,这使得与服务的交互更加容易,同时客户端也有一个内置的负载平衡器,它执行基本的循环负载均衡。简单来说Eureka就好比是一个公司的后台,负责管理、记录服务提供者的信息。我们只要将我们的微服务注册到Eureka中去,我们的服务调用者在调用微服务的时候,就无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你,从而完成微服务的调用。
Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
2.Ribbon负载均衡
简述:
Ribbon是***flix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中Load Balancer后面的所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。
基本使用:
Ribbon的负载均衡有两种方式
- 和 RestTemplate 结合 Ribbon+RestTemplate
- 和 OpenFeign 结合
Ribbon的核心子模块
- ribbon-loadbalancer:可以独立使用或者和其他模块一起使用的负载均衡API
- ribbon-core:Ribbon的核心API
3.Hystrix熔断器
简述:
Hystrix:英 [hɪst’rɪks] 美 [hɪst’rɪks] ,翻译过来是“豪猪”的意思。 在分布式环境中,不可避免地会出现某些依赖的服务发生故障的情况。Hystrix是这样的一个库,它通过添加容许时延和容错逻辑来帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,阻止跨服务的级联故障,并提供了退路选项,所有这些都可以提高系统的整体弹性。
为解决雪崩效应,它通过四个方面的机制来解决这个问题:
- 隔离(线程池隔离和信号量隔离):限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
- 优雅的降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
- 熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
- 缓存:提供了请求缓存、请求合并实现。
- 支持实时监控、报警、控制(修改配置)
4.Fegin组件(声明式的Http客户端)
简述:
Feign存在的目的就是为了简化微服务之间的调用。他有一个动态代理的机制,首先,如果你对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理,接着你要是调用那个接口,本质就是会调用 Feign创建的动态代理,Feign的动态代理会根据你在接口上@RequestMapping等注解,来动态构造出你要请求的服务的地址,最后针对这个地址,发起请求、解析响应。
FeginClient注解的属性:
属性名 | 默认值 | 作用 | 备注 |
---|---|---|---|
value | 空字符串 | 调用服务名称,和name属性相同 | |
serviceId | 空字符串 | 服务id,作用和name属性相同 | 已过期 |
name | 空字符串 | 调用服务名称,和value属性相同 | |
url | 空字符串 | 全路径地址或hostname,http或https可选 | |
decode404 | false | 配置响应状态码为404时是否应该抛出FeignExceptions | |
configuration | {} | 自定义当前FeginClient的一些配置 | 参考FeignClientsConfiguration |
fallback | void.class | 熔断机制,调用失败时,走的一些回退方法,可以用来抛出异常或给出默认返回数据。 | 底层依赖hystrix,启动类要加上@EnableHystrix |
path | 空字符串 | 自动给所有方法的requestMapping前加上前缀,类似与controller类上的requestMapping | |
primary | true |
5.Zuul网关
简述:
Zuul是***flix开源的微服务网关,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul组件的核心是一系列的过滤器。
这些过滤器可以完成以下功能:
-
验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
-
审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
-
动态路由: 以动态方式根据需要将请求路由至不同后端集群处。
-
压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。
-
负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
-
静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
-
多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。
四、参考文档
-
Spring Cloud
-
Spring Cloud ***flix
-
spring-cloud/spring-cloud-***flix: Integration with ***flix OSS ***ponents (github.***)
-
Spring Cloud Config
五、总结
- 本文简单讲述Spring Cloud的五个核心组件以及各自的作用,并为对如何使用进行赘述,后续会各个组件如何使用进行讲解。
- 欢迎大家提出建议以及批评,有任何问题可以私信