文档章节

SpringCloud系列第04节之注册中心Eureka高可用

吴伟祥
 吴伟祥
发布于 2019/03/20 09:36
字数 1640
阅读 233
收藏 1

简介

Eureka Server 也支持运行多实例,并以互相注册的方式(即伙伴机制),来实现高可用的部署

即每一台 Eureka 都在配置中指定另一个 Eureka 地址作为伙伴,它在启动时会向伙伴节点获取注册列表

如此一来,Eureka 集群新加机器时,就不用担心注册列表的完整性

所以:我们只需要在 Eureke Server 里面配置其他可用的 serviceUrl,就实现了注册中心的高可用

详见:http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_peer_awareness

Zone

上面提到 serviceUrl,那就顺便说下 defaultZone

Eureka 有一个 Region 和 Zone 的概念,你可以理解为现实中的大区(Region)和机房(Zone)

Eureka Client 在启动时需要指定 Zone,它会优先请求自己 Zone 的 Eureka Server 获取注册列表

同样的,Eureka Server 在启动时也需要指定 Zone,如果没有指定的话,其会默认使用 defaultZone

详见源码中的 getEurekaServerServiceUrls() 方法:https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java

示例代码

这是演示的是一个由四个模块组成的 Maven 工程,其中包含两个注册中心和两个服务提供者

如下图所示

这是公共的 pom.xml

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.jadyer.demo</groupId>
    <artifactId>demo-cloud-04</artifactId>
    <version>1.1</version>
    <packaging>pom</packaging>
    <modules>
        <module>service-discovery-01</module>
        <module>service-discovery-02</module>
        <module>service-server-01</module>
        <module>service-server-02</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.3.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

注册中心01

这是第一个注册中心的 pom.xml

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.jadyer.demo</groupId>
        <artifactId>demo-cloud-04</artifactId>
        <version>1.1</version>
    </parent>
    <artifactId>service-discovery-01</artifactId>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    </dependencies>
</project>

这是第一个注册中心的 SpringBoot 启动类 ServiceDiscovery01BootStrap.java

package com.jadyer.demo;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

//创建服务注册中心
@EnableEurekaServer
@SpringBootApplication
public class ServiceDiscovery01BootStrap {
    public static void main(String[] args) {
        new SpringApplicationBuilder(ServiceDiscovery01BootStrap.class).run(args);
    }
}

这是第一个注册中心的配置文件 /src/main/resources/application.yml

server:
  port: 1100

eureka:
  server:
    enable-self-preservation: false       # 关闭自我保护模式(缺省为打开)
    eviction-interval-timer-in-ms: 1000   # 续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
  client:
    # 设置是否从注册中心获取注册信息(缺省true)
    # 因为这是一个单点的EurekaServer,不需要同步其它EurekaServer节点的数据,故设为false
    # fetch-registry: false
    # 设置是否将自己作为客户端注册到注册中心(缺省true)
    # 这里为不需要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient)
    register-with-eureka: false
    # 在未设置defaultZone的情况下,注册中心在本例中的默认地址就是http://127.0.0.1:1100/eureka/
    # 但奇怪的是,启动注册中心时,控制台还是会打印这个地址的节点:http://localhost:8761/eureka/
    # 而实际服务端注册时,要使用1100端口的才能注册成功,8761端口的会注册失败并报告异常
    serviceUrl:
      # 实际测试:若修改尾部的eureka为其它的,比如/myeureka,注册中心启动没问题,但服务端在注册时会失败
      # 报告异常:com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
      defaultZone: http://127.0.0.1:1200/eureka/

注册中心02

其大部分代码与注册中心01相同,不同的有以下两处

  1. 启动端口为1200
  2. eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1100/eureka/(指向到伙伴那里)

服务提供方01

这是第一个服务提供方的 pom.xml

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.jadyer.demo</groupId>
        <artifactId>demo-cloud-04</artifactId>
        <version>1.1</version>
    </parent>
    <artifactId>service-server-01</artifactId>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
    </dependencies>
</project>

这是第一个服务提供方的 SpringBoot 启动类 ServiceServer01BootStarp.java

package com.jadyer.demo;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 通过 @EnableEurekaClient 注解,为服务提供方赋予注册和发现服务的能力
 * ------------------------------------------------------------------------------------------------------------------
 * 也可以使用org.springframework.cloud.client.discovery.@EnableDiscoveryClient注解
 * 详见以下两篇文章的介绍
 * http://cloud.spring.io/spring-cloud-static/Camden.SR3/#_registering_with_eureka
 * https://spring.io/blog/2015/01/20/microservice-registration-and-discovery-with-spring-cloud-and-netflix-s-eureka
 * ------------------------------------------------------------------------------------------------------------------
 * Created by 玄玉<https://jadyer.cn/> on 2017/1/9 16:00.
 */
@EnableEurekaClient
@SpringBootApplication
public class ServiceServer01BootStarp {
    public static void main(String[] args) {
        new SpringApplicationBuilder(ServiceServer01BootStarp.class).run(args);
    }
}

这是第一个服务提供方的配置文件 /src/main/resources/application.yml

server:
  port: 2100

spring:
  application:
    name: CalculatorServer                        # 指定发布的微服务名(以后调用时,只需该名称即可访问该服务)

eureka:
  instance:
    instance-id: ${spring.application.name}:${server.port}
    prefer-ip-address: true                       # 设置微服务调用地址为IP优先(缺省为false)
    lease-renewal-interval-in-seconds: 5          # 心跳时间,即服务续约间隔时间(缺省为30s)
    lease-expiration-duration-in-seconds: 15      # 发呆时间,即服务续约到期时间(缺省为90s)
  client:
    healthcheck:
      enabled: true                               # 开启健康检查(依赖spring-boot-starter-actuator)
    serviceUrl:
      defaultZone: http://127.0.0.1:1100/eureka/  # 指定服务注册中心的地址

这是第一个服务提供方暴露的数学运算服务 CalculatorController.java

package com.jadyer.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

/**
 * 服务提供方暴露的数学运算服务
 * Created by 玄玉<https://jadyer.cn/> on 2017/1/9 16:00.
 */
@RestController
public class CalculatorController {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    @Resource
    private DiscoveryClient client;

    @RequestMapping("/add")
    public int add(int a, int b){
        //加运算
        int result = a + b;
        //输出服务信息
        ServiceInstance instance = client.getLocalServiceInstance();
        logger.info("uri={},serviceId={},result={}", instance.getUri(), instance.getServiceId(), result);
        //返回结果
        return result;
    }
}

服务提供方02

其大部分代码与服务提供方01相同,不同的有以下两处

  1. 启动端口为2200
  2. eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1200/eureka/(也可配成1100,再看效果,是一样的)

补充一下:服务提供方配置成这样也可以eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1100/eureka/,http://127.0.0.1:1200/eureka/

至于验证,先启动两个注册中心(启动时会报错,不过没关系,这是由于它找不到伙伴),再启动服务提供方

然后看两个注册中心 Eureka 首页的注册服务列表,就会发现会被自动同步

本文转载自:https://jadyer.cn/2017/01/18/springcloud-eureka-highavailability/

吴伟祥

吴伟祥

粉丝 34
博文 500
码字总数 285677
作品 0
泉州
后端工程师
私信 提问
加载中

评论(0)

史上最简单的 SpringCloud 教程 | 终章

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/70148833 转载请标明出处...

方志朋
2017/04/12
0
0
史上最简单的 SpringCloud 教程

《史上最简单的 SpringCloud 教程》系列: 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka) 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon) 史上最...

外星人et59
2018/04/21
0
0
EurekaServer高可用

前言 之前一篇文章文章《服务注册与发现---eureka》介绍了单点EurekaServer。但是实际环境中,这种单点的的模式可能会有很多隐形的问题。比如EurekaServer发生宕机,或者某些意外情况发生,很...

dalaoyang
2018/06/15
0
0
SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)

前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识。 SpringCloud Hystrix Hystrix 介绍 Netflix创建了一个名为Hystrix的库,它实现了断路器模...

虚无境
2019/05/31
325
0
SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka)

前言 本篇主要介绍的是SpringCloud相关知识、微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka)。 SpringCloud介绍 Spring Cloud是在Spring Boot的基础上构建的,用于简化分布...

虚无境
2019/01/14
212
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL字符串截取的4个函数

1、从左开始截取字符串 left(str, length) 说明: left(被截取字段,截取长度) 例如: select left(content,200) as abstract from my_content_t 从左边(字符串开始位置)截取指定长...

fairy1674
51分钟前
92
0
Fedora 31 - 查杀木马

使用chkrootkit和rkhunter检查系统 #安装工具sudo dnf install chkrootkit rkhunter#修改配置##使用管理员邮箱地址sudo sed -i 's/^MAILTO=.*/MAILTO=admin@server.com/' /etc/sy......

wffger
58分钟前
68
0
检查目录是否存在,如果不存在则创建

我经常发现自己写的R脚本会产生大量输出。 我发现它更干净,可以将此输出放到自己的目录中。 我在下面编写的内容将检查目录是否存在并移入该目录,或者创建目录然后移入该目录。 有没有更好的...

javail
今天
97
0
让你相见恨晚的Photoshop 使用技巧——用ps做后期渲染

无论是面对客户汇报方案还是在设计竞赛中脱颖而出,通过PS来渲染平面图都是至关重要的工作。无论何时,你的平面设计的出图质量便也是你的能力说明。 今天小编给大家带来真正的对建筑 / 规划/...

mac小叮当
今天
80
0
推荐VSCode12个比较实用的插件

1、Auto Rename Tag ——自动重命名成对的HTML标记。假如你创建了一个<p>标记。现在你想更改它。有了这个软件,你只需要更改一个就行,另一个会自动修改。从理论上来说,使用这个软件可以把...

IT技术分享社区
今天
113
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部