一、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. Python的dict

    dict把key和value关联起来,可以通过 key来查找 value. 花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可.最后一个 key: value 的逗号可以 ...

  2. 将svn项目导出,再导入到其他工作空间

    方法一: 对于一致svn地址,本地没有的项目,直接eclipse中svn检出即可. 若本地有项目,但想导入到另一个工作空间(即拷贝一份,不想再从svn拉),则需要用export方法. 方法二(expo ...

  3. BootStrap学习代码

    要为毕设做准备了! 哎,毕设前台得自己来,所以打算学学bootstrap,把学习的代码放到码云上面了,使用HbuilderX来写,界面友好,适合我这种前端小白- 第一天就感受到了写html快捷键的强大 ...

  4. python·那些不值钱的经验

    时间:2018-11-22 整理:byzqy python读写文本文件 1 # -*- coding: utf-8 -*- 2 3 def read_file(file): 4 with open(f ...

  5. shell脚本书写

    #!/bin/bash #指定脚本默认使用的命令解释器 第1行 幻数 #!/usr/bin/python #!/bin/awk #!/bin/sed

  6. JS015. 数据存储方式与位置(堆内存、栈内存、指针)

    数据 - 基本类型 Undefined  ,  Null  ,  String  ,  Number  ,  Boolean  ,  Symbol (ES 6)  , 基本数据类型存储在栈内存中. 数 ...

  7. MobaXterm - 渗透之旅的终端神器

    一.背景 1.SSH概念 如果想要连接Linux服务器来进行文件之间的传送,那就需要一个Secure Shell软件(简称SSH的)来完成.从概念上来讲,SSH其实是一个网络协议,允许通过网络连接到L ...

  8. SpringBoot自定义初始化Bean+HashMap优化策略模式实践

    策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 传统的策略模式一般是创建公共接口.定义公共方法-->然后创建实体类实现公共接口.根据各自的 ...

  9. 编写一个应用程序,利用数组或者集合, 求出"HELLO",“JAVA”,“PROGRAM”,“EXCEPTION”四个字符串的平均长度以及字符出现重复次数最多的字符串。

    public class Number { public static void main(String[] args) { String[] arr = { "HELLO", & ...

  10. private关键字理解

    private 意思: 私有的 私人的 不公开的 private 是一个修饰符可以用来修饰成员变量和方法 被private修饰的成员变量或成员方法,只能在本类中访问,针对private修饰的成员变量, ...