一只糊涂的程序汪
下午有个程序员朋友问我用过springCloud吗?我果断的回答:没有。 据说springCloud还挺火,不妨搜搜。
去spring官网瞅了一眼,不禁脸红到大腿根。什么Eureka、Zuul、Hystrix、Feign、Ribbon等,都是SpringCloud的组件啊。这些东东我已经用了几个月了。鄙人愚钝。
SpringCloud是什么?
其实SpringCloud就是上面说的那些组件的组合,为微服务架构提供了非常完整的支持。下面是部分组件的简介。
- Eureka:服务注册与发现,用于服务管理。
- Feign: web调用客户端,能够简化HTTP接口的调用。
- Ribbon:基于客户端的负载均衡。
- Hystrix:熔断降级,防止服务雪崩。
- Zuul / Gateway:网关路由,提供路由转发、请求过滤、限流降级等功能。
- Config:配置中心,分布式配置管理。
- Sleuth:服务链路追踪
- Admin:健康管理
下面展开说一下。
Feign
微服务之间有必定有联系,这些服务是怎么互相调用呢?是用的http协议,cloud用Feign简化了http接口调用。 只需要在调用的接口前加
@FeignClient(name = "service—name")
Ribbon
是基于客户端的负载均衡,每个客户端节点都有一份自己访问的服务端地址列表,这些列表是从服务注册中心获取。 Ribbon与Eureka配合使用时,Ribbon自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。 Ribbon负债均衡算可以参考Ribbon的负载均衡策略及原理
Zuul
网关路由,Zuul本质上就是filter,把外部请求通过配置的路径地址分发到其他服务。
Eureka
前面Feign、Ribbon、Zuul都是基于Eureka注册中心。
Hystrix
微服务之间少不了互相调用,每个服务都有可能发生异常状况,一旦其中一个服务不能提供服务(网络不佳、服务挂掉、负债过大等),就会影响调用它的服务,产生连锁反应,发生雪崩效应(由基础服务故障导致联级故障),真的是没有一片雪花(服务)是无辜的。就像是赤壁中的火烧战船,一只也跑不了,导致全军覆没。
** 服务不可用可能的原因:**
- 服务器宕机
- 网络故障
- 程序异常
- 负载过大,超负荷
Hystrix的目的就是解决雪崩,隔离坏的服务,不影响其他服务。隔离的这个服务的功能由其他服务替代,就是服务降级。 本来是范冰冰,现在只能用凤姐。
它的设计思路来至于舱壁模式:
舱壁模式(Bulkhead)隔离了每个工作负载或服务的关键资源,如连接池、内存和CPU。
使用舱壁避免了单个工作负载(或服务)消耗掉所有资源,从而导致其他服务出现故障的场景。
这种模式主要是通过防止由一个服务引起的级联故障来增加系统的弹性。
简单的说就是对每个请求设置单独的连接池,连接数,不影响别的相应,就像一个防水舱。
一个服务调用a和b俩个服务。一旦调用a服务的时候超时了。占用了大量的资源。导致调用b也失败。 如果给调用a设置单独的资源,就不会影响到调用b。
** 容错机制 **
- 为网络服务设置超时
- 使用断路器模式,就好像是家里的保险丝。
- 对容易导致错误的代理。判断是正常异常还是请求失败
- 实现快速失败,如果一段时间内检测到许多类似的错误,就会在未来的一段时间内,强制对该服务快速失败直接返回。
- 自动诊断依赖服务是否恢复正常。过一段时间会重新请求,如果服务恢复正常,就恢复请求。
这样就做到了自我修复。
先简单介绍到这里。后续再做详细介绍。