返回 导航

SpringBoot / Cloud

hangge.com

SpringCloud - 服务注册与发现组件Eureka的使用详解1(搭建服务注册中心)

作者:hangge | 2020-06-30 08:10

序:基本概念介绍

1,服务治理

(1)服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。
  • 服务注册:在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,包括服务的主机与端口号、服务版本号、通讯协议等一些附加信息。注册中心按照服务名分类组织服务清单,同时还需要以心跳检测的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,以达到排除故障服务的效果。
  • 服务发现:在服务治理框架下,服务间的调用不再通过指定具体的实例地址来实现,而是通过服务名发起请求调用实现。服务调用方通过服务名从服务注册中心的服务清单中获取服务实例的列表清单,通过指定的负载均衡策略取出一个服务实例位置来进行服务调用。

(2)Spring Cloud Eureka Spring Cloud Netflix 微服务套件中的一部分,它基于 Netflix Eureka 做了二次封装。主要负责完成微服务架构中的服务治理功能。
    Spring Cloud 通过为 Eureka 增加了 Spring Boot 风格的自动化配置,我们只需要通过简单引入依赖和注解配置就能让 Spring Boot 构建的微服务应用轻松地与 Eureka 服务治理体系进行整合。

2,Netflix Eureka 介绍

(1)Spirng Cloud Eureka 使用 Netflix Eureka 来实现服务注册与发现。它既包含了服务端组件,也包含了客户端组件。
  • Eureka 服务端:即服务注册中心。它同其他服务注册中心一样,支持高可用配置(支持集群模式部署)。依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。
  • Eureka 客户端:主要处理服务的注册和发现。客户端服务通过注册和参数配置的方式,嵌入在客户端应用程序的代码中。在应用程序启动时,Eureka 客户端向服务注册中心注册自身提供的服务,并周期性的发送心跳来更新它的服务租约。同时,他也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期行的刷新服务状态。

(2)由于服务端与客户端均采用 java 编写,所以 Eureka 主要适用于通过 java 实现的分布式系统,或是 JVM 兼容语言构建的系统。
注意:由于 Eureka 的服务端提供了较为完善的 REST API,所以 Eureka 也支持将非 java 语言实现的服务纳入到 Eureka 服务治理体系中来,只需要其他语言平台自己实现 Eureka 的客户端程序。

一、搭建服务注册中心

1,添加依赖

首先创建一个 Spring Boot 工程,然后在 pom 文件中引入相关依赖:
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <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>Greenwich.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2,Eureka Server 相关配置

编辑项目的 application.properites 文件,添加如下相关配置:
注意:由于在默认配置下,Eureka Server 会将自己也作为客户端来尝试注册自己,所以我们需要禁用它的客户端禁用行为。
#服务注册中心端口号
server.port=1111

#服务注册中心实例的主机名
eureka.instance.hostname=localhost
#表示是否将自己注册在EurekaServer上,默认为true。由于当前应用就是EurekaServer,所以置为false
eureka.client.register-with-eureka=false
#表示表示是否从EurekaServer获取注册信息,默认为true。单节点不需要同步其他的EurekaServer节点的数据
eureka.client.fetch-registry=false
#设置Eureka的地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

3,启动服务注册中心

在启动类上添加 @EnableEurekaServer 注解即可启动服务注册中心:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

4,运行访问

    项目启动以后,访问 http://localhost:1111 就可以看到如下图所示的 Eureka 的信息面板。其中 Instances currently registered with Eureka 一栏是空的,说明注册中心还没有注册任何服务。

附:自我保护配置

(1)当我们在本地调试基于 Eureka 的程序时,基本上会碰到这样一个问题,就是在服务注册中心的信息面板中出现如下这样的红色警告信息:
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.

(2)该警告就是触发了 Eureka Server 的自我保护机制。服务注册到 Eureka Server 之后,会维护一个心跳连接,告诉 Eureka Server 自己还活着。Eureka Server 在运行期间,会统计心跳失败的比例在 15 分钟之内是否低于 85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),EurekaServer 会将当前的实例注册信息保护起来,让这些实例不会过期,尽可能保护这些注册信息。
注意:在这段保护期间内实例若出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如可以使用请求重试、断路器等机制。

(3)由于本地调试很容易触发注册中心的保护机制,这会使得注册中心维护的服务实例不那么准确。所以,我们在本地进行开发的时候,可通过如下配置来关闭保护机制,以确保注册中心可以将不可用的实例正确剔除。
#关闭保护机制
eureka.server.enable-self-preservation=false
评论

全部评论(0)

回到顶部