什么是集群?
在讲解如何搭建eureka集群前,先给大家普及一下集群的概念,有些小伙伴可能还不知道什么是集群。
说到集群可能就有人会想到分布式,可能有很多人对分布式和集群这两个概念有点混淆:
- 分布式:将一套系统拆分成不同子系统部署在不同服务器上
- 集群:部署多个相同的子系统在不同的服务器上
分布式的每一个子系统,完成的是不同的业务,一台服务挂了,那么这个业务功能就无法访问了,甚至可能会影响到其他业务。而集群是多个子系统完成的是一个业务,正因为这样,其中一台服务挂了,其他服务节点可以顶上来,从而保证了服务的健壮性。
所以说,集群可以理解为:你中有我,我中有你,手拉手肩并肩,一起保证服务的健壮性
Eureka集群原理

基本原理
上图是来自eureka的官方架构图,这是基于集群配置的eureka;
- 处于不同节点的eureka通过Replicate进行数据同步
- Application Service为服务提供者
- Application Client为服务消费者
- Make Remote Call完成一次服务调用
服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。
当服务注册中心Eureka Server检测到服务提供者因为宕机、网络原因不可用时,则在服务注册中心将服务置为DOWN状态,并把当前服务提供者状态向订阅者发布,订阅过的服务消费者更新本地缓存。
服务提供者在启动后,周期性(默认30秒)向Eureka Server发送心跳,以证明当前服务是可用状态。Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,则认为服务宕机,注销该实例。
Eureka集群搭建
在搭建eureka集群前,咱们先来回顾一下,单个eureka服务的时候,是如何来配置的
server:
port: 7001
eureka:
instance:
hostname: eureka7001 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(单机)
从上面的配置文件可以看出,eureka7001
就是一个eureka服务,所有服务都是往这台服务上注册。那么我们如何去搭建一个 Eureka 集群呢?假设现在有三个 Eureka
服务:eureka7001
、eureka7002
和 eureka7003
。
为了体现出集群的你中有我,我中有你,不难想象,eureka7001
中应该挂上 eureka7002
和 eureka7003
;eureka7002
中应该挂上 eureka7001
和 eureka7003
;eureka7003
中应该挂上 eureka7001
和 eureka7002
。如下图所示:
现在集群的雏形已经有了,下面我们来一步步实现。
Eureka7001改造
修改defaultZone配置。
server:
port: 7001
eureka:
instance:
hostname: eureka7001 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(单机)
defaultZone: http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(集群)
搭建Eureka7002
将Eureka7001拷贝一份,修改其配置文件即可
server:
port: 7002
eureka:
instance:
hostname: eureka7002 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(单机)
defaultZone: http://eureka7001:7001/eureka/,http://eureka7003:7003/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(集群)
搭建Eureka7003
步骤同上
server:
port: 7003
eureka:
instance:
hostname: eureka7003 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(单机)
defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(集群)
host映射
从前面的配置文件可以看到,为了区分不同的服务,hostname
不再是localhost
了,因此我们还要修改一下host
文件,此处环境为Mac,Windows下如何修改host文件自行百度
打开命令行,输入sudo vi /private/etc/hosts
修改host文件。注意:执行此命令需要输入用户密码
将一下内容添加到host文件中,保存即可:
127.0.0.1 eureka7001
127.0.0.1 eureka7002
127.0.0.1 eureka7003
用户服务提供者改造
因为现在是集群模式,所有我们需要将服务分别注册到三个eureka中,同样是修改defaultZone
配置
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis-config.xml # mybatis配置文件所在路径
type-aliases-package: com.chaytech.model.* # 所有Entity别名类所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: user-provider
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://127.0.0.1:3306/spring_cloud_db01 # 数据库名称
username: root
password: root
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
eureka:
client: #客户端注册进eureka服务列表内
service-url:
#defaultZone: http://localhost:7001/eureka (单机)
defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/ #(集群)
info:
app.name: user-provider
build.artifactId: $project.artifactId$
build.version: $project.version$
测试
通过前面的步骤已经将eureka集群搭建好了,下面我们来测试一下:
依次启动Eureka7001、Eureka7002、Eureka7003、UserProvider8001
等服务
访问Eureka7001
:http://eureka7001:7001/
可以看到Eureka7001
上挂着 eureka7002
和 eureka7003
,并且用户服务也成功注册到该注册中心
接着访问Eureka7002
:http://eureka7002:7002/
可以看到Eureka7002
上挂着 eureka7001
和 eureka7003
,并且用户服务也成功注册到该注册中心
接着访问Eureka7003
:http://eureka7003:7003/
可以看到Eureka7003
上挂着 eureka7001
和 eureka7002
,并且用户服务也成功注册到该注册中心