之前使用eureka时,注册服务的ID 是随机数,eureka上不会出现同一服务多实例的问题。但是,换上了 consul 作为注册中心后,却出现同一个服务拥有多个实例的问题,上次服务挂掉之后的实例还在注册中心上挂着,每次重启多一个实例。
有什么办法去解决这个问题?答案就是自定义spring cloud consul 的注册方法,使其唯一化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class ServiceIdRegister extends ConsulServiceRegistry {
public ServiceIdRegister(ConsulClient client, ConsulDiscoveryProperties properties, TtlScheduler ttlScheduler, HeartbeatProperties heartbeatProperties) { super(client, properties, ttlScheduler, heartbeatProperties); }
@Override public void register(ConsulRegistration reg) { reg.getService().setId(reg.getService().getName() + "-" + reg.getService().getAddress() + "-" + reg.getPort()); super.register(reg); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| @Configuration @ConditionalOnConsulEnabled public class ConsulConfig {
@Autowired(required = false) private TtlScheduler ttlScheduler;
@Bean public ServiceIdRegister consulServiceRegistry(ConsulClient consulClient, ConsulDiscoveryProperties properties, HeartbeatProperties heartbeatProperties) { return new ServiceIdRegister(consulClient, properties, ttlScheduler, heartbeatProperties); }
}
|