Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于 Netflix Eureka 做了二次封装。主要负责完成微服务架构中的服务治理功能。
- 服务注册:在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,包括服务的主机与端口号、服务版本号、通讯协议等一些附加信息。注册中心按照服务名分类组织服务清单,同时还需要以心跳检测的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,以达到排除故障服务的效果。
- 服务发现:在服务治理框架下,服务间的调用不再通过指定具体的实例地址来实现,而是通过服务名发起请求调用实现。服务调用方通过服务名从服务注册中心的服务清单中获取服务实例的列表清单,通过指定的负载均衡策略取出一个服务实例位置来进行服务调用。
一、Eureka简介
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。它既包含了服务端组件,也包含了客户端组件。
- Eureka 服务端:即服务注册中心。它同其他服务注册中心一样,支持高可用配置(支持集群模式部署)。依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。
- Eureka 客户端:主要处理服务的注册和发现。在应用程序启动时,Eureka 客户端向服务注册中心注册自身提供的服务,并周期性的发送心跳来更新它的服务租约。同时,他也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期行的刷新服务状态。
上图简要描述了Eureka的基本架构,由3个角色组成:
- Eureka Server
- 提供服务注册和发现
- Service Provider
- 服务提供方
- 将自身服务注册到Eureka,从而使服务消费方能够找到
- Service Consumer
- 服务消费方
- 从Eureka获取注册服务列表,从而能够消费服务
二、创建服务注册中心-服务端
2.1、创建项目
首先我们需要创建一个项目。我们这里使用IDEA创建,文件-》新建-》项目-》下一步到如下的页面:
然后在点下一步,直到完成。
2.2、修改依赖
这里我们 SpringCloud 使用的 Hoxton.SR6 的版本,SpringBoot 使用的 2.3.5.RELEASE 版本。当然大家也可以用IEDA默认创建的版本。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
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.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR9</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>
</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>
2.3、添加配置
编辑项目的 application.properites 文件,添加如下相关配置:
#服务注册中心端口号
server.port=2000
#指定服务名称
spring.application.name=piao-server
#服务注册中心实例的主机名
eureka.instance.hostname=localhost
#表示是否将自己注册在EurekaServer上,默认为true。由于当前应用就是EurekaServer,所以置为false
eureka.client.register-with-eureka=false
#表示表示是否从EurekaServer获取注册信息,默认为true。单节点不需要同步其他的EurekaServer节点的数据
eureka.client.fetch-registry=false
#设置Eureka的地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
在启动类上添加 @EnableEurekaServer 注解。
@EnableEurekaServer
@SpringBootApplication
public class PiaoServerApplication {
public static void main(String[] args) {
SpringApplication.run(PiaoServerApplication.class, args);
}
}
2.4、启动访问注册中心
其中 Instances currently registered with Eureka 一栏是空的,说明注册中心还没有注册任何服务。
2.5、关不保护机制
当我们在本地调试基于 Eureka 的程序时,基本上会碰在服务注册中心的信息面板中出现如下这样的红色警告信息:
该警告就是触发了 Eureka Server 的自我保护机制。服务注册到 Eureka Server 之后,会维护一个心跳连接,告诉 Eureka Server 自己还活着。Eureka Server 在运行期间,会统计心跳失败的比例在 15 分钟之内是否低于 85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),EurekaServer 会将当前的实例注册信息保护起来,让这些实例不会过期,尽可能保护这些注册信息。
注意:在这段保护期间内实例若出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如可以使用请求重试、断路器等机制。
编辑项目的 application.properites 文件。
#关闭保护机制
eureka.server.enable-self-preservation=false
三、创建注册中心-客户端
3.1、创建项目
首先我们需要创建一个项目。我们这里使用IDEA创建,文件-》新建-》项目-》下一步到如下的页面:
然后在点下一步,直到完成。
3.2、修改依赖
这里我们 SpringCloud 使用的 Hoxton.SR6 的版本,SpringBoot 使用的 2.3.5.RELEASE 版本。当然大家也可以用IEDA默认创建的版本。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
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.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.piao</groupId>
<artifactId>piao-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>piao-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR9</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-test</artifactId>
<scope>test</scope>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>
3.3、添加配置
编辑项目的 application.properites 文件,添加如下相关配置:
#服务注册中心端口号
server.port=2010
#指定服务名称
spring.application.name=piao-client
#指定服务注册中心的地址
eureka.client.serviceUrl.defaultZone=http://localhost:2000/eureka/
#更多常用配置
#获取注册中心的服务请求清单。默认为true
eureka.client.fetch-registry=true
#修改缓存清单的更新时间。默认为30秒
eureka.client.registry-fetch-interval-seconds=30
#是否注册到Eureka Server上,默认true
eureka.client.register-with-eureka=true
#定义服务续约任务的调用时间间隔(即发送心跳给server端的频率),默认为30秒
eureka.instance.lease-renewal-interval-in-seconds=30
#定于服务失效的时间(即server端多长时间没收到心跳后就将此实例剔除),默认为90秒
eureka.instance.lease-expiration-duration-in-seconds=90
#在注册列表显示IP+端口。H版本默认就是显示IP+端口。
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
在启动类上添加 @EnableDiscoveryClient 注解。
@EnableDiscoveryClient
@SpringBootApplication
public class PiaoClientApplication {
public static void main(String[] args) {
SpringApplication.run(PiaoClientApplication.class, args);
}
}
3.4、添加控制类
这个接口主要输出应用的端口,主要用于后面的文章。
@RestController
public class ClientController {
@Value("${server.port}")
private String port;
@GetMapping("/client")
public void client() {
System.out.println("my port is " + port);
}
@GetMapping("/param")
public String param(@RequestParam String param) {
return "port is " + port + "。param is" + param;
}
}
3.5、启动访问注册中心