写点什么

Eureka 基础

作者:李子捌
  • 2021 年 12 月 10 日
  • 本文字数:2049 字

    阅读完需:约 7 分钟

Eureka基础

1、简介

Eureka 在 Spring Cloud Netflix 项目中担任微服务注册中心的角色。Eureka 本身也是一个微服务,它的作用就是让微服务之间能够互相发现。



如上图,服务提供者将自身服务信息注册到 Eureka 上,服务消费者从 Eureka 中获取可用服务实例信息,通过客户端负载均衡器 Ribbon 选择服务发起请求。Eureka 解决了以下几个问题:


  1. 服务消费者`硬编码服务提供者的主机和端口信息

  2. 服务提供者下线后,服务消费者及时感知

2、Eureka 使用

2.1 服务搭建

第一步:引入依赖,我这里选择的 Spring Cloud 版本是 Greenwich.SR1


<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>
<groupId>com.liziba</groupId> <artifactId>spring-cloud-netflix-demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
</project>
复制代码


第二步:在应用的主引导类添加**@EnableEurekaServer 注解**,启动 Eureka Server


/** * <p> *     Eureka Server 服务启动类 * </p> * * @Author: Liziba * @Date: 2021/10/26 23:27 */
@SpringBootApplication@EnableEurekaServerpublic class EurekaServerApplication {
public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); }
}
复制代码


第三步:配置端口信息(由于我本地 8080 提供了其他服务,因此这里修改了端口信息),默认情况不配置端口,Eureka Server 启动后会尝试监听 8080 端口。


server:  port: 8761
复制代码


第四步:浏览器访问http://localhost:8761/,如果看到如下 Eureka 提供的 Dashborad 页面表示 Eureka Server 已经正常启动了


2.2 服务详细配置

配置一:此时 Eureka 启动,并未有任何服务注册到当前 Eureka 中,但是实例表中有一个 UNKNOWN 实例,这是因为 Eureka 默认会将其本身注册到上面。


## 两个值默认都为true eureka:  client:    ## 是否从Eureka获取注册信息    fetch-registry: false    ## 配置当前微服务是否注册到Eureka    register-with-eureka: false
复制代码


此时 Eureka 中不再有 UNKNOWN 实例信息,这配置适用于任何服务,通过这两个属性能够告诉该服务该如何 Eureka 服务进行交互。



配置二:指定 Eureka 服务端口信息,一般情况下我们指定 8761 作为 Eureka 默认端口


server:  port: 8761
复制代码


配置三:禁用自我保护模式我们先来看一个警告信息,当 Eureka 服务一直未接收到其他服务注册时,会在 Eureka 的 Dashboard 中出现如下红色警告: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 开启了自我保护模式。由于 Eureka Server 和 Eureka Client 之间不可避免的存在网络故障问题,Eureka Server 可能无法及时收到 Eureka Client 的心跳请求,如果 Eureka Server 直接下线该服务,会导致该服务无法被客户端请求。因此 Eureka 会有如下心态和自我保护机制:


  1. Eureka Cilent 每隔 30 秒,向 Eureka Server 发送一次服务更新请求(心跳机制),告诉 Eureka Server 当前 Eureka Client 存活

  2. Eureka Server 统计 15 分钟内心跳成功的比率是否低于 85%,如果低于 85% Eureka Server 将进入自我保护模式(认为当前服务之间通信存在网络异常),将当前 Eureka Server 上的注册信息保存起来,并且提示上面红色警告。

  3. 如果 Eureka Server 判断网络正常,并且 Eureka Server 在 3 个更新周期 90 秒内未收到 Eureka Client 的更新请求,Eureka Server 会注销该服务。


这种机制也可以关闭,但是在生产环境中推荐使用


## 关闭自我保护模式eureka:  server:    enable-self-preservation: false
复制代码



关闭自我保护模式之后,Eureka Dashboard 中会出现如下提示:THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.



发布于: 3 小时前阅读数: 4
用户头像

李子捌

关注

华为云享专家 2020.07.20 加入

公众号【李子捌】

评论

发布
暂无评论
Eureka基础