SpringCloud分布式开发
Spring Cloud为开发人员提供了快速构建分布式系统中的一些通用模式(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式 会话,群集状态)。 分布式系统的协调导致了锅炉板模式,并且使用Spring Cloud开发人员可以快速地站起来实现这些模式的服务和应用程序。 它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心和受管平台,如Cloud Foundry。
- 服务发现——实现:Netflix Eureka/Consul(必须)
- 分布式配置——Spring Cloud Config(必须)
- 服务网关——实现:Netflix Zuul(需要不一定要,根据开发进度需求逐步完善)
- 客服端负载均衡——实现:Netflix Ribbon(需要不一定要,根据进度逐步完善)
- 断路器——实现Netflix Hystrix(需要不一定要,根据进度逐步完善)
服务发现
目前实现采用spring cloud 全家桶解决方案实现的服务发现主要是,Eureka 或 Consule 2种方案。
服务发现之 Eureka 实现
Eureka 是一个RESTFul服务,由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
服务发现之 Consul实现
Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对。 一致性协议采用 Raft 算法,用来保证服务的高可用. 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制。 参考: http://cloud.spring.io/spring-cloud-consul/#quick-start
Consul 的使用场景
- docker 实例的注册与配置共享
- coreos 实例的注册与配置共享
- vitess 集群
- SaaS 应用的配置共享
- 与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件
Consul 的优势
- 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft.
- 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持.
- 支持健康检查. etcd 不提供此功能.
- 支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议.
- 官方提供web管理界面, etcd 无此功能. 综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究.可以替代Eureka
分布式配置中心
这个还是静态的,得配合Spring Cloud Bus + AMQP 实现动态的配置更新。
客服端负载均衡
Ribbon,主要提供客户侧的软件负载均衡算法。 Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略:
- 简单轮询负载均衡
- 加权响应时间负载均衡
- 区域感知轮询负载均衡
- 随机负载均衡
Ribbon中还包括以下功能:
- 易于与服务发现组件(比如Netflix的Eureka)集成。
- 使用Archaius完成运行时配置
- 使用JMX暴露运维指标,使用Servo发布
- 多种可插拔的序列化选择
- 异步和批处理操作(即将推出)
- 自动SLA框架(即将推出)
- 系统管理/指标控制台(即将推出)
断路器
断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费 CPU 周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。 断路器增加了稳定性和灵活性,以一个系统,提供稳定性,而系统从故障中恢复,并尽量减少此故障的对性能的影响。它可以帮助快速地拒绝对一个操作,即很可能失败,而不是等待操作超时(或者不返回)的请求,以保持系统的响应时间。如果断路器提高每次改变状态的时间的事件,该信息可以被用来监测由断路器保护系统的部件的健康状况,或以提醒管理员当断路器跳闸,以在打开状态。
服务网关
类似nginx,反向代理的功能,不过netflix自己增加了一些配合其他组件的特性。
参考
- The Netflix Stack Using Spring Boot - Part 1: Eureka
- Netflix开源他们的另一个架构——Eureka
- Eureka 的 Application Client 客户端的运行示例
- Eureka service 客户端的注册以及运行示例
- Linux 下 Eureka 服务器的部署
- Spring Cloud源码解析:一个注解加载Eureka client
- Spring-cloud & Netflix 源码解析:Eureka client 到Server的调用过程
- Spring-cloud & Netflix 源码解析:Eureka client 注册过程
- Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口
- Netflix发布云中间层服务开源项目Ribbon
- Ribbon 和 Eureka 的集成
- CircuitBreaker
- Circuit Breaker Pattern(必读)
- 断路器模式
- Netflix Zuul vs Nginx performance