前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多节点高可用Eureka集群配置与部署

多节点高可用Eureka集群配置与部署

作者头像
胖虎
发布2019-06-26 17:20:59
2.1K0
发布2019-06-26 17:20:59
举报
文章被收录于专栏:晏霖晏霖

前言 上一节讲的是动态扩容Eureka服务,说实话,一般情况这种操作并不多,一般多用在,由于大量服务节点部署后给Eureka造成压力突然积增,而解决的办法。这节讲的是一次启动或部署,直接就是集群多节点的,多用于服务节点相对稳定的场景。还有笔者这里有实际部署和应用的经验分享给大家,就是,我目前25个服务都注册在一个单节点Eureka上了(无论生产还是测试环境下),测试周期接近一年,我发现Eureka可靠性和可用性还是很高的,没有出现一次注册中心挂了的情况。还有,我一下内容没有花里胡哨的套话和流程图,想必大家最想解决的就是如何快速的解决自己的问题,所以以下基本都是贴出的代码,关键地方我会文字说明。代码还是基于《重新定义》的思想。

正文 首先还是创建一个父module,pom配置如下:

代码语言:javascript
复制
<groupId>cn.springcloud.book</groupId>
    <artifactId>ch3-2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>ch3-2</name>
    <description>ch3-2</description>

    <modules>
        <module>ch3-2-zuul-gateway</module>
        <module>ch3-2-eureka-server</module>
        <module>ch3-2-eureka-client</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

然后创建EurekaServer服务,分别贴出pom文件和启动类

代码语言:javascript
复制
<groupId>cn.springcloud.book</groupId>
    <artifactId>ch3-2-eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>ch3-2-eureka-server</name>
    <description>ch3-2-eureka-server</description>

    <parent>
        <groupId>cn.springcloud.book</groupId>
        <artifactId>ch3-2</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

代码语言:javascript
复制
@SpringBootApplication
@EnableEurekaServer
public class Ch322EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(Ch322EurekaServerApplication.class, args);
    }
}

然后下面的内容是多节点配置的重要部分了 我会从上到下依次贴出这个目录的代码

代码语言:javascript
复制
eureka:
  server:
    use-read-only-response-cache: false
    response-cache-auto-expiration-in-seconds: 10
management:
  endpoints:
    web:
      exposure:
        include: '*'
----------------------------------------------

server:
  port: 8761
spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost
    preferIpAddress: true
    metadataMap.zone: zone1
  client:
    register-with-eureka: true
    fetch-registry: true
    region: region-east
    service-url:
      zone1: http://localhost:8761/eureka/,http://localhost:8762/eureka/
      zone2: http://localhost:8763/eureka/,http://localhost:8764/eureka/
    availability-zones:
      region-east: zone1,zone2
  server:
      waitTimeInMsWhenSyncEmpty: 0
      enableSelfPreservation: false

代码语言:javascript
复制
server:
  port: 8762
spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost
    preferIpAddress: true
    metadataMap.zone: zone1
  client:
    register-with-eureka: true
    fetch-registry: true
    region: region-east
    service-url:
      zone1: http://localhost:8761/eureka/,http://localhost:8762/eureka/
      zone2: http://localhost:8763/eureka/,http://localhost:8764/eureka/
    availability-zones:
      region-east: zone1,zone2
  server:
      waitTimeInMsWhenSyncEmpty: 0
      enableSelfPreservation: false

代码语言:javascript
复制
server:
  port: 8763
spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost
    preferIpAddress: true
    metadataMap.zone: zone2
  client:
    register-with-eureka: true
    fetch-registry: true
    region: region-east
    service-url:
      zone1: http://localhost:8761/eureka/,http://localhost:8762/eureka/
      zone2: http://localhost:8763/eureka/,http://localhost:8764/eureka/
    availability-zones:
      region-east: zone1,zone2
  server:
      waitTimeInMsWhenSyncEmpty: 0
      enableSelfPreservation: false

代码语言:javascript
复制
server:
  port: 8764
spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost
    preferIpAddress: true
    metadataMap.zone: zone2
  client:
    register-with-eureka: true
    fetch-registry: true
    region: region-east
    service-url:
      zone1: http://localhost:8761/eureka/,http://localhost:8762/eureka/
      zone2: http://localhost:8763/eureka/,http://localhost:8764/eureka/
    availability-zones:
      region-east: zone1,zone2
  server:
      waitTimeInMsWhenSyncEmpty: 0
      enableSelfPreservation: false

这里值得解释的是 上面我配置的是四个节点,分别在一个区域里,用region: region-east 配置,然后这个区域有两个空间分别是zone1和zone2

代码语言:javascript
复制
availability-zones:
  region-east: zone1,zone2

这个配置代表了 然后8761和8762在zone1空间里,8763和8764在zone2空间里,请大家仔细看我上面的配置,按照配置理解用意。

还有必要解释的是WaitTimeInMsWhenSyncEmpty(*):

这个设置为0是为了尽快让eureka server启动起来就提供rest api服务。默认是5分钟,也就是如果peer节点注册列表为空,那就等5分钟让其他服务有注册上来了,然后同步过来,再对外提供rest api服务。

UseReadOnlyResponseCache(*):

目前采用的是二级缓存策略,一个是读写高速缓存过期策略,另一个没有过期只有只读缓存,默认为true,表示只读缓存。

然后进入eureka-server目录下分别执行

mvn spring-boot:run -Dspring.profiles.active=zone1a

mvn spring-boot:run -Dspring.profiles.active=zone1b

mvn spring-boot:run -Dspring.profiles.active=zone2a

mvn spring-boot:run -Dspring.profiles.active=zone1b

切记每次执行下一条命令需要再打开一个Terminal

这里笔者全部启动成功了。其实这时候你们访问http://localhost:8761/ 任意节点都是可以看到的。

但是我为了更好说明问题,这里加入一个eureka-client,并且这个客户端是双节点的,分别在zone1和zone2各一个

下面是client的pom和启动类

代码语言:javascript
复制
<groupId>cn.springcloud.book</groupId>
    <artifactId>ch3-2-eureka-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>ch3-2-eureka-client</name>
    <description>ch3-2-eureka-client</description>

    <parent>
        <groupId>cn.springcloud.book</groupId>
        <artifactId>ch3-2</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

代码语言:javascript
复制
@SpringBootApplication
@EnableDiscoveryClient
public class Ch32EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(Ch32EurekaClientApplication.class, args);
    }
}

下面我同样分别列出client的配置文件

代码语言:javascript
复制
management:
  endpoints:
    web:
      exposure:
        include: '*'
--------------------------------------

server:
  port: 8081
spring:
  application:
    name: client
eureka:
  instance:
    metadataMap.zone: zone1
  client:
    register-with-eureka: true
    fetch-registry: true
    region: region-east
    service-url:
      zone1: http://localhost:8761/eureka/,http://localhost:8762/eureka/
      zone2: http://localhost:8763/eureka/,http://localhost:8764/eureka/
    availability-zones:
      region-east: zone1,zone2

代码语言:javascript
复制
server:
  port: 8082
spring:
  application:
    name: client
eureka:
  instance:
    metadataMap.zone: zone2
  client:
    register-with-eureka: true
    fetch-registry: true
    region: region-east
    service-url:
      zone1: http://localhost:8761/eureka/,http://localhost:8762/eureka/
      zone2: http://localhost:8763/eureka/,http://localhost:8764/eureka/
    availability-zones:
      region-east: zone1,zone2

下面分别用命令启动两个节点,操作也是和eurekaServer是一样的,进入到client目录

分别使用mvn spring-boot:run -Dspring.profiles.active=zone1 和mvn spring-boot:run -Dspring.profiles.active=zone2

访问http://localhost:8761/

大家可以四个节点都访问以下,展示的页面和这一个是一样的。

好了,到这里已经讲解完多节点配置和应用了,

下面如果把这两个工程打成jar在服务器上分别启动不同配置文件jar的时候

用java -Dspring.profiles.active=prod -jar xxx.jar 命令

注:大家可能看到我的副本均是不可用的,原因是我四个节点都是在本地,需要改hosts文件,

由于我在当前Demo没有做这些,所以后期我在本地补了一部分,这回所有节点都是可用的,如下图需要改几个地方。

对本文有异议或不明白的地方微信探讨,wx:15524579896

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 晏霖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档