`

Eureka服务注册与发现组件

阅读更多
1. 服务注册与发现组件Eureka简介

Eureka github地址:https://github.com/Netflix/eureka

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。

Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。

在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
类似zookeeper,Eureka也是一个服务注册和发现组件,是SpringCloud的一个优秀子项目,不过比较坑的是,Eureka2版本已经停止更新了。但是Eureka1版本还是很稳定,功能足够用。


几个常用的服务注册与发现组件比对:
FeatureConsulzookeeperetcdeureka
服务健康检查服务状态,内存,硬盘等(弱)长连接keepalive连接心跳可配支持
多数据中心支持---
kv存储服务支持支持支持-
一致性raftpaxosraft-
capcacpcpap
使用接口(多语言能力)支持http和dns客户端http/grpchttp(sidecar)
watch支持全量/支持long polling支持支持long polling支持long polling/大部分增量
自生监控metrics-metricsmetrics
安全acl/httpsaclhttps支持(若)-
集成spring cloud已支持已支持已支持已支持


服务注册与发现原理



2. Eureka服务注册中心microservice-eureka-server-2001搭建

eureka是c/s模式的server服务端就是服务注册中心,其他的都是client客户端,服务端用来管理所有服务,客户端通过注册中心,来调用具体的服务;

新建服务消费者项目microservice-eureka-server-2001
new -> Maven Module
    -> create a simple project
Module Name:microservice-eureka-server-2001
Parent Project:microservice
Working set:SpringCloud
    -> Artifact
Group Id:com.andrew.springcloud
Artifact Id:microservice-eureka-server-2001
Version:0.0.1-SNAPSHOT
Packaging:jar


2.1) Eureka服务注册中心microservice-eureka-server-2001增加pom.xml依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.andrew.springcloud</groupId>
        <artifactId>microservice</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-eureka-server-2001</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!-- 修改后立即生效,热部署 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>
</project>


2.2) Eureka服务注册中心microservice-eureka-server-2001增加application.yml配置

server:
  port: 2001
  context-path: /
  
eureka: 
  instance:
    hostname: localhost #eureka注册中心实例名称
  client: 
    register-with-eureka: false #false 由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己。
    fetch-registry: false #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
    service-url: 
       defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka注册中心交互的地址,查询服务和注册服务用到


2.3) Eureka服务注册中心microservice-eureka-server-2001增加com.andrew.EurekaApplication_2001.java启动类

package com.andrew;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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


http://localhost:2001/
显示spring eureka主页


3. 注册服务提供者到Eureka注册中心

服务提供者microservice-student-provider-1001
Eureka注册中心microservice-eureka-server-2001

3.1) 服务提供者microservice-student-provider-1001增加pom.xml依赖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>


3.2) 服务提供者microservice-student-provider-1001增加application.yml配置依赖eureka客户端

eureka:
  instance:
    hostname: localhost #eureka客户端主机实例名称
    appname: microservice-student #客户端服务名
    instance-id: microservice-student:1001 #客户端实例名称
    prefer-ip-address: true #显示IP
  client: 
    service-url: 
      defaultZone: http://localhost:2001/eureka #把服务注册到eureka注册中心


3.3) 服务提供者microservice-student-provider-1001的StudentProviderApplication_1001.java增加eureka注解@EnableEurekaClient

package com.andrew;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

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


启动microservice-eureka-server-2001
启动microservice-student-provider-1001

http://localhost:2001/

发现有UP (1) - microservice-student:1001 这个服务

但是无法调用


3.4) 服务提供者microservice-student-provider-1001增加pom.xml依赖actuator监控

<!-- actuator监控引入 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>


3.5) 父项目microservice增加pom.xml构建插件配置,主要是为了再构建的时候扫描子项目配置文件,解析配置用的

<!-- 构建的时候,解析src/main/resources下的配置文件,其实就是application.yml解析以$开头和结尾的信息 -->
<build>
    <finalName>microservice</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>
                    <delimit>$</delimit>
                </delimiters>
            </configuration>
        </plugin>
    </plugins>
</build>


3.6) 服务提供者microservice-student-provider-1001增加application.yml信息info

info:
   groupId: $project.groupId$
   artifactId: $project.artifactId$
   version: $project.version$
   负责人: 张三
   联系电话: 110


启动microservice-eureka-server-2001
启动microservice-student-provider-1001

http://localhost:2001/
点击实例 UP (1) - microservice-student:1001
{"groupId":"com.andrew.springcloud","artifactId":"microservice-student-provider-1001","version":"0.0.1-SNAPSHOT","负责人":"张三","联系电话":110}


4. Eureka注册中心高可用集群配置

4.1) 新建两个module Eureka注册中心microservice-eureka-server-2002 Eureka注册中心microservice-eureka-server-2003
新建服务消费者项目microservice-eureka-server-2002
new -> Maven Module
    -> create a simple project
Module Name:microservice-eureka-server-2002
Parent Project:microservice
Working set:SpringCloud
    -> Artifact
Group Id:com.andrew.springcloud
Artifact Id:microservice-eureka-server-2002
Version:0.0.1-SNAPSHOT
Packaging:jar


新建服务消费者项目microservice-eureka-server-2003
new -> Maven Module
    -> create a simple project
Module Name:microservice-eureka-server-2003
Parent Project:microservice
Working set:SpringCloud
    -> Artifact
Group Id:com.andrew.springcloud
Artifact Id:microservice-eureka-server-2003
Version:0.0.1-SNAPSHOT
Packaging:jar


4.2) 两个Eureka注册中心添加pom依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.andrew.springcloud</groupId>
        <artifactId>microservice</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-eureka-server-2002</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!-- 修改后立即生效,热部署 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>
</project>


<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.andrew.springcloud</groupId>
        <artifactId>microservice</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-eureka-server-2003</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!-- 修改后立即生效,热部署 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>
</project>


4.3) 两个Eureka注册中心增加启动类

package com.andrew;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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


package com.andrew;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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


4.4) 修改本地hosts

单机时候eureka注册中心实例名称localhost,如果改成集群直接配置本机hosts,来实现本机域名映射

C:\Windows\System32\drivers\etc打开hosts,增加配置
127.0.0.1  eureka2001.andrew.com
127.0.0.1  eureka2002.andrew.com
127.0.0.1  eureka2003.andrew.com


4.5) 修改三个Eureka注册中心application.yml文件,主要是修改hostname和defaultZone

server:
  port: 2001
  context-path: /
  
eureka: 
  instance:
    # 单机
    # hostname: localhost #eureka注册中心实例名称
    # 集群
    hostname: eureka2001.andrew.com 
    
  client: 
    register-with-eureka: false #false 由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己。
    fetch-registry: false #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
    service-url: 
       # 单机
       # defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka注册中心交互的地址,查询服务和注册服务用到
       # 集群
       defaultZone: http://eureka2002.andrew.com:2002/eureka/,http://eureka2003.andrew.com:2003/eureka/



server:
  port: 2002
  context-path: /
  
eureka: 
  instance:
    # 单机
    # hostname: localhost #eureka注册中心实例名称
    # 集群
    hostname: eureka2002.andrew.com
  client: 
    register-with-eureka: false #false 由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己。
    fetch-registry: false #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
    service-url: 
       # 单机
       # defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka注册中心交互的地址,查询服务和注册服务用到
       # 集群
       defaultZone: http://eureka2001.andrew.com:2001/eureka/,http://eureka2003.andrew.com:2003/eureka/


server:
  port: 2002
  context-path: /
  
eureka: 
  instance:
    # 单机
    # hostname: localhost #eureka注册中心实例名称
    # 集群
    hostname: eureka2002.andrew.com
  client: 
    register-with-eureka: false #false 由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己。
    fetch-registry: false #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
    service-url: 
       # 单机
       # defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka注册中心交互的地址,查询服务和注册服务用到
       # 集群
       defaultZone: http://eureka2001.andrew.com:2001/eureka/,http://eureka2003.andrew.com:2003/eureka/


4.6) 修改服务提供者microservice-student-provider-1001的application.yml,主要修改eureka.client.service-url.defaultZone

server:
  port: 1001
  context-path: /
 
# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springcloud
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  thymeleaf:
    cache: false
eureka:
  instance:
    hostname: localhost  #eureka客户端主机实例名称
    appname: microservice-student  #客户端服务名
    instance-id: microservice-student:1001 #客户端实例名称
    prefer-ip-address: true #显示IP
  client: 
    service-url: 
      # 单机
      # defaultZone: http://localhost:2001/eureka   #把服务注册到eureka注册中心
      # 集群
      defaultZone: http://eureka2001.andrew.com:2001/eureka/,http://eureka2002.andrew.com:2002/eureka/,http://eureka2003.andrew.com:2003/eureka/
info:
   groupId: $project.groupId$
   artifactId: $project.artifactId$
   version: $project.version$
   负责人: 张三
   联系电话: 110


启动microservice-eureka-server-2001
启动microservice-eureka-server-2002
启动microservice-eureka-server-2003
启动microservice-student-provider-1001

http://eureka2001.andrew.com:2001/
显示eureka2002.andrew.com eureka2003.andrew.com两个
http://eureka2001.andrew.com:2002/
显示eureka2001.andrew.com eureka2003.andrew.com两个
http://eureka2001.andrew.com:2003/
显示eureka2001.andrew.com eureka2002.andrew.com两个

三个服务中心都有microservice-student:1001

这里本质是三个服务注册中心都有我们服务提供者的信息,等后面通过默认轮询,会去找对应的服务注册中心;通过集群,能减轻每个服务注册中心的压力;


5. 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.
开发环境,我们经常会遇到这个红色的警告;

当我们长时间为访问服务以及变更服务实例名称的时候,就会出现这个红色警告;
默认情况,如果服务注册中心再一段时间内没有接收到某个微服务实例的心跳,服务注册中心会注销该实例(默认90秒)。

由于正式环境,经常会有网络故障,网络延迟问题发生,服务和注册中心无法正常通信,此时服务是正常的,不应该注销该服务,Eureka这时候,就通过"自我保护模式"来解决问题,当短时间和服务失去通信时,保留服务信息,当恢复网络和通信时候,退出"自我保护模式";
通过"自我保护模式",使Eureka集群更加的健壮和稳定;
  • 大小: 129.3 KB
分享到:
评论

相关推荐

    spring cloud eureka服务注册与发现

    Spring Cloud Eureka是Spring Cloud框架中的一个核心组件,主要用于实现微服务架构中的服务注册与发现功能。在微服务架构中,服务之间的通信依赖于服务发现机制,Eureka就是扮演这个角色,帮助各个微服务实例自动...

    01Spring Cloud Eureka:服务注册与发现1

    Eureka是Spring Cloud Netflix子项目的核心组件之一,它提供了服务注册与发现机制,允许微服务在注册中心注册自己的地址及端口信息,然后在需要调用其他服务时,从注册中心获取服务列表,并调用对应的服务实例。

    Eureka服务注册与发现-示例代码

    Eureka是Spring Cloud Netflix框架中的一个关键组件,主要用于实现服务的注册与发现。在微服务架构中,Eureka充当了服务注册中心的角色,使得服务提供者可以将自己的服务注册到Eureka服务器,同时服务消费者可以通过...

    eureka服务注册发现demo

    在分布式系统中,服务治理是不可或缺的一环,而Eureka是...通过服务提供者向Eureka注册,服务消费者从Eureka获取服务实例,配合Spring Boot和Spring Cloud的其他组件,我们可以构建出高可用、可扩展的分布式系统。

    EureKa服务注册与发现.docx

    EureKa是Spring Cloud框架中的核心组件,它主要负责服务的注册与发现,使得微服务架构中的服务能够互相找到并进行通信。EureKa的设计理念遵循了可用性(Availability)优先于一致性(Consistency)的原则,即AP原则,这...

    Eureka服务注册与发现

    Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现在分布式环境下的服务发现、服务注册的功能。采用的是客户端发现模式。

    SpringCloud基础概念与入门+SpringCloud核心组件Eureka服务注册与发现等全套教程

    SpringCloud核心组件Eureka服务注册与发现 SpringCloud核心组件Ribbon负载均衡 SpringCloud核心组件Feign声明式服务调用 SpringCloud核心组件Hystrix断路器与容错机制 SpringCloud核心组件ZuulAPI网关 SpringCloud...

    1-Eureka服务注册与发现以及Eureka集群搭建(实操型)

    在构建分布式系统时,服务注册与发现是至关重要的一个环节,Eureka作为Netflix开源的组件,专门用于实现这一功能。本文将深入探讨Eureka的基本概念、服务注册与发现的原理,以及如何搭建Eureka集群,以提升系统的...

    springcloud之eureka注册服务与发现

    在Spring Cloud生态系统中,Eureka是核心组件之一,主要用于服务的注册与发现。Eureka的工作原理、使用方式以及源码分析对于理解微服务架构中的服务治理至关重要。下面将详细阐述Eureka的相关知识点。 1. **Eureka...

    spring-cloud-eureka 服务注册及发现实例

    在这个实例中,我们将探讨如何利用 Spring Cloud Eureka 实现服务注册与发现,以及相关的配置和实践。 首先,Spring Boot 是一个快速开发框架,它简化了创建独立、生产级别的基于 Spring 的应用程序。版本 2.1.10....

    Eureka服务注册中心学习笔记

    Eureka是Netflix公司开源的一款基于Java的微服务发现组件,它是Spring Cloud生态体系中的关键一环,用于实现服务的注册与发现。Eureka通过提供一个中心化的服务注册表,使得微服务实例可以在启动时向Eureka注册自己...

    Eureka服务注册和消费案例

    在Spring Cloud生态系统中,Eureka是关键的组件之一,它主要负责服务的注册与发现,是构建微服务架构的重要基石。本案例将深入探讨Eureka如何作为服务注册中心以及服务消费者的角色来工作。 首先,Eureka作为一个...

    dubbo服务注册到eureka.zip

    Eureka 是 Netflix 的服务发现组件,通过提供服务注册与发现的功能,帮助微服务架构中的各个服务能够相互找到并通信。 首先,要将 Dubbo 服务注册到 Eureka,我们需要对这两个框架有一定的理解。Eureka 由两部分...

    微服务SpringCloud+Eureka+Web

    【微服务SpringCloud+Eureka+Web】是一种基于Java的微服务架构实现,它结合了SpringCloud框架和Eureka服务注册与发现组件,并且利用Web技术进行应用开发。SpringCloud是Spring公司推出的微服务解决方案,旨在简化...

    Spring Cloud eureka服务注册DEMO

    我们将基于提供的"Spring Cloud Eureka服务注册DEMO"来理解其核心概念,并探索如何通过三个Spring Boot应用——服务注册模块、服务提供模块和服务发现与消费模块——实现服务注册与发现。 1. **Eureka概述**: ...

    SpringCloud-服务注册与实现-Eureka创建服务提供者示例源码.zip

    总的来说,Eureka是Spring Cloud中的关键组件,它的服务注册与发现机制简化了微服务之间的通信,降低了系统的复杂性。通过学习和实践这个Eureka服务提供者示例,开发者能够深入理解Eureka的工作原理,并将其应用到...

    springcloud eureka 服务注册中心

    Spring Cloud Eureka 就是这样的一个服务注册与发现工具,它是 Netflix 提供的开源项目,是 Spring Cloud 生态系统中的重要组成部分。Eureka 通过提供服务注册与发现功能,帮助构建松耦合、高可用的分布式系统。 **...

    微服务架构核心组件:服务注册中心Eureka

    Spring Cloud是实现微服务架构的常用框架,其中Eureka是其关键组件之一,用于服务注册与发现。 Eureka是Netflix开源的一个服务注册中心,它的主要功能是为微服务架构中的各个服务提供注册和发现的能力。服务注册是...

    SpringCloud——服务的注册与发现Eureka

    SpringCloud是中国开发者广泛使用的微服务框架之一,其中Eureka是其核心组件,主要负责服务的注册与发现。本文将深入探讨Eureka的工作原理、配置以及如何在实际项目中使用它来构建服务注册中心和实现服务提供者的...

    微服务之Eureka服务注册中⼼

    Eureka是Netflix开源的服务注册和发现组件,基于RestFul API开发,广泛应用于Spring Cloud体系中。Eureka的主要特点是提供了高可用性和高扩展性,能够满足大规模微服务系统的需求。 Eureka服务注册中心的实现原理是...

Global site tag (gtag.js) - Google Analytics