第九篇: 高可用的服务注册中心
文章 第一篇: 服务的注册与发现(Eureka) 介绍了服务注册与发现,其中服务注册中心Eureka Server,是一个实例,当成千上万个服务向它注册的时候,它的负载是非常高的,这在生产环境上是不太合适的,这篇文章主要介绍怎么将Eureka Server集群化。
一、准备工作
Eureka通过运行多个实例,使其更具有高可用性。事实上,这是它默认的熟性,你需要做的就是给对等的实例一个合法的关联serviceurl。
这篇文章我们基于第一篇文章的工程,来做修改。
二、改造工作
在eureka-server工程中resources文件夹下,创建配置文件application-peer1.yml:
server:
port: 8761
spring:
profiles: peer1
eureka:
instance:
#prefer-ip-address: false
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2:8769/eureka/,http://peer3:8770/eureka/
registerWithEureka: true #这里显式的把这两个属性设为true,作为服务注册,当单点时,要设置为false。或者将application.yml的属性设为true,因为即使启动时加了参数peer1也会加载application.yml.
fetchRegistry: true
#这里显式的把registerWithEureka,fetchRegistry设为true,作为服务注册,当单点时,要设置为false。或者将application.yml的属性设为true,因为即使启动时加了参数peer1也会加载application.yml.(重要的事情写三遍)
#这里显式的把registerWithEureka,fetchRegistry设为true,作为服务注册,当单点时,要设置为false。或者将application.yml的属性设为true,因为即使启动时加了参数peer1也会加载application.yml.(重要的事情写三遍)
#这里显式的把registerWithEureka,fetchRegistry设为true,作为服务注册,当单点时,要设置为false。或者将application.yml的属性设为true,因为即使启动时加了参数peer1也会加载application.yml.(重要的事情写三遍)
并且创建另外一个配置文件application-peer2.yml:
server:
port: 8769
spring:
profiles: peer2
eureka:
instance:
#prefer-ip-address: false
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/,http://peer3:8770/eureka/
registerWithEureka: true
fetchRegistry: true
并且创建另外一个配置文件application-peer3.yml:
server:
port: 8770
spring:
profiles: peer3
eureka:
instance:
#prefer-ip-address: false
hostname: peer3
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/,http://peer2:8769/eureka/
registerWithEureka: true
fetchRegistry: true
新建了peer1,peer2,peer3三个eureka配置文件,互相依赖。
按照官方文档的指示,需要改变etc/hosts,linux系统通过vim /etc/hosts ,加上:
127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3
windows电脑,在C:\Windows\System32\drivers\etc修改。
这时eureka-server就已经改造完毕。
三、打包
这时需要打成jar包,分别由三个配置文件启动eureka-server,成为一个三个节点的小集群。
右键点击项目名 -》run as -》maven install打包。
tip1:这里需要先打包项目的父依赖,也就是:
<parent> <groupId>com.sun</groupId> <artifactId>springcloud-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
springcloud-parent项目,否则会出现:Could not find artifact com.sun:springcloud-parent:pom:0.0.1-SNAPSHOT and 'parent.relativePath' points at wrong local POM这样的错误。
tip2:我碰到打包的时候提示我jre环境错误,这时,需要右键项目-》build path-》configure build path:
选择编译环境是jdk。
正确打包后显示:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.939 s
[INFO] Finished at: 2018-08-07T09:29:16+08:00
[INFO] Final Memory: 43M/294M
[INFO] ------------------------------------------------------------------------
这时在项目的target路径下已经有了打包好的eureka-server.jar包:
四、运行
分别在命令提示框下,启动eureka-server:
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3
tip:在eureka-server.jar包的文件夹下,shift+右键可以直接打开命令行界面,这样就不用打路径了。
启动eureka-client项目。
当访问http://localhost:8761/,http://localhost:8769/,http://localhost:8770/三个地址,我们可以看到:
你会发现注册了service-hi,并且有个peer2和peer3节点,
同理访问localhost:8769你会发现有个peer1和peer3节点
访问localhost:8770你会发现有个peer1和peer2节点
client只向8761注册,但是你打开8769,8770,你也会发现,8769,8770也有 client的注册信息。
Eureka-eserver peer1 8761,Eureka-eserver peer2 8769,Eureka-eserver peer3 8770相互感应,当有服务注册时,三个Eureka-eserver是对等的,它们都存有相同的信息,这就是通过服务器的冗余来增加可靠性,当有一台服务器宕机了,服务并不会终止,因为另两台服务存有相同的数据。
最后感谢:https://blog.csdn.net/forezp/article/details/81041101博主的付出。
但原文是有bug的,在这里感谢https://blog.csdn.net/u012470019/article/details/77973156博主。