Spring Cloud Eureka

class Spring Cloud Eureka

Spring Cloud Eureka 是 Netflix Eureka 的 Spring 实现,主要用于微服务架构中的服务注册与发现。Eureka 提供了一个服务注册中心,每个微服务在启动时将自己注册到该中心,其他服务可以通过注册中心查找到这些服务的实例信息,从而实现负载均衡和故障转移等功能。

下面是关于 Eureka 的详细介绍,包括使用方法、代码示例和相关讲解。

Eureka 的主要功能

  1. 服务注册与发现:每个微服务在启动时将自己的信息注册到 Eureka 服务器,其他服务通过 Eureka 服务器获取服务信息。
  2. 健康检查:Eureka 服务器定期检查注册的服务是否健康,如果发现某个服务不可用,会将其从注册表中剔除。
  3. 负载均衡:通过 Eureka 获取服务列表,可以实现客户端的负载均衡。
  4. 故障转移:当某个服务不可用时,Eureka 可以将请求转发到其他可用的服务实例。

使用示例

1. Eureka 服务注册中心

创建 Eureka 服务注册中心

  1. 创建 Spring Boot 项目

    使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择以下依赖:

    • Eureka Server
  2. 添加 Eureka Server 依赖

    pom.xml 中添加 Eureka Server 依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  3. 配置 Eureka Server

    在项目的主类中,使用 @EnableEurekaServer 注解启用 Eureka Server:

    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);
        }
    }
    
  4. 配置文件 application.yml

    配置文件中定义 Eureka Server 的基本信息:

    server:
      port: 8761
    
    eureka:
      client:
        register-with-eureka: false
        fetch-registry: false
      server:
        enable-self-preservation: false
    
    • server.port:指定 Eureka Server 的端口。
    • eureka.client.register-with-eureka:是否将 Eureka Server 自身注册到 Eureka。
    • eureka.client.fetch-registry:是否从 Eureka Server 获取注册表信息。
    • eureka.server.enable-self-preservation:是否启用自我保护模式(关闭自我保护模式以便于测试)。
  5. 启动 Eureka Server

    运行 EurekaServerApplication 类,启动 Eureka 服务注册中心。访问 http://localhost:8761 可以看到 Eureka 的管理页面。

2. Eureka 客户端

创建 Eureka 客户端服务

  1. 创建 Spring Boot 项目

    使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择以下依赖:

    • Eureka Discovery Client
    • Spring Web
  2. 添加 Eureka Client 依赖

    pom.xml 中添加 Eureka Client 依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  3. 配置 Eureka Client

    在项目的主类中,使用 @EnableEurekaClient 注解启用 Eureka Client:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @SpringBootApplication
    @EnableEurekaClient
    public class EurekaClientApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaClientApplication.class, args);
        }
    }
    
  4. 配置文件 application.yml

    配置文件中定义 Eureka Client 的基本信息:

    server:
      port: 8080
    
    spring:
      application:
        name: eureka-client
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
      instance:
        prefer-ip-address: true
    
    • server.port:指定服务的端口。
    • spring.application.name:指定服务的名称。
    • eureka.client.service-url.defaultZone:指定 Eureka Server 的地址。
    • eureka.instance.prefer-ip-address:使用 IP 地址进行注册。
  5. 创建一个简单的 REST 控制器

    创建一个简单的 REST 控制器,提供一个测试接口:

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
    
        @GetMapping("/hello")
        public String sayHello() {
            return "Hello from Eureka Client!";
        }
    }
    
  6. 启动 Eureka Client

    运行 EurekaClientApplication 类,启动 Eureka 客户端服务。服务启动后会自动注册到 Eureka Server。

3. 服务调用

使用 RestTemplate 调用服务

在 Eureka Client 中,可以使用 RestTemplate 调用其他服务。需要使用 @LoadBalanced 注解来启用客户端负载均衡。

  1. 配置 RestTemplate

    在 Eureka Client 项目中,配置 RestTemplate

    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class AppConfig {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    
  2. 调用其他服务

    使用 RestTemplate 调用其他服务:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class ServiceController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("/invoke")
        public String invokeService() {
            return restTemplate.getForObject("http://eureka-client/hello", String.class);
        }
    }
    

    在上面的代码中,通过 RestTemplate 调用 eureka-client 服务的 /hello 接口。

4. 动态刷新 Eureka 配置

可以使用 Spring Cloud Config 和 Spring Cloud Bus 动态刷新 Eureka 配置。

  1. 添加依赖

    pom.xml 中添加 Spring Cloud Config 和 Spring Cloud Bus 依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
    
  2. 配置文件

    bootstrap.yml 中配置 Config Server 地址:

    spring:
      cloud:
        config:
          uri: http://localhost:8888
    
  3. 刷新配置

    使用 Spring Cloud Bus 刷新配置:

    curl -X POST http://localhost:8080/actuator/bus-refresh
    

小结

Eureka 是微服务架构中的重要组件,用于服务注册与发现。通过 Eureka,服务可以动态地注册和发现其他服务,实现负载均衡和故障转移。结合 Spring Cloud Config 和 Spring Cloud Bus,可以实现配置的动态刷新,提高系统的灵活性和可维护性。

如果你有任何问题或需要进一步的帮助,请随时告诉我!

评论区
评论列表
menu