共计 3880 个字符,预计需要花费 10 分钟才能阅读完成。
这篇文章将为大家详细讲解有关分布式架构 SpringCloud 如何实现 CAP,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
调研 SpringCloud
SpringCloud 是现阶段最火的微服务治理框架,那么 SpringCloud 如何实现服务治理的 CAP,这里我只想谈谈我对 SpringCloud 架构思想的理解。
个人理解的 SpringCloud 本质:
1)封装业界最火的基础组件(也可以叫中间件),豌豆荚的 Netflix 一篮子组件,并注入 SpringBoot 特性,无缝对接 SpringBoot 项目,业务开箱即用。
2)SpringCloud 本质上也是一个高级中间件,比 spring 和 springBoot 都高级,但是比他们都简单,也更加的灵活。
那么问题来了,SpringCloud 能为我们解决什么问题呢,特性、有点和缺点有事什么,网上百度一下,一大堆乱七八糟的文章,都是浅尝辄止,人云亦云,这个可能会给很多架构师出了很多的难题,为嘛选型 SpringCloud。
其实技术对于架构师来说不是难事,主要难在如何选型和技术梳理,SpringCloud 官网 http://projects.spring.io/spring-cloud/,SpringCloud 中文翻译网站 https://springcloud.cc/,其实很好的利用好这两个网站,对于你更好的掌握好这个框架是很有帮助的。
SpringCloud 整体功能模块
分布式配置模块
SpringCloudConfig,分布式配置,阿里也有自己自研的 config server,那么 SpringCloud 的分布式配置系统有哪些特性,这里就简单的总结下。SpringCloudConfig 是 SpringCloud 提供的分布式配置中心的解决方案,依托于 Netflix 服务治理模块和 Consul 服务治理模块,解耦为 server 和 client,server 就是分布式配置中心,独立部署,暴露一些 restful 接口,获取配置信息。客户端通过 starter 集成到业务系统,与业务系统一块启动,通过指定对应的 server 配置中心,热加载与应用相关的配置信息,并本地缓存。SpringCloud 支持 git 和文件两种模式的分布式配置中心,那么这两种如何保证 CAP,这就得仔细的阅读源码。当然你可以直接通过 client 访问 server,获取配置信息,但是这样就会有单点问题了,一旦 server 挂了,就很难玩完了,其实 SpringCloud 本身框架设计的理念就是服务化集群管理,怎么可能出现单点故障了,client 和 server 都可以以一个独立的微服务注册到 eureka 或者 consul 注册中心,从而实现 client 和 server 的服务治理,就可以充分的利用 consul 的 CP 和 eureka 的 AP 特性,达到服务的高可用。
Netflix 服务治理模块(Eureka)
SpringCloudNetflix,考虑到发生故障的情况,服务注册中心发生故障必将会造成整个系统的瘫痪,因此需要保证服务注册中心的高可用。Eureka Server 在设计的时候就考虑了高可用设计,在 Eureka 服务治理设计中,所有节点既是服务的提供方,也是服务的消费方,服务注册中心也不例外。
Eureka Server 的高可用实际上就是将自己做为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。
Eureka Server 的同步遵循着一个非常简单的原则:只要有一条边将节点连接,就可以进行信息传播与同步。可以采用两两注册的方式实现集群中节点完全对等的效果,实现最高可用性集群,任何一台注册中心故障都不会影响服务的注册与发现。eureka 强调高可用性,也就是牺牲强一致性的前提下,保证 AP。
eureka 是 Servlet 程序,需要嵌入到 Servlet 容器中,会影响服务治理的性能,这就是在网关技术选型的时候很多人放弃 eureka-zuul, 选择更加粗暴的 Nginx 和 lua 做基础网关,服务只要嵌入到 servlet 容器,性能就会受到 setvlet 容器的限制。
eureka1.0 高可用架构缺陷:
eureka 没有使用强一致性的选举协议,比如 ZAB 协议作为数据一致性的算法(zookeeper 选举算法)比如 Consul 的数据一致性算法 Raft,Eureka 集群的多副本的一致性协议采用类似“异步多写”的 AP 协议,每一个 server 都会把本地接收到的写请求(register/heartbeat/unregister/update)发送给组成集群的其他所有的机器(Eureka 称之为 peer,对等服务 ),特别是 hearbeat 报文是周期性持续不断的在 client- server- all peers 之间传送。
eureka 数据一致性协议缺点:
每一台 Server 都需要存储全量的服务数据,Server 的内存明显会成为瓶颈。当订阅者却来越多的时候,需要扩容 Eureka 集群来提高读的能力,但是扩容的同时会导致每台 server 需要承担更多的写请求,扩容的效果不明显。组成 Eureka 集群的所有 server 都需要采用相同的物理配置,并且只能通过不断的提高配置来容纳更多的服务数据
eureka2.0 架构升级:
数据推送从 pull 走向 push 模式,并且实现更小粒度的服务地址按需订阅的功能。
读写分离,写集群相对稳定,无需经常扩容;读集群可以按需扩容以提高数据推送能力。
新增审计日志的功能和功能更丰富的 Dashboard。
eureka2.0 架构整体升级类似于阿里巴巴自研的分布式注册中心 ConfigServer 的架构演进。
分布式消息总线模块(Bus)
SpringCloudBus 又是一个什么样的功能组件,顾名思义,那肯定是消息总线,如果不熟悉消息总线这个概念,可以自行的百度。这里就简单描述下 SpringCloudBus 微服务框架,主要解决什么问题。
SpringCloudBus 消息总线支持 Rabbitmq 和 Kafka,工程目录结构:Spring-cloud-bus、Spring-cloud-bus-dependencies、Spring-cloud-starter-bus-amqp、Spring-cloud-starter-bus-kafka,其实 Springcloud 所有的工程目录结构都是按照 springboot 的格式来梳理的。消息总线底层是采用 SpringCloudStream 完成服务间的通信。
单点登录 web 模块:SpringCloudForCloudFoundry
集群管理模块:SpringCloudCluster
Consul 服务治理模块:SpringCloudConsul
安全认证模块:SpringCloudSecurity
全链路追踪系统:SpringCloudSleuth
数据流服务模块:SpringCloudDataFlow
消息队列模块
SpringCloudStream 是一个用来为微服务应用构建消息驱动能力的框架,隔离业务与消息中间件,屏蔽掉消息中间件的差异性,比如 Rabbitmq、Kafka 等,当然 SpringCloud 目前只支持 Rabbitmq 和 Kafka,中间件团队可以自己封装 Rocketmq 的绑定器,并以插件的形式侵入到业务中,从而让业务无缝的切到 Rocketmq,不用更改上层的业务代码,完成消息中间件的升级。
网关模块
SpringCloudGateway 是 SpringCloud 封装的又一套分布式微服务架构网关。
最新网关特性如下:基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0 构建;能够匹配任何请求属性上的路由;Hystrix 断路器集成;Spring Cloud DiscoveryClient 集成;请求率限制;路径重写;容易编写断言和过滤器;支持断言和过滤器到路由端。
Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,Spring Cloud Gateway 旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式。Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,目标是替代 Netflix ZUUL,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控 / 埋点,和限流等。
网关模块的核心概念:路由、断言和过滤器,路由功能是网关的基本模块,它由一系列的 ID,URI,以及断言和过滤器组成。断言是 java8 的函数式断言,输入类型是 SpringFramework 的 ServerWebExchange,允许开发者匹配所有的 HTTP 请求,包括 HTTP 头和参数等。过滤器是 SpringFramework GatewayFilter 的实例化,请求和响应会在 HTTP 下行请求之前或者之后改变。
关于分布式架构 SpringCloud 如何实现 CAP 就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。