单点故障
对于分布式应用来说,它有效的避免了单点故障。那么如何来确保我们的分布式服务不出现单点故障呢?
我们可以从两个角度来思考:
(1).我们注册的服务。我们可以通过在多台机器上注册来避免单点故障,当某一台机器不可用的时候,我们还有其他的机器作为备份。
(2).我们的注册中心。当我们的注册中心应该能够支持多台机器,当某一台机器不可用的时候,我们还可以有其他的机器作为备份。
那么我们今天要做的就是实现注册中心的多机部署,从而实现高可用。
注册中心集群思路
这里假设我们需要两个注册中心,我们是需要设置它们互相注册的,这样一个注册中心挂掉之后,由于另一个注册中心上已经具有了注册信息,所以不会导致整个服务不可用。
需要说明的是,我们在这里设置的时候,需要使用域名的方式,而不能使用ip的方式。
这里我们可以使用spring的多个profile来部署到多台机器上,我们可以这里可以使用两个端口来模拟两台机器。
注册中心集群实战
首先我们可以打一个直接用java -jar运行的jar包,首先我们在eureka-server中的pom.xml中添加如下build配置项:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
然后我们在resource目录下新建一个application-peer1.yml
,然后我们写入如下代码:
server:
port: 8762
eureka:
instance:
hostname: peer1-server
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://peer2-server:8763/eureka
spring:
profiles:
active: peer1
application:
name: register-center
然后我们新建一个application-peer2.yml
,我们写入如下代码:
server:
port: 8763
eureka:
instance:
hostname: peer2-server
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://peer1-server:8762/eureka
spring:
profiles:
active: peer2
application:
name: register-center
然后我们修改一下host,如下所示:
127.0.0.1 peer1-server
127.0.0.1 peer2-server
然后我们可以用 java -jar target/eureka-server-1.0-SNAPSHOT.jar --spring.profiles.active=peer1
和java -jar target/eureka-server-1.0-SNAPSHOT.jar --spring.profiles.active=peer2
来启动。
然后我们可以让我们的user-service来注册到8762端口上,然后我们来看一下此时的8762端口的内容吧:
然后我们访问一下8763端口,我们也可以看到类似的效果:
我们可以看到,我们注册到某一台机器上的服务,可以在另一个注册中心被发现。
假设此时端口8762的这台机器宕机了,我们来看一下此时8763的表现吧:
假如我们此时再次启动8762的机器,我们发现数据又会自动恢复。
小结
至此我们的注册中心已经可以避免单点故障了,我们就介绍到这里啦。