03Eureka

Published on in java with 443 views

服务注册和发现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

Responses