03Eureka

本贴最后更新于 2204 天前,其中的信息可能已经时移俗易

服务注册和发现 Eureka

Eureka 简介

什么是 Eureka

Eureka 是一个用于服务注册和发现的组件, 最开始主要应用于亚马逊公司旗下的云计算服务平台 AWS。Eureka 分为 Eureka Server 和 Eureka Client, Eureka Server 为 Eureka 服务注册中心, Eureka Client 为 Eureka 客户端 。

Eureka 的优势

首先 Eureka 完全开源,在功能和性能上都非常稳定。其次,Eureka 是 SpringCloud 首先推荐的服务注册与发现组件,与 SpringCloud 其它组件可以无缝对接。最后,Eureka 和其它组件,比如负载均衡组件 Ribbon、熔断器组件 Hystrix、熔断器监控组件 Hystrix Dashboard 组件、熔断器聚合监控 Turbine 组件,以及网关 Zuul 组件相互配合,能够很容易实现服务注册、负载均衡、熔断和智能路由等功能。

Eureka 的基本架构

Eureka 主要有以下三种角色:

  • Regeister Service:服务注册中心,它是一个 Eureka Server,提供服务注册和发现的功能。
  • Provider Service:服务提供者,它是一个 Eureka Client,提供服务。
  • Consumer Service:服务消费者,它是一个 Eureka Client,消费服务。

基本过程如下:首先需要一个服务注册中心 Eureka Server,服务提供者 Eureka Client 向服务注册中心 Eureka Server 注册,将自己的信息(比如服务名和服务的 IP 地址等)通过 REST API 的形式提交给服务注册中心 Eureka Server。同样,服务消费者 Eureka Client 也向服务注册中心 Eureka Server 注册,同时服务消费者获取一份服务注册列表的信息,该列表包含了所有向脱务注册中心 Eureka Server 注册的服务信息。获取服务注册列表信息之后,服务消费者就知道服务提供者的 IP 地址,可以通过 Http 远程调度来消费服务提供者的服务。

编写一个 Eureka 注册和发现的例子

####创建 maven 主工程
为了方便管理,这里采用 Maven 多 Module 的结构。首先创建一个 Maven 主工程,最终项目结构如下

|_eureka_study
	|_.idea
	|_eureka-client
	|_eureka-server
	|_eureka_study.iml
	|_pom.xml

然后编写 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>
    <groupId>com.eureka</groupId>
    <artifactId>eureka_study</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.SR1</spring-cloud.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

####创建服务注册中心
再创建一个 eureka-server 的 Module 工程,采用 Spring Initializr 的方式构建。作为服务注册中心
目录工程如下:

|_eureka-server
	|_.mvn
    |_src
    	|_...
    |_pom.xml

pom 文件代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <groupId>com.example</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>com.eureka</groupId>
        <artifactId>eureka_study</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

添加配置文件,命名为 application.yml

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

编写相关 application 的 java 文件,在类上加上 @EnableEurekaServer 注解,然后以 springboot 方式启动程序启动类,在浏览器上访问 Eureka Server 的主界面 http://localhost:876l 。

####编写 eureka-client
在主 Maven 工程中创建一个新的 Module 工程,命名为 eureka-client , 该工程作为 Eureka Client 的工程 向服务注册中心 Eureka server 注册 。
目录工程如下:

|_eureka-client
	|_.mvn
    |_src
    	|_...
    |_pom.xml

然后修改 pom 文件:

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <groupId>com.example</groupId>
    <artifactId>eureka-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>eureka-client</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>com.eureka</groupId>
        <artifactId>eureka_study</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <dependencies>
        <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

同样的,Eureka-client 也需要它的配置文件,这里我们可以创建一个 bootstrap.yml 文件,内容如下:

server:
  port: 8762
spring:
  application:
    name: eureka-client

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

然后我们可以在 Eureka-client 的启动类上加上 @EnableEurekaClient,就可以运行测试了。运行成功后再次进入 http://localhost:8761 就可以看到有一个服务已经注册了。

深入理解 Eureka

Register - 服务注册

当 Eureka Client 向 Eureka Server 注册时,Eureka Client 提供自身的元数据,比如 IP 地址、端口、运行状况指标的 URL、主页地址等信息。
源码解析:TODO

Renew - 服务续约

Eureka Client 在默认的情况下会每隔 30 秒发送一次心跳来进行服务续约。告知 Eureka Server 该 Eureka client 仍然可用,没有出现故障。
源码解析:TODO

Fetch Registries - 获得服务注册列表信息

Eureka Client 从 Eureka Server 获取服务注册表信息,并将其缓存到本地。然后 Eureka Client 会使用得到的信息来远程调用其它服务。并且该注册列表信息会定时更新一次(默认 30 秒)。Eureka Server 与 Eureka Client 可以使用 JSON 和 XML 数据格式进行通信,默认情况下使用 JSON 格式
源码解析:TODO

Cancel - 服务下线

Eureka Client 在程序关闭时可以向 Eureka Server 发送下线请求。发送请求后,该客户端的实例信息将从 Eureka Server 的服务注册列表中删除。下线请求需要在程序关闭时调用以下代码:
DiscoveryManager.getInstance().shutdownComponent();
源码解析:TODO

Eviction - 服务剔除

默认情况下,当 Eureka Client 连续 90 秒没有向 Eureka Server 发送心跳时,EUreka Server 会将该服务实例从服务注册列表删除,即㐏剔除
源码解析:TODO

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3454 回帖 • 189 关注
  • Eureka
    22 引用 • 3 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...