类ConsulAutoRegistration
bean的构造方式
在类 ConsulAutoServiceRegistrationAutoConfiguration 中,通过下面的方式构造 ConsulAutoRegistration 的 bean:
@Bean
@ConditionalOnMissingBean
public ConsulAutoRegistration consulRegistration(ConsulDiscoveryProperties properties, ApplicationContext applicationContext,
ServletContext servletContext, HeartbeatProperties heartbeatProperties) {
return ConsulAutoRegistration.registration(properties, applicationContext, servletContext, heartbeatProperties);
这里和 ConsulServiceRegistry 与 ConsulRegistration 的方式很不相同. ConsulAutoRegistration 作为一个标准的spring bean 给 ConsulAutoServiceRegistration 使用,单例.而ConsulRegistration 是通过方法传递给 ConsulServiceRegistry.如register()方法:
public void register(ConsulRegistration reg) {......}
registration()方法的实现
public static ConsulAutoRegistration registration(ConsulDiscoveryProperties properties, ApplicationContext context, ServletContext servletContext, HeartbeatProperties heartbeatProperties) {
RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(context.getEnvironment());
NewService service = new NewService();
// 取应用名
String appName = getAppName(properties, propertyResolver);
// 取ID
service.setId(getInstanceId(properties, context));
if(!properties.isPreferAgentAddress()) {
service.setAddress(properties.getHostname());
}
service.setName(normalizeForDns(appName));
// 取tag
service.setTags(createTags(properties, servletContext));
if (properties.getPort() != null) {
service.setPort(properties.getPort());
// we know the port and can set the check
setCheck(service, properties, context, heartbeatProperties);
}
// 最后返回ConsulAutoRegistration对象
return new ConsulAutoRegistration(service, properties, context, heartbeatProperties);
}
类定义
ConsulAutoRegistration 定义如下:
// 继承自ConsulRegistration
public class ConsulAutoRegistration extends ConsulRegistration {
// 增加了三个属性
private final ConsulDiscoveryProperties properties;
private final ApplicationContext context;
private final HeartbeatProperties heartbeatProperties;
public ConsulAutoRegistration(NewService service, ConsulDiscoveryProperties properties, ApplicationContext context, HeartbeatProperties heartbeatProperties) {
super(service);
this.properties = properties;
this.context = context;
this.heartbeatProperties = heartbeatProperties;
}
}