1. SpringCloud特点
SpringCloud专注于为典型的用例和扩展机制提供良好的开箱即用体验,以涵盖其他情况:
-
分布式/版本化配置
-
服务注册和发现 Eureka
-
路由 Zuul
-
服务到服务的呼叫
-
负载均衡 Ribbon
-
断路器 Hystrix
-
分布式消息传递
2. 分布式系统的三个指标CAP
在介绍SpringCloud默认使用的注册中心前,先介绍分布式系统的三个指标,分别是:
-
Consistency:一致性,在分布式系统中,更新操作执行成功后所有的用户的读操作必须返回最新值;client写入,server同步至整个系统;
-
Availability:可用性,只要收到用户的请求,在一定的时间内服务器就必须给出回应,回应的结果可以是成功或是失败;
-
Partition tolerance:分区容错,即区间通信可能失败,在网络中断,消息丢失的情况下,仍对外提供服务;一般无法避免,可以认为CAP中的P总是成立
CAP定律说的是,在一个分布式计算机系统中,一致性C,可用性A,分区容错性P这三种保证无法同时得到满足,最多满足两个:
- 放弃P
为了避免分区容错性问题的发生,一种做法是将所有与事务相关的数据都放在一台服务器上,虽然不能保证100%系统不会出错,但是不会碰到由分区带来的负面效果,这样的做法会严重影响系统的扩展性。
- 放弃A
放弃可用性,一旦遇到分区容错故障,受到影响的服务器需要等待一定的时间,因此会导致在等待期间系统无法对外提供服务。
- 放弃C
这儿说的放弃一致性,并不是完全放弃数据的一致性,而是放弃数据的强一致性,而保留数据的最终一致性。以网络购物为例,对只剩下一件库存的商品,如果同时接受到了两份订单,那么较晚的订单将被告知商品告罄。
3. Eureka
基本介绍
Eureka是SpringCloud官方推荐用于服务注册和发现,一个基于REST的服务
SpringBoot实现了Netflix OSS的集成,使用Eureka的原因之一是因为其可以利用Spring Cloud Netflix的其他组件:智能路由(Zuul)、客户端负载均衡(Ribbon)等
基本组成
Eureka由多个Instance(服务实例)组成,分为Eureka Server和Eureka Client
其中Eureka Client又可细分为:Service Provider、Service Consumer
-
Eureka Server:服务端,提供服务的注册和发现;
-
Eureka Client:客户端
- Service Provider:服务提供方,将自身服务注册到Eureka,让消费方找到
- Service Consumer:服务消费方,从Eureka获取注册服务列表,从而消费服务
Eureka和Zookeeper
1)由CAP理论的角度来看
Zookeeper:ZK保证CP,突出强一致性,但无法保证每次访问服务可用性,比如ZK会出现这样一种情况:当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举,在ZK选举leader期间整个ZK集群都是不可用的,这就导致了在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得ZK集群失去master节点是较大概率会发生的事儿,虽然服务最终会恢复,但是漫长的选举时间导致的注册长期不可用是难以容忍的。
Eureka:Eureka保证AP,Eureka在设计时就优先保证可用性。对于Eureka中的节点,每个节点都是平等的,几个节点挂掉也不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。但Eureka不保证强一致性,即查到的信息可能不是最新的。此外Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就会认为客户端和注册中心出现了网络故障,但会保证当前节点依然可用,不会像ZK导致整个注册服务瘫痪。
2)由节点分工的角度来看
Zookeeper:ZK集群中节点分为三类,承担不同的任务
- Leader:事务请求唯一的调度者和处理者(除了查询请求)
- Follower:处理非事务请求,参与Leader选举投票
- Observer:处理非事务请求,但不参与Leader选举投票
Eureka:在Eureka集群中每个节点都是平等的,每个节点扮演相同的角色,它们通过相互注册的方式来感知对方的存在,当由注册消息时,它们会同步给集群内的其他节点
4. SpringCloud Demo
Demo整体结构(父子项目)
-
api:Bean、DTO、POJO等以及Service接口
-
controller:服务消费方,前端交互
-
provider:服务提供方,服务实现
-
registry:服务注册中心
4.1 registry
1)pom.xml
关键点在于导入eureka服务端依赖以及SpringCloud依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server -->
<!-- eureka服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2)application.properties
进行Eureka服务端的相关配置
spring.application.name=SpringCloudDemoRegistry
# server端口,自己喜欢
server.port=8888
# Eureka Server服务url以及默认zone,结尾必须eureka
eureka.client