SpringCloud--Eureka入门教程

Eureka 介绍

Eureka 是什么

Eureka 是 Netflix 开发的一款基于 HTTP REST 的服务,由 Pivotal 公司将其整合进 Spring Cloud 生态。Netflix 在设计 Eureka 时遵守的是 AP 原则,通常用于服务注册发现、负载均衡和故障转移等,也是 Spring Cloud 中使用的服务注册发现组件。Eureka 采用 C/S 架构,提供了一个基于 Java 的 Client 组件,用来与服务端交互,同时具有一套内置的负载均衡器,可以进行基本的轮询负载均衡。

Eureka架构体系

在这里插入图片描述

Eureka 服务的三个角色

  • 服务注册中心:Eureka 提供的服务端,提供服务注册与发现的功能,一般被称作 Eureka-Server;
  • 服务消费者:消费者应用从服务注册中心获取服务列表,从而使消费者可以知道去何处调用其所需要的服务;
  • 服务提供者:提供服务的应用,可以是 Spring Boot 应用,也可以是其他技术平台且遵循 Eureka 通信机制的应用。它将自己提供的服务注册到 Eureka,以供其他应用发现。

Eureka 的自我保护模式

默认情况下,如果 Eureka Server 在一定时间内(默认 90 秒)没有接收到某个微服务实例的心跳,Eureka Server 将会注销该实例。但是当网络分区故障发生时,微服务与 Eureka Server 之间无法正常通信,这就可能变得非常危险了。因为微服务本身是健康的,此时本不应该注销这个微服务。Eureka Server 通过 “自我保护模式” 来解决这个问题,当 Eureka Server 节点在短时间内丢失过多客户端时(超过 85%【默认情况下,可以通过请设置属性:eureka.renewalPercentThreshold=[0.0, 1.0]】 的服务实例丢失心跳,可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server 就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该 Eureka Server 节点会自动退出自我保护模式。自我保护模式是一种对网络异常的安全保护措施,使用自我保护模式,可以让 Eureka 集群更加的健壮、稳定。
在自我保护模式中,Eureka Server 会保护注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阀值以上时,该 Eureka Server 节点就会自动退出自我保护模式。

如何选择关闭还是开启自我保护机制

Eureka服务端默认情况下是会开启自我保护机制的,但我们在不同环境应该选择是否开启保护机制。

我们可以通过配置文件使用 eureka.server.enable-self-preservation: false 来禁用自我保护模式。

Eureka 的健康检查

在 Eureka 中,微服务状态可取值为 DOWN、OUT_OF_SERVICE、UNKNOWN 等,只有 UP 的微服务会被请求。由于 Eureka Server 与 Eureka Client 之间使用心跳机制来确定 Eureka Client 的状态,默认情况下服务器端与客户端的心跳保持正常,应用程序就会始终保持 UP 状态,所以微服务的 UP 并不能完全反应应用程序的状态。Spring Boot Actuator 提供了 /health 端点,该端点可展示应用程序的健康信息,只要将该端点中的健康状态传播到 Eureka Server 就可以了,实现这点很简单,只需为微服务配置如下内容即可。如果需要更细粒度健康检查,可实现 com.netflix.appinfo.HealthCheckHandler 接口,EurekaHealthCheckHandler 已实现了该接口。

# 开启健康检查(需要添加spring-boot-starter-actuator依赖)
eureka.client.healthcheck.enabled = true

Eureka的一些概念

  • Register:服务注册
  • Renew:服务续约
  • Fetch Registries:获取注册列表信息
  • Cancel:服务下线
  • Eviction 服务剔除

Eureka 入门案例

创建 Maven 父级 Pom 工程

<properties>
  <springcloud.version>Dalston.SR1</springcloud.version>
  <springboot.version>1.5.9.RELEASE</springboot.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>${springboot.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${springcloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

创建 Eureka Server 工程

<dependencies>
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka-server</artifactId>
  </dependency>
</dependencies>

创建 Eureka Server 的启动主类,这里添加相应注解,作为程序的入口:


@SpringBootApplication
@EnableEurekaServer //开启Euraka注册中心服务
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class,args);
    }
}

添加 Eureka Server 需要的 application.yml 配置文件到工程的 src/main/resources 目录下:

server:
  port: 8761   # 默认端口 

spring:
  application:
    name: cloud-eureka-service    #应用名称


配置

直接运行后就可以在浏览器访问http://localhost:8761

在这里插入图片描述

创建 Eureka Client 工程

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

创建 Eureka Client 的启动主类,添加注解 @EnableEurekaClient

@EnableEurekaClient
@SpringBootApplication
public class DeptProviderApplication {

    public static void main(String[] args){
        SpringApplication.run(DeptProviderApplication.class, args);
    }
}

配置文件

server:
  port: 8088

spring:
  application:
    name: cloud-eureka-client-a    #应用名称

#注册的含义就是将自己的一些信息(ip,port......)发送给Eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

运行访问

在这里插入图片描述

Eureka 常用配置

Eureka 配置有三种

server


#服务端开启自我保护模式。无论什么情况,服务端都会保持一定数量的服务。避免client与server的网络问题,而出现大量的服务被清除。
eureka.server.enable-self-preservation=true
#开启清除无效服务的定时任务,时间间隔。默认1分钟
eureka.server.eviction-interval-timer-in-ms= 60000
#在设置的时间范围类,期望与client续约的百分比。
eureka.server.renewal-percent-threshold=0.85

client


#实例是否在eureka服务器上注册自己的信息以供其他服务发现,默认为true
eureka.client.register-with-eureka=false
#此客户端是否获取eureka服务器注册表上的注册信息,默认为true
eureka.client.fetch-registry=false

#是否过滤掉,非UP的实例。默认为true
eureka.client.filter-only-up-instances=true
#与Eureka注册服务中心的通信zone和url地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

#从eureka服务器注册表中获取注册信息的时间间隔(s),默认为30秒
eureka.client.registry-fetch-interval-seconds=30

instance

#服务注册中心实例的主机名
eureka.instance.hostname=localhost
#该实例的IP地址
eureka.instance.ip-address=
#该实例,相较于hostname是否优先使用IP
eureka.instance.prefer-ip-address=false
#服务中心删除此服务实例的等待时间(秒为单位),时间间隔为最后一次服务中心接受到的心跳时间
eureka.instance.lease-expiration-duration-in-seconds=90
#该实例给服务中心发送心跳的间隔时间,用于表明该服务实例可用
eureka.instance.lease-renewal-interval-in-seconds=30


Eureka 集群配置 初级方案

集群作用:为了保证Eureka高可用

假设现有三台 Eureka Server 主机,每台主机的 IP 与端口分别是: localhost:8005、localhost:8006、localhost:8007

Eureka Server1 配置

server:
  port: 8001

eureka:
  instance:
    hostname:  eureka1
  client:
    register-with-eureka: false #是否注册自己
    fetch-registry: false #是否拉取注册服务
    service-url:
      defaultZone: http:// eureka2:8002/eureka/,http:// eureka3:8003/eureka/

Eureka Server2 配置

server:
  port: 8002

eureka:
  instance:
    hostname:  eureka2
  client:
    register-with-eureka: false #是否注册自己
    fetch-registry: false #是否拉取注册服务
    service-url:
      defaultZone: http:// eureka1:8001/eureka/,http:// eureka3:8003/eureka/

Eureka Server3 配置

server:
  port: 8083

eureka:
  instance:
    hostname:  eureka3
  client:
    register-with-eureka: false #是否注册自己
    fetch-registry: false #是否拉取注册服务
    service-url:
      defaultZone: http:// eureka1:8001/eureka/,http:// eureka2:8002/eureka/

本地集群搭建的细节说明

若三台 Eureka Server 的 IP 都是 127.0.0.1 或者 localhost,彼此只是服务端口不一样;此时建议修改系统的 hosts 文件作相应的域名映射,方便日后访问 Eureka 的服务。当 hosts 文件加入下述配置之后,则可以通过不同的域名访问对应的 Eureka 服务了

127.0.0.1 eureka1
127.0.0.1 eureka2
127.0.0.1 eureka3

特别注意:新版的 Eureka 搭建集群时,eureka.client.serviceUrl.defaultZone 配置项的地址,不能使用 localhost 或者内网/外网 IP,必须使用域名,DNS 解析需自行配置,也可以在本机的 /etc/hosts 里映射域名,否则各节点均出现在 unavailable-replicas 下

Eureka 集群配置 终极方案

同时我们也可以只开一个服务来实现集群模式,通过启动时改变端口号来实现

server:
  port: 9090

spring:
  application:
    name: demo-client

eureka:
  client:
    service-url:
      defaultZone: http:// eureka1:8001/eureka/,http:// eureka2:8002/eureka/,http:// eureka3:8003/eureka/
  instance:
    instance-id: demo-client-9090
    prefer-ip-address: true

参考资料

https://blog.csdn.net/forezp/article/details/73017664
https://www.techgrow.cn/posts/be1e11c7.html
https://zhuanlan.zhihu.com/p/138542807

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值