目录
三、搭建 Eureka 服务提供者 (Service Provider)
3.application.yml 添加 Eureka 注册配置
一、Eureka介绍
以下内容来自百度百科
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
Eureka的作用
Eureka是一款由Netflix开发的基于Java的服务发现框架,主要用于微服务架构中的服务注册与发现。在分布式系统中,服务实例可能频繁地启动和关闭,传统的静态配置方式难以应对这种动态变化。Eureka通过维护服务实例的注册表,解决了服务位置的不确定性问题,使得服务调用方能够通过服务名称找到服务提供方。
为什么使用Eureka
- 服务动态管理:Eureka能够动态地管理服务实例的注册和注销,即使服务实例频繁上下线也能保持服务间的正常通信。
- 容错机制:Eureka具有自我保护机制,在网络分区的情况下,服务实例不会被立即注销,从而保证了系统的高可用性。
- 简化服务发现:Eureka提供了简单易用的API,使得服务发现变得非常容易。
- 易于集成:Eureka与Spring Cloud紧密结合,可以轻松地集成到Spring Boot项目中。
服务治理
服务治理是指对服务实例进行管理和监控的过程,包括但不限于服务注册、服务发现、负载均衡、故障恢复等。Eureka通过其服务端和客户端两部分实现了服务治理的关键功能。
服务注册
服务注册是指服务实例向服务注册中心(如Eureka Server)注册自身的过程。在注册时,服务实例会提供必要的元数据,比如服务地址、端口、健康检查路径等信息。这些信息将被Eureka Server存储起来,以便后续的服务发现。
服务发现
服务发现是指服务调用方根据服务名称查找服务实例的过程。Eureka Client可以从Eureka Server获取服务实例列表,并从中选择合适的实例进行调用。服务发现过程是透明的,开发者只需要关注业务逻辑即可。
Eureka的服务端与客户端
Eureka服务端
Eureka服务端的主要职责是维护服务实例的注册表,包括以下功能:
- 服务实例注册:接收来自客户端的服务实例注册请求,并存储服务实例的信息。
- 服务实例更新:接收服务实例的心跳信号,以确定服务实例是否仍然活跃。
- 服务实例注销:如果长时间没有收到某个服务实例的心跳,则将其从注册表中移除。
- 服务实例查询:提供接口供客户端查询服务实例列表。
Eureka客户端
Eureka客户端则通常部署在每个服务实例上,其功能包括:
- 服务注册:在启动时向Eureka Server注册服务实例,并定期发送心跳信号。
- 服务发现:从Eureka Server获取服务实例列表,并根据负载均衡策略选择合适的服务实例进行调用。
- 自我保护:在网络不稳定的情况下,Eureka客户端可以进入自我保护模式,避免不必要的服务实例注销。
二、搭建Eureka服务模块
1. 创建Eureka Server项目
创建一个新的Spring Boot项目,命名为eureka-server
。
2. pom.xml
在项目的pom.xml
文件中添加Eureka Server依赖:
<?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>
<groupId>com.example</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Eureka Server</name>
<description>Eureka Server for Service Discovery</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka Server dependency -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3. application.yml
配置Eureka Server的application.yml
文件:
spring:
application:
name: eureka-server
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4. 主程序
创建主程序EurekaServerApplication.java
:
package com.example.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
5. 修改host文件
为了支持多个服务实例在同一台机器上的测试,可以在C:\Windows\System32\drivers\etc\hosts
(Windows)或/etc/hosts
(Linux/MacOS)中添加以下行:
127.0.0.1 localhost
127.0.0.1 eureka-server
-
这样可以在本地环境中使用域名访问 Eureka Server。
三、搭建 Eureka 服务提供者 (Service Provider)
-
修改 item-service 模块
假设你有一个名为
item-service
的模块,现在需要将其改造为 Eureka 服务提供者。 -
pom.xml
在
item-service
的pom.xml
文件中添加 Eureka Client 的依赖。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
3.application.yml 添加 Eureka 注册配置
在 application.yml
文件中添加 Eureka Client 的配置。
spring:
application:
name: item-service
eureka:
client:
service-url:
defaultZone: http://eureka-server:8761/eureka/
4.主程序添加服务注册发现客户端
在 item-service
的主类中添加 @EnableEurekaClient
注解。
@SpringBootApplication
@EnableEurekaClient
public class ItemServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ItemServiceApplication.class, args);
}
}
5.启动并查看服务注册情况
- 启动 Eureka Server 和
item-service
。 - 打开浏览器访问 Eureka Server 的控制台页面(默认为
http://localhost:8761/
或http://eureka-server:8761/
)。 - 查看服务实例列表,确认
item-service
是否已经成功注册。
四、Eureka 的使用
服务提供者的“高可用”
为了实现服务提供者的高可用,可以通过启动多个相同的实例来实现。这里以启动两个 item-service
实例为例。
-
配置启动参数
在
application.yml
文件中,可以为每个实例设置不同的端口号。
server:
port: 8081 # 第一个实例
对于第二个实例:
server:
port: 8082 # 第二个实例
-
启动两个服务,并查看注册信息
分别启动两个
item-service
实例,然后通过 Eureka Server 控制台页面查看服务实例的注册信息。确认两个实例都被成功注册。
五、Eureka 的高可用
为了实现 Eureka Server 的高可用,可以部署多个 Eureka Server 实例,并让它们互相注册,形成集群。
-
添加两个配置 yml 文件
创建两个配置文件,分别为
application-eureka1.yml
和application-eureka2.yml
。application-eureka1.yml:
spring: application: name: eureka-server server: port: 8761 eureka: instance: hostname: eureka1 client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://eureka2:8762/eureka/
application-eureka2.yml:
spring: application: name: eureka-server server: port: 8762 eureka: instance: hostname: eureka2 client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://eureka1:8761/eureka/
配置启动参数
在命令行中分别使用不同的配置文件启动两个 Eureka Server 实例。
对于第一个实例:
java -jar eureka-server.jar --spring.profiles.active=eureka1
对于第二个实例:
java -jar eureka-server.jar --spring.profiles.active=eureka2
-
启动两台服务器,查看注册信息
启动两个 Eureka Server 实例后,通过访问任何一个 Eureka Server 的控制台页面(例如
http://localhost:8761/
或http://localhost:8762/
),可以看到两个 Eureka Server 实例相互注册的情况。 -
修改 item-service 服务的 yml
修改
item-service
的application.yml
文件,使其能够注册到两个 Eureka Server 实例上。spring: application: name: item-service eureka: client: service-url: defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/