服务注册中心之Eureka使用
一、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使用的更多相关文章
- springboot+cloud 学习(一)高可用服务注册中心(Eureka)
先说说Eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringClo ...
- Spring Cloud-服务的注册与发现之服务注册中心(Eureka Server)
Spring cloud是为了什么产生的? 根据官网的这个介绍来看,我们可以知道,Spring cloud是为开发者提供的一个工具,而使用这个工具的产生就是为了帮助开发者快速的开发一套比较通用的分布式 ...
- 作为服务注册中心,Eureka比Zookeeper好在哪里
CAP是Consistency.Availablity和Partition Tolerance的缩写.一般的分布式系统最多满足其中两条.而Partition Tolerance是分布式系统的关键,因此 ...
- 服务注册中心:Eureka
第一章 注册中心介绍 1.1.什么是注册中心 注册中心可以说是微服务架构中的"通讯录",它记录了服务和服务地址的映射关系.在分布式系统中,服务会注册到这里,当服务需要调用其它服务时 ...
- Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼
Spring Cloud并不与Spring MVC类似是一个开源框架,而是一组解决问题的规范(个人理解).解决哪些问题呢?如下: 1)服务管理:⾃动注册与发现.状态监管 2)服务负载均衡 3)熔断 4 ...
- 服务注册中心,Eureka比Zookeeper好在哪里?
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性).和P(分区容错性).由于分区容错性P在分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡. 因此: Zookeep ...
- 【Eureka】 作为服务注册中心,Eureka比Zookeeper好在哪里
著名的 CAP 理论指出,一个分布式系统不可能同时满足 C(一致性) A(可用性) 和 P(分区容错性).由于分区容错性 P 是在分布式系统中必须保证的,因此我们只能在 A 和 C 之间进行权衡. Z ...
- Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现
介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...
- Spring Cloud(二):Eureka 服务注册中心
前言 服务治理 随着业务的发展,微服务应用也随之增加,这些服务的管理和治理会越来越难,并且集群规模.服务位置.服务命名都会发生变化,手动维护的方式极易发生错误或是命名冲突等问题.而服务治理正是为了解决 ...
随机推荐
- 初识javaScript(慕课网学习笔记)
js输出 window.alert() 警告框 document.write() 写到HTML文档中 innerHTML 写到HTML元素 console.log() 写到浏览器的控制台 <!D ...
- JDBC基础篇(MYSQL)——使用statement执行DML语句(insert/update/delete)
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day02_statement; import java.sql.Connection; import java.s ...
- myScript调研,电子手写板使用,纯干货
第二天进公司,就叫我调研myScript作为手写板的可行性,又不能不做,哎~ myScript效果十分的奈斯,前端用canvas手写的文字.数学字符,都可以识别然后转换,不知道myScript是不是你 ...
- JavaScript——数组——数组长度
JavaScript--数组--数组长度 JavaScript中的数组长度是可变的,可用赋值运算符改变数组大小,如果改变之后的数组的长度比原数组大,则新数组会在末尾补充相应数量的空位,空位上的数组元素 ...
- JavaScript高级程序设计读书笔记之JSON
JSON(JavaScript Object Notation)JavaScript对象表示法.JSON是JavaScript的一个严格的子集,利用了JavaScript中的一些模式来表示结构化数据. ...
- 哲学家就餐问题-Java语言实现死锁避免
哲学家就餐问题-Java语言实现死锁避免 我死锁预防是至少破坏死锁产生的四个必要条件之一,带来的问题就是系统资源利用率低且不符合开发习惯,而死锁避免不是事先釆取某种限制措施破坏死锁的必要条件,只是注意 ...
- spring boot 系列之七:SpringBoot整合Mybatis
springboot已经很流行,但是它仍需要搭配一款ORM框架来实现数据的CRUD,之前已经分享过JdbcTemplete和JPA的整合,本次分享下Mybatis的整合. 对于mybatis的使用,需 ...
- kubernetes 使用 PV 和 PVC 管理数据存储
文章链接 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的状态)重 ...
- 从需求去理解 Linux dbus与基于dbus协议的无agent软件管理
What is IPC IPC [Inter-Process Communication] 进程间通信,指至少两个进程或线程间传送数据或信号的一些技术或方法.在Linux/Unix中,提供了许多IPC ...
- 掌握基于AOP事务管理
一.手动管理和半自动工厂模式 二.AOP事务管理 1.表达式中,第一个※是返回值所有类型,service包下一个点意思是service包下的类,两个点意思是service包下的类和其子包下的类也包含, ...