day04-SpringCloud Eureka-服务注册与发现01
SpringCloud Eureka-服务注册与发现01
1.Eureka介绍
1.1学习Eureka前的说明
目前主流的服务注册&发现的组件是 Nacos,但是 Eureka 作为老牌经典的服务注册&发现技术还是有必要学习一下,原因:
(1)一些早期的分布式微服务项目使用的是 Eureka,在工作中完全有可能遇到这种情况。
(2)后期的服务注册&发现组件/技术,都参考了 Eureka 设计和理念,学习了 Eureka 后, 我们上手 Nacos 容易很多,而且可以理解得更深刻。
1.2当前架构问题分析

在企业级项目中,服务消费访问请求会存在高并发现象。如果只有一个会员中心-提供服务,可用性很差——如果该模块宕机,那么整个分布式应用就不能使用了。所以,会员中心提供服务往往是一个集群,有多个会员中心-提供服务模块。
这时又会出现两个问题:
- 因为是分布式架构(不同的服务模块在不同的主机上),服务消费方怎么去发现多个可以使用的提供服务(服务发现问题)?
- 还有,当服务消费方法发现可以使用的多个服务后,怎么从多个服务中选择其中的一个?(服务注册、负载均衡问题——选择策略)
使用Eureka就可以解决上述问题。
1.3引入Eureka项目架构分析

图示是分布式架构,每个模块都在不同的主机上
- 会员中心-提供服务模块,在项目中,会做成集群,提供高可用性(某个提供服务模块宕机,其他服务模块可以继续提供服务)
- Eureka Server 有必要的话,也可以做成集群(同理,防止宕机,提供高可用性)
- Eureka 包含两个组件∶Eureka Server 和 Eureka Client(EurekaClient 在服务消费&服务提供方都要引入)
- Eureka Server 提供注册服务,各个微服务节点(图例的服务消费&服务提供方)通过配置启动后,会在 Eureka Server 中进行注册,这样 EurekaServer 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在 Eureka 提供的界面中直观看到。
- Eureka Client 通过注册中心进行访问,是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(round-robin))负载算法的负载均衡器。在所有 Eurek Client 应用启动后,将会向 Eureka Server 发送心跳(默认周期为 30 秒),目的是告诉 Eureka Server 自己所在的微服务模块可以正常工作 。如果 Eureka Server 在多个心跳周期内(默认 90 秒)没有接收到某个节点的心跳,EurekaServer 将会从服务注册表中把这个服务节点移除。
1.4服务治理介绍
服务治理即服务管理:当项目中有多个服务的时候,怎么去管理这些服务。
Eureka 实现服务治理:
在传统的 rpc (remote procedure call)远程调用框架中,每个服务与服务之间的依赖关系比较复杂,管理也比较困难,所以需要管理服务之间的依赖关系。服务治理实现服务调用、负载均衡、容错等功能,实现服务发现与注册。
1.5服务注册和发现
- Eureka 采用 CS[Client-Server] 设计架构,Eureka Server 作为服务注册功能的服务器,成为服务注册中心。
- 系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server 并维持心跳连接,通过 Eureka Server 来监控系统中各个微服务是否正常运行。
- 当每个服务器启动的时候,会把当前自己服务器的信息,比如服务地址、通讯地址等,以别名方式注册到服务注册中心(Eureka Server)。
- 服务消费者或者服务提供者,以服务别名的方式去注册中心获取实际的服务提供者的通讯地址,然后通过 RPC 调用服务。
2.创建单机版Eureka Server-注册中心
2.1需求说明
演示创建单机版的Eureka Server,集群版的后面再使用。

2.2实现步骤
2.2.1创建Module&完成配置
(1)创建 e-commerce-eureka-server-9001 微服务模块 [作为注册中心]
选中父项目并右键--New--Module--Maven--直接点击next--根据下图配置--Finish

(2)修改本模块的pom.xml,加入依赖
<!--引入相关依赖,版本都使用父项目声明的版本-->
<dependencies>
<!--引入Eureka Server场景启动器,使用版本仲裁-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--web-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--actuator-starter 是 springboot程序的监控系统,可以实现系统的健康监测
可以通过http://localhost:9001/actuator看到相关的连接和信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--test-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--通用模块的jar包-e_commerce_center_common-api-->
<dependency>
<groupId>com.li.springcloud</groupId>
<artifactId>e_commerce_center_common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
(3)创建application.yml,配置服务端口
server:
port: 9001
#配置Eureka-server
eureka:
instance:
hostname: localhost #服务实例名
client: #如果Eureka是一个集群,那么相互两个Eureka之间也可以当做对方为客户端
#配置是否向注册中心注册自己
register-with-eureka: false
#表示自己就是注册中心,作用是维护注册的服务实例,不需要去检索服务
fetch-registry: false
service-url: #设置于 Eureka server 的交互模块,查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
(4)创建主启动类 EurekaApplication.java
package com.li.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author 李
* @version 1.0
*/
@EnableEurekaServer //表示该程序作为EurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
2.2.2完成测试
启动主程序,在浏览器访问设置的ip+端口,已经能够看到Eureka的监控页面:

2.3将其他微服务模块注册到Eureka
2.3.1注册member-service-provider-10000
将member-service-provider-10000作为EurekaClient,注册到注册中心(e-commerce-eureka-server-9001),成为服务提供者

(1)在本模块的pom.xml中引入EurekaClient依赖
<!--引入EurekaClient场景启动器starter-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)修改本模块的application.yml,添加如下配置:
#配置Eureka-Client
eureka:
client:
register-with-eureka: true #将自己注册到EurekaServer
#表示从EurekaServer抓取注册信息
fetch-registry: true
service-url:
#表示将自己注册到哪个EurekaServer
defaultZone: http://localhost:9001/eureka
instance:
# 消费端地址
ip-address: localhost
#以IP地址的方式向eureka进行注册,域名变ip
prefer-ip-address: true
(3)在本模块的主启动类添加注解@EnableEurekaClient,将该程序标识为EurekaClient

(4)完成测试:
先启动EurekaServer(e-commerce-eureka-server-9001),再启动EurekaServer(member-service-provider-10000),然后在浏览器中访问EurekaServer的监控页面,可以看到注册中心已经检测到一个Eureka实例:

2.3.2注册member-service-consumer-80
将member-service-consumer-80也作为EurekaClient注册到注册中心(e-commerce-eureka-server-9001),并且可以拉取注册中心提供的服务信息。

步骤、代码和2.3.1一致:
(1)修改本模块的pom.xml,添加EurekaClient的依赖
(2)在本模块的application.yml中进行EurekaClient的配置
(3)在本模块的主启动类添加注解@EnableEurekaClient,将该程序标识为EurekaClient
(4)先启动EurekaServer,再启动本模块,然后在浏览器中访问EurekaServer的监控页面,可以看到注册中心已经检测到本模块的EurekaClient实例:

如果上面的Status显示的是电脑名、localhost而不是ip地址,解决方案:
2.4Eureka注册中心的维护机制

2.5Eureka自我保护模式
在默认情况下,Eureka会启动自我保护模式(如图红字)

2.5.1自我保护模式是什么
默认情况下,Eureka Client定时向Eureka Server端发送心跳包。如果Eureka Server在一定时间内没有收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90s)
但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与Eureka Server之间无法正常通信,以上的注销行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务的。
Eureka 通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时,Eureka Server 就会进入自我保护模式。开启自我保护模式之后,不会剔除微服务。因为客户端还能发送心跳,可能只是网络延迟问题。
综上,自我保护是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的、不健康的微服务都会保留),也不盲目注销任何健康的微服务。
一句话:开启自我保护模式后,如果某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该服务的信息进行保存。
- 自我保护属于CAP里面的AP分支,即:保证可用性、分区容错性。
CAP原则:分布式系统中,C:一致性;A:可用性;P:分区容错性。CAP理论详解
验证下 Eureka 的自我保护机制:
启动 member-service-provider-10000 和 e-commerce-eureka-server-9001
让 member-service-provider-10000 正确的注册
然后关闭 member-service-provider-10000,观察注册的 member-service-provider-10000 服务是否还在
注意不能通过idea直接关闭,详见:自我保护机制开启了但是服务还是"被删掉了"
2.5.2如何禁用自我保护模式(不推荐)
在生产环境中一般不禁用自我保护模式
在Eureka Server端的配置文件中:
#配置Eureka-server
eureka:
server:
enable-self-preservation: false #禁用自我保护模式
day04-SpringCloud Eureka-服务注册与发现01的更多相关文章
- 将SpringCloud Eureka 服务注册与发现部署到docker
一.前言 最近在学习docker,顺便把之前学习的spring cloud 部署到Docker 中.至于什么是SpringCloud的服务注册与发现,什么是docker,我这里就不作赘述了.可以先去学 ...
- SpringCloud Eureka服务注册及发现——服务端/客户端/消费者搭建
Eureka 是 Netflix 出品的用于实现服务注册和发现的工具. Spring Cloud 集成了 Eureka,并提供了开箱即用的支持.其中, Eureka 又可细分为 Eureka Serv ...
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...
- SpringCloud——Eureka服务注册和发现
一.SpringCloud和Dubbo SpringCloud整合了一套较为完整的微服务解决方案框架,而Dubbo只是解决了微服务的几个方面的问题. content Dubbo SpringCloud ...
- SpringCloud(3)---Eureka服务注册与发现
Eureka服务注册与发现 一.Eureka概述 1.Eureka特点 (1) Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. (2) Eureka 主管服务 ...
- SpringCloud 进阶之Eureka(服务注册和发现)
1. Eureka 服务注册与发现 Eureka 是一个基于REST的服务,用于服务的的注册与发现; Eureka采用C-S的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册 ...
- SpringCloud的入门学习之概念理解、Eureka服务注册与发现入门
1.微服务与微服务架构.微服务概念如下所示: 答:微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题.提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面的一个个微服务 ...
- SpringCloud - 2. 服务注册 和 发现
SpringCloud 的服务注册和发现是由Eureka来完成. 1.eureka server 1.1 依赖 <dependency> <groupId>org.spring ...
- Spring Cloud学习(一):Eureka服务注册与发现
1.Eureka是什么 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的. Eureka ...
- Eureka服务注册与发现
一.服务注册 注册Eureka的服务非常的简单,只需要引入spring-cloud-starter-netflix-eureka-client的jar包即可. <dependency> & ...
随机推荐
- MBR和gpt说明
1.MBR MBR的全称是Master Boot Record(主引导记录),MBR早在1983年IBM PC DOS 2.0中就已经提出.之所以叫"主引导记录",是因为它是存在于 ...
- 面向对象1(Java)
什么是面向对象 面向对象编程(oop) 面向对象编程的本质是:以类的方式组织代码,以对象的组织(封装)数据 抽象 三大特征:封装.继承.多态 从认识论角度考虑是先有对象后有类.对象是具体的事物.类是抽 ...
- JSON详述
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写 使用json函数需要导入json库,import json json.dumps 将p ...
- EF OwnsOne 主键不自增
menu public class Menu { /// <summary> /// id /// </summary> [Key, DatabaseGeneratedAttr ...
- java mysql截取所需数据
mysql截取数据: 例:截取门铺名称,门铺名称长度不确定 {"进店日期":"2022-09-01","电话":"1******* ...
- 3vue
阻止冒泡 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- PyCharm2018 不使用IPython 不成功--一直显示连接控制台
每次关闭PyCharm时,都提示有后台任务在运行,一开始不知道怎么回事. 另外,发现底部的,python 控制台,启动pycharm时总有错误信息. 后来发现底部状态栏,显示1个 进程在运行. 2个地 ...
- 油猴CSDN净化脚本
CSDN版面越来越乱,最近还总是弹出红包雨和顶部巨大横幅,左侧也会随机出现学生认证弹窗.而且版面混乱难看,看起来非常费劲. 另外底下的推荐列表经常夹杂着CSDN文件下载的链接,下载文件又要付费,从来不 ...
- 03 docker容器镜像基础
本章内容 1.docker镜像基础 2.docker环境下使用的文件系统 3.registry(仓库) 4.获取镜像 5.制作(生成)并上传镜像 --------------------------- ...
- 删除Mac版word上方的Mathtype
原因 Mac升级到macOS Catalina v10.15.3发现mathtype用不了, Mathtype官网说目前暂时不支持这个版本的系统. 现在尴尬的是, mathtype删除了, 但一不小心 ...