1. spring cloud服务获取当前示例所在zone
com.netflix.appinfo.InstanceInfo
/**
* Get the zone that a particular instance is in.
* Note that for AWS deployments, myInfo should contain AWS dataCenterInfo which should contain
* the AWS zone of the instance, and availZones is ignored.
*
* @param availZones the list of available zones for non-AWS deployments
* @param myInfo
* - The InstanceInfo object of the instance.
* @return - The zone in which the particular instance belongs to.
*/
public static String getZone(String[] availZones, InstanceInfo myInfo) {
String instanceZone = ((availZones == null || availZones.length == 0) ? "default"
: availZones[0]);
if (myInfo != null
&& myInfo.getDataCenterInfo().getName() == DataCenterInfo.Name.Amazon) {
String awsInstanceZone = ((AmazonInfo) myInfo.getDataCenterInfo())
.get(AmazonInfo.MetaDataKey.availabilityZone);
if (awsInstanceZone != null) {
instanceZone = awsInstanceZone;
}
}
return instanceZone;
}
该方法在非亚马逊机房的情况下 直接返回当前availZones 的第一个节点
此方法调用发代码示例:
com.netflix.discovery.shared.transport.EurekaHttpClients.defaultBootstrapResolver方法中 调用如下:
/**
* @return a bootstrap resolver that resolves eureka server endpoints based on either DNS or static config,
* depending on configuration for one or the other. This resolver will warm up at the start.
*/
static ClosableResolver<AwsEndpoint> defaultBootstrapResolver(final EurekaClientConfig clientConfig,
final InstanceInfo myInstanceInfo) {
String[] availZones = clientConfig.getAvailabilityZones(clientConfig.getRegion());
String myZone = InstanceInfo.getZone(availZones, myInstanceInfo);
ClusterResolver<AwsEndpoint> delegateResolver = new ZoneAffinityClusterResolver(
new ConfigClusterResolver(clientConfig, myInstanceInfo),
myZone,
true
);
可以看到直接读取的clientConfig中的配置