【JAVA】服务注册与发现(Eureka)

服务注册与发现(Eureka)

1. Eureka 简介

Eureka 是 Netflix 开源的一个服务注册与发现组件,用于在微服务架构中帮助服务自动注册和查找其他服务。它允许微服务通过一个集中式注册中心实现动态的服务发现,从而提高系统的扩展性、灵活性和容错能力。
在微服务架构中,服务注册与发现是至关重要的一部分。Eureka Server 作为注册中心,负责管理所有服务实例的注册信息,Eureka Client 则负责向 Eureka Server 注册自己并定期发送心跳,确保自身服务的可用性。同时,其他服务可以通过 Eureka 查询到已注册的服务并与其通信。

2. Eureka 组件

  • Eureka Server:注册中心,负责存储所有服务的注册信息。
  • Eureka Client:服务客户端,负责注册自身服务并从 Eureka Server 获取其他服务的地址。
  • Eureka Dashboard:提供可视化界面,用于查看当前服务的健康状态和注册信息。

3. Eureka 工作原理

  • 服务注册:Eureka Client 在启动时,将自身信息(如服务名、IP 地址、端口号等)注册到 Eureka Server。
  • 服务续约:Eureka Client 会定期发送心跳(默认每 30 秒一次)给 Eureka Server,保持服务的可用状态。
  • 服务剔除:如果 Eureka Server 在一定时间内未接收到某个服务的心跳信息,会将该服务标记为不可用,并从注册表中剔除。
  • 服务发现:Eureka Client 从 Eureka Server 获取注册表(即所有已注册服务的清单),并缓存该清单来实现服务发现。
  • 自我保护模式:当 Eureka Server 检测到大量服务丢失心跳时,会启动自我保护模式,防止将健康的服务错误地剔除。

4. Eureka 的配置

4.1 搭建 Eureka Server

首先,创建一个 Eureka Server,它将作为服务注册中心,所有服务都需要注册到这里。

1. 添加依赖:

在 pom.xml 中添加 Eureka Server 的依赖:
xml

org.springframework.cloud
spring-cloud-starter-netflix-eureka-server

2. 编写启动类:

在主应用程序类中使用 @EnableEurekaServer 注解启用 Eureka Server:

@SpringBootApplication
@EnableEurekaServer  // 启用 Eureka 服务注册中心
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
3. 配置文件 application.yml:
server:
  port: 8761  # Eureka Server 端口

eureka:
  client:
    register-with-eureka: false  # 当前应用是 Eureka Server,不需要注册自己
    fetch-registry: false        # 不从其他 Eureka Server 获取服务注册表
  server:
    enable-self-preservation: false  # 禁用自我保护模式(测试用)

启动 Eureka Server,访问 http://localhost:8761,可以看到 Eureka 控制台,显示当前没有注册的服务。

4.2 搭建 Eureka Client(服务提供者)

接下来,创建一个服务提供者,它会向 Eureka 注册自身服务。

1. 添加依赖:

在 pom.xml 中添加 Eureka Client 的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2. 编写服务提供者类:
@SpringBootApplication
@EnableEurekaClient  // 启用 Eureka 客户端
@RestController
public class ServiceProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello from Service Provider!";
    }
}
3. 配置文件 application.yml:
server:
  port: 8081  # 服务提供者的端口

spring:
  application:
    name: service-provider  # 服务名称

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # 指定 Eureka Server 的地址

启动服务提供者,访问 http://localhost:8761,可以看到 service-provider 服务已经成功注册到 Eureka Server 中。

4.3 搭建 Eureka Client(服务消费者)

创建一个服务消费者,通过服务发现机制调用服务提供者的接口。

1. 添加依赖:

在 pom.xml 中添加 Eureka Client 和 Feign 的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 编写服务消费者类:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients  // 启用 Feign 客户端
@RestController
public class ServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }

    @Autowired
    private HelloService helloService;

    @GetMapping("/consume")
    public String consume() {
        return helloService.sayHello();
    }
}

@FeignClient(name = "service-provider")  // 声明式 HTTP 客户端,name 对应服务提供者的名称
public interface HelloService {
    @GetMapping("/hello")
    String sayHello();
}
3. 配置文件 application.yml:
server:
  port: 8082  # 服务消费者的端口

spring:
  application:
    name: service-consumer

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # 指定 Eureka Server 的地址

启动服务消费者,访问 http://localhost:8082/consume,可以看到通过 Feign 调用服务提供者接口,返回 “Hello from Service Provider!”。

5. Eureka 优缺点

优点:

  • 简化了服务注册与发现的流程,提供了自动化的服务管理。
  • Eureka 提供了服务的负载均衡和故障容错能力。
  • 可视化的控制台方便监控服务的健康状况。
  • 自我保护模式在网络分区或临时故障时可以防止服务大规模剔除。
    缺点:
  • 由于是集中式的注册中心,Eureka Server 是单点故障的潜在源头,尽管可以通过集群部署来提高可用性。
  • 相比于其他服务注册发现机制(如 Consul 或 Zookeeper),Eureka 偏向于简单易用,但在一致性和性能方面可能略显不足。

6. 总结

Eureka 是 Spring Cloud 中用于实现服务注册与发现的核心组件,适用于微服务架构中动态、灵活的服务管理。通过 Eureka,服务可以自动发现和通信,极大地减少了服务之间的耦合和配置的复杂性。同时,配合其他 Spring Cloud 组件,如 Ribbon、Feign,可以轻松实现负载均衡和声明式服务调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值