一、原理介绍
- Eureka是Netflix开发的一种服务发现和负载均衡框架,用于在分布式系统中管理和监控服务的注册和发现,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。
- Spring Cloud Eureka 是对Netflix公司的Eureka的二次开发,包含两个组件:服务端 (Eureka Server) 与客户端(Eureka Client),服务端即是Eureka服务注册中心,客户端完成微服务向Eureka服务的注册与发现。服务端和客户端都是用java实现的。
-
1、 Eureka Server:
- Eureka服务器是一个中央注册服务器,用于管理和维护服务的注册表。
- 每个服务实例在启动时,会向Eureka服务器注册自己的信息,包括服务名、主机名、端口等。
- Eureka服务器会维护一个心跳机制,定期向注册的服务实例发送心跳请求,以确保服务实例的可用性。
2、 服务注册和发现:
- 当服务实例启动时,会通过Eureka客户端向Eureka服务器注册自己的信息。
- Eureka客户端会定期向Eureka服务器发送心跳请求,以表明服务实例的可用性。
- 其他服务在需要访问该服务时,可以通过Eureka客户端向Eureka服务器获取可用的服务实例列表,然后选择一个合适的实例进行访问。
3、 服务负载均衡:
- Eureka客户端会缓存从Eureka服务器获取的可用服务实例列表,以提高访问的性能。
- 客户端可以使用负载均衡算法(如轮询、随机等)选择一个要访问的服务实例。
- 如果某个服务实例不可用(心跳超时、服务停止运行等),Eureka客户端会从缓存中移除该实例,并更新可用实例列表。
4. 高可用性:
- Eureka支持集群部署,通过多个Eureka服务器实现高可用性。
- Eureka服务器之间会进行互相注册和同步,以保持服务注册表的一致性。
- 客户端可以配置多个Eureka服务器地址,以便在主服务器不可用时自动切换到备用服务器。
5、Eureka Client
- Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
二、Eureka 代码解析
- 如何实现Eureka注册中心,也就是Eureka Server;
新建一个父工程,删除src文件,增加pom文件,做一下简单的配置,pom文件如图
<?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>
<parent>
<groupId>org.storemanage.regestercenter</groupId>
<artifactId>springcloudexample</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>eurekamodule</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--eureka-server-->
<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-web</artifactId>
</dependency>
</dependencies>
</project>
- 创建一个子工程项目eurekamodule(名称见名之意可以根据自己具体项目命名,pom文件相关依赖
<?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>
<parent>
<groupId>org.storemanage.regestercenter</groupId>
<artifactId>springcloudexample</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>eurekamodule</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--eureka-server-->
<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-web</artifactId>
</dependency>
</dependencies>
</project>
- 项目结构如何
- 启动类代码
package org.storemanage.regestercenter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @CreateTime: 2024-08-22
* @Description: 注册中心
* @Version: 1.0
* @Author: hkf
*/
@EnableEurekaServer
@SpringBootApplication
public class GsEurekaServer {
public static void main(String[] args) {
SpringApplication.run(GsEurekaServer.class, args);
}
}
- 在resource下面新建 配置文件application.yml
server:
port: 9999 #d端口号
eureka:
instance:
appname: eurekacenter # 实例名称
hostname: eureka9999.com #主机地址
client:
register-with-eureka: false # 表示自己是注册中心,不能自己注册自己
fetch-registry: false # 注册中心职责是维护服务,不需要去检索服务
server-url:
defaultZone: http://eureka9999.com:9999/eureka #其他服务注册到注册中心交互地址
- 启动项目,通过浏览器访问注册中心,效果如图
访问地址:根据自己定义的端口号进行访问,localhost:9999
四、总结
-
Eureka通过集中管理和监控服务的注册和发现,提供了分布式系统中服务调用的可靠性和可用性。它的原理和实践可以帮助开发人员轻松地实现服务发现和负载均衡功能,提高系统的可扩展性和可维护性。
-
Eureka是Netflix开源的一个服务发现框架,被广泛应用于微服务架构中。它通过建立一个注册中心来负责服务的注册与发现,使得微服务之间能够方便地相互调用。
如有不足欢迎指出,期待与各位大佬共同进步