blob: 2cd28ea18295c46c17e90e9d7fdcb28bc3d7820c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.registry.client;
import org.apache.dubbo.metadata.MetadataInfo;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;
/**
* The default implementation of {@link ServiceInstance}.
*
* @since 2.7.5
*/
public class DefaultServiceInstance implements ServiceInstance {
private static final long serialVersionUID = 1149677083747278100L;
private String id;
private String serviceName;
private String host;
private Integer port;
private boolean enabled;
private boolean healthy;
private Map<String, String> metadata = new HashMap<>();
private transient String address;
private transient MetadataInfo serviceMetadata;
// used at runtime
private transient Map<String, String> extendParams = new HashMap<>();
public DefaultServiceInstance() {
}
public DefaultServiceInstance(String id, String serviceName, String host, Integer port) {
if (port != null && port.intValue() < 1) {
throw new IllegalArgumentException("The port must be greater than zero!");
}
this.id = id;
this.serviceName = serviceName;
this.host = host;
this.port = port;
this.enabled = true;
this.healthy = true;
}
public DefaultServiceInstance(String serviceName, String host, Integer port) {
this(host + ":" + port, serviceName, host, port);
}
public void setId(String id) {
this.id = id;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
public void setHost(String host) {
this.host = host;
}
@Override
public String getId() {
return id;
}
@Override
public String getServiceName() {
return serviceName;
}
@Override
public String getHost() {
return host;
}
public void setPort(Integer port) {
this.port = port;
}
@Override
public Integer getPort() {
return port;
}
@Override
public String getAddress() {
if (address == null) {
address = getAddress(host, port);
}
return address;
}
private static String getAddress(String host, int port) {
return port <= 0 ? host : host + ':' + port;
}
@Override
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@Override
public boolean isHealthy() {
return healthy;
}
public void setHealthy(boolean healthy) {
this.healthy = healthy;
}
@Override
public Map<String, String> getMetadata() {
return metadata;
}
@Override
public Map<String, String> getExtendParams() {
return extendParams;
}
@Override
public Map<String, String> getAllParams() {
Map<String, String> allParams = new HashMap<>((int) ((metadata.size() + extendParams.size()) / 0.75f + 1));
allParams.putAll(metadata);
allParams.putAll(extendParams);
return allParams;
}
public void setMetadata(Map<String, String> metadata) {
this.metadata = metadata;
}
public MetadataInfo getServiceMetadata() {
return serviceMetadata;
}
public void setServiceMetadata(MetadataInfo serviceMetadata) {
this.serviceMetadata = serviceMetadata;
}
@Override
public InstanceAddressURL toURL() {
return new InstanceAddressURL(this, serviceMetadata);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof DefaultServiceInstance)) {
return false;
}
DefaultServiceInstance that = (DefaultServiceInstance) o;
boolean equals = Objects.equals(getServiceName(), that.getServiceName()) &&
Objects.equals(getHost(), that.getHost()) &&
Objects.equals(getPort(), that.getPort());
for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {
if (entry.getKey().equals(REVISION_KEY)) {
continue;
}
equals = equals && entry.getValue().equals(that.getMetadata().get(entry.getKey()));
}
return equals;
}
@Override
public int hashCode() {
int result = Objects.hash(getServiceName(), getHost(), getPort());
for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {
if (entry.getKey().equals(REVISION_KEY)) {
continue;
}
result = 31 * result + (entry.getValue() == null ? 0 : entry.getValue().hashCode());
}
return result;
}
@Override
public String toString() {
return "DefaultServiceInstance{" +
"id='" + id + '\'' +
", serviceName='" + serviceName + '\'' +
", host='" + host + '\'' +
", port=" + port +
", enabled=" + enabled +
", healthy=" + healthy +
", metadata=" + metadata +
'}';
}
}