SpringCloud-微服务-Eureka
什么是 Eureka?
和Consul Zookeeper 类似,Eureka 是一个用于服务注册和发现的组件.
Eureka 的一些概念
- Register 一一服务注册
- 当eureka Client 向Eureka Server 注册时 Eureka Client 提供自身的元数据,比如 IP 地址、端口、运行状况指标的 Uri 主页地址等信息。
- Renew一一服务续约
- Eureka client 在默认的情况下会每隔 30 秒发送一次心跳来进行服务续约。通过服务续约来告知 eureka Server该eureka Client 仍然可用,没有出现故障。
- Fetch Registries一一获取服务注册列表信息
- Eureka Client 从Eureka Server 获取服务注册表信息,井将其缓存在本地。 Eureka Client会使用服务注册列表信息查找其他服务的信息,从而进行远程调用。
- Cancel-一服务下线
- Eureka Client 在程序关闭时可以向 Eureka Server 发送下线请求,发送请求后,该客户端的实例信息将从 Eureka Server 的服务注册列表中删除。该下线请求不会自动完成,需要在程序关闭时调用以下代码:DiscoveryManager . getinstance() .shutdownComponent();
- Eviction一一服务剔除
- 在默认情况下,当 Eureka Client 90 秒没有向 Eureka Server 发送服务续约(即心跳〉时, Eureka Server 会将该服务实例从服务注册列表删除,即服务剔除。
为什么 Eureka Client 获取服务实例这么慢
- Eureka Client 注册延迟
Eureka Client 启动之后,不是立即向 Eureka Server 注册的,而是有一个延迟向服务端注册的时间。 - Eureka Server 的响应缓存
Eureka Server 维护每 30 秒更新一次响应缓存,可通过更改配置 eureka.server.responseCacheUpdatelntervalMs 来修改。所以即使是刚刚注册的实例,也不会立即出现在服务注册列表中。 - Eureka Client 缓存
Eureka Client 保留注册表信息的缓存。该缓存每 30 秒更新一次(如前所述)。因此, Eureka Client 刷新本地缓存并发现其他新注册的实例可能需要 30 秒。 - LoadBalancer 缓存
Ribbon 的负载平衡器从本地的 Eureka Client 获取服务注册列表信息。 Ribbon 本身还维护了缓存,以避免每个请求都需要从 Eureka Client 获取服务注册列表
综上因素,一个新注册的实例,默认延迟 40 秒向服务注册中心注册,所以不能马上被Eureka Server 发现。
另外,刚注册的 Eureka Client 不能立即被其他服务调用,原因是调用方由于各种缓存没有及时获取到最新的服务注册列表信息。
springcloud为什么选择 Eureka?
首先 Eureka 完全开源,是 Netflix 公司的开源产品 ,经历了 Netflix 公司的生产环境的检验,以及3年时间的不断迭代,在功能和性能上都非常稳定
其次 Eureka Spring Cloud 首选推荐的服务注册与发现组件 Spring Cloud 其他组件可以无缝对接。
最后 Eureka 和其他组件,比如负载均衡组件 Ribbon 熔断器组件 Hystrix、熔断器聚合监控 Turbine 组件,以及网关 Zuul 组件相互配合,能够很容易实现服务注册、负载均衡、熔断和智能路由等功能
Eureka 的基本架构
Eureka 的基本架构主要包括以下3种角色:
Register Service :服务注册中心,它是一个 Eureka Server ,提供服务注册和发现的功能。
Provider Service :服务提供者,它是一个 Eureka Client ,提供服务。
Consumer Service :服务消费者,它是一个 Eureka Cient ,消费服务。
编码
采用 Maven Module 的结构,所以需要创建 Maven 主工程
项目结构:
创建maven主工程
创建maven项目,删除src。修改pom.xml:
<?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>org.zwq</groupId>
<artifactId>eureka</artifactId>
<version>1.0-SNAPSHOT</version>
<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 srver
- 在maven主工程里面创建一个 Module 工程,命名为eureka-server 。采用 Spring Initializr 方式构建,作为服务注册中心 Eureka srver 的工程。
- 修改pom.xml:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.zwq</groupId> <artifactId>eureka</artifactId> <version>1.0-SNAPSHOT</version> <relativePath/> </parent> <groupId>com.zwq</groupId> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-server</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <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/
- 在启动类加上注解@EnableEurekaServer,开启 Eureka Server 的功能.
- 启动项目访问http://localhost:8761, 进入Eureka Server 主界面
创建Eureka Client
- 在maven主工程里面创建一个 Module 工程,命名为eureka-client 。采用 Spring Initializr 方式构建,作为Eureka Client
- 修改pom.xml:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.zwq</groupId> <artifactId>eureka</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.zwq</groupId> <artifactId>eureka-client</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-client</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <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>
- 修改配置文件为:bootstrap.yml:
server: port: 8762 spring: application: name: eureka-client eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
- 在程序的启动类加上注解@EnableEurekaClient,开启 Eureka Client 功能
- 启动两个项目,进入Eureka Server 主页,即:http://localhost:8761:
说明 Eureka Client 己成功向 Eureka Server注册。