Spring cloud的整体架构
原始方式:服务的消费者直接通过访问服务提供者的url去调用里面的方法:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class WebController { @Autowired private RestTemplate restTemplate; @RequestMapping("/web/hello") public String hello(){ // 逻辑判断省略不写 // 调用springcloud服务提供者提供的服务 return restTemplate.getForEntity("http://127.0.0.1:8080/service/hello",String.class).getBody(); } }
该方法的缺点:将url写死,如果被调用的方法其url改变了,那么在本方法中也要去改变url,这样就及其不方便,所以引入注册中心。
注册中心Eureka
在微服务架构中,服务注册与发现是核心组件之一,手动指定每个服务是很低效的,spring cloud提供了多种服务注册与发现的实现方式,例如:Eureka、Consul、Zookeeper。
Spring Cloud支持得最好的是Eureka,其次是Consul,再次是Zookeeper。
什么是服务注册?
服务注册:将服务所在主机、端口、版本号、通信协议等信息登记到注册中心上;
什么是服务发现?
服务发现:服务消费者向注册中心请求已经登记的服务列表,然后得到某个服务的主机、端口、版本号、通信协议等信息,从而实现对具体服务的调用。
Eureka是什么?
Eureka是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心。
Eureka是一个基于REST的服务,用来定位服务,进行中间层服务器的负载均衡和故障转移;
Eureka是Netflix公司开发的,Spring Cloud封装了Netflix公司开发的Eureka模块来实现服务注册和发现,也就是说Spring Cloud对Netflix Eureka做了二次封装;
Eureka采用了C-S(客户端/服务端)的设计架构,也就是Eureka由两个组件组成:Eureka服务端和Eureka客户端。Eureka Server作为服务注册的服务端,它是服务注册中心,而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server服务端,并维持心跳连接,Eureka客户端是一个Java客户端,用来简化与服务器的交互、负载均衡,服务的故障切换等;
有了Eureka注册中心,系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
Eureka与Zookeeper的比较
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。
由于分区容错性在分布式系统中是必须要保证的,因为只能在A和C之间进行权衡,在此Zookeeper保证的CP,而Eureka则是AP。
Zookeeper保证CP
在Zookeeper中,当master节点因为网络故障与其他节点失去联系的时候,剩余的节点会重新进行leader选举,但是问题在于,选举leader需要一定时间,并且选择期间整个Zookeeper集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因为网络问题使得Zookeeper集群失去master节点是大概率事件,虽然服务最终能够恢复,但是在选举时间内导致服务注册长期不可用是难以容忍的。