简介

Netflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 进行了二次封装,主要负责完成微服务架构中的服务治理功能。

Spring Cloud Eureka 是一个基于 REST 的服务,并提供了基于 Java 的客户端组件,能够非常方便的将服务注册到 Spring Cloud Eureka 中进行统一管理。

部署 Eureka Server

  1. 创建一个名为 eureka-server 的 Spring Cloud 的项目(略)

  2. 引入 eureka-server 依赖(maven)

    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
  3. 开启 EurekaServer

    在启动类上添加 @EnableEurekaServer注解,开启 EurekaServer 的自动装配功能。

  4. 修改服务端口为8761

  5. 修改 register-with-eureka 配置

    添加一个eureka.client.register-with-eureka=false的配置,作为EurekaServer可以不将自己的实例注册到 Eureka Server 中,如果是集群部署设置为true(不配置默认值也是true)。

  6. 修改 fetch-registry 配置

    添加一个 eureka.client.fetch-registry=false 的配置,表示不从 Eureka Server 中获取 Eureka 的注册表信息,如果是集群部署设置为true(不配置默认值也是true)。

  7. 添加defaultZone配置

    添加一条配置eureka.client.service-url.defaultZone=http://localhost:8761/eureka/(如果不加这个的话又自定义了端口,可能会报错Connect to localhost:8761 timed out)

  8. 启动 Eureka Server,访问 http://localhost:8761/,如果顺利的话可以看到如下成功页面

至此,一个简单的Eureka注册中心就完成了,后面实战中的 Eureka Client 都会注册到这个注册中心。上面的demo只是一个单机部署,接下里我们看看我们要部署多个Eureka节点时怎么做。

Eureka Server 集群部署

集群部署一般有两种情况,一是伪集群部署,二是真正的集群部署。

集群部署,我们可以在多台物理机上部署,这样多个实例可以用同一个端口,不会出现伪集群端口冲突的问题,更推荐这种方式,性能更高,稳定性也更好。

伪集群部署一般说的是在同一台物理机器上部署多个节点,这时候端口就必须不一样,否则启动的时候会出现端口冲突;

伪集群部署示例:

假设要部署3个节点:master/slave1/slave2

  1. 在application.yml配置定义三个节点的端口:

    port:
    master: 8761
    slave1: 8762
    slave2: 8763
  2. 我们可以分别创建三个配置文件application-master.yml、application-slave1.yml、application-slave2.yml,三个配置文件除了有冲突的地方端口不一样,其他配置完全一样

    # application-master.yml
    server:
    port: ${port.slave1} # 服务端口 # application-master.yml
    server:
    port: ${port.slave1} # 服务端口 # application-slave2slave2.yml
    server:
    port: ${port.slave2} # 服务端口 # 以下配置三个配置文件都一样
    eureka:
    client:
    register-with-eureka: true #不将自己的实例注册到 Eureka Server
    fetch-registry: true #不从 Eureka Server 中获取 Eureka 的注册表信息
    service-url:
    defaultZone: http://127.0.0.1:${port.master}/eureka/,http://127.0.0.1:${port.slave1}/eureka/,http://127.0.0.1:${port.slave2}/eureka/
    instance:
    hostname: eureka-server
    server:
    enable-self-preservation: true # 开启自我保护机制,默认也是开启的
  3. IDEA 分别以三个不同的profiles启动

  4. 访问 http://localhost:8761/ 或者 http://localhost:8762/ 或者 http://localhost:8761/,出现以下类似页面则代表成功

观察上面的页面,发现 Eureka Server 节点均出现在 unavailable-replicas 下,说明集群搭建还是失败了,那这个问题怎么解决呢?

  1. host添加以下配置

    127.0.0.1       eureka-server-master
    127.0.0.1 eureka-server-slave1
    127.0.0.1 eureka-server-slave2
  2. 修改三个配置文件的defaultZone信息

    eureka:
    client:
    service-url:
    defaultZone: http://eureka-server-master:${port.master}/eureka/,http://eureka-server-slave1:${port.slave1}/eureka/,http://eureka-server-slave2:${port.slave2}/eureka/
  3. 配置eureka.instance.hostname信息(尤其是在同一台物理机上配置三个节点时,需要修改为不同的host)

    eureka:
    instance:
    hostname: eureka-server-master eureka:
    instance:
    hostname: eureka-server-slave1 **eureka:
    instance:
    hostname: eureka-server-slave2
  4. 重新启动,访问http://localhost:8761/ ,其他两个节点君出现在 available-replicas 选项

    注意:如果执行完上面还是出现在,请检查是否配置了 prefer-ip-address = true,true #以IP地址注册到服务中心,相互注册使用IP地址,如果是在一台物理机上,IP都是一个,所以建议设置成false,或者不配置再试试。

部署 Eureka Client

  1. 创建一个名为eureka-client 的SprintBoot的项目(略)

  2. 引入eureka-client依赖(maven)

    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
  3. 引入spring-boot-starter-web依赖,如果没有加上spring-boot-starter-web,服务无法正常启动

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  4. 开启 EurekaClient

    在启动类上加入注解@EnableEurekaClient,用于启用Eureka发现配置

  5. 配置端口为8081

    server.port = 8081
    port.master = 8761
    port.slave1 = 8762
    port.slave2 = 8763
  6. 配置注册中心地址

    添加配置 eureka.client.serviceUrl.defaultZone=http://eureka-server-master:${port.master}/eureka/,http://eureka-server-slave1:${port.slave1}/eureka/,http://eureka-server-slave2:${port.slave2}/eureka/

  7. 启动服务,刷新 http://localhost:8761/ 页面,如果看到了EUREKA-CLIENT应用则表示注册成功

Eureka自我保护机制

自我保护机制是为了避免因网络分区故障而导致服务不可用的问题。具体现象为当网络故障后,所有的服务与 Eureka Server 之间无法进行正常通信,一定时间后,Eureka Server 没有收到续约的信息,将会移除没有续约的实例。这个时候正常的服务也会被移除掉,所以需要引入自我保护机制来解决这种问题。

当服务提供者出现网络故障,无法与 Eureka Server 进行续约,Eureka Server 会将该实例移除,此时服务消费者从 Eureka Server 拉取不到对应的信息,实际上服务提供者处于可用的状态,问题就是这样产生的。

开启自我保护机制

eureka.server.enable-self-preservation=true # 开启自我保护机制,默认也是开启的

当服务提供者出现网络故障,无法与 Eureka Server 进行续约时,虽然 Eureka Server 开启了自我保护模式,但没有将该实例移除,服务消费者还是可以正常拉取服务提供者的信息,正常发起调用。

但是自我保护机制也有不好的地方,如果服务提供者真的下线了,由于 Eureka Server 自我保护还处于打开状态,不会移除任务信息,当服务消费者对服务提供者 B 进行调用时,就会出错。

自我保护模式有利也有弊,但我们建议在生产环境中还是开启该功能,默认配置也是开启的。

完整代码实例:

  1. Eureka Server 代码实例
  2. Eureka Client 代码示例

总结

  1. 使用@EnableEurekaServer 注解实现注册中心
  2. 使用@EnableEurekaClient 注册到注册中心
  3. Eureka Server 集群部署的时候需要保证register-with-eurekafetch-registry 为true,单机部署可以为false
  4. 生产环境建议开启自我保护机制

①SpringCloud 实战:引入Eureka组件,完善服务治理的更多相关文章

  1. 微服务---Eureka注册中心(服务治理)

    在上一篇的初识SpringCloud微服务中,我们简单讲解到服务的提供者与消费者,当服务多了之后,会存在依赖与管理之间混乱的问题,以及需要对外暴露自己的地址,为了解决此等问题,我们学习Eureka注册 ...

  2. springcloud超简单的入门2--Eureka服务治理

    Eureka服务治理 下面请听第一个话题,母...咳咳,拿错书了. Eureka简介 eureka是什么呢? 简单来说呢,当我的微服务应用多了起来,一个一个写死再程序里是件很不优雅的事情,而且同一服务 ...

  3. SpringCloud实战-Hystrix请求熔断与服务降级

    我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...

  4. SpringCloud实战3-Hystrix请求熔断与服务降级

    我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...

  5. ②SpringCloud 实战:引入Feign组件,完善服务间调用

    这是SpringCloud实战系列中第二篇文章,了解前面第一篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 简介 Feign 是一个声明式的 RE ...

  6. ⑦SpringCloud 实战:引入Sleuth组件,完善服务链路跟踪

    这是SpringCloud实战系列中第7篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...

  7. ④SpringCloud 实战:引入Hystrix组件,分布式系统容错

    这是SpringCloud实战系列中第4篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...

  8. ⑤SpringCloud 实战:引入Zuul组件,开启网关路由

    这是SpringCloud实战系列中第4篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...

  9. ⑥SpringCloud 实战:引入gateway组件,开启网关路由功能

    这是SpringCloud实战系列中第4篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...

随机推荐

  1. Linux命令之tab 键补全

    tab 键补全 tab 键可以实现命令及路径等补全,提高输入效率,避免出错 命令补全 用户给定的字符串只有一条惟一对应的命令,直接补全, 两次Tab会给出列表 内部命令: 外部命令:bash根据PAT ...

  2. Pytest学习(三) - setup和teardown的使用

    一.前言 从文章标题可以看出,就是初始化和释放的操作,根据我的java习惯来学习pytest,个人感觉没差太多,理解上也不是很难. 哦,对了,差点跑题了,这个框架是基于Python语言的,在学习的时候 ...

  3. 在centOS上安装oracle出现java.lang.NoClassDefFoundError问题及解决方法

    问题一:CentOS6.5 静默安装Oracle 11G过程中提示:Exception in thread "main" java.lang.NoClassDefFoundErro ...

  4. byte + byte = int

    byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double

  5. dbvis 导出表结构 xls

    1.dbvis 可以导出多种格式的文件,如SQL.XLS.TXT.HTML.JSON.CSV及XML. 需求场景(本场景是实际场景引申的场景,此处导出xls): 最近,遇到一个需求需要将表的结构数据导 ...

  6. 图解git,用手绘图带你理解git中分支的原理和应用

    大家好,今天我们来聊git当中一个非常非常重要的特性,就是branch. git branch可以说是git当中最重要的概念了,甚至没有之一.因为git最重要的使用场景就是协同开发,大家一起在一个项目 ...

  7. DateTimeFormatter接替SimpleDateFormat

    java程序猿经常会碰到的一个问题就是日期格式化.当接收参数中有日期或时间,那么就需要与前端商量好其格式,这边我知道是2种:1.时间戳 2.字符串. 先说一下时间戳,这个形势的参数,Java只需new ...

  8. python机器学习实现K-近邻算法(KNN)

    机器学习 K-近邻算法(KNN) 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 后打开浏览器输入网址htt ...

  9. 如何k个一组反转链表

    之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就用迭代方式来解决. 本文要解决「K 个一组反转链表」,不 ...

  10. C语言100题集合004-统计各个年龄阶段的人数

    系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...