一、服务注册与发现相关注解
用于将服务注册到注册中心(如 Eureka、Nacos、Consul),或让服务发现其他服务。
1. @EnableEurekaClient
- 所属组件:Spring Cloud Eureka
- 作用:标识当前服务是 Eureka 客户端,启动时会自动向 Eureka Server 注册。
- 属性:无核心属性(仅用于开启功能)。
- 说明:仅适用于 Eureka 注册中心,若使用其他注册中心(如 Nacos),需用更通用的
@EnableDiscoveryClient
。
2. @EnableDiscoveryClient
- 所属组件:Spring Cloud Common(通用服务发现)
- 作用:通用的服务发现注解,适用于所有符合 Spring Cloud 服务发现规范的注册中心(如 Eureka、Nacos、Consul),启动时自动注册服务并支持发现其他服务。
- 属性:无核心属性。
- 说明:Spring Cloud 2020 版本后,若引入了注册中心依赖(如 Nacos),可省略此注解,默认自动开启服务注册发现。
3. @EurekaInstanceConfig
(接口)
- 所属组件:Spring Cloud Eureka
- 作用:自定义 Eureka 客户端实例配置(如服务实例 ID、续约间隔等),需通过实现类配置。
- 常用属性(通过实现类设置):
instanceId
:服务实例唯一标识(默认是主机名:服务名:端口
,可自定义为IP:端口
)。leaseRenewalIntervalInSeconds
:客户端向 Eureka Server 发送续约请求的间隔(默认 30 秒)。preferIpAddress
:是否优先使用 IP 地址作为服务实例的主机名(默认 false,设为 true 便于跨网络访问)。
二、服务调用(Feign)相关注解
Feign 是声明式 HTTP 客户端,简化服务间调用,常用注解如下:
1. @EnableFeignClients
- 所属组件:Spring Cloud OpenFeign
- 作用:开启 Feign 功能,扫描并加载标注了
@FeignClient
的接口。 - 核心属性:
basePackages
:指定扫描@FeignClient
接口的包路径(如basePackages = "com.example.feign"
)。clients
:指定具体要加载的 Feign 接口(如clients = UserFeignClient.class
,适用于精确扫描)。defaultConfiguration
:全局 Feign 配置类(如日志级别、拦截器等,优先级低于接口自身的configuration
)。
2. @FeignClient
- 所属组件:Spring Cloud OpenFeign
- 作用:标识一个 Feign 客户端接口,声明要调用的远程服务,Spring 会自动生成代理实现类。
- 核心属性:
name
/value
:必填,远程服务的名称(与注册中心的服务名一致,用于服务发现)。例如name = "user-service"
。url
:可选,直接指定远程服务的 URL(跳过服务发现,适用于调试或固定地址的服务)。例如url = "http://localhost:8081"
。fallback
:降级处理类(需实现当前 Feign 接口),当远程服务调用失败(超时、熔断等)时,会执行该类的对应方法。例如fallback = UserFeignFallback.class
。fallbackFactory
:比fallback
更灵活的降级工厂类,可获取异常信息。例如fallbackFactory = UserFeignFallbackFactory.class
。configuration
:当前 Feign 接口的专属配置类(如自定义日志、拦截器),优先级高于@EnableFeignClients
的全局配置。path
:远程服务的统一前缀路径。例如服务接口都是/api/user
开头,可设置path = "/api/user"
,接口方法只需写相对路径(如@GetMapping("/{id}")
对应/api/user/{id}
)。
3. Feign 接口方法注解(复用 Spring MVC 注解)
Feign 接口的方法需使用 Spring MVC 注解声明 HTTP 请求细节,例如:
@GetMapping
/@PostMapping
/@PutMapping
/@DeleteMapping
:指定请求方法和路径。@PathVariable
:获取 URL 路径参数(如@GetMapping("/{id}") User getUser(@PathVariable("id") Long id)
)。@RequestParam
:获取请求参数(如@GetMapping("/list") List<User> getList(@RequestParam("status") Integer status)
)。@RequestBody
:传递请求体(如@PostMapping("/save") Boolean save(@RequestBody User user)
)。
三、配置中心(Config)相关注解
用于集成 Spring Cloud Config 配置中心,实现配置的集中管理和动态刷新。
1. @EnableConfigServer
- 所属组件:Spring Cloud Config
- 作用:标识当前服务是 Config 配置中心服务器,用于加载远程配置(如 Git、SVN)并提供给客户端。
- 属性:无核心属性。
2. @RefreshScope
- 所属组件:Spring Cloud Context
- 作用:声明 Bean 支持配置动态刷新。当配置中心的配置更新后,通过调用
/actuator/refresh
端点,标注该注解的类会重新实例化,加载新配置。 - 属性:无核心属性。
- 示例:
@RestController @RefreshScope // 配置更新时,该类会重新创建 public class ConfigController {@Value("${app.name}") // 注入配置private String appName;@GetMapping("/name")public String getAppName() {return appName;} }
四、熔断降级(Resilience4j)相关注解
Resilience4j 是 Spring Cloud 推荐的熔断组件(替代 Hystrix),提供熔断、重试、限流等功能,常用注解如下:
1. @CircuitBreaker
- 所属组件:Spring Cloud Resilience4j
- 作用:开启熔断功能,当方法调用失败率达到阈值时,自动触发熔断(暂时停止调用,直接返回降级结果),避免服务级联失败。
- 核心属性:
name
:熔断器名称(需与配置文件中的规则对应,如resilience4j.circuitbreaker.instances.<name>
)。fallbackMethod
:降级方法名(当前类中定义的方法,参数和返回值需与原方法一致,最后可加一个Exception
参数接收异常)。
- 示例:
@Service public class UserService {// 调用远程服务,开启熔断@CircuitBreaker(name = "userService", fallbackMethod = "getUserFallback")public User getUser(Long id) {return userFeignClient.getById(id); // 调用Feign接口}// 降级方法(参数与原方法一致,最后可加Exception)public User getUserFallback(Long id, Exception e) {log.error("获取用户失败", e);return new User(-1L, "默认用户"); // 返回降级结果} }
2. @Retry
- 所属组件:Spring Cloud Resilience4j
- 作用:开启重试功能,当方法调用失败时(如超时、异常),自动重试指定次数,提高调用成功率。
- 核心属性:
name
:重试器名称(对应配置文件resilience4j.retry.instances.<name>
)。fallbackMethod
:最终重试失败后的降级方法。
- 配置示例(application.yaml):
resilience4j:retry:instances:userService: # 与@Retry的name对应maxRetryAttempts: 3 # 最大重试次数(含首次调用共4次)waitDuration: 1000 # 重试间隔(毫秒)
3. @RateLimiter
- 所属组件:Spring Cloud Resilience4j
- 作用:实现接口限流,限制单位时间内的调用次数,防止服务被过度请求击垮。
- 核心属性:
name
:限流器名称(对应配置文件resilience4j.ratelimiter.instances.<name>
)。fallbackMethod
:限流触发后的降级方法。
- 配置示例:
resilience4j:ratelimiter:instances:userService:limitRefreshPeriod: 1s # 令牌刷新周期limitForPeriod: 10 # 每个周期内的最大请求数(1秒最多10次)
五、负载均衡相关注解
@LoadBalanced
- 所属组件:Spring Cloud LoadBalancer
- 作用:为
RestTemplate
或WebClient
开启负载均衡功能,使其在调用服务时,能通过服务名从注册中心获取实例列表,并按负载均衡策略(如轮询、随机)选择实例。 - 属性:无核心属性。
- 示例:
@Configuration public class RestTemplateConfig {@Bean@LoadBalanced // 开启负载均衡public RestTemplate restTemplate() {return new RestTemplate();} }// 使用时通过服务名调用(无需写具体IP:端口) @Service public class UserService {@Autowiredprivate RestTemplate restTemplate;public User getUser(Long id) {// "user-service"是服务名,负载均衡会自动选择实例return restTemplate.getForObject("http://user-service/api/user/" + id, User.class);} }
六、组合注解
@SpringCloudApplication
- 所属组件:Spring Cloud Common
- 作用:组合注解,简化微服务启动类配置,等价于:
@SpringBootApplication
(Spring Boot 基础注解) +@EnableDiscoveryClient
(服务发现) +@EnableCircuitBreaker
(熔断支持,Resilience4j 或 Hystrix)。 - 示例:
@SpringCloudApplication // 替代三个注解 public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);} }
总结
Spring Cloud 注解按功能可分为服务注册发现、服务调用(Feign)、配置中心、熔断降级、负载均衡等类别。核心注解如
@FeignClient
(服务调用)、@CircuitBreaker
(熔断)、@LoadBalanced
(负载均衡)等,需重点掌握其属性含义(如 @FeignClient
的 name
和 fallback
)及使用场景,以简化微服务开发。