目录
简介
Eureka 提供基于 REST 的服务的管理。使用该框架后,可以将业务组件注册到 Eureka 容器中,Eureka 主要维护这些服务的列表并自动检查它们的状态 。
构建Eureka应用
Eureka架构
- Eureka 服务器:保存已注册服务实例,保持客户端的最新状态。
- Eureka 客户端(服务提供者):提供服务,并发送心跳检测,同时可以获取服务器的注册列表。
- Eureka 客户端(服务调用者):对服务进行发现与调用。
注:
Eureka 客户端保存了服务注册表信息,调用服务的时候不再进过服务器。
构建Eureka服务器
- 新建项目时,选择
eureka server
- 对应的
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.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.alex</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>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 启动类中添加注解
@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- 默认情况下,Eureka服务器也会把自己当成客户端,注册自己,此时会报错。
配置application.yml
,取消自注册。
eureka:
client:
register-with-eureka: false //不向服务器注册
fetch-registry: false //不拉取服务器的注册列表
- 启动服务器,访问
构建Eureka服务提供者(Eureka客户端)
- 新建Spring boot项目时,选择
- 项目构建完成之后,具体的
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.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.alex</groupId>
<artifactId>eureka_provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka_provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 在boot启动类中添加
@EnableEurekaClient
注释
@SpringBootApplication
@EnableEurekaClient
public class EurekaProviderApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
}
- 在
application.yml
中添加以下配置
server:
port: 9001
spring:
application:
name: hello-server-provider
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:9000/eureka
- 添加一个Restful接口
@RestController
public class HelloController {
@GetMapping("/hi")
public String sayHi(){
return "hello,world!";
}
}
- 启动项目,可以看到
eureka server
界面出现对应服务提供者信息,接口也可调用
Eureka服务器集群
在实际生产环境中,经常需要对Eureka服务器进行集群操作,集群Eureka服务器的方法非常简单,就是让各个服务器进行相互注册。假如有三台服务器,则它们的配置文件可以进行如下修改:
---
spring:
application:
name: spring-cloud-eureka
server:
port: 8001
eureka:
instance:
hostname: localhost1
client:
serviceUrl:
defaultZone: http://localhost2:8002/eureka/,http://localhost3:8003/eureka/
---
spring:
application:
name: spring-cloud-eureka
server:
port: 8002
eureka:
instance:
hostname: localhost2
client:
serviceUrl:
defaultZone: http://localhost1:8001/eureka/,http://localhost3:8003/eureka/
---
spring:
application:
name: spring-cloud-eureka
server:
port: 8002
eureka:
instance:
hostname: localhost3
client:
serviceUrl:
defaultZone: http://localhost1:8001/eureka/,http://localhost2:8002/eureka/
Eureka常用配置
心跳检测配置
- eureka.instance .leaseRenewallntervallnSeconds :指定客户端发送到服务器的心跳间隔时间,默认为30秒。
- eureka.instance.leaseExpirationDurationlnSeconds :指定服务器没有收到心跳的最大时限,果在一定期限内没有接收到服务实例的心跳,那么会将该实例从注册表中清理掉,默认值为90秒。
注册表抓取时间间隔
eureka.client.registryFetchIntervalSeconds :指定客户端到服务器抓取服务注册表的时间间隔,默认为30秒。
服务自我保护模式
客户端会定时发送心跳给服务器端,如果心跳的失败率超过一定比例,服务会将这些实例保护起来。此时,该宕机服务仍然存在注册表中,可能导致“雪崩”效应,可以通过将eureka.server.enable-self-preservation
设置为false,关闭自我保护模式。