服务到底是什么时候注册进注册中心的?预热没做完会不会就有流量进来?优雅停机时实例什么时候被摘掉?自己写一个 DiscoveryClient 会怎样合并?这篇在 Spring Boot 4.0.8、Spring Cloud 2025.1.3 上用一个自己实现的内存注册中心把时间线打出来。
1501 ms AbstractAutoServiceRegistration.start() 被调用(getPhase() = 0,isAutoStartup = true) 1502 ms RegistrationLifecycle.postProcessBeforeStartRegister 1502 ms ServiceRegistry.register(x117-app, 端口 9601),线程 main 1502 ms RegistrationLifecycle.postProcessAfterStartRegister 1503 ms 事件 ServletWebServerInitializedEvent 1503 ms SmartLifecycle probe.start()(phase 2147483547) 1508 ms 事件 ContextRefreshedEvent 1542 ms 事件 ApplicationStartedEvent 1543 ms 事件 AvailabilityChangeEvent → CORRECT 1544 ms ApplicationRunner 开始(睡 1500 ms,模拟启动后的预热) 3048 ms ApplicationRunner 结束 3049 ms 事件 ApplicationReadyEvent 3049 ms 事件 AvailabilityChangeEvent → ACCEPTING_TRAFFIC (应用的真实端口是 9601,与 register 时的端口比较:一致)
Web 服务器启动后立即注册,早于 ApplicationRunner 和 ApplicationReadyEvent。
GET /actuator/serviceregistry → HTTP 200 UP
POST {"status":"OUT_OF_SERVICE"} → HTTP 200
再 GET → HTTP 200 OUT_OF_SERVICE
服务端的 setStatus 日志:ServiceRegistry.setStatus(OUT_OF_SERVICE)GET 读状态,POST 改状态,调用的是自己实现的 ServiceRegistry。
register 被调用 0 次;AutoServiceRegistrationProperties 个数 = 0,AutoServiceRegistration 个数 = 0 对照(默认开启):register 被调用 1 次;AutoServiceRegistrationProperties 个数 = 1,AutoServiceRegistration 个数 = 1
enabled=false 时没有 AutoServiceRegistrationProperties,不再注册。
2944 ms 事件 ApplicationReadyEvent 2945 ms 事件 AvailabilityChangeEvent → ACCEPTING_TRAFFIC 4250 ms 事件 AvailabilityChangeEvent → REFUSING_TRAFFIC 4251 ms 事件 ContextClosedEvent 4251 ms SmartLifecycle probe.stop() GracefulShutdown: Commencing graceful shutdown. Waiting for active requests to complete 6582 ms /slow 处理完毕 GracefulShutdown: Graceful shutdown complete 6648 ms AbstractAutoServiceRegistration.stop() 被调用 6648 ms RegistrationLifecycle.postProcessBeforeStopRegister 6648 ms ServiceRegistry.deregister(x117-app),线程 SpringApplicationShutdownHook 6649 ms RegistrationLifecycle.postProcessAfterStopRegister 6649 ms ServiceRegistry.close() 6649 ms ServiceRegistry.close() 客户端:/slow 的响应 200 done,耗时 3.0 秒(SIGTERM 在请求开始 0.7 秒后发送)
先拒绝流量,等在途请求处理完,最后才 deregister。
fixed=(order -5,description FixedClient);compositeDiscoveryClient=CompositeDiscoveryClient(order 0,description Composite Discovery Client);simpleDiscoveryClient=SimpleDiscoveryClient(order 0,description Simple Discovery Client); 组合后的 getServices() = [payments, orders, users] ,getInstances(orders) = [http://10.0.0.1:8080, http://10.0.0.2:8080],getInstances(payments) = [http://10.0.0.9:9000],description = Composite Discovery Client 同样的配置再加 spring.cloud.discovery.enabled=false → fixed=(order -5,description FixedClient);compositeDiscoveryClient=CompositeDiscoveryClient(order 0,description Composite Discovery Client);simpleDiscoveryClient=SimpleDiscoveryClient(order 0,description Simple Discovery Client); | 组合后的 getServices() = [payments, orders, users] ,getInstances(orders) = [http://10.0.0.1:8080, http://10.0.0.2:8080],getInstances(payments) = [http://10.0.0.9:9000],description = Composite Discovery Client
Composite 合并所有 DiscoveryClient 的服务与实例。