5月29日 01:37
Spring Boot 微服务如何实现服务注册与发现?
服务注册与发现是微服务架构的基础设施:服务启动时将自身地址注册到注册中心,消费方从注册中心拉取可用实例列表并调用。主流方案有 Eureka(AP、已停维)、Nacos(AP/CP 可切换、国产生态)、Consul(CP、云原生友好)。核心流程三步:注册(实例启动时上报 IP/端口)、心跳(定时续约保活)、拉取(客户端缓存实例列表并定时刷新)。Nacos 是当前新项目首选,临时实例走客户端心跳,持久实例走服务端探活,还内置配置中心。
追问
Eureka 自我保护机制触发后,实例下线能否被感知? 不能立即感知。自我保护模式下 Eureka 不再剔除过期实例,客户端可能拿到已下线的地址,需配合 Ribbon 重试或熔断兜底。
Nacos 临时实例和持久实例的区别是什么? 临时实例(ephemeral=true)由客户端发心跳,不续约则自动剔除,适合微服务;持久实例由服务端主动探活,不会自动删除,适合数据库等基础设施。
客户端发现与服务端发现有什么区别? 客户端发现:消费方从注册中心拉取列表,本地负载均衡(Eureka/Nacos);服务端发现:请求先到网关/代理,由代理侧转发(Consul + Nginx)。前者少一跳,后者解耦消费方。
注册中心选型时 CAP 如何取舍? Eureka 牺牲一致性保可用(AP),适合网络分区时仍需可用的场景;Consul/ZK 保一致性(CP),适合不能容忍脏数据的场景;Nacos 支持按实例切换 AP/CP。
优雅下线如何避免请求打到已注销实例? 先从注册中心注销,再等待正在处理的请求完成(如 5s),最后关闭服务。Spring Boot 可监听 ContextClosedEvent 触发注销,配合 sleep 等待在途请求。
写段代码
java@SpringBootApplication @EnableDiscoveryClient public class OrderApp { public static void main(String[] args) { SpringApplication.run(OrderApp.class, args); } } @FeignClient(name = "user-service") public interface UserClient { @GetMapping("/users/{id}") User getById(@PathVariable Long id); }