SpringCloud注解(@EnableDiscoveryClient)

876 阅读2分钟

@EnableDiscoveryClient 注解的作用是启用Spring Cloud的服务发现功能,它使得应用能够自动注册到服务注册中心(如Nacos),并能够发现其他服务。这个注解是Spring Cloud提供的,用于启动服务发现客户端,它会根据配置自动配置服务发现的相关组件。

为什么需要 @EnableDiscoveryClient

  1. 服务注册:对于服务提供者而言,添加 @EnableDiscoveryClient 注解后,服务会在启动时自动向服务注册中心注册自己的信息,包括服务名称、IP地址、端口号等。

  2. 服务发现:对于服务消费者而言,添加 @EnableDiscoveryClient 注解后,服务可以自动发现其他已注册的服务,并且可以使用Spring Cloud的负载均衡机制来调用这些服务。

示例说明

1. item-service(服务提供者)

假设 item-service 是一个服务提供者,它需要将自己的信息注册到Nacos中,以便其他服务能够发现它。

@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现
public class ItemServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ItemServiceApplication.class, args);
    }
}

配置文件 application.yml

spring:
  application:
    name: item-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

2. cart-service(服务消费者)

假设 cart-service 是一个服务消费者,它需要能够发现并调用 item-service

@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现
public class CartServiceApplication {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(CartServiceApplication.class, args);
    }
}

配置文件 application.yml

spring:
  application:
    name: cart-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

调用示例

cart-service 中创建一个控制器来调用 item-service

@RestController
public class CartController {

    @Autowired
    private LoadBalancerClient loadBalancerClient; // 负载均衡调用

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/invoke-item-service")
    public String invokeItemService() {
        // 选择一个名为 "item-service" 的服务实例
        ServiceInstance instance = loadBalancerClient.choose("item-service");
        if (instance == null) {
            return "No instances available";
        }
        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/item-service/endpoint";

        // 发送请求
        ResponseEntity<String> response = restTemplate.exchange(
                url,
                HttpMethod.GET,
                HttpEntity.EMPTY,
                String.class
        );

        return response.getBody();
    }
}

进行测试

  1. 启动Nacos服务:确保Nacos服务已经在运行。
  2. 启动 item-service:启动 item-service 应用。
  3. 启动 cart-service:启动 cart-service 应用。
  4. 测试调用:访问 http://localhost:你的端口/invoke-item-service,端口是cart-service的端口

总结

  • 服务提供者:需要在主类上添加 @EnableDiscoveryClient 注解,以便能够注册到服务注册中心。
  • 服务消费者:同样需要在主类上添加 @EnableDiscoveryClient 注解,以便能够发现并调用其他服务。

通过这种方式,item-servicecart-service 都能够参与到服务发现机制中,实现自动注册和服务调用。这确保了微服务架构中服务之间的正确注册和发现。