服务注册和发现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/> </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:
|
然后我们可以在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