1、介绍

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务。主要用于定位运行在 AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务注册与发现的功能。

Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样 EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。 在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。 综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

官方文档:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

架构图

2、Eureka 环境搭建

2.1 搭建 eureka 服务端

引入依赖

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

父pom中引入spring-cloud-dependencies

 <dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Greenwich.SR3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

在主启动类上添加@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class ServiceEurekaApplication {public static void main(String[] args) {SpringApplication.run(ServiceEurekaApplication.class, args);}}

编写配置文件application.properties

#eureka服务端应用的端口默认是8761
server.port=8761
#表示是否将自己注册到Eureka Server,默认为true,由于当前应用就是Eureka Server,故而设为false
eureka.client.register-with-eureka=false
# 表示是否从Eureka Server获取注册信息,默认为true,如果是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,就设为false
eureka.client.fetch-registry=false
#暴露给其他eureka client 的注册地址,不配置的话默认 http://localhost:8761/eureka/
eureka.client.service-url.defaultZone = http://www.eureka8761.com:8761/eureka/

测试
可通过 http://www.eureka8761.com:8761访问管理页

http://www.eureka8761.com:8761/apps 查看注册节点详情

2.2 搭建 eureka 客户端

引入依赖

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

在主启动类上添加@EnableDiscoveryClient (可以不加)

@SpringBootApplication
//@EnableDiscoveryClient
public class ServiceOrderApplication {public static void main(String[] args) {SpringApplication.run(ServiceOrderApplication.class, args);}}

编写配置文件application.properties

server.port=8010
#注册到eureka服务端的微服务名称
spring.application.name=service-order
#注册到eureka服务端的地址
eureka.client.service-url.defaultZone=http://www.eureka8761.com:8761/eureka/
#将ip注册到Eureka Server上   ip替代hostname
eureka.instance.prefer-ip-address=true
#显示微服务的服务实例id
eureka.instance.instance-id=service-order-${server.port}

测试
使用RestTemplate进行服务调用,可以使用微服务名称 (spring.application.name)

 String url = "http://service-order/order/findOrderByUserId/"+id;ResponseEntity<List> responseEntity = restTemplate.getForEntity(url,List.class);List<Order> orderList = responseEntity.getBody();

2.3 搭建 eureka 集群

启动两个 eureka 服务端: www.eureka8761.com:8761 www.eureka8761.com:8762。多个服务端之间要相互注册。

8761端口配置:

#eureka服务端应用的端口默认是8761
server.port=8761
#表示是否将自己注册到Eureka Server,默认为true,由于当前应用就是Eureka Server,故而设为false
eureka.client.register-with-eureka=false
# 表示是否从Eureka Server获取注册信息,默认为true,如果是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,就设为false
eureka.client.fetch-registry=false
#暴露给其他eureka client 的注册地址
eureka.client.service-url.defaultZone = http://www.eureka8762.com:8762/eureka/

8762端口配置:

#eureka服务端应用的端口默认是8761
server.port=8762
#表示是否将自己注册到Eureka Server,默认为true,由于当前应用就是Eureka Server,故而设为false
eureka.client.register-with-eureka=false
# 表示是否从Eureka Server获取注册信息,默认为true,如果是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,就设为false
eureka.client.fetch-registry=false
#暴露给其他eureka client 的注册地址
eureka.client.service-url.defaultZone = http://www.eureka8761.com:8761/eureka/

eureka client需向两个注册中心注册

#注册到eureka服务端的地址
eureka.client.service-url.defaultZone=http://www.eureka8761.com:8761/eureka/,http://www.eureka8761.com:8761/eureka/

2.4 安全配置

eureka server端引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

修改application.properties

# 注册的时候需要带入用户名和密码,基本格式为 http:用户名:密码@ip:port/eureka/
eureka.client.service-url.defaultZone= http://${spring.security.user.name}:${spring.security.user.password}@www.eureka8761.com:8761/eureka/
#开启默认的认证
spring.security.basic.enable=true
spring.security.user.name=root
spring.security.user.password=root

禁用csrf(跨域请求伪造)保护,否则eureka client 会注册失败

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {super.configure(http);http.csrf().disable();}
}

eureka client 修改application.properties

eureka.client.service-url.defaultZone=http://${security.login.username}:${security.login.pass}@www.eureka8761.com:8761/eureka/
security.login.username=root
security.login.pass=root

2.5 服务上下线监控

在某些特定的需求下,我们需要对服务的上下线进行监控,上线或下线都进行邮件通知, Eureka 中提供了事件监听的方式来扩展。 目前支持的事件如下:

EurekaInstanceCanceledEvent 服务下线事件
EurekaInstanceRegisteredEvent 服务注册事件
EurekaInstanceRenewedEvent 服务续约事件
EurekaRegistryAvailableEvent Eureka 注册中心启动事件
EurekaServerStartedEvent Eureka Server 启动事件

基于 Eureka 提供的事件机制,可以监控服务的上下线过程,在过程发生中可以发送邮件来进行通知

@Component
public class EurekaStateChangeListener {@EventListenerpublic void listen(EurekaInstanceCanceledEvent event) {System.err.println(event.getServerId() + "\t" + event.getAppName()+ " 服务下线 ");}@EventListenerpublic void listen(EurekaInstanceRegisteredEvent event) {InstanceInfo instanceInfo = event.getInstanceInfo();System.err.println(instanceInfo.getAppName() + " 进行注册 ");}@EventListenerpublic void listen(EurekaInstanceRenewedEvent event) {System.err.println(event.getServerId() + "\t" + event.getAppName()+ " 服务进行续约 ");}@EventListenerpublic void listen(EurekaRegistryAvailableEvent event) {System.err.println(" 注册中心启动 ");}@EventListenerpublic void listen(EurekaServerStartedEvent event) {System.err.println("Eureka Server启动 ");}
}

3、Eureka 核心功能点

服务注册(register):Eureka Client会通过发送REST请求的方式向Eureka Server注册自己的服务,提供自身的元数据,比如ip地址、端口、运行状况指标的url、主页地址等信息。Eureka Server接收到注册请求后,就会把这些元数据信息存储在一个双层的Map中。

服务续约(renew):在服务注册后,Eureka Client会维护一个心跳来持续通知Eureka Server,说明服务一直处于可用状态,防止被剔除。Eureka Client在默认的情况下会每隔30秒 (eureka.instance.leaseRenewallIntervalInSeconds)发送一次心跳来进行服务续约。 eureka.instance.lease‐renewal‐interval‐in‐seconds=30

服务同步(replicate):Eureka Server之间会互相进行注册,构建Eureka Server集群,不同Eureka Server之间会进行服务同步,用来保证服务信息的一致性。

获取服务(get registry):服务消费者(Eureka Client)在启动的时候,会发送一个REST请求给 Eureka Server,获取上面注册的服务清单,并且缓存在Eureka Client本地,默认缓存30秒 (eureka.client.registryFetchIntervalSeconds)。同时,为了性能考虑,Eureka Server也会维护 一份只读的服务清单缓存,该缓存每隔30秒更新一次。
前提:eureka.client.fetch‐registry=true (默认)
eureka.client.registry‐fetch‐interval‐seconds=30

服务调用:服务消费者在获取到服务清单后,就可以根据清单中的服务列表信息,查找到其他服务的地址,从而进行远程调用。Eureka有Region和Zone的概念,一个Region可以包含多个Zone, 在进行服务调用时,优先访问处于同一个Zone中的服务提供者。

服务下线(cancel):当Eureka Client需要关闭或重启时,就不希望在这个时间段内再有请求进来, 所以,就需要提前先发送REST请求给Eureka Server,告诉Eureka Server自己要下线了,Eureka Server在收到请求后,就会把该服务状态置为下线(DOWN),并把该下线事件传播出去。

服务剔除(evict):有时候,服务实例可能会因为网络故障等原因导致不能提供服务,而此时该实例也没有发送请求给Eureka Server来进行服务下线,所以,还需要有服务剔除的机制。Eureka Server在启动的时候会创建一个定时任务,每隔一段时间(默认60秒),从当前服务清单中把超时没有续约(默认90秒, eureka.instance.leaseExpirationDurationInSeconds)的服务剔除。
eureka.instance.lease‐expiration‐duration‐in‐seconds=90

自我保护:既然Eureka Server会定时剔除超时没有续约的服务,那就有可能出现一种场景,网络一段时间内发生了异常,所有的服务都没能够进行续约,Eureka Server就把所有的服务都剔除了,这样显然不太合理。所以,就有了自我保护机制,当短时间内(15min是否低于85%),统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。
自我保护开关 (eureka.server.enableself-preservation: false)

4、Eureka 注册中心常用http rest接口

查看所有服务的注册列表:
GET http://www.eureka8761.com:8761/eureka/apps  查看某一服务的注册列表:
GET http://www.eureka8761.com:8761/eureka/apps/SERVICE‐NAME 暂时剔除某服务(隔几秒会重新注册上来)
DELETE http://www.eureka8761.com:8761/eureka/apps/SERVICE‐NAME/INSTANCE‐NAME 下线某一服务:
PUT http://www.eureka8761.com:8761/eureka/apps/SERVICE‐NAME/INSTANCENAME/status?value=OUT_OF_SERVICE 下线后再恢复服务:
PUT http://www.eureka8761.com:8761/eureka/apps/SERVICE‐NAME/INSTANCE‐NAM E/ status?value=UP

Eureka 服务注册与发现原理剖析相关推荐

  1. 详解Eureka服务注册与发现和Ribbon负载均衡【纯理论实战】

    Eureka服务注册与发现 Eureka简介 在介绍Eureka前,先说一下CAP原则 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability ...

  2. SpringCloud[01]Eureka服务注册与发现

    文章目录 Eureka服务注册与发现 1. Eureka基础知识 1. 什么是服务治理 2. 什么是服务注册与发现 3. Eureka包含两个组件:**Eureka Server** 和 **Eure ...

  3. 跟着狂神学SpringCloud(Rest环境搭建+Eureka服务注册与发现+ribbon+Feign负载均衡+Hystrix+服务熔断+Zuul路由网关+SpringCloud config分布)

    跟着狂神学SpringCloud SpringCloud 回顾之前的知识- JavaSE 数据库 前端 Servlet Http Mybatis Spring SpringMVC SpringBoot ...

  4. 【夯实Spring Cloud】Spring Cloud中的Eureka服务注册与发现详解

    本文属于[夯实Spring Cloud]系列文章,该系列旨在用通俗易懂的语言,带大家了解和学习Spring Cloud技术,希望能给读者带来一些干货.系列目录如下: [夯实Spring Cloud]D ...

  5. 二、Eureka服务注册与发现

    SpringCloud系列目录: 一.SpringCloud简介 二.Eureka服务注册与发现 三.Eureka注册与发现之Eureka Comsumer 四.Eureka.Server Provi ...

  6. springcloud Eureka服务注册和发现

    一,Eureka基本介绍: Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper). Eureka 采用了 C-S 的设计架构 ...

  7. Eureka服务注册与发现:什么是服务注册与发现,Server注册中心

    Eureka服务注册与发现 一套微服务架构的系统由很多单一职责的服务单元组成,而每个服务单元又有众多运行实例.例如,世界上最大的收费视频网站Netflix的系统是由600多个服务单元构成的,运行实例的 ...

  8. eureka 客户端服务启动了又失败了_Spring cloud Eureka服务注册与发现详解

    一.Eureka概述 (1)Eureka是什么 Eureka是一个用于服务注册与发现的框架,本身是一个基于Rest的服务. (2)Eureka的组件有哪些? Eureka的组件可分为Eureka Se ...

  9. SpringCloud与微服务Ⅴ --- Eureka服务注册与发现

    一.Eureka是什么 Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务架构 ...

最新文章

  1. 错把一加当苹果,美国海关侵权大案糗大了:被网友无情嘲讽
  2. 正确使用索引(sql优化),limit分页优化,执行计划,慢日志查询
  3. 大众EA211djs和css的区别,宣传上却说捷达VS5用的发动机是EA211,但这款车的参数配置栏发动机型号写的却是DJS,谁能为我解惑吗?(只有斯柯达的柯米克的发动机型号写得才是EA211)...
  4. strcpy会覆盖原来的吗_幽默你真的会了吗?原来可以这么简单
  5. 使用百度云服务器BCC搭建网站,过程记录
  6. Angular ctorParameters,decorator等元数据,包含在ActivatedRouteSnapshot数据结构里
  7. 使用JDK 11在Java字符串上的新方法
  8. python非贪婪匹配_Python中关于正则表达式非贪婪以及多行匹配功能详解
  9. 组件用.vue还是.js_如何使用Vue.js 2.0构建灵活的图像上传器组件
  10. wcdma系统随机接入过程的流程图_WCDMA终端的随机接入过程的射频测试
  11. 英国Just Eat自动驾驶机器人的外卖系统上线
  12. 由A* = A^T推导问题
  13. 服务器放在机柜_服务器网络机柜的保养维护
  14. excel只计算隐藏不计算机,excel计算公式求和_excel中如何让隐藏数据不参与求和计算?_excel表格数据求和...
  15. 网站接口被恶意攻击怎么办
  16. AtCoder Beginner Contest 233(A~D)题解
  17. 在word中如何制作问卷调查?原来是使用word控件技巧!
  18. 建立一个电脑网络至少需要两台计算机,两台电脑见建立一个局域网方法介绍
  19. android ntfs驱动_如何在Android上读写外部NTFS外部硬盘驱动器和笔式驱动器
  20. Nested weights are bad for performance警告

热门文章

  1. Lucene 的原理
  2. 一级计算机基础演示文稿,计算机一级计算机基础及MSOffice应用辅导:在演示文稿中增加和删除幻灯片...
  3. Stanford CoreNLP Stanza使用手册
  4. html js 扇形统计图_Html5饼图绘制实现统计图的方法
  5. Pdf转doc的感受
  6. FPGA - Zynq - 加载 - FSBL源码解析1
  7. 被上司坑,怕不怕? 往死里整那种
  8. 详解网络基础知识:IP地址、子网掩码、网关
  9. Java后端如何保证用户注册登录接口的安全性之用户注册篇
  10. HDU 3999 BST基础