前言
我们知道,在微服务架构中,每个微服务都是以集群的形式存在的,我们要做负载的话,需要知道这些服务的ip地址和端口号,在之前的两篇文章中,在学习Ribbon的时候,我们的每个服务的ip地址都是写死在application.properties文件中,如图所示
这样在节点比较少的情况下可能还可以,但是如果节点特别多的话,如果都用文件配置的话,可维护性太差,并且,这种方式并不能支持服务的上下线动态感知。
怎么办的?这时候,就该用到注册中心了。
1.Eureka是什么?
Spring-Cloud Eureka是Spring Cloud集合中一个组件,它是对Eureka的集成,用于服务注册和发现。Eureka是Netflix中的一个开源框架。它和 zookeeper、Consul一样,都是用于服务注册管理的,同样,Spring-Cloud 还集成了Zookeeper和Consul。
Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service Provider和Service Consumer。
- Eureka Server 提供服务注册和发现
- Service Provider 服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到
- Service Consumer 服务消费方,从Eureka获取注册服务列表,从而能够消费服务
2.Eureka与Zookeeper比较
首先介绍下CAP原理
- P:Partition tolerance:网络分区容错。类似多机房部署,保证服务稳定性。
- A: Availability:可用性。
- C:Consistency :一致性(强一致性)。
CAP定理:CAP三个属性对于分布式系统不能同时做到。只能做到如AP/CP/AC。
Eureka与Zookeeper比较:
-
Zookeeper是CP,分布式协同服务,突出一致性。对ZooKeeper的的每次请求都能得到一致的数据结果,但是无法保证每次访问服务可用性。如请求到来时,zookeer正在做leader选举,此时不能提供服务,即不满足A可用性。
-
Eureka是AP,高可用与可伸缩的Service发现服务,突出可用性。相对于Zookeeper而言,可能返回数据没有一致性,但是保证能够返回数据,服务是可用的。
这里有篇文章介绍为什么服务发现使用Eureka,而不是Zookeeper。
http://dockone.io/article/78
3.Eureka简单的原理图
4.Eureka的简单使用
先创建一个eureka微服务
添加eureka的依赖
application.properties配置
# 应用名称
spring.application.name=eureka-server
server.port=8761
#指向服务注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
主入口
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
访问浏览器:localhost:8761
eureka注册中心已经有了,下面需要将服务注册上去
order微服务中,添加eureka依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
配置文件
# 应用名称
spring.application.name=order-service
# 应用服务 WEB 访问端口
server.port=8080
# 将服务注册到注册中心
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
启动项目
服务已经注册上去
接下来,user-service(服务调用者)也要注册到注册中心去
添加pom依赖(同上),配置文件做修改
# 应用名称
spring.application.name=user-service
# 应用服务 WEB 访问端口
server.port=8088
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# 用了注册中心后,下面写死的配置不需要了
# 配置制定服务的提供者地址列表
#order-service.ribbon.listOfServers=\
# localhost:8080,localhost:8082
大功告成,重启user-service,访问localhost:8088/test 发现可以调用,大功告成!
5 Eureka 的集群
在这个图上 Eureka通过Replicate进行数据同步 不同Eureka Server之间的节点地位均等(扁平化,去中心化)节点间集群的形成 通过置顶的serviceUrl相互注册 高可用节点的可用性得到提高
若集群中某个节点失效 client自动切换到其他server上(每个server节点相互同步) Eureka连接方式 不建议单线连接(1->2->3 此时1也会和3互相同步) 可以指定多个注册地址(这样配置serviceUrl 1->2 1->3)
Eureka分区:
1.region->地理上的不同区域
2.zone->具体的机房
5.2 eureka集群的搭建
非常简单,建立一个一模一样的eureka服务,然后改一下配置即可。两个服务相互注册
eureka1配置
# 应用名称
spring.application.name=eureka-server
server.port=8761
#指向服务注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:8762/eureka
eureka2配置
# 应用名称
spring.application.name=eureka-server
server.port=8762
#指向服务注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
这样集群就配好了
然后微服务这样配置,写两个地址就行
# 应用名称
spring.application.name=user-service
# 应用服务 WEB 访问端口
server.port=8088
# 配置制定服务的提供者地址列表
#order-service.ribbon.listOfServers=\
# localhost:8080,localhost:8082
eureka.client.service-url.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka
6 Eureka自我保护机制
在默认配置中,Eureka在运行过程,会统计心跳失败的比例在15分钟之内,低于85%的节点,Eureka server会认为这个实例出现了网络故障,直接剔除这个有问题的服务。
但是如果开启了保护机制,则:
- eureka server 不会剔除因为长时间没有收到心跳数据的过期服务
- eureka server 仍然能够接受新的服务的注册和查询
这个机制,减少了在网络抖动或者网络不稳定的情况下,误删除情况的发生。