当前位置: 代码迷 >> 综合 >> springcloud——微服务注册与发现 eureka
  详细解决方案

springcloud——微服务注册与发现 eureka

热度:63   发布时间:2023-11-24 16:17:34.0

 一、什么是服务发现

微服务将传统的"巨石"应用拆分成一个一个的组件应用,每个组件应用提供特定的服务,可以是一个,也可以是多个,并且组件所含服务应该是可以动态扩展的,随着时间推移、系统进化,可任意拆分、合并。

组件化应用和颗粒化的服务,遍布在系统的各个角落,由不同的项目成员进行维护,微服务的核心是化整为零、各司其职,这就要求开发人员不得操作其业务或服务范围以外的数据模型等资源,只能通过接口的访问,使用某一服务。

由于服务的跨度很大(公司很大的情况下)、数量很多(数以百计甚至更多),为保障系统的正常运行,必然需要有一个中心化的组件完成对各个服务的整合,即将分散于各处的服务进行汇总,汇总的信息可以是提供服务的组件名称、地址、数量等,每个组件拥有一个监听设备,当本组件内的某个服务的状态变化时报告至中心化的组件进行状态的更新。服务的调用方在请求某项服务时首先到中心化组件获取可提供该项服务的组件信息(IP、端口等),通过默认或自定义的策略选择该服务的某一提供者进行访问,实现服务的调用。

 

服务注册与发现架构

服务发现组件、服务消费者和服务提供者这三者之间的大致关系如下:

  • 各个微服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息。
  • 服务消费者可从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口。
  • 各个微服务与服务发现组件使用一定机制(例如:心跳)通信。服务发现组件若长时间无法与某微服务实例通信,就会注销该实例。
  • 微服务网络地址发生变更(例如:实例增减或者IP端口发生变化等)时,会重新注册到服务发现组件。使用这种方式,服务消费者就无须人工修改提供者的网络地址了。

综上所述,服务发现组件应该具备以下功能:

  • 服务注册表:是服务发现组件的核心,它用来记录各个微服务的信息,例如:微服务的名称、IP、端口等信息。服务注册表提供查询API和管理API,查询API可以用于查询微服务实例,管理API可以用于微服务的注册和注销。
  • 服务注册与发现:服务注册是指微服务在启动时,将自己的信息注册到服务发现组件上的过程。服务发现是指查询可用微服务列表及其网络地址的机制。
  • 服务检查:服务发现组件使用一定机制定时检测已经注册的服务,如发现某实例长时间无法访问,就会从服务注册表中移除该实例。

二、Eureka服务发现组件

(一)、概述

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul,后面章节会进行介绍)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

eureka服务发现组件

 

Eureka Server(服务发现组件):提供服务注册服务,各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。默认情况下,Eureka Server同时也是Eureka Client。多个Eureka Server实例互相之间通过复制的方式来实现服务注册表中的数据同步。

EurekaClient(服务消费者和服务提供者):是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)。Eureka Client会缓存服务注册表中的信息,这种方式有一定的优势——微服务无须每次请求都查询Eureka Server,从而降低了Eureka Server的压力;其次,即使全部的Eureka Server节点都宕机,服务消费者依然可以通过缓存中的信息来找到服务提供者并完成调用。

(二)、 编写一个Eureka Server

1、创建一个maven工程:microservicecloud-discovery-euraka,并添加以下依赖

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency>
</dependencies>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

2、编写启动类,在启动类上添加一个@EnableEurekaServer注解,声明这是一个Eureka Server

@SpringBootApplication
@EnableEurekaServer//EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7001_App{public static void main(String[] args){SpringApplication.run(EurekaServer7001_App.class, args);}
}

3、在配置文件application.yml中添加以下内容 

server:port: 7001eureka:instance:hostname: eureka7001.com #eureka服务端的实例名称client:register-with-eureka: false   #false表示不向注册中心注册自己,默认为truefetch-registry: false   #表示是否从Eureka Server获取注册表信息,默认为true。因为当前是一个单点Eureka Server,不需要同步其它Eureka Server节点的数据,所以设为falseservice-url:defaultZone: http://localhost:7001/eureka    #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

4、测试

访问:http://localhost:7001/

Eureka首页

出现这个页面表示测试成功。

 

(三)、 编写一个Eureka Client

1、创建一个maven工程:microservicecloud-provider,并添加以下依赖

<dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!-- 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>
</dependencies>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.SR1</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>1.5.9.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

2、编写启动类,在启动类上添加一个@EnableEurekaServer注解,声明这是一个Eureka Server

@SpringBootApplication
@EnableEurekaClient
public class DeptProvider8001_App{public static void main(String[] args){SpringApplication.run(DeptProvider8001_App.class, args);}
}

3、在配置文件application.yml中添加以下内容 

server:port: 8001
eureka:client:service-url:defaultZone:  http://localhost:7001/eurekainstance:instance-id: microservicecloud_provider_8001   #自定义服务名称信息prefer-ip-address: true     #访问路径可以显示IP地址

4、测试

先启动Eureka Server,在启动Eureka Client,然后访问:http://localhost:7001/

出现这个页面表示测试成功。

(四)、Eureka的自我保护

现象:

长时间没有心跳反应??????
服务掉线

默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。