springCloud踩坑系列-Eureka-构建高可用服务注册中心

场景说明

项目中使用springboot有一段时间了,在做eureka高可用集群的时候发现网上的资料各种不全,折腾了好久,翻了N篇博文,才算真正完成一个高可用的eureka注册中心的搭建,在此记录下来.开发环境:JDK8+IDEA+Maven+…

搭建过程

上面文章:springCloud踩坑系列-Eureka-单节点服务端,我们已经初步搭成了一个单节点的服务注册中心,我们在此基础上继续进行高可用版的注册中心搭建.

  1. 创建工程
    复制项目:eureka-server1到它同级目录,重命名为:eureka-server2,修改eureka-server2的pom文件,项目名改为eureka-server2,代码为:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.vj.study</groupId>
    <artifactId>eureka-server2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-server2</name>
    <description>Eureka project for Spring Boot</description>

    <parent>
        <artifactId>spring-cloud</artifactId>
        <groupId>com.vj.study</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
</project>

同样操作,复制eureka-server1到它同级目录,重命名为:eureka-server3,并且修改eureka-server3的pom文件中的项目名称.
然后将eureka-server2,eureka-server3加到父项目中:
在这里插入图片描述
此时项目结构为:
在这里插入图片描述
eureka-server1,eureka-server2,eureka-server3为我们接下来部署的三个eureka服务.

  1. 修改配置文件
    eureka-server1的yml文件修改为:
server:
  port: 6021                    # 指定该Eureka实例的端口
spring:
  application:
    name: vjEurekaServer
#  cloud:
#    inetutils:
#      ignoredInterfaces:
#        - VMware Network Adapter VMnet1
#        - VMware Network Adapter VMnet8
#      default-ip-address: 192.168.3.115
#      preferredNetworks: 192.168.3


eureka:
  environment: dev
  instance:
    appname: ${spring.application.name}
#    hostname: ${spring.cloud.client.ipAddress}        # 指定该Eureka实例的主机名
    hostname: server1        # 指定该Eureka实例的主机名
#    ip-address: 192.168.3.115      # 指定该Eureka实例的IP
    prefer-ip-address: false     # 使用IP注册
#    prefer-ip-address: true     # 使用IP注册
    instanceId: ${eureka.instance.hostname}:${server.port}
#    instanceId: ${spring.cloud.client.ipAddress}:${server.port}
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/,http://server2:6022/eureka/,http://server3:6023/eureka/

# 参考文档:http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#_standalone_mode

将eureka.client. register-with-eureka和eureka.client.fetch-registry改为true,并且修改defaultZone,将server2和server3加入进默认注册中心(server2和server3分别对应eureka-server2,eureka-server3,在eureka.instance.hostname中进行配置即可.).

eureka-server2的yml配置(修改了启动端口以及hostname和defaultZone):

server:
  port: 6022                    # 指定该Eureka实例的端口
spring:
  application:
    name: vjEurekaServer
#  cloud:
#    inetutils:
#      ignoredInterfaces:
#        - VMware Network Adapter VMnet1
#        - VMware Network Adapter VMnet8
#      default-ip-address: 192.168.3.115
#      preferredNetworks: 192.168.3


eureka:
  environment: dev
  instance:
    appname: ${spring.application.name}
#    hostname: ${spring.cloud.client.ipAddress}        # 指定该Eureka实例的主机名
    hostname: server2        # 指定该Eureka实例的主机名
#    ip-address: 192.168.3.115      # 指定该Eureka实例的IP
    prefer-ip-address: false     # 使用IP注册
#    prefer-ip-address: true     # 使用IP注册
    instanceId: ${eureka.instance.hostname}:${server.port}
#    instanceId: ${spring.cloud.client.ipAddress}:${server.port}
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/,http://server1:6021/eureka/,http://server3:6023/eureka/

# 参考文档:http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#_standalone_mode

eureka-server3的yml配置(修改了启动端口以及hostname和defaultZone):

server:
  port: 6023                    # 指定该Eureka实例的端口
spring:
  application:
    name: vjEurekaServer
#  cloud:
#    inetutils:
#      ignoredInterfaces:
#        - VMware Network Adapter VMnet1
#        - VMware Network Adapter VMnet8
#      default-ip-address: 192.168.3.115
#      preferredNetworks: 192.168.3


eureka:
  environment: dev
  instance:
    appname: ${spring.application.name}
#    hostname: ${spring.cloud.client.ipAddress}        # 指定该Eureka实例的主机名
    hostname: server3        # 指定该Eureka实例的主机名
#    ip-address: 192.168.3.115      # 指定该Eureka实例的IP
    prefer-ip-address: false     # 使用IP注册
#    prefer-ip-address: true     # 使用IP注册
    instanceId: ${eureka.instance.hostname}:${server.port}
#    instanceId: ${spring.cloud.client.ipAddress}:${server.port}
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/,http://server1:6021/eureka/,http://server2:6022/eureka/

# 参考文档:http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#_standalone_mode

注意: eureka.instance.appname必须保持一致,网上很多说和spring.application.name保持一致,其实背后隐藏的是所有的服务的appname都必须一致,个人理解这里的application指的是你的项目名而不是某个服务名.如果三个eureka.instance.appname不一致将导致服务不可用.

然后分别运行三个模块中的EurekaServerApplication,访问http://server1:6021/,页面如下:
在这里插入图片描述
可以看到三个服务正常启动.

  1. 以IP形式部署
    上面我们已经成功通过改hosts的方式搭建了eureka服务中心,但实际部署中我们可能没有那么多域名,只能通过IP的方式去进行搭建,现在我们对application.yml配置文件进行修改,以适用于IP部署方式:
    此处我们需要改三个地方:
    prefer-ip-address:false -->true
    hostname: server1 --> ${spring.cloud.client.ipAddress}
    defaultZone: 将server1,server2,server3改为对应的IP.

注意,必须保持每个hostname唯一,这里使用了当前服务主机IP作为hostname,也可修改为其它,但必须保证唯一.

eureka-server1的yml配置文件为:

server:
  port: 6021                    # 指定该Eureka实例的端口
spring:
  application:
    name: vjEurekaServer
#  cloud:
#    inetutils:
#      ignoredInterfaces:
#        - VMware Network Adapter VMnet1
#        - VMware Network Adapter VMnet8
#      default-ip-address: 192.168.3.115
#      preferredNetworks: 192.168.3


eureka:
  environment: dev
  instance:
    appname: ${spring.application.name}
    hostname: 192.168.1.3        # 指定该Eureka实例的主机名
#    hostname: server1        # 指定该Eureka实例的主机名
#    ip-address: 192.168.3.115      # 指定该Eureka实例的IP
#    prefer-ip-address: false     # 使用IP注册
    prefer-ip-address: true     # 使用IP注册
    instanceId: ${eureka.instance.hostname}:${server.port}
#    instanceId: ${spring.cloud.client.ipAddress}:${server.port}
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/,http://192.168.1.5:6022/eureka/,http://192.168.1.3:6023/eureka/

# 参考文档:http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#_standalone_mode

server2和server3的配置文件做对应修改.这里我们将server1和server3的appname设为一样的,server2与他们不一样.将server2打包后放到对应的服务器,分别运行server1,2,3,访问http://192.168.1.5:6022/,界面如下:
在这里插入图片描述

访问http://192.168.1.3:6021:
在这里插入图片描述

访问http://192.168.1.3:6023/:
在这里插入图片描述

可以看到,appname相同eureka-server1和eureka-server3相互注册是不成功的,因此配置的时候,如果是在同一台服务器上部署多个eureka服务,需要改hosts,并且关闭ip注册方式,如果部署在多台服务器并且以ip形式注册的时候就需要开启prefer-ip-address.但都需要保持hostname唯一.

要点总结

1.三个服务的appname必须保持一致
2.需要保持hostname唯一
3.and more…

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值