SpringCloud微服务(二)——Eureka服务注册中心

news2024/12/30 2:55:39

Eureka服务注册中心

SpringCloud组件,Eureka已停更。

内容简介

1、Eureka是什么

Eureka 是 Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件,以实现中间层服务器的负载平衡和故障转移。服务注册:将服务信息注册进注册中心;服务发现:从注册中心上获取服务信息。

它主要包括两个组件:Eureka Server 和 Eureka Client

  • Eureka Client:一个Java客户端,用于简化与 Eureka Server 的交互(通常就是微服务中的客户端和服务端)
  • Eureka Server:提供服务注册和发现的能力(通常就是微服务中的注册中心)

在这里插入图片描述

服务在Eureka上注册,然后每隔30秒发送心跳来更新它们的租约。如果客户端不能多次续订租约,那么它将在大约90秒内从服务器注册表中剔除。注册信息和更新被复制到集群中的所有eureka节点。来自任何区域的客户端都可以查找注册表信息(每30秒发生一次)来定位它们的服务(可能在任何区域)并进行远程调用

2、 Eureka 客户端与服务器之间的通信

服务发现有两种模式:一种是客户端发现模式,一种是服务端发现模式。Eureka采用的是客户端发现模式。

2.1. Register(注册)

Eureka客户端将关于运行实例的信息注册到Eureka服务器。注册发生在第一次心跳。

2.2. Renew(更新 / 续借)

Eureka客户端需要更新最新注册信息(续借),通过每30秒发送一次心跳。更新通知是为了告诉Eureka服务器实例仍然存活。如果服务器在90秒内没有看到更新,它会将实例从注册表中删除。建议不要更改更新间隔,因为服务器使用该信息来确定客户机与服务器之间的通信是否存在广泛传播的问题。

2.3. Fetch Registry(抓取注册信息)

Eureka客户端从服务器获取注册表信息并在本地缓存。之后,客户端使用这些信息来查找其他服务。通过在上一个获取周期和当前获取周期之间获取增量更新,这些信息会定期更新(每30秒更新一次)。获取的时候可能返回相同的实例。Eureka客户端自动处理重复信息。

2.4. Cancel(取消)

Eureka客户端在关机时向Eureka服务器发送一个取消请求。这将从服务器的实例注册表中删除实例,从而有效地将实例从流量中取出。

3、Eureka自我保护模式
如果 Eureka 服务器检测到超过预期数量的注册客户端以一种不优雅的方式终止了连接,并且同时正在等待被驱逐,那么它们将进入自我保护模式。这样做是为了确保灾难性网络事件不会擦除eureka注册表数据,并将其向下传播到所有客户端。

任何客户端,如果连续3次心跳更新失败,那么它将被视为非正常终止,病句将被剔除。当超过当前注册实例15%的客户端都处于这种状态,那么自我保护将被开启。

当自我保护开启以后,eureka服务器将停止剔除所有实例,保留服务注册信息,直到:它看到的心跳续借的数量回到了预期的阈值之上,或者自我保护被禁用。

默认情况下,自我保护是启用的,并且,默认的阈值是要大于当前注册数量的15%

4、Eureka VS Zookeeper
4.1. Eureka保证AP

Eureka服务器节点之间是对等的,只要有一个节点在,就可以正常提供服务。

Eureka客户端的所有操作可能需要一段时间才能在Eureka服务器中反映出来,随后在其他Eureka客户端中反映出来。也就是说,客户端获取到的注册信息可能不是最新的,它并不保证强一致性

4.2. Zookeeper保证CP

Zookeeper集群中有一个Leader,多个Follower。Leader负责写,Follower负责读,ZK客户端连接到任何一个节点都是一样的,写操作完成以后要同步给所有Follower以后才会返回。如果Leader挂了,那么重新选出新的Leader,在此期间服务不可用。

4.3. 为什么用Eureka

分布式系统大都可以归结为两个问题:数据一致性和防止单点故障。而作为注册中心的话,即使在一段时间内不一致,也不会有太大影响,所以在A和C之间选择A是比较适合该场景的。

单机

server

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

spring:
  application:
    name: eureka-service
    
eureka:
  instance:
    # 单机eureka服务端的实例名称
    hostname: localhost
  client:
    # false表示不向注册中心注册自己
    register-with-eureka: false
    # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

启动类添加@EnableEurekaServer

访问http://localhost:7001/

在这里插入图片描述

client

<!--eureka client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
spring:
  application:
    name: xxx-service
    
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
  instance:
    instance-id: xxx  #主机名,7001页面,默认自己主机,一般是公司名,自定义
    prefer-ip-address: true #访问路径显示ip地址,7001页面

启动类添加@EnableEurekaClient

server集群

高可用,防止单点故障

原理说明:

服务注册:将服务信息注册到注册中心

服务发现:从注册中心获取服务信息

实质:存key服务名,取value调用地址

步骤:

先启动eureka注册中心

启动服务提供者payment支付服务

支付服务启动后,会把自身信息注册到eureka

消费者order服务在需要调用接口时,使用服务别名去注册中心获取实际的远程调用地址

消费者获得调用地址后,底层实际是调用httpclient技术实现远程调用

消费者获得服务地址后会缓存在本地jvm中,默认每30秒更新异常服务调用地址

问题:微服务RPC远程调用最核心的是说明?

高可用,如果注册中心只有一个,出现故障就麻烦了。会导致整个服务环境不可用。

解决办法:搭建eureka注册中心集群,实现负载均衡+故障容错

互相注册,相互守望

window机集群搭建步骤(liunx机etc下也有hosts/不同服务器就不需要添加映射步骤)

添加映射

liunx机etc下也有hosts

修改C:\Windows\System32\drivers\etc下的hosts(本机映射地址)

末尾加上

# springcloud2020
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com

这样做的效果是添加多个域名映射到本机

搭建eureka服务

如果是用服务器之间搭建集群,hostname可以直接localhost,端口可以统一7001,

defaultZone: http://ip2:7001/eureka/,http://ip3:7001/eureka/,其它类推

修改7001项目 applicaton.yml,可以不用服务名

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com #eureka服务端实例名称
  client:
    register-with-eureka: false #表示不向注册中心注册自己
    fetch-registry: false #false表示自己就是注册中心,我的职责就是维护服务实例,并不区检索服务
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

修改7002项目 applicaton.yml,可以不用服务名

server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com #eureka服务端实例名称
  client:
    register-with-eureka: false #表示不向注册中心注册自己
    fetch-registry: false #false表示自己就是注册中心,我的职责就是维护服务实例,并不区检索服务
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/

修改7003项目 applicaton.yml,可以不用服务名

server:
  port: 7003

eureka:
  instance:
    hostname: eureka7003.com #eureka服务端实例名称
  client:
    register-with-eureka: false #表示不向注册中心注册自己
    fetch-registry: false #false表示自己就是注册中心,我的职责就是维护服务实例,并不区检索服务
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

集群效果

在这里插入图片描述

client修改配置

eureka:
  client:
    # 默认true,表示将自己注册进入server
    register-with-eureka: true
    # 默认true,集群必须设置true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      # 集群版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
   instance:
    instance-id: xxx  #主机名,7001页面,默认自己主机,一般是公司名,自定义
    prefer-ip-address: true #访问路径显示ip地址,7001页面

client都注册到7001,7002,7003

client服务集群

提供服务的微服务也可以集群

准备好多个相同的微服务,提供服务的微服务,微服务的名字一致即可,同个机的话就需要改端口。

消费者微服务,调提供服务的微服务api接口,在RestTemplate中加入@LoadBalanced注解,启动类注入也行。@LoadBalanced//开启负载均衡,默认是轮询方法,平均访问。

/**
 * @ClassName: ApplicationContextConfig
 * @description: 配置类
 * @author: WZQ
 * @create: 2020/3/5 21:25
 **/
@Configuration
public class ApplicationContextConfig {
    
    @Bean
    @LoadBalanced//开启负载均衡
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
    
}

使用RestTemplate调用集群服务:

在这里插入图片描述

private final static String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";//集群微服务名字,都是cloud-payment-service

url = PAYMENT_URL + "/payment/create(地址)"
    
    @GetMapping("/consumer/payment/create")
    public CommonResult<Payment> create(Payment payment) {
        return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
    }

只要所有的微服务都在server上注册信息,消费者微服务就可以通过eureka注册中心http://CLOUD-PAYMENT-SERVICE的微服务名字,轮询的访问提供服务的集群微服务(相同微服务名字绑定)。

服务发现

从注册中心上获取服务信息

查看在注册中心中的服务信息

    /**
     * 服务发现 获取服务信息
     */
    @Resource
    private DiscoveryClient discoveryClient;

    /**
     * 服务发现
     *
     * @return
     */
    @GetMapping(value = "payment/discovery")
    public Object discovery() {
        //所有服务的名称
        List<String> services = discoveryClient.getServices();
        for (String element : services) {
            log.info("*****element:" + element);
        }
        // 一个微服务下的全部实例,集群
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.debug(instance.getServiceId() + "\t" + instance.getHost() + "\t" + instance.getPort() + instance.getUri());
        }
        return this.discoveryClient;
    }

启动类加入,@EnableDiscoveryClient

在这里插入图片描述

Eureka的自我保护机制

为什么会产生自我保护机制?

为防止EurekaClient可以正常运行,但是与EurekaServer网络不同的情况下,EurekaServer不会立刻将EurekaClient服务剔除。

什么是自我保护机制?

默认情况下,当Eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制。

比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last min),当后者(最后一分钟收到的心跳数)小于前者(心跳阈值)的时候,触发保护机制,会出现红色的警告:

EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEGING EXPIRED JUST TO BE SAFE.

从警告中可以看到,eureka认为虽然收不到实例的心跳,但它认为实例还是健康的,eureka会保护这些实例,不会把它们从注册表中删掉。

取消,页面也会显示TURNED OFF。

在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例。

综上,自我保护模式是一种应对网络异常的安全保护措施它的架构哲学是宁可同时保留所有微服务,也不忙保姆注销如何健康的微服务,使用自我保护模式,可以让Eureka集群更加健壮,稳定。

署于CAP 的AP分支。

如何禁止自我保护机制

服务提供者:

eureka:
  instance: 
    # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-renewal-interval-in-seconds: 1
    # Eureka服务端在收到最后一次心跳后等待时间上限 ,单位为秒(默认是90秒),超时剔除服务
    lease-expiration-duration-in-seconds: 2

注册中心配置:

eureka:
  server:  
    enable-self-preservation: false # 关闭自我保护机制 保证不可用服务及时清除  
    eviction-interval-timer-in-ms: 2000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[杂记]算法: 单调栈

0. 引言 单调栈, 顾名思义就是从栈底到栈顶元素单调递增或者单调递减的栈. 往往, 我们在解决寻找一个元素前面/后面的最远/最近处满足某条件的另一个元素的时候可以用到单调栈. 也是用两道算法题作为例子. 在这之前, 先简单写一下构造单调栈的模板. 如果我们需要从一个数组中…

ES6 入门教程 18 Iterator 和 for...of 循环 18.7 for...of 循环

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程18 Iterator 和 for...of 循环18.7 for...of 循环18.7.1 数组18.7.2 Set 和 Map 结构18.7.3 计算生成的数据结构18.7.4 类似…

供应叶酸PEG试剂Folic acid-PEG-Azide,FA-PEG-N3,叶酸-聚乙二醇-叠氮

1、名称 英文&#xff1a;Folic acid-PEG-Azide&#xff0c;FA-PEG-N3 中文&#xff1a;叶酸-聚乙二醇-叠氮 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG Folic acid&#xff08;FA&#xff09; PEG 4、分子量&#xff1a;可定制&#xff0c;FA-PEG-N3 5…

Web安全之CTF测试赛

Web安全之CTF测试赛 1.000-我是谁 题目描述&#xff1a; 找到诈骗网站bsde.cn的域名注册人及邮箱&#xff0c;将域名注册人的126邮箱填写到下方答案框并点击送出 考察点&#xff1a;whois查询 whois查询网址&#xff1a; https://x.threatbook.com/ //微步在线 http://wh…

ES6 入门教程 17 Promise 对象 17.11 Promise.reject() 17.12 应用 17.13 Promise.try()

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程17 Promise 对象17.11 Promise.reject()17.12 应用17.12.1 加载图片17.12.2 Generator 函数与 Promise 的结合17.13 Promise…

ES6 入门教程 15 Proxy 15.2 Proxy 实例的方法 15.2.2 set() 15.2.3 apply()

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程15 Proxy15.2 Proxy 实例的方法15.2.2 set()15.2.3 apply()15 Proxy 15.2 Proxy 实例的方法 拦截方法的详细介绍。 15.2.…

【附源码】Python计算机毕业设计天润律师事务所管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

〖全域运营实战白宝书 - 运营角色认知篇③〗- 运营的底层逻辑是什么?

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

【笔试题】【day24】

文章目录第一题&#xff08;完全二叉树的最多结点个数&#xff09;第二题&#xff08;哈夫曼树的带权路径长度&#xff09;第三题&#xff08;堆的重建&#xff09;第四题&#xff08;哈希映射的冲突&#xff09;第一题&#xff08;完全二叉树的最多结点个数&#xff09; 一棵…

UE4 几种蓝图通信的方法

根据视频&#xff08;UE4 几种蓝图通讯的方法&#xff09;所做笔记 目录 方法一&#xff1a;通过公有变量 方法二&#xff1a;通过“获取类的所有actor”节点 方法三&#xff1a;通过蓝图接口 关卡蓝图与蓝图通信 方法一&#xff1a;通过公有变量 步骤&#xff1a; 1.新建…

一款php开发的非常好的OA办公管理系统源码

一款基于TP5 HAdmin Mysql打造的简单实用的开源的企业办公系统框架。可以帮助解决企业办公项目60的重复工作&#xff0c;让开发更多关注业务逻辑。既能快速提高开发效率&#xff0c;帮助公司节省人力成本&#xff0c;同时又不失灵活性。使用本系统可以简单快速地开发出企业级的…

如何将 MATLAB 源代码导出成 Java 的 JAR 包

文章目录编写 MATLAB 源文件安装 Java制作 JAR 包找到 MATLAB 的 JAR 包运行环境&#xff1a; MATLAB R2022a Java 8&#xff08;1.8.0_311&#xff09; Windows 10 教育版 64位 使用混合编程通常都不是好主意&#xff0c;但是有时候会遇到极端的情况。Java 擅长网络编程&am…

vivo霍金实验平台设计与实践-平台产品系列02

vivo 互联网平台产品研发团队 - Bao Dawei 本篇介绍了vivo霍金实验平台的系统架构以及业务发展过程中遇到的问题以及对应的解决方案。 《平台产品》系列文章&#xff1a; 1.vivo平台化实践探索之旅-平台产品系列01 一、前言 互联网企业经历过野蛮生长的开拓红利期之后&#xf…

UE4 TCP通信 (UE客户端与网络调试助手服务端、python服务端通信)

目录 一、使用UE4建立TCP客户端 二、使用网络调试助手建立服务端 三、基于网络调试助手的服务端与UE客户端通信 四、基于python的TCP服务端与UE客户端通信 一、使用UE4建立TCP客户端 1.在虚幻商城中搜索socket来下载TCP Socket Plugin插件 2.安装到引擎&#xff0c;目前…

面向对象分析与设计_类图

判断题 类与对象之间的关系&#xff0c;可以理解为模板与具体实例之间的关系 T 类是现实世界中客观存在的事物或实体。 F 类是具有相同属性和服务的一组对象的集合 T 对象的属性都有值&#xff0c;类的属性没有值 T 类的可见性描述了其属性和操作是否对于其他类可见&…

PHPer 开始使用 Java

出于工作需要&#xff0c;新项目要开始使用 Java 进行开发&#xff0c;注意力就要从 PHP 转移到 Java 上来。个人觉得这是一个挺好的机会&#xff0c;能接触被广泛使用的另一种开发语言和生态。 虽说语言之间存在许多相似之处&#xff0c;但真正落地的过程肯定会存在不少的曲折…

类加载与类文件结构

文章目录类加载机制为什么需要类加载类加载的时机类加载详细过程加载链接初始化类加载器类加载器的分类Java虚拟机自带的类加载器用户自定义类加载器ClassLoader的使用说明双亲委派机制沙箱安全机制类文件的结构类加载机制 为什么需要类加载 首先我们计算机的主要组成是输入设…

ES6 入门教程 15 Proxy 15.2 Proxy 实例的方法 15.2.10 ownKeys() ~ 15.2.12 setPrototypeOf()

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程15 Proxy15.2 Proxy 实例的方法15.2.10 ownKeys()15.2.11 preventExtensions()15.2.12 setPrototypeOf()15 Proxy 15.2 Pro…

算法题:SOJ1092: 欧几里得算法

一、BackGroud 在RSA密码体系中,欧几里得算法是加密或解密运算的重要组成部分。它的基本运算过程就是解 x*a1(mod n) 这种方程。 二、The Problem 整个解的过程是这样的&#xff0c;我们用一个例子来说明。 当a&#xff1d;1001 &#xff0c;n&#xff1d;3837时 方程为 x *…

12 个免费 GIS 数据源介绍:最佳全球栅格和矢量数据集

我们生活在当今的信息时代&#xff0c;每天都被大量的信息包围&#xff0c;就免费的 GIS 数据源而言&#xff0c;它的信息似乎是永无止境的。机器学习、人工智能、区块链、预测分析&#xff0c;所有令人惊叹的技术都将革新商业和社会的发展。但如果没有数据的话&#xff0c;这些…