03Eureka

服务注册和发现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主工程,最终项目结构如下

1
2
3
4
5
6
|_eureka_study
|_.idea
|_eureka-client
|_eureka-server
|_eureka_study.iml
|_pom.xml

然后编写pom.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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 的方式构建。作为服务注册中心
目录工程如下:

1
2
3
4
5
|_eureka-server
|_.mvn
|_src
|_...
|_pom.xml

pom文件代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?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

1
2
3
4
5
6
7
8
9
10
11
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 注册 。
目录工程如下:

1
2
3
4
5
|_eureka-client
|_.mvn
|_src
|_...
|_pom.xml

然后修改pom文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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文件,内容如下:

1
2
3
4
5
6
7
8
9
10
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


03Eureka
https://code666.top/articles/2018/12/09/1544359283271.html
作者
Sean
发布于
2018年12月9日
许可协议