在上一篇博客中我们介绍了搭建Spring Cloud注册与消费模块。但是在实际项目中,可能有较多的微服务实例,如果只搭建单台Eureka Server,这时候Eureka Server 就会承担非常高的负载压力,我们知道微服务实例是通过注册中心来查询其他实例的,所以这个单台的Eureka Server的服务器如果出现意外宕机,那么整个微服务系统将无法正常工作。
这篇博客将介绍用一台电脑模拟搭建Eureka Server集群。
本篇博客的代码在上一篇博客的基础上进行改造,上一篇博客的地址:https://blog.youkuaiyun.com/czx2018/article/details/102979527
按照上一篇博客的步骤做好以后,我们会得到这样一个项目层级结构
首先我们要修改本地的hosts文件,这是为了要在本地搭建Eureka Server集群而做的准备步骤,实际的线上环境并不需要做这一步。Windows系统的电脑的hosts文件在C:/windows/systems/drivers/etc/hosts,Mac系统的hosts文件在/etc/hosts。hosts文件中添加三个域名:peer1、peer2、peer3。修改后的hosts文件如下
EurekaServer的设计一开始就考虑了高可用问题, 在Eureka的服务注册发现设计中, 所有节点即是服务提供方, 也是服务消费方,服务注册中心也不例外。 在上一篇的单节点的配置中, 我们设置过下面这两个参数, 让服务注册中心不注册自己:
eureka:
client:
register-with-eureka: false
fetch-registry: false
但搭建Eureka Server集群时就需要将上面两条配置去掉。
EurekaServer的高可用实际上就是将自己作为服务向其他服务注册中心注册自己, 这样就可以形成一组互相注册的服务注册中心, 以实现服务清单的互相同步, 达到高可用的效果。 下面我们就来构建一个三节点的服务注册中心集群。
修改eureka-server的配置文件application.yml,修改后具体代码如下。
spring:
application:
name: eureka-server
--- #这个横线只能三个,不能多不能少,不然就会报错
spring:
profiles: peer1
server:
port: 8761
eureka:
instance:
hostname: peer1
client:
service-url:
#把自己注册到另外两个eureka server上去
default-zone: http://peer2:8762/eureka/,http://peer3:8763/eureka/
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
service-url:
#把自己注册到另外两个eureka server上去
default-zone: http://peer1:8761/eureka/,http://peer3:8763/eureka/
---
spring:
profiles: peer3
server:
port: 8763
eureka:
instance:
hostname: peer3
client:
service-url:
#把自己注册到另外两个eureka server上去
default-zone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
实际的线上环境中,在上述代码中default-zone可能是真实服务器的IP端口。
然后我们来配置idea,以启动多个springboot工程实例:
点击Edit Configuration。
1:添加 。2:随便起一个名称,建议和我一样把名称跟服务实例名一致。 3:选择启动类。 4:输入启动参数。然后点ok。
按照相同的步骤配置peer2和peer3。
配置好以后就可以将3个工程实例run起来。
这里有一个小插曲,启动第一个Eureka Server工程实例的时候,控制台会出现无法连接的异常,这是因为它要向另外两个Eureka Server发送注册信息,但是这时候另外两个工程实例还没有启动,所以就报错了。只管把另外两个Eureka Server的工程实例也启动起来就好。
启动完成之后,我们浏览器分别打开http://peer1:8761/,http://peer2:8762/,http://peer3:8763/。
在搭建了多节点的服务注册中心之后, 服务提供方还需要做一些简单的配置才能将服务注册到Eureka Server 集群中。 我 们以eureka-client为例,修改application.yml配置文件, 如下所示:
eureka:
client:
service-url:
default-zone: http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/
server:
port: 8764
spring:
application:
name: eureka-client
上面的配置主要对eureka.client.service-url. default-zone
属性做了改动,将注册中心指向了之前我们搭建的peer1、peer2与peer3。
然后将eureka-client工程启动起来,再去访问注册中心,就会看到每一个注册中心中都已经把eureka-client注册上去了。
这样一来,集群中任何一个注册中心挂掉了,消费服务仍可以通过其他注册中心节点来同步注册表信息,就实现了Eureka Server的高可用。
PS:上面启动多个工程实例我是用idea来启动的,实际的线上环境我们会将工程打成jar包然后用指令java -jar 包名 --spring.profiles.active={spring.profiles}
来启动,等号后面请改为配置文件中的spring.profiles的属性。