一、为什么要搭建Eureka集群
如果我们只配置一个Eureka服务端,那么如果这个服务端崩溃,那么所有服务都无法获取,这肯定不是我们不期望的。所以为了保证高可用性,我们需要搭建Eureka集群。
二、Eureka集群实现原理
Eureka Server
注册中心集群中每个节点都是平等的,集群中的所有节点同时对外提供服务的发现和注册等功能。同时集群中每个Eureka Server
节点又是一个微服务,也就是说,每个节点都可以在集群中的其他节点上注册当前服务。又因为每个节点都是注册中心,所以节点之间又可以相互注册当前节点中已注册的服务,并发现其他节点中已注册的服务。
简单地说就是:每个Eureka Server
节点之间相互注册,相互守望
补充:
CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。
由于分布式系统中必须保证分区容错性,因此我们只能在A和C之间进行权衡。
Zookeeper保证的是CP, 而Eureka则是保证AP。
因此,我们搭建Eureka服务注册中心集群,主要是实现负载均衡+故障容错。
三、Eureka集群环境搭建
第1步:设置主机名
由于我们学习都是使用单台电脑开搭建集群的,所以我们需要修改映射配置添加进hosts
文件,hosts
文件目录为C:\Windows\System32\drivers\etc
,新增映射如下(我们这里搭建3个节点的集群):
127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com 127.0.0.1 eureka7003.com
第2步:创建Module
我们参考cloud-eureka-server7001
的创建过程创建cloud-eureka-server7002
和cloud-eureka-server7003
第3步:修改yml
1)cloud-eureka-server7001
的yml:
server: port: 7001 eureka: instance: hostname: eureka7001.com #eureka服务端实例名称 client: #false表示不像注册中心注册自己 register-with-eureka: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 fetch-registry: false service-url: #集群版eureka server 相互注册,相互守望 多个用逗号隔开 defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
1)cloud-eureka-server7002
的yml:
server: port: 7002 eureka: instance: hostname: eureka7002.com #eureka服务端实例名称 client: #false表示不像注册中心注册自己 register-with-eureka: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 fetch-registry: false service-url: #集群版eureka server 相互注册,相互守望 多个用逗号隔开 defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
3)cloud-eureka-server7003
的yml:
server: port: 7003 eureka: instance: hostname: eureka7003.com #eureka服务端实例名称 client: #false表示不像注册中心注册自己 register-with-eureka: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 fetch-registry: false service-url: #集群版eureka server 相互注册,相互守望 多个用逗号隔开 defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
第4步:测试
1)启动着3个eureka server ,浏览器分别访问eureka7001.com:7001
、eureka7002.com:7002
、eureka7003.com:7003
,我们发现他们相互注册了:
四、发布至集群
接下来我们将订单80和支付8001两个模块发布到Eureka集群,我们只需要修改他们的yml配置的defaultZone
指向Eureka集群即可,具体如下:
1)cloud-consumer-order80
的application.yml
:
server: port: 80 spring: application: name: cloud-order-service eureka: client: #表示是否将自己注册进eureka服务中心,默认true register-with-eureka: true #表示是否从EurekaServer抓取已有注册信息,默认true。单节点无所谓,集群必须设置true才能配合ribbon使用负载均衡 fetch-registry: true service-url: #指向eureka集群 defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
2)cloud-provider-payment8001
的application.yml
:
server: port: 8001 spring: application: name: cloud-payment-service datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/dbcloud?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false username: root password: 123456 mybatis: mapperLocations: classpath:mapper/*.xml type-aliases-package: com.panziye.springcloud.entities eureka: client: #表示是否将自己注册进eureka服务中心,默认true register-with-eureka: true #表示是否从EurekaServer抓取已有注册信息,默认true。单节点无所谓,集群必须设置true才能配合ribbon使用负载均衡 fetch-registry: true service-url: #指向eureka集群 defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
3)测试
我们先启动3个Eureka Server
模块,再启动支付8001和订单80两个模块,测试如下:
1)分别访问http://eureka7001.com:7001
、http://eureka7002.com:7002
、http://eureka7003.com:7003
,如下(发现两个模块在3个注册中心都注册了):