1. @SpringBootApplication
  • 概述
  • @SpringBootApplication是Spring Boot项目的核心注解。在Spring Cloud应用中,由于Spring Cloud是构建在Spring Boot之上的,所以启动类也会使用这个注解。它是一个组合注解,实际上包含了@Configuration@EnableAutoConfiguration@ComponentScan
  • @Configuration部分
  • 这个注解表明该类是一个配置类。它可以用来定义Java - based的配置,替代传统的XML配置方式。在配置类中,可以通过@Bean注解来定义各种Bean,这些Bean会被Spring容器管理。例如:
@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
  • 这里定义了一个名为myService的Bean,其类型是MyService,实际的实现类是MyServiceImpl
  • @EnableAutoConfiguration部分
  • 这是Spring Boot的一个强大功能。它会根据项目中添加的依赖自动配置Spring应用程序。例如,如果项目中添加了spring - webmvc依赖,Spring Boot会自动配置一个DispatcherServlet,并设置好相关的配置,如视图解析器等。它会自动扫描类路径下的各种配置类和Bean,然后根据条件来决定是否启用某些配置。
  • 它还会参考spring - factories文件。这个文件可以在很多Spring Boot自动配置的starter中找到。例如,在spring - boot - autoconfigure项目中,spring - factories文件定义了一系列的自动配置类。当@EnableAutoConfiguration被启用时,这些自动配置类会被加载并应用相应的配置。
  • @ComponentScan部分
  • 这个注解用于扫描组件。它会扫描指定包及其子包下的带有@Component@Service@Repository@Controller等注解的类,并将它们注册为Spring容器中的Bean。默认情况下,它会扫描启动类所在的包及其子包。如果想要扫描其他包,可以通过basePackages属性来指定,例如:
@ComponentScan(basePackages = "com.example.myapp.services")
public class MyApp {
}
  • 这里就会扫描com.example.myapp.services包及其子包下的组件。
  1. @EnableDiscoveryClient(在服务发现场景下)
  • 概述
  • 当构建微服务架构并且使用服务发现组件(如Eureka、Consul等)时,需要在启动类上添加@EnableDiscoveryClient注解。这个注解的作用是启用服务发现客户端功能。
  • 工作原理
  • 以Eureka为例,当服务启动时,带有@EnableDiscoveryClient注解的服务会向Eureka Server注册自己的信息。这些信息包括服务名称、IP地址、端口号等。同时,它也会从Eureka Server获取其他服务的信息,以便在需要的时候进行服务调用。
  • 这个注解实际上是一个标记接口,用于触发Spring Cloud自动配置相关的服务发现客户端配置。在内部,它会加载一系列的配置类来实现服务注册和发现的功能。例如,它会配置一个DiscoveryClient对象,这个对象可以用于查询服务实例列表等操作。
  1. @EnableCircuitBreaker(在断路器场景下)
  • 概述
  • 在微服务架构中,为了防止某个服务出现故障而导致整个系统雪崩,会使用断路器模式。@EnableCircuitBreaker注解用于启用Spring Cloud Circuit Breaker(断路器)功能。
  • 工作原理
  • 以Netflix Hystrix为例(Spring Cloud支持多种断路器实现),当启用@EnableCircuitBreaker后,Spring Cloud会自动配置Hystrix相关的功能。它会为标记了@HystrixCommand注解的方法创建一个代理,这个代理会监控方法的执行情况。
  • 如果方法调用的服务出现故障(比如超时或者返回错误码),断路器会打开,后续的请求会直接被短路,而不是继续调用故障的服务。同时,可以定义一个fallback方法,当断路器打开时,会调用这个fallback方法来返回一个默认值或者执行一些其他的替代逻辑。例如:
@Service
public class MyService {
    @HystrixCommand(fallbackMethod = "fallback")
    public String callAnotherService() {
        // 调用其他服务的逻辑
        return "success";
    }
    public String fallback() {
        return "fallback value";
    }
}
  • 在这里,callAnotherService方法如果出现故障,就会调用fallback方法。

这些注解在构建Spring Cloud应用程序时起着关键的作用,它们帮助我们快速搭建具有服务发现、断路器等功能的微服务应用。