Eureka服务注册与发现

一套微服务架构的系统由很多单一职责的服务单元组成,而每个服务单元又有众多运行实例。例如,世界上最大的收费视频网站Netflix的系统是由600多个服务单元构成的,运行实例的数量就更加庞大了。由于各服务单元颗粒度较小、数量众多,相互之间呈现网状依赖关系,因此需要服务注册中心来统一管理微服务实例,维护各服务实例的健康状态。

什么是服务注册与发现

从宏观角度,微服务架构下的系统角色可以简单分为注册中心、服务提供者、远程客户端组件。

什么是服务注册呢?服务注册是指服务提供者将自己的服务信息(如服务名、IP地址等)告知服务注册中心。

什么是服务发现呢?注册中心客户端组件从注册中心查询所有服务提供者信息,当其他服务下线后,注册中心能够告知注册中心客户端组件这种变化。

远程客户端组件与服务提供者之间一般使用某种RPC通信机制来进行服务消费,常见的RPC通信方式为REST API,底层为HTTP传输协议。

服务提供者通常以Web服务的方式提供REST API接口;远程客户端组件则通常以模块组件的方式完成REST API的远程调用。

注册中心、服务提供者、远程客户端组件之间的关系大致如图2-1所示。

图2-1 注册中心、服务提供者、远程客户端组件之间的关系

注册中心的主要功能如下:(1)服务注册表维护:此功能是注册中心的核心,用来记录各个服务提供者实例的状态信息。注册中心提供Provider实例清单的查询和管理API,用于查询可用的Provider实例列表,管理Provider实例的上线和下线。

(2)服务健康检查:注册中心使用一定机制定时检测已注册的Provider实例,如发现某实例长时间无法访问,就会从服务注册表中移除该实例。

服务提供者的主要功能如下:

(1)服务注册:是指Provider微服务实例在启动时(或者定期)将自己的信息注册到注册中心的过程。

(2)心跳续约:Provider实例会定时向注册中心提供“心跳”,以表明自己还处于可用的状态。当一个Provider实例停止心跳一段时间后,注册中心会认为该服务实例不可用了,就会将该服务实例从服务注册表中剔除。如果被剔除掉的Provider实例过了一段时间后又继续向注册中心提供心跳,那么注册中心会把该Provider实例重新加入服务注册表中。

(3)健康状况查询:Provider实例能提供健康状况查看的API,注册中心或者其他的微服务Provider能够获取其健康状况。

服务提供者的服务注册和心跳续约一般都会通过注册中心客户端组件来完成。注册中心客户端组件还有如下功能:

(1)服务发现:从注册中心查询可用Provider实例清单。

(2)实例缓存:将从注册中心查询的Provider实例清单缓存到本地,不需要在每次使用时都去注册中心临时获取。总体来说,注册中心、服务提供者需要作为独立应用进行部署和运行,而注册中心客户端组件、远程客户端组件则不同,它们一般会作为一个模块组件被服务提供者所使用。

Spring Cloud生态体系中存在多种注册中心框架,例如Eureka、Nacos、Consul、ZooKeeper等。本文将以Eureka为例讲解注册中心的使用。

Eureka Server注册中心

Eureka本身是Netflix开源的一款注册中心产品,并且Spring Cloud提供了相应的集成封装。选择Eureka作为注册中心实例来讲解是出于以下原因:

(1)Eureka在业界的应用十分广泛(尤其是国外),整个框架经受住了Netflix严酷生产环境的考验。

(2)除了Eureka注册中心外,Netflix的其他服务治理功能也十分强大,包括Ribbon、Hystrix、Feign、Zuul等组件结合到一起组成了一套完整的服务治理框架,使服务的调用、路由变得异常容易。

那么,Netflix和Spring Cloud是什么关系呢?

Netflix是一家互联网流媒体播放商,是美国视频巨头,访问量非常大。

正因如此,Netflix把整体的系统迁移到了微服务架构,并且几乎把它的整个微服务治理生态中的组件都开源贡献给了Java社区,并命名为Netflix OSS。

Spring Cloud是Spring背后的Pivotal公司(由EMC和VMware联合成立的公司)在2015年推出的开源产品,主要是对Netflix开源组件的进一步封装,方便Spring开发人员构建微服务架构的应用。

Spring Cloud Eureka是Spring Cloud Netflix微服务套件的一部分,基于Netflix Eureka做了二次封装,主要负责完成微服务实例的自动注册与发现,这也是微服务架构中的核心和基础功能。

Eureka所治理的每一个微服务实例被称为Provider Instance(提供者实例)。每一个Provider Instance包含一个Eureka Client组件(相当于注册中心客户端组件),它的主要工作如下:

(1)向Eureka Server完成Provider Instance的注册、续约和下线等操作,主要的注册信息包括服务名、机器IP、端口号、域名等。

(2)向Eureka Server获取Provider Instance清单,并且缓存在本地。一般来说,Eureka Server作为服务治理应用会独立地部署和运行。在新建一个Eureka Server注册中心应用时,首先需要在pom.xml文件中添加eureka-server依赖库。

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

然后需要在启动类中添加@EnableEurekaServer注解,声明这个应用是一个Eureka Server。启动类的代码如下:

package com.crazymaker.springcloud.cloud.center.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
//在启动类中添加@EnableEurekaServer注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

接下来,在应用的配置文件application.yml中对Eureka Server的一些参数进行配置。一份基础的配置文件大致如下:

server:

 port: 7777
spring:application:name: eureka-server
eureka:client:register-with-eureka: falsefetch-registry: falseservice-url:#服务注册中心的配置内容,指定服务注册中心的位置defaultZone:http://localhost: 7777/eureka/instance:
hostname: ${EUREKA_ZONE_HOST:localhost}server:enable-self-preservation: true #开启自我保护

eviction-interval-timer-in-ms: 60000 #扫描失效服务的间隔时间(单位毫秒,默认是60×1000毫秒,即60秒)以上配置文件中包含3类配置项:作为注册中心的配置项(eureka.server.*)、作为服务提供者的配置项(eureka.instance.*)、作为注册中心客户端组件的配置项(eureka.client.*)。它们的具体含义稍后介绍。

配置完成后,运行启动类EurekaServerApplication就可以启动EurekaServer,然后通过浏览器访问Eureka Server的控制台界面(其端口为server.port配置项的值),如图2-2所示。

图2-2 Eureka Server的控制台界面

实际上一个Eureka Server实例身兼三个角色:注册中心、服务提供者、注册中心客户端组件。主要原因如下:

(1)对于所有Provider Instance而言,Eureka Server的角色是注册中心。

(2)对于Eureka Server集群中其他的Eureka Server而言,EurekaServer的角色是注册中心客户端组件。

(3)Eureka Server对外提供REST接口的服务,当然也是服务提供者。

1.Eureka Server作为注册中心的配置项

Eureka Server作为注册中心的配置项以eureka.server.*作为前缀,大致如下:

(1)
eureka.server.enable-self-preservation:此配置项用于设置是否关闭注册中心的保护机制。什么是保护机制呢?Eureka Server会定时统计15分钟之内心跳成功的Provider实例的比例,如果低于85%就会触发保护机制,处于保护状态的Eureka Server不剔除失效的服务提供者。enable-selfpreservation的默认值为true表示开启自我保护机制。如果15分钟之内心跳成功的Provider实例的比例高于85%,那么Eureka Server仍然会处于正常状态。

(2)
eureka.server.eviction-interval-timer-in-ms:配置EurekaServer清理无效节点的时间间隔,默认为60 000毫秒(60秒)。但是,如果Eureka Server处于保护状态,此配置就无效。

2.Eureka Server作为服务提供者的配置项

Eureka Server自身是一种特殊的服务提供者,对外提供REST服务,所以需要配置一些Provider实例专属的配置项,这些配置项以eureka.instance.*作为前缀,大致如下:

(1)eureka.instance.hostname:设置当前实例的主机名称。

(2)eureka.instance.appname:设置当前实例的服务名称。默认值取自spring.application.name配置项的值,如果该选项没有值,eureka.instance.appname的值就为unknown。在Eureka服务器上,服务提供者的名称不区分字母大小写。

(3)
eureka.instance.ip-address:设置当前实例的IP地址。

(4)
eureka.instance.prefer-ip-address:如果配置为true,就使用IP地址的形式来定义Provider实例的访问地址,而不是使用主机名来定义Provider实例的地址。如果同时设置了eureka.instance.ip-address选项,就使用该选项所配置的IP,否则自动获取网卡的IP地址作为Provider实例的访问地址。默认情况下,此配置项的值为false,即使用主机名来定义Provider实例的访问地址。

(5)
eureka.instance.lease-renewal-interval-in-seconds:定义Provider实例到注册中心续约(心跳)的时间间隔,单位为秒,默认值为30秒。

(6)
eureka.instance.lease-expiration-duration-in-seconds:定义Provider实例失效的时间,单位为秒,默认值为90秒。

(7)
eureka.instance.status-page-url-path:定义Provider实例状态页面的URL,此选项配置的是相对路径,默认使用HTTP访问,如果需要使用HTTPS,就使用绝对路径配置。默认的相对路径为/info。

(8)
eureka.instance.status-page-url:定义Provider实例状态页面的URL,此选项配置的是绝对路径。

(9)
eureka.instance.health-check-url-path:定义Provider实例健康检查页面的URL,此选项配置的是相对路径,默认使用HTTP访问,如果需要使用HTTPS,就使用绝对路径配置。默认的相对路径为/health。

(10)
eureka.instance.health-check-url:定义Provider实例健康检查页面的URL,此选项配置的是绝对路径。

3.Eureka Server作为注册中心客户端组件的配置项

如果集群中配置了多个Eureka Server,那么节点和节点之间是对等的,在角色上一个Eureka Server同时也是其他Eureka Server实例的客户端,它的注册中心客户端组件角色的相关配置项以eureka.client.*作为前缀,大致如下:

(1)
eureka.client.register-with-eureka:作为Eureka Client,eureka.client.register-with-eureka表示是否将自己注册到其他的EurekaServer上,默认为true。因为当前集群只有一个Eureka Server,所以需要设置成false。

(2)
eureka.client.fetch-registry:作为Eureka Client,是否从Eureka Server获取注册信息,默认为true。因为本例是一个单点的EurekaServer,不需要同步其他Eureka Server节点数据,所以设置为false。

(3)
eureka.client.registery-fetch-interval-seconds:作为EurekaClient,从Eureka Server获取注册信息的间隔时间,单位为秒,默认为30秒。

(4)
eureka.client.eureka-server-connect-timeout-seconds:EurekaClient组件连接到Eureka Server的超时时间,单位为秒,默认值为5。

(5)
eureka.client.eureka-server-read-timeout-seconds:EurekaClient组件读取Eureka Server信息的超时时间,单位为秒,默认值为8。

(6)
eureka.client.eureka-connection-idle-timeout-seconds:Eureka Client组件到Eureka Server连接的空闲超时的时间,单位为秒,默认值为30。

(7)
eureka.client.filter-only-up-instances:从Eureka Server获取Provider实例清单时是否进行过滤,只保留UP状态的实例,默认值为true。

(8)
eureka.client.service-url.defaultZone:作为Eureka Client,需要向远程的Eureka Server自我注册,发现其他的Provider实例。此配置项用于设置Eureka Server的交互地址,在具有注册中心集群的情况下,多个Eureka Server的交互地址之间可以使用英文逗号分隔开。

此配置项涉及Spring Cloud中的Region(地域)与Zone(可用区)两个概念,两者都是借鉴AWS(Amazon云)的概念。在非AWS环境下,Region和Zone可以理解为服务器的位置,Region可以理解为服务器所在的地域,Zone可以理解为服务器所处的机房。一个Region可以包含多个Zone。不同的Region的距离很远,一个Region的不同Zone间的距离往往较近,也可能在同一个物理机房内。

在网络环境跨地域、跨机房的情况下,Region与Zone都可以在配置文件中进行配置。配置Region与Zone的主要目的是,在网络环境复杂的情况下帮助客户端就近访问需要的Provider实例。负载均衡组件Spring Cloud Ribbon的默认策略是优先访问与客户端处于同一个Zone中的服务端实例,只有当同一个Zone中没有可用服务端实例时,才会访问其他Zone中的实例。

如果网络环境不复杂,比如所有服务器都在同一个地域同一个机房,就不需要配置Region与Zone。如果不配置Region选项值,那么它的默认值就为useast-1;如果不配置Zone的Key值,那么它的默认Key值就为defaultZone。可以通过
eureka.client.serviceUrl.defaultZone选项设置默认Zone的注册中心Eureka Server的访问地址。

Spring Cloud的注册中心地址是以Zone为单位进行配置的,一个Zone如果有多个注册中心,则要使用逗号分隔开。如果有多个机房,就配置多个
eureka.client.serviceUrl.ZoneName配置项。举个例子,假设在北京区域有两个机房,每一个机房有一个注册中心Eureka Server,那么Eureka Server配置文件中有关Zone和注册中心的配置大致如下:

eureka:client:region: Beijing #指定Region为北京availabilityZones:Beijing:zone-2,zone-1 #指定北京的机房为zone-2、zone-1serviceUrl:#zone-1机房的Eureka Serverzone-1: http://localhost:7777/eureka/#zone-2 机房的Eureka Server
zone-2: http://localhost: 7778/eureka/

在配置注册中心地址时,如果Eureka Server加入了安全验证,那么注册中心的URL格式为:

http://<username>:<password>@localhost:8761/eureka

其中,<username>为安全校验的用户名,<password>为该用户的密码。

(9)eureka.client.serviceUrl.*:此配置项是上面第(8)项的上一级配置项,用于在多个Zone的场景下配置注册中心,它的类型为HashMap,Key为Zone,Value为机房中的所有注册中心地址。如果没有多个Zone,那么此配置项有一个默认的可用区,Key为defaultZone。

本文给大家讲解的内容是Eureka服务注册与发现:什么是服务注册与发现,Server注册中心

  1. 下篇文章给大家讲解的是Eureka服务注册与发现:服务提供者的创建和配置,服务提供者的续约(心跳);
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!!

Eureka服务注册与发现:什么是服务注册与发现,Server注册中心相关推荐

  1. sql服务器注册表被禁用,被删除了的sql server注册表可以恢復吗

    SQL Server名称或IP地址拼写有误:服务器端网络配置有误以及客户端网络配置有误等错误配置均会造成上述故障的发生.其中使用SQL Server自带的"服务器网络实用工具"来解 ...

  2. 《深入理解 Spring Cloud 与微服务构建》第六章 服务注册和发现 Eureka

    <深入理解 Spring Cloud 与微服务构建>第六章 服务注册和发现 Eureka 文章目录 <深入理解 Spring Cloud 与微服务构建>第六章 服务注册和发现 ...

  3. gradle 指定springcloud 版本_SpringCloud微服务架构开发实战:实现服务注册与发现

    实现服务的注册与发现 在前面分别用Eureka Server和Eureka Client来搭建了一台注册服务器,以及多个Eureka Client客户端.Eureka Client在启动后,就会将自己 ...

  4. eureka 之前的服务如何关闭_干货分享 | 服务注册中心Spring Cloud Eureka部分源码分析...

    友情提示:全文13000多文字,预计阅读时间10-15分钟 Spring Cloud Eureka作为常用的服务注册中心,我们有必要去了解其内在实现机制,这样出现问题的时候我们可以快速去定位问题.当我 ...

  5. 引入springcloud报错。common依赖找不到_微服务架构:spring cloud之服务注册和服务发现...

    SpringCloud主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路有(Zuul),客户端负载均衡(Ribbon),Archaius,Turbine,Eureka为微服 ...

  6. 【华为云专家原创】 服务注册与发现如何满足服务治理?

    摘要:本文主要介绍了服务注册与发现的原理,以及常用的几种服务注册与发现组件介绍对比. 在单体应用向微服务架构演进的过程中,原本的巨石型应用会按照业务需求被拆分成多个微服务,每个服务提供特定的功能,并可 ...

  7. 微服务架构的优缺点_微服务架构DNS服务注册与发现实现原理

    微服务架构已经成为中小型企业必备的项目支撑能力,尤其互联网BATJ企业在04年已经非常成熟,在大规模的核心业务实战中总结了很多大规模服务调度与大数据集的处理方案.微服务架构中涉及到很多模块,本文以微服 ...

  8. SpringCloud微服务-服务注册发现-负载均衡-服务调用-服务降级-服务网关-配置中心-消息总线-消息驱动-链路追踪-alibaba-nacos-sentinel-seata理论原理分析

    SpringCloud理论技术 概述 ​ Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总 ...

  9. Netflix Eureka 简介、架构原理、及服务发现

    目录 Netflix Eureka 简介 spring-cloud-netflix 简介 Eureka 原理 服务发现 客户端发现模式 服务端发现模式 服务注册表 自注册方式 第三方注册模式 总结 N ...

最新文章

  1. redis 队列_Redis系列5实现简单消息队列
  2. extjs_04_grid(弹出窗口amp;行编辑器 CRUD数据)
  3. jsp mysql模板_jsp的分页查询的代码(mysql数据库)
  4. python 内存管理
  5. struts2_struts2线程安全吗?
  6. datagrid编辑单元格中的内容
  7. 网络PXE启动WinPE,支持UEFI和LEGACY引导
  8. ORACLE数据库空间满了如何进行空间扩展
  9. delphi网络时间校对
  10. RSA加解密的OAEP MGF1 填充解析
  11. wordpress html5视频播放插件,WordPress插件DPlayer支持m3u8视频HTML5播放
  12. 矩阵键盘_按键检测_按键次数检测
  13. 我对价值投资的思考(二)
  14. 2019年,实现 React 动画的 5 种最常用方式
  15. 【机器人基础】阻抗/导纳控制深度解析
  16. Tandem Repeats Finder:串联重复序列查找工具
  17. matlab----多项式、函数
  18. 利用bat批处理做启动mongodb脚本
  19. python爬虫教程-Python网络爬虫实例教程(视频讲解版)
  20. Unity 开关门脚本

热门文章

  1. 在NUC972上利用pjsip实现VOIP网关
  2. 【弗洛伊得算法的改良(可以求出具体的路径)】
  3. 请勿滥用 2PC, 忘记提交prepared transaction对PostgreSQL造成的危害.
  4. 手机上的虚拟机-VMOS,Lsp必备
  5. 6-1 设计Shape基类及Circle, Rectangle继承类(高教社,《Python编程基础及应用》习题9-7)分数 20
  6. Java十六进制码的字符_【重点】java中 转16进制字符串 hex
  7. 【JAVA】【刷题子】732. 我的日程安排表
  8. Matlab学习-数据转换、数据格式处理
  9. redis server服务端启动流程分析(一)
  10. 前端面试知识点--5