第九篇: 高可用的服务注册中心

文章 第一篇: 服务的注册与发现(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:WindowsSystem32driversetc修改。

这时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博主。

原文地址:https://www.cnblogs.com/PPBoy/p/9435289.html