上一篇最后提到我们的 Eureka Server 只有一个进程在运行,一旦发生不可预料的问题,进程停止,服务也就停止。
而 Eureka 的解决方案就是为 Eureka Server 构建一个集群,使用多个服务来同时提供服务,这样可保证当某一个服务异常停止,不影响整个集群的正常使用
一、集群规划
既然是集群,那么我们的服务至少也得是两个吧(不然你跟我说啥?)。此处,我们模拟一个 3 个节点的集群。其中三个服务各分布于三台不同的服务器上(三台 CentOS 6.x 虚拟机)。地址分别为:
192.168.174.200
192.168.174.201
192.168.174.202
我们计划分别在三台服务器上部署端口均为 8000 的三个服务。并且将 192.168.174.200 的 Eureka 注册到 192.168.174.201/202 中, 将 192.168.174.201 的 Eureka 注册到 192.168.174.200/202 中,将 192.168.174.202 的 Eureka 注册到 192.168.174.200/201 中。
这里我们可以看出,Eureka Server 的高可用方案是通过交叉注册的方式实现的。
二、项目配置
我们为三台服务器上运行的 Eureka Server 程序 (即前面创建的 eureka 的项目) 配置如下配置文件:
application-200.yml
spring:
application:
name: eureka
profiles:
active: 200
server:
port: 8000
eureka:
client:
service-url:
defaultZone: http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/
register-with-eureka: true
fetch-registry: true
instance:
hostname: hadoop1
application-201.yml
spring:
application:
name: eureka
profiles:
active: 201
server:
port: 8000
eureka:
client:
service-url:
defaultZone: http://hadoop1:8000/eureka/,http://hadoop3:8000/eureka/
register-with-eureka: true
fetch-registry: true
instance:
hostname: hadoop2
application-202.yml
spring:
application:
name: eureka
profiles:
active: 202
server:
port: 8000
eureka:
client:
service-url:
defaultZone: http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/
register-with-eureka: true
fetch-registry: true
instance:
hostname: hadoop3
注:
- 确保集群中的所有服务中的 spring.application.name 或者 eureka.instance.appname 的属性值相同
- eureka.client.register-with-eureka 与 eureka.client.fetch-registry 均需要设置为 true,表示允许 eureka server 服务之间相互注册。
-
设置 eureka.instance.hostname,eureka.client.defaultZone 中配置的注册地址别用 IP 使用 hostname。特别注意第三点,因为此问题非常有可能出现 unavailable replicas (UI 后台显示我们的复本不可用),如果你使用的是 IP,则有可能出现如下的问题(甚至你使用 localhost 也不行):
- 上面的 hadoop1/hadoop2/hadoop3 分别对应于三台虚拟机 192.168.174.200/201/202。为了方便本机访问三台虚拟机,我在
C:\Windows\System32\drivers\etc\hosts
文件中配置了如下映射 (使用管理员权限打开文件,在文件末尾添加如下信息即可)
192.168.174.200 hadoop1
192.168.174.201 hadoop2
192.168.174.202 hadoop3
- hostname 只是我们为服务主机取的名字,至于取什么名字,根据自己情况来定。
三、部署过程
- 使用 Maven 编译打包 eureka 项目为 jar 文件,具体的打包方式请参考上一篇文章。在此不作赘述。
- 将打包好的文件分别上传到服务器上的某一目录下(如 /data/eureka/),如不会上传文件的,请自行百度 ftp 上传文件到 Linux 服务器。
- 在三台服务器上分别使用如下的对应命令运行
hadoop1:
[root@hadoop1 eureka]# pwd
/data/eureka
[root@hadoop1 eureka]# ll
total 43744
-rw-r--r--. 1 root root 44675073 Jun 23 08:30 eureka-0.0.1-SNAPSHOT.jar
[root@hadoop1 eureka]# nohup java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=200 &
hadoop2:
[root@hadoop1 eureka]# pwd
/data/eureka
[root@hadoop1 eureka]# ll
total 43744
-rw-r--r--. 1 root root 44675073 Jun 23 08:30 eureka-0.0.1-SNAPSHOT.jar
[root@hadoop1 eureka]# nohup java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=201 &
hadoop3:
[root@hadoop1 eureka]# pwd
/data/eureka
[root@hadoop1 eureka]# ll
total 43744
-rw-r--r--. 1 root root 44675073 Jun 23 08:30 eureka-0.0.1-SNAPSHOT.jar
[root@hadoop1 eureka]# nohup java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=202 &
注:
- 服务器上必须已经安装 jdk 并且配置好环境变量。
- 如果有防火墙,请将服务的端口在防火墙配置规则中添加放行。
四、验证服务
- 查看进程状态
[root@hadoop1 eureka]# ps -ef | grep eureka
root 32687 15540 8 08:31 pts/0 00:01:14 java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=200
root 34292 15540 0 08:45 pts/0 00:00:00 grep eureka
- 查看启动日志
[root@hadoop1 eureka]# pwd
/data/eureka
[root@hadoop1 eureka]# tail -10f nohup.out
2018-06-23 08:37:56.307 INFO 32687 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 4ms
2018-06-23 08:38:56.306 INFO 32687 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
2018-06-23 08:39:56.308 INFO 32687 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 2ms
2018-06-23 08:40:56.309 INFO 32687 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
2018-06-23 08:41:23.383 INFO 32687 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
2018-06-23 08:41:56.311 INFO 32687 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 2ms
2018-06-23 08:42:56.311 INFO 32687 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
2018-06-23 08:43:56.312 INFO 32687 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
2018-06-23 08:44:56.315 INFO 32687 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 2ms
2018-06-23 08:45:56.316 INFO 32687 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 1ms
2018-06-23 08:46:23.386 INFO 32687 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
2018-06-23 08:46:24.796 INFO 32687 --- [hresholdUpdater] c.n.e.r.PeerAwareInstanceRegistryImpl : Current renewal threshold is : 5
- 查看 UI 后台
在浏览器中输入分别如下网址可以查看各 Eureka Server 的服务情况
http://hadoop1:8000/
http://hadoop2:8000/
http://hadoop3:8000/
至此,我们的 Eureka Server 的高可用集群便搭建完成了,基本模拟了接近生产环境的搭建,只是配置文件以及部署及运行方式可能与生产环境不同,后面我们会加入自动化部署以及容器技术来更方便的发布和管理我们的服务。
下一篇我们将关注如何将 Client 注册到集群中以及相关注意事项。