04_服务注册Eureka
一、服务注册Eureka基础
1. 微服务的注册中心
注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中, 服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。
1.1 注册中心的主要作用
服务注册中心(下称注册中心)是微服务架构非常重要的一个组件,在微服务架构里主要起到了协调者 的一个作用。注册中心一般包含如下几个功能:
(1)服务发现:
服务注册/反注册:保存服务提供者和服务调用者的信息
服务订阅/取消订阅:服务调用者订阅服务提供者的信息,最好有实时推送的功能 服务路由(选):具有筛选整合服务提供者的能力。
(2)服务配置:
配置订阅:服务提供者和服务调用者订阅微服务相关的配置
配置下发:主动将配置推送给服务提供者和服务调用者
(3)服务健康检测
检测服务提供者的健康情况
1.2 常见的注册中心
(1)Zookeeper
zookeeper它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应 用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项 的管理等。简单来说zookeeper=文件系统+监听通知机制。
(2)Eureka
Eureka是在Java语言上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflix中的重要组件。
(3)Consul
Consul是由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件, 采用Raft算法保证服务的一致性,且支持健康检查。
(4)Nacos
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是 注册中心 + 配置中心的组合,提供简单易用的特性集,帮助我们解决微服务开发必会涉及到的服务注册 与发现,服务配置,服务管理等问题。Nacos 还是 Spring Cloud Alibaba 组件之一,负责服务注册与 发现。
最后我们通过一张表格大致了解Eureka、Consul、Zookeeper的异同点。选择什么类型的服务注册与发现组件可以根据自身项目要求决定。
组件名 |
语言 |
CAP |
一致性算法 |
服务健康检查 |
对外暴露接口 |
Eureka |
Java |
AP |
无 |
可配支持 |
HTTP |
Consul |
Go |
CP |
Raft |
支持 |
HTTP/DNS |
Zookeeper |
Java |
CP |
Paxos |
支持 |
客户端 |
Nacos |
Java |
AP |
Raft |
支持 |
HTTP |
2. Eureka的概述
2.1 Eureka的基础知识
Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中, 实现SpringCloud的服务发现功能。
上图简要描述了Eureka的基本架构,由3个角色组成:
(1)Eureka Server
提供服务注册和发现
(2)Service Provider
服务提供方 将自身服务注册到Eureka,从而使服务消费方能够到
(3)Service Consumer
服务消费方 从Eureka获取注册服务列表,从而能够消费务
2.2 Eureka的交互流程与原理
图是来自Eureka官方的架构图,大致描述了Eureka集群的工作过程。图中包含的组件非常多,可能比 较难以理解,我们用通俗易懂的语言解释一下:
- Application Service 相当于本书中的服务提供者,
- Application Client相当于服务消费者;
- Make Remote Call,可以简单理解为调用RESTful API;
- us-east-1c、us-east-1d等都是zone,它们都属于us-east-1这个region;
由图可知,Eureka包含两个组件:Eureka Server 和 Eureka Client,它们的作用如下:
- Eureka Client是一个Java客户端,用于简化与Eureka Server的交互;
- Eureka Server提供服务发现的能力,各个微服务启动时,会通过Eureka Client向Eureka Server 进行注册自己的信息(例如网络信息),Eureka Server会存储该服务的信息;
- 微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如 果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服 务节点(默认90秒);
- 每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的方式完成服务注 册表的同步;
- Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费 者依然可以使用缓存中的信息找到服务提供者。
- 综上,Eureka通过心跳检测、健康检查和客户端缓存等机制,提高了系统的灵活性、可伸缩性和可用 性。
3. 搭建Eureka注册中心
3.1 搭建Eureka服务中心
(1)创建shop_eureka_server子模块
在 shop_parent 下创建子模块 shop_eureka_server
(2)引入maven坐标
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
(3)配置application.yml
registerWithEureka:是否将自己注册到Eureka服务中,本身就是所有无需注册
fetchRegistry:是否从Eureka中获取注册信息
serviceUrl Eureka:客户端与Eureka服务端进行交互的地址
server:port: 9005servlet:context-path: /005-shop-eureka-servereureka:instance:hostname: localhostclient:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://localhost:9006/006-shop-eureka-server/eureka/server:enable-self-preservation: false
(4)配置启动类
在 com.suke.eureka下创建启动类 EurekaServerApplication
@SpringBootApplication
@EnableEurekaServer//激活Eureka Server端配置
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
3.2 服务注册中心管理后台
打开浏览器访问http://localhost:9005/005-shop-eureka-server/即可进入EurekaServer内置的管理控制台,显示效果如下
4. 服务注册到Eureka注册中心
4.1 商品服务注册
(1) 商品模块中引入坐标
在 shop_service_product 的pom文件中添加eureka client的相关坐标
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
(2) 配置application.yml文件
在工程的 application.yml 中添加Eureka Server的主机地址
server:port: 9003servlet:context-path: /003-shop-service-producteureka:client:service-url:defaultZone: http://localhost:9005/005-shop-eureka-server/eureka/,http://localhost:9006/006-shop-eureka-server/eureka/spring:application:name: shop-service-product
(3) 修改启动类添加服务注册注解
@SpringBootApplication
//@EnableDiscoveryClient
//@EnableEurekaClient
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}
}
从Spring Cloud Edgware版本开始, @EnableDiscoveryClient 或 @EnableEurekaClient 可 省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。
4.2 订单服务注册
和商品微服务一样,只需要引入坐标依赖,在工程的 application.yml 中添加Eureka Server的主机地址即可。
4.3 用户服务注册
和商品微服务一样,只需要引入坐标依赖,在工程的 application.yml 中添加Eureka Server的主机地址 即可。
4.4 Eureka中的自我保护
微服务第一次注册成功之后,每30秒会发送一次心跳将服务的实例信息注册到注册中心。通知Eureka Server 该实例仍然存在。如果超过90秒没有发送更新,则服务器将从注册信息中将此服务移除。
Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会 将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server 之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)
验证完自我保护机制开启后,并不会马上呈现到web上,而是默认需等待 5 分钟(可以通过eureka.server.wait-time-in-ms-when-sync-empty 配置),即 5 分钟后你会看到下面的提示信息:
如果关闭自我保护
通过设置 eureka.enableSelfPreservation=false 来关闭自我保护功能。
4.5 Eureka中的元数据
Eureka的元数据有两种:标准元数据和自定义元数据。
- 标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注 册表中,用于服务之间的调用。
- 自定义元数据:可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存储格式。这 些元数据可以在远程客户端中访问。
在程序中可以使用DiscoveryClient 获取指定微服务的所有元数据信息
//配置RestTemplate交给spring管理@LoadBalanced//基于Ribbon的服务调用与负载均衡@Beanpublic RestTemplate getRestTemplate() {return new RestTemplate();}
二、服务注册Eureka高级
1. Eureka Server 高可用集群
在上一个章节,实现了单节点的Eureka Server的服务注册与服务发现功能。Eureka Client会定时连接 Eureka Server,获取注册表中的信息并缓存到本地。微服务在消费远程API时总是使用本地缓存中的数 据。因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用。但如果Eureka Server宕机时,某些微服务也出现了不可用的情况,Eureka Server中的缓存若不被刷新,就可能会影 响到微服务的调用,甚至影响到整个应用系统的高可用。因此,在生成环境中,通常会部署一个高可用 的Eureka Server集群。
Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增 量地同步信息,从而确保所有节点数据一致。事实上,节点之间相互注册是Eureka Server的默认行为。
1.1 搭建 Eureka Server高可用集群
(1)修改本机host属性
由于是在个人计算机中进行测试很难模拟多主机的情况,Eureka配置server集群时需要执行host地址。 所以需要修改个人电脑中host地址
127.0.0.1 eureka1
127.0.0.1 eureka2
(2)修改 shop_eureka_server 工程中的yml配置文件,添加如下配置属性
server:port: 9005servlet:context-path: /005-shop-eureka-servereureka:instance:hostname: localhostclient:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://localhost:9006/006-shop-eureka-server/eureka/server:enable-self-preservation: false
在配置文件中通过连字符(---)将文件分为三个部分,第一部分为应用名称,第二部分和第三部 分是根据不同的profiles选项动态添加,可以在IDEA启动时进行激活配置
使用IDEA启动历次EurekaServerApplicaion分别激活eureka1和eureka2配置。访问http://eureka1:87 61和http://eureka1:8762/。会发现注册中心 SHOP-EUREKA-SERVER 已经有两个节点,并且registered-replicas (相邻集群复制节点)中已经包含对方。
1.2 服务注册到Eureka Server集群
如果需要将微服务注册到Eureka Server集群只需要修改yml配置文件即可
2. Eureka中的常见问题
2.1 服务注册慢
默认情况下,服务注册到Eureka Server的过程较慢。SpringCloud官方文档中给出了详细的原因
大致含义:服务的注册涉及到心跳,默认心跳间隔为30s。在实例、服务器、客户端都在本地缓存中具 有相同的元数据之前,服务不可用于客户端发现(所以可能需要3次心跳)。可以通过配置 eureka.instance.leaseRenewalIntervalInSeconds (心跳频率)加快客户端连接到其他服务的过程。在生产中,最好坚持使用默认值,因为在服务器内部有一些计算,他们对续约做出假设。
2.2 服务节点剔除问题
默认情况下,由于Eureka Server剔除失效服务间隔时间为90s且存在自我保护的机制。所以不能有效而 迅速的剔除失效节点,这对开发或测试会造成困扰。解决方案如下:
Eureka Server: 配置关闭自我保护,设置剔除无效节点的时间间隔
eureka: instance:hostname: eureka1client: service-rl:defaultZone: http://eureka2:8762/eurekaserver:enable-self-preservation: false #关闭自我保护eviction-interval-timer-in-ms: 4000 #剔除时间间隔,单位:毫秒
Eureka Client:配置开启健康检查,并设置续约时间
eureka: client:healthcheck: true #开启健康检查(依赖spring-boot-actuator)serviceUrl:defaultZone: http://eureka1:8761/eureka/,http://eureka1:8761/eureka/instance: preferIpAddress: truelease-expiration-duration-in-seconds: 10 #eureka client发送心跳给server端后,
续约到期时间(默认90秒)lease-renewal-interval-in-seconds: 5 #发送心跳续约间隔
2.3 监控页面显示ip
在Eureka Server的管控台中,显示的服务实例名称默认情况下是微服务定义的名称和端口。为了更好 的对所有服务进行定位,微服务注册到Eureka Server的时候可以手动配置示例ID。配置方式如下
eureka: instance:instance-id: ${spring.cloud.client.ip-address}:${server.port}#spring.cloud.client.ip-address:获取ip地址
04_服务注册Eureka相关推荐
- Spring Cloud【Finchley】-02服务发现与服务注册Eureka + Eureka Server的搭建
文章目录 服务发现组件概述 Eureka概述 Eureka原理 Maven父子工程的搭建 Eureka Server的搭建 新建 Maven Module 添加spring-cloud-starter ...
- 服务注册eureka上显示ip地址出现的问题
服务注册到eureka上面默认是主机名+ip地址,这时候再另外一台服务器上调用这个服务是调用不到的,注册上的服务名称如下: 鼠标移到这服务名称上去左下角如下: 这样不同服务器之间是访问不到的. 具体解 ...
- Spring Cloud【Finchley】-13 Eureka Server HA高可用 2个/3个节点的搭建及服务注册调用
文章目录 导读 官方文档 Eureka Server高可用集群概述 2个Eureka Server节点高可用集群搭建步骤 Step1. 新建子模块 microservice-discovery-eur ...
- Spring Cloud【Finchley】-03将微服务注册到Eureka Server上 + 为Eureka Server添加用户认证
文章目录 概述 将用户微服务micorservice-provider-user注册到Eureka Server上 pom中增加 spring-cloud-starter-netflix-eureka ...
- SpringCloud(五)Eureka服务注册与发现
Eureka基础知识 什么是服务治理 SpringCloud 封装了 NetFlix公司开发的Eureka模块来实现服务治理 在传统的rpc远程调用框架中, 管理每个服务与服务之间依赖关系比较 ...
- 【SpringCloud系列】服务注册与发现 - Eureka Server源码分析(2)
3.6.Eureka Server 源码分析 上一篇文章简单介绍了 Eureka 的一些概念,今天咱们来看看其原理和源码,首先先看 Eureka Server 的原理. 3.6.1.Eureka Se ...
- 服务注册与发现(上)
服务注册与发现 服务注册 服务注册是指服务提供者向注册中心注册服务实例,主要将其服务信息如服务名称.IP 地址.端口等注册到注册中心. 服务发现 服务发现是指服务消费者需要调用其他服务时,注册中心将服 ...
- Eureka服务注册中心
Eureka服务注册中心 最近在研究Spring Cloud,发现其中的组件实在是太多了,真的是头大,只能一块一块看,像盲人摸象一样.要想很短时间内掌握Spring Cloud是不可能的,小编就学习一 ...
- Spring Cloud第一篇:服务注册与发现Eureka
一.spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运 ...
最新文章
- java中jtextfield_java中的JTextField
- openFeign 服务接口的调用01——概述
- 用神经网络分类随机数与无理数
- 电脑延迟关机命令Shutdown详解
- java获取音频_java获取音频文件播放时长
- 堆与优先队列课内模板
- 常用MySQL数据库命令总结
- Win11推送如何操作 Windows11推送的详细步骤方法
- 国际音标的HTML实体对照表
- Sipdroid项目的编译运行
- Improving Opencv9 Eroding and Dilating 和对opencv窗体上有控制按钮的理解
- 《MacTalk 跨越边界》一一1.2 人生如摆摊
- 硬件设计之一——电源设计05:过电流能力
- 玩转肺癌目标检测数据集Lung-PET-CT-Dx ——④转换成PASCAL VOC格式数据集
- 酷派大神F1 联通版救砖线刷.docx
- 神经网络量化----吐血总结
- 李开复微博数据分析--微博爬虫、数据挖掘、数据可视化(持续更新)
- PS练习6——文字特效处理
- FAQ | 为大屏幕设备构建应用的常见问题解答
- 软件体验测试方案,互联网项目用户体验测试报告模板