首页 > 其他分享 >SpringCloud的Eureka组件

SpringCloud的Eureka组件

时间:2022-10-16 20:37:21浏览次数:72  
标签:服务 SpringCloud eureka microservicecloud 注册 组件 Eureka Server

SpringCloud的Eureka组件

1.* Eureka概述

1.*.& Eureka是什么

image

Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于Dubbo的注册中心,比如ZooKeeper。

Netflix在设计Eureka时遵守的就是AP原则。

1.*.& Eureka的基本架构

SpringCloud封装了Netflix公司开发的Eureka模块来实现服务注册和发现(请对比ZooKeeper)。

Eureka采用了C-S的设计架构。Eurake Server作为服务注册功能的服务器,它是服务注册中心。

而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。SpringCloud的一些其他模块(比如Zuul)就可以通过Eureka Server来发现系统中的其他微服务,并执行相关的逻辑。

image

image

Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka Server提供服务注册服务,各个节点启动之后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用节点的信息,并可以在界面中直观地看到。

Eureka Client是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

1.*.& Eureka的三大角色

  • Eureka Server:提供服务注册与发现
  • Service Provider:服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到
  • Service Consumer:服务消费方,从Eureka获取注册服务列表,从而能够消费服务

1.* Eureka Server服务注册中心建立

1.*.& 创建microservicecloud-eureka-7001模块

在之前基础上,添加microservicecloud-eureka-7001模块。

1.*.& 修改pom.xml

查看代码

1.*.& 编写yml

查看代码

1.*.& 编写EurekaServer7001Application主启动类

在启动类上面,标注启动该新组件技术的相关注解标签@EnableEurekaServer:

查看代码

1.*.& 测试

http://localhost:7001

结果页面:

image

1.* 将已有的部门微服务注册进Eureka服务中心

将已有的microservicecloud-provider-dept-8001部门微服务注册进Eureka服务中心。

1.*.& 修改pom.xml

修改pom.xml文件,添加以下两个依赖:

点击查看代码
<!--将微服务provider注册进eureka-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

查看代码

1.*.& 修改yml

在application.yml中添加如下配置:

点击查看代码
eureka:
  client: #客户端注册进eureka服务列表内
    service-url:
      #defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: microservicecloud-dept8001
    prefer-ip-address: true #访问路径可以显示IP地址

查看代码

1.*.& 修改DeptProvider8001Application主启动类

在主启动类中添加注解标签@EnableEurekaClient,表示这是一个Eureka客户端。

查看代码

1.*.& 测试

image

图中的Application就是我们的application.yml中定义的spring.application.name的名字。

1.* actuator与注册微服务信息完善

1.*.& 主机名称:服务名称修改

在microservicecloud-provider-dept-8001中修改application.yml,将spring.application.name值修改为microservicecloud-dept,将eureka.instance.instace-id修改为microservicecloud-dept8001,可以看到如下显示:

image

1.*.& 访问信息有IP信息显示

在microservicecloud-provider-dept-8001项目中,添加如下内容:

点击查看代码
eureka:
  client: #客户端注册进eureka服务列表内
    service-url:
      #defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: microservicecloud-dept8001
    prefer-ip-address: true #访问路径可以显示IP地址

如上prefer-ip-address配置为true之后就可以显示IP地址:

image

1.*.& 微服务info内容详细信息

1.*.&.% 问题发现

当我们点击如图所示的超链接:

image

可以发现,如果没有配置好info内容详细信息,就会跳转到一个error page。

1.*.&.% 修改步骤

1、首先在父工程的pom.xml中添加如下内容:

点击查看代码
<build>
    <finalName>microservicecloud</finalName>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <configuration>
                <delimiters>
                    <delimiter>$</delimiter>
                </delimiters>
            </configuration>
        </plugin>
    </plugins>
</build>

2、在microservicecloud-provider-dept-8001的pom.xml中添加actuator监控信息完善:

点击查看代码
<!--actuator监控信息完善-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

3、在microservicecloud-provider-dept-8001的application.yml中添加info信息

点击查看代码
info:
  app.name: hzhiping-microservicecloud
  company.name: www.hzhiping.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$

4、查看效果

分别前后启动microservicecloud-eureka-7001和microservicecloud-provider-dept-8001项目,查看info界面如下:

image

1.* Eureka的自我保护机制

Eureka Server在运行期间会去统计心跳失败比例在15分钟之内是否低于85%,如果低于85%,Eureka Server会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。

我们在单机测试的时候很容易满足心跳失败比例在 15 分钟之内低于 85%,这个时候就会触发 Eureka 的保护机制,一旦开启了保护机制,则服务注册中心维护的服务实例就不是那么准确了,此时我们可以使用eureka.server.enable-self-preservation=false来关闭保护机制,这样可以确保注册中心中不可用的实例被及时的剔除(不推荐)。

自我保护模式被激活的条件是:在1分钟后,Renews (last min) < Renews threshold。

这两个参数的意思:

  • Renews threshold:Eureka Server期望每分钟收到客户端实例续约的总数。
  • Renews (last min):Eureka Server最后1分钟收到客户端实例续约的总数。

具体的值,我们可以在Eureka Server界面可以看到:

image

可以看到,我们部署了3个Eureka Server(自注册模式),另外,又部署7个服务,注册到Eureka Server集群,参数值分别为:

  • Renews threshold:17
  • Renews (last min):20

下面说下Renews threshold和Renews threshold具体计算方式。

Renews threshold计算代码:

点击查看代码
this.expectedNumberOfRenewsPerMin = count * 2;
this.numberOfRenewsPerMinThreshold = (int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold());

count表示服务的数量,如果Eureka Server开启自注册模式,也算一个服务,比如我们上面的示例,count的值就是10(3个自注册服务 + 7个独立服务),serverConfig.getRenewalPercentThreshold()默认是0.85(可以通过eureka.server.renewal-percent-threshold配置)。

所以,根据上面的分析,我们可以计算出Renews threshold的值:(int) (10 * 2 * 0.85) = (int) 17 = 17。

Renews (last min)计算方式:count * 2,数值2表示每30秒1个心跳,每分钟2个心跳的固定频率因子,所以具体值为:10 * 2 = 20。

如果在1分钟后,Renews (last min) < Renews threshold,默认需等待5分钟(可以通过eureka.server.wait-time-in-ms-when-sync-empty配置),即5分钟后你会看到下面的提示信息:

image

解决方式有三种:

  • 关闭自我保护模式(eureka.server.enable-self-preservation设为false),不推荐。
  • 降低renewalPercentThreshold的比例(eureka.server.renewal-percent-threshold设置为0.5以下,比如0.49),不推荐。
  • 部署多个Eureka Server并开启其客户端行为(eureka.client.register-with-eureka不要设为false,默认为true),推荐。

Eureka的自我保护模式是有意义的,该模式被激活后,它不会从注册列表中剔除因长时间没收到心跳导致租期过期的服务,而是等待修复,直到心跳恢复正常之后,它自动退出自我保护模式。这种模式旨在避免因网络分区故障导致服务不可用的问题。例如,两个客户端实例C1和C2的连通性是良好的,但是由于网络故障,C2未能及时向Eureka发送心跳续约,这时候Eureka不能简单的将C2从注册表中剔除。因为如果剔除了,C1就无法从Eureka服务器中获取C2注册的服务,但是这时候C2服务是可用的。

所以,Eureka的自我保护模式最好还是开启它。

Eureka Server单机版配置示例:

点击查看代码
debug: true
spring:
  application:
    name: eureka-server
logging:
  level:
    com.netflix.eureka: 'off'
    com.netflix.discovery: 'off'
server:
  port: 8100
eureka:
  instance:
    hostname: localhost
  server:
    enable-self-preservation: false #关闭自我保护机制,不推荐
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

1.* Eureka的服务发现

对于注册进Eureka里面的微服务,可以通过服务发现来获取到该服务的信息,步骤如下:

1、修改microservicecloud-provider-dept-8001工程的DeptController,注入相关的服务发现类

查看代码

2、先启动EurekaServer服务,然后再动microservicecloud-provider-dept-8001的启动类

3、访问浏览器,查看对应的服务发现

image

4、microservicecloud-consumer-dept-80工程的DeptConsumerController修改:

查看代码

5、访问对应的地址

image

1.* Eureka集群配置

1、新建microservicecloud-enureka-7002/microservicecloud-enureka-7003

2、修改对应模块的pom文件

3、修改7002和7003的启动类

4、在hosts文件中修改映射配置

5、三台Eureka服务器的yml配置

6、microservicecloud-provider-dept-8001微服务发布上面三台Eureka集群配置中

具体按照上述步骤查看工程代码。

标签:服务,SpringCloud,eureka,microservicecloud,注册,组件,Eureka,Server
From: https://www.cnblogs.com/hzhiping/p/16796832.html

相关文章

  • 文章的评论 和 评论的恢复组件
    封装请求接口:get提交的query数据放在params里面(或者放在url?后面)/***文章评论*功能1:获取文章的评论*======》typea评论类型,a-对文章(article)的评......
  • vue3 中使用ref获取组件元素
    //父组件<template><Sonref="sonRef"/></div></template><scriptlang='ts'setup>import{ref}from"vue";importSonfrom"../components/son.vue"......
  • 点赞,取消点赞组件
    <template><divclass="collect-container"><van-loadingv-if="isLoading"type="spinner"color="#1989fa"></van-loading><van-iconv-else......
  • 收藏文章组件
      组件:collectArticle<template><divclass="collect-container"><van-loadingv-if="isLoading"type="spinner"color="#1989fa"></van-loading><va......
  • v-model 语法糖-在父子组件传值 的简写形式
    props的变量名字必须是 value,this.$emit('input',数据值)的自定义事件必须是input;v-model 是vue中进行数据双向绑定的指令,在内部实际上是通过语法糖来完成数据......
  • 关于自定义事件父子组件传值问题 $event
    1.$event是vue提供的特殊变量,用来表示原生的事件参数对象event1.1在原生事件中,$event是事件对象可以点出来属性 2.在原生事件中,$event是事件对象,在自定义事件中,$ev......
  • 序列化组件
    序列化组件的三大功能序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器......
  • 02应用和组件
    1<!doctypehtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"6content="width=device-width,user-sca......
  • 兄弟组件传值
    https://www.bilibili.com/video/BV1Hu411r7dt/?spm_id_from=333.337.search-card.all.click&vd_source=d87a0cdb006a04b60ce265a9ce85d6afeventBus可以在全局定义......
  • restframework分页组件的应用
    restframework中提供了优秀的分页组件在settings.py中,填写关于restframework的配置REST_FRAMEWORK={"UNAUTHENTICATED_USER":None,"PAGE_SIZE":4}1.Pag......