背景:
如果只有一台服务器作为注册中心,当唯一的注册中心宕机时会导致整个微服务瘫痪。
为了提高服务费的容灾能力,注册中心往往搭建集群。
原理:
你中有我,我中有你
如何搭建?
首先拷贝一份工程,修改其项目名。
我原本的注册中心的项目名是springcloud-eureka-server
现在复制一份成spring-eureka-server2
然后修改他们的配置文件application.yml
server:
server:
### 端口号
port: 8100
spring:
application:
### 注册中心的服务名,在服务中心集群时要保持一致
name: app-eureka
### eureka 配置
eureka:
client:
### 是否需要将自己注册给注册中心? (因为自己是注册中心所以为false,集群的时候要true)
register-with-eureka: true
### 是否需要检索服务中心(因为自己是注册中心,所以为false)
fetch-registry: true
service-url:
###注册中心的地址
defaultZone: http://127.0.0.1:8101/eureka/
server2:
server:
### 端口号
port: 8101
spring:
application:
### 注册中心的服务名,在服务中心集群时要保持一致
name: app-eureka
### eureka 配置
eureka:
client:
### 是否需要将自己注册给注册中心? (因为自己是注册中心所以为false,集群的时候要true)
register-with-eureka: true
### 是否需要检索服务中心(因为自己是注册中心,所以为false)
fetch-registry: true
service-url:
###注册中心的地址
defaultZone: http://127.0.0.1:8100/eureka/
server 和 server2 的配置文件差异主要在于defaultZone
因为我是在一台电脑上开发的,所以用了不同端口号,如果是多台服务器的话端口号可以重复,
原本注册中心是不需要服务名的,但是为了达到集群的效果,要像普通服务集群一样,用同一个服务名就可以。
然后切记 register-with-eureka 和 fetch-registry 要设置为 true ,因为需要将自己注册到其他注册中心
最重要的就是defaultZone了,设置的是其他注册中心的地址,如果有多个就以逗号隔开
然后启动项目,顺序不重要,先启动的会报错
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
这是因为其他的注册中心还没跑起来,在向其他注册中心注册自己的时候没有得到回应。
只要等全部注册中心都启动成功就没有问题了。
接下来我们访问一下两个注册中心
会发现两个注册中心都包含了自己和对方,这时候集群就搭建完成了。(如果注册中心没显示全那就稍等一会儿再刷新一下就行了)
至于服务端,我们只需要以逗号相连加在defaultZone就可以了
member的部分配置:
## eureka 配置
eureka:
client:
#### 注册中心的地址
service-url:
defaultZone: http://127.0.0.1:8100/eureka/,http://127.0.0.1:8101/eureka/
## 是否需要注册到eureka
register-with-eureka: true
fetch-registry: true
我也把order加上了server2的地址
然后启动member和order
当member和order启动完成后,我们可以在8100看到order和member已经注册
再看8101,
和视频中不一样,他的另一台注册中心是没有member和order的,然而我的都有。这不影响我们的使用。
接下来我们测试一下当8100宕机时的反应,因为8100放在前面,所以目前它是主注册中心。
我们先访问getMember,没有问题,然后关掉8100后再次访问。
会发现getMember任何可以访问,这就达成了我们最初的目的了。
视频中是要等30秒服务才能恢复,而我的马上就可以恢复访问了,
至于为什么会有差异,我想是因为由于依赖是交由Finchley.M7托管的,所以导致我和视频中的依赖版本不同,eureka可能升级了。