一、Eureka基础

  Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。在Eureka Client应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

  Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

  Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。

  服务治理产生的原因?

   传统的rpc远程调用框架中,要进行每个服务之间的依赖管理是比较复杂的,所以需要服务治理来管理服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务的发现与注册。springCloud封装了Netflix公司的Eureka模块来实现服务治理。

  什么是服务注册与发现?

   Eureka采用了cs客户-服务设计模式,Eureka Server作为服务注册功能的服务器,它是服务注册中心。而系统中的其他服务,则使用Eureka的客户端连接到Eureka Server并维持心跳。这样系统的维护人员就可以通过Eureka Server来监控系统中各个服务模块的运行状况。当服务启动的时候会把自己的服务器信息注册到Eureka Server注册中心,这就是服务注册。当调用方用服务别名去获取和查找服务信息这就是服务发现。注册中心拥有管理服务之间依赖关系的能力,这就是服务治理的概念。在任何rpc远程调用框架中,都会有一个注册中心用于存放微服务模块相关的地址信息(服务在注册中心是以键值对形式存在的,key为服务名,value为调用地址),当服务调用者需要调用某个服务时,就用该服务的别名去注册中心查找,获取对应的调用地址(获取后可能会缓存该地址,会根据配置定时更新地址),获得调用地址后底层利用httpclient技术实现远程调用。

  Eureka的架构模式:Eureka服务注册中心可以有多个形成集群,服务提供者也可以有多个形成集群,而消费者可以只有一个,他们的架构关系如下图。

、单机Eureka-Server注册中心构建

  按照Maven项目模块的创建方式,依次进行建立模块、修改POM、编写yml配置文件、编写主启动类的顺序完成服务模块的编写。编写完成启动该模块后访问ip+port即可显示一个服务监控界面,如下图。

  编写主启动类时,在启动类上加入@EnableEurekaServer注解,以表示该模块是服务注册中心。

  编写POM时,引入Eureka-server包和图形监控包,如下所示:

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

  编写yml文件时,在resources文件夹下创建application.yml文件,并写入如下代码:

server:
port:8765
eureka:
client:
register-with-eureka: false #false表示不向服务注册中心注册自己
fetch-registry: false #false表示自己就是注册中心,不需要去检索服务
service-url: #与Eureka-server交互的地址查询服务和注册服务,都需要使用这个地址
default-zone: http://eurekaServer:8765/eureka/eureka
instance:
hostname: main-service #eureka服务端的实例名称

三、Eureka将服务模块注册到注册中心成为服务提供者

  同样按照Maven项目模块的创建方式,依次进行建立模块、修改POM、编写yml配置文件、编写主启动类的顺序完成服务模块的编写。

  编写主启动类时,在启动类上加入@EnableEurekaClient注解,以表示该模块是服务提供者。

  编写POM时,引入Eureka-client包,如下所示:

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

  编写yml文件时,在resources文件夹下创建application.yml文件,并写入如下代码server:

   port:8088
spring:
application:
name:service-name #表示服务模块的名称,当服务注册到注册中心后,可以在监控界面显示该名称,以定位该服务。
eureka:
client:
register-with-eureka: true #true表示向服务注册中心注册自己
fetch-registry: true #true表示检索服务,单节点可以不设置,集群节点必须设置为true才能配合ribbon使用负载均衡
service-url: #这是服务注册中心地址,表示该服务要注册到哪一个注册中心
default-zone: http://eurekaServer:8765/eureka/eureka
instance:
instance-id:servicename #服务名称
   prefer-ip-address:true #访问路径显示ip地址
lease-renewal-interva1-in-seconds: 20 #EurekaClient向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
lease-expiration-duration-in-seconds: 60   #EurekaServer在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务

  当该服务启动后,可以在注册中心监控界面查看到该服务的信息,如图所示:

、Eureka注册中心负载均衡集群理论

  1.注册中心集群:多个注册中心相互注册,形成相互守望,对外暴露出这些注册中心地址,使用负载均衡服务来访问这些地址。

  2.服务提供者集群:注册中心可以集群,服务提供者也可以集群,实现服务提供者集群需完成以下两件事情:

    a.当服务提供者集群以后,就不能使用端口的形势(http://ip:port)来调用服务提供者,调用消费者需使用微服务名称来调用提供者(http://cloud-servername),原因是集群状态下服务提供者端口不止一个。

    b.消费者通过微服务名称来调用提供者时,因为集群会有多个相同的微服务名称,会出现调用不明确的情况而报错,因此需要赋予RestTemplate负载均衡能力,具体实现是在消费者的ApplicationContextConfig配置文件的getRestTemplet()下增加@LoadBalanced注解。

  3.服务模块需要同时注册到每个集群的注册中心:其注册方式为在yml配置文件中的defaultzone下使用","逗号来分割这些注册中心地址。

 五、服务发现Discovery

  微服务自身要向外提供服务功能,就需要向外部提供微服务的信息,服务本身可以向外暴露一个discovery()方法,消费者可以通过调用该方法获得服务的说明信息。在eureka组件中,通过DiscoveryClient类来实现,该类可以获取已经在注册中心注册成功的所有微服务的信息。微服务要向外提供信息,需要在主启动类上增加@EnableDiscoveryClient注解,同时需要给DiscoveryClient类增加注解@resource注解。

 六、Eureka的自我保护机制

  保护模式主要用于一组客户端和EurekaServer之间存在网络分区时的保护,EurekaServer将尝试保护其注册表中的信息,不再删除服务注册表中的数据,也不会注销任何微服务。如果在EurekaServer首页看到如下提示,则表示进入了保护模式。

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE。

  通俗的说,就是指某一时刻某一个微服务不可用了,Eureka不会立即清理,依旧会对该服务的信息进行保存。这是CAP理论中的AP理论。为什么会产生自我保护机制?这是为了防止Eureka可以正常运行,但与EurekaServer之间网络不通时造成误删。

  什么是自我保护模式?默认情况下,如果EurekaServer在一定时间内没有收到某服务的心跳,EurekaServer会将其注销(默认90秒),但是当EurekaServer与服务模块之间网络存在延时、卡顿、拥挤时,他们之间无法正常发送心跳,此时微服务本身是健康的,不应该被注销。Eureka就通过"自我保护模式"来解决,自我保护模式的思想是当检测到短时间内偶尔没有收到心跳时(可能发生了网络分区故障),不会立即删除微服务。

  如何禁止自我保护?在EurekaServer的application.yml配置文件中server节点下增加如下配置:

server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 2000 #心跳间隔时间

  关闭自我保护模式后,刷新注册中心页面主页,则会出现THE SELF PRESERVATION MODE IS TURNED FFNCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.提示。

 七、Eureka停止更新的说明

  Netflix官网公告了Eureka已经停止更新,进入维护模式,除非已经在项目中使用该组件,新项目建议使用其他替代组件,比如Zookeeper、Consul、Nacos等。

  

服务注册中心之Eureka使用的更多相关文章

  1. springboot+cloud 学习(一)高可用服务注册中心(Eureka)

    先说说Eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringClo ...

  2. Spring Cloud-服务的注册与发现之服务注册中心(Eureka Server)

    Spring cloud是为了什么产生的? 根据官网的这个介绍来看,我们可以知道,Spring cloud是为开发者提供的一个工具,而使用这个工具的产生就是为了帮助开发者快速的开发一套比较通用的分布式 ...

  3. 作为服务注册中心,Eureka比Zookeeper好在哪里

    CAP是Consistency.Availablity和Partition Tolerance的缩写.一般的分布式系统最多满足其中两条.而Partition Tolerance是分布式系统的关键,因此 ...

  4. 服务注册中心:Eureka

    第一章 注册中心介绍 1.1.什么是注册中心 注册中心可以说是微服务架构中的"通讯录",它记录了服务和服务地址的映射关系.在分布式系统中,服务会注册到这里,当服务需要调用其它服务时 ...

  5. Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼

    Spring Cloud并不与Spring MVC类似是一个开源框架,而是一组解决问题的规范(个人理解).解决哪些问题呢?如下: 1)服务管理:⾃动注册与发现.状态监管 2)服务负载均衡 3)熔断 4 ...

  6. 服务注册中心,Eureka比Zookeeper好在哪里?

    著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性).和P(分区容错性).由于分区容错性P在分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡. 因此: Zookeep ...

  7. 【Eureka】 作为服务注册中心,Eureka比Zookeeper好在哪里

    著名的 CAP 理论指出,一个分布式系统不可能同时满足 C(一致性) A(可用性) 和 P(分区容错性).由于分区容错性 P 是在分布式系统中必须保证的,因此我们只能在 A 和 C 之间进行权衡. Z ...

  8. Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现

    介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...

  9. Spring Cloud(二):Eureka 服务注册中心

    前言 服务治理 随着业务的发展,微服务应用也随之增加,这些服务的管理和治理会越来越难,并且集群规模.服务位置.服务命名都会发生变化,手动维护的方式极易发生错误或是命名冲突等问题.而服务治理正是为了解决 ...

随机推荐

  1. kafka零数据丢失的配置方案

    讨论一下kafka参数的配置 1.acks 参数配置 acks这个参数有三个值:0,1,-1,但是不用的参数对应的含义不同,那如果我们想要保证数据不丢失,acks 值应该设置为哪个参数呢? 0:代表生 ...

  2. docker学习之network:初识网络配置

    起因 我的开发环境需要一个python代码运行环境.reids服务和mysql服务. 由于以前,我的开发环境是mac,而CI和线上运行环境是centos,偶尔会出项本地单元测试跑不过,而CI可以过.这 ...

  3. 我说Java完全面向对象,老大过来就是一jio

    哈喽,大家好,我是指北君.自从开始学Java,就知道Java是一门面向对象编程的语言,所以在指北君眼中,Java就是完全面向对象的.有一天老大问到我这个事情,我脱口而出,结果老大过来就是一jio... ...

  4. form表单中id与name的区别

    以前经常写form表单时,不写id和name,总觉得没有什么用.后来一看后台套完的页面发现,他们都补上name,不知道所以然,就查了一下资料,吓我一跳,要是照我那样写根本不会有数据传到服务器.原来表单 ...

  5. C# - 音乐小闹钟_BetaV2.0

    时间:2017-11-21 作者:byzqy  介绍: 虽然上一版本基本实现了闹钟的功能,但是界面.功能.用户体验(简直谈不上体验^_^),以及众多的bug,所以升级,刻不容缓! 还是先看一下Beta ...

  6. PyTorch安装及试用 基于Anaconda3

    设置Torch国内镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ ...

  7. tensorflow saver简介+Demo with linear-model

    tf.train.Saver提供Save和Restore Tensorflow变量的功能,常用于保存.还原模型训练结果,这在自己的训练和迁移学习中都很有用. 训练.保存脚本: import tenso ...

  8. 174道 JavaScript 面试题,助你查漏补缺

    最近在整理 JavaScript 的时候发现遇到了很多面试中常见的面试题,本部分主要是作者在 Github 等各大论坛收录的 JavaScript 相关知识和一些相关面试题时所做的笔记,分享这份总结给 ...

  9. proto buffer

    protobuf是一种高效的数据格式,平台无关.语言无关.可扩展,可用于 RPC 系统和持续数据存储系统. protobuf介绍 Protobuf是Protocol Buffer的简称,它是Googl ...

  10. Android kotlin http url request

    kotlin.concurrent.thread{ val url = "https://hangj.cnblogs.com/" val res = try { java.net. ...