blob: aeb63c8b1efcc305bd18788c37fb5c75a8ba1100 [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.servicecomb.loadbalance;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.core.Endpoint;
import org.apache.servicecomb.core.Transport;
import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
import org.apache.servicecomb.serviceregistry.cache.CacheEndpoint;
import com.google.common.annotations.VisibleForTesting;
import com.netflix.loadbalancer.Server;
/**
* 服务器抽象,address只有transport识别, LB模块不识别
* LB模块不提供服务器状态监测,这块功能是由注册中心进行处理的。
*
*/
public class ServiceCombServer extends Server {
private final Endpoint endpoint;
// 所属服务实例
private final MicroserviceInstance instance;
private final String microserviceName;
@VisibleForTesting
ServiceCombServer(String microserviceName, Endpoint endpoint, MicroserviceInstance instance) {
super(null);
this.endpoint = endpoint;
this.instance = instance;
this.microserviceName = microserviceName;
// Different types of Robin Component Rule have different usages for server status and list.
// e.g. RoundRobinRule using getAllServers & alive & readyToServe
// RandomRule using getReachableServers & alive
// WeightedResponseTimeRule using getAllServers & alive
// To make all rules work only on "how to choose a server from alive servers", we do not rely on Robbin defined status
this.setAlive(true);
this.setReadyToServe(true);
}
public ServiceCombServer(String microserviceName, Transport transport, CacheEndpoint cacheEndpoint) {
super(null);
this.microserviceName = microserviceName;
endpoint = new Endpoint(transport, cacheEndpoint.getEndpoint(), cacheEndpoint.getInstance());
instance = cacheEndpoint.getInstance();
// Different types of Robin Component Rule have different usages for server status and list.
// e.g. RoundRobinRule using getAllServers & alive & readyToServe
// RandomRule using getReachableServers & alive
// WeightedResponseTimeRule using getAllServers & alive
// To make all rules work only on "how to choose a server from alive servers", we do not rely on Robbin defined status
this.setAlive(true);
this.setReadyToServe(true);
try {
URI endpointURI = new URI(endpoint.getEndpoint());
setHost(endpointURI.getHost());
setPort(endpointURI.getPort());
} catch (URISyntaxException ignored) {
}
}
public String getMicroserviceName() {
return this.microserviceName;
}
public Endpoint getEndpoint() {
return endpoint;
}
public MicroserviceInstance getInstance() {
return instance;
}
@Override
public String toString() {
return endpoint.getEndpoint();
}
// used in LoadBalancerContext
@Override
public String getHost() {
return endpoint.getEndpoint();
}
@Override
public boolean equals(Object o) {
if (o instanceof ServiceCombServer) {
return this.instance.getInstanceId().equals(((ServiceCombServer) o).instance.getInstanceId())
&& StringUtils.equals(endpoint.getEndpoint(), ((ServiceCombServer) o).getEndpoint().getEndpoint());
} else {
return false;
}
}
@Override
public int hashCode() {
return this.instance.getInstanceId().hashCode();
}
}