1.什么是服务治理?
SpringCloud封装了Netflix公司开发的Eureka模块实现服务治理,在传统的rpc远程调用框架中,管理每个服务与服务之间的依赖关系比较复杂,管理比较复杂,所以需要服务治理,管理服务与服务之间的依赖关系,可以实现服务调用,负载均衡,容错等,实现服务发现与注册。
2.什么是服务注册与发现?
Eureka采用了CS的设计架构,Eureka Server作为服务注册功能的服务器,他是服务注册中心,而系统中其他微服务,使用Eureka客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server 来检测系统中各个微服务模块是否正常运行。
注册:
每个服务都向Eureka登记自己提供服务的元数据,包括服务的ip地址、端口号、版本号、通信协议等注册到注册中心。eureka将各个服务维护在了一个服务清单中(双层Map,第一层key是服务名,第二层key是实例名,value是服务地址加端口另一方,同时对服务维持心跳,剔除不可用的服务,eureka集群各节点相互注册每个实例中都有一样的服务清单。
发现:
以该别名的方式去注册中心获取到实际的服务通讯地址,并获取所有服务实例清单(缓存到本地),然后实现服务的请求访问,框架核心设计思想在于注册中心,因为使用注册中心管理每个服务于服务之间的一个依赖关系(服务治理概念)。
3.Eureka
3.1Eureka服务发现怎么做?
首先在Controller中注入DiscoveryClient。
@Resource
private DiscoveryClient discoveryClient;
然后调用discoveryClient就可以获取到当前注册中心中的信息,在主启动类中加入一个@EnableDiscoveryClient注解就可以实现一个简单的注册发现了
3.2.Eureka的自我保护机制
意思就是,某时刻某一个微服务不可用了,Eureka不会立即清理,依旧会对该服务的信息进行保存。宁可保留可能错误的服务注册信息,也不会盲目注销掉任何可能健康的服务实例。真好死不如赖活着。
产生的原因是:为了防止可能是EurekaServer网络不通畅,但是其实EurekaClient是正常运行的,所以,Eureka会有那么一种保护机制。是一种AP的设计思想,高可用。
默认情况下,如果EurekaServer在一定时间内(默认90秒)没有收到EurekaClient向EurekaServer发送的心跳包,便会直接从服务注册列表中剔除该服务,但是如果在短时间内丢失了过多的客户端,那么这个节点就进入了自我保护模式。
3.3.Eureka的自我保护机制的禁用:
4.Zookeeper
在conf目录下,新建一个名为zoo.cfg的文件,其中内容如下:
4.1注册进zookeeper
1.pom文件引入jar包
2.yml文件配置好
3.controller测试一下
4.成功后的结果
和Eureka自我保护机制来看,Zookeeper是一个提供的服务是一个临时节点,一定时间内,如果接受不到心跳,就会把入驻的踢掉,如果你又回来了,又是陌生人,丝毫不念旧情,无情的一批,Zookeeper比Eureka更加的无情。
5.Consul服务注册与发现
5.1Consul的安装
1.下载地址https://www.consul.io/downloads.html
2.将解压后的文件consul 拷贝到/usr/local/bin下
sudo cp consul /usr/local/bin
3.打开bin文件,执行consul,查看consul命令,如下即表示成功
4.启动consul
consul agent -dev
启动成功之后可以访问consul的页面 http://localhost:8500/
6.三种服务注册框架的异同点
CAP理论:
C : Consistency(强一致性)
A : Availability(可用性)
P : Partition tolerance(分区容错性)
CAP的核心是,一个分布式系统不可能同时满足很好的一致性、可用性和分区容错性三个需求,因此,根据CAP原理可以将其分为三类:
CA:单点集群,满足一致性,可用性的系统,通常可扩展性上不太强大。
CP:满足一致性,分区容忍性的系统,通常性能不是特别高。
AP:满足可用性,分区容忍性的系统,通常对一致性大的要求低一些。
综上来看,只有Eureka是AP的,保证高可用,当注册的用户断掉之后,会认为是网络出现了问题,认为注册的用户是没问题的,保证了高可用,而Consul和Zookeeper是CP,要保证一致性,当客户端宕机之后,Server没有收到心跳包,会将客户端移除,有就是有,没有就是没有,保证一致性。Eureka和Consul是自带前台页面展示的,而Zookeeper只有客户端。
个人更喜欢Consul,而且Consul的界面更加简单美观易懂。