/*
* Copyright 2008-2009 the original author or authors.
*
* Licensed 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 net.hasor.registry.server.register;
import net.hasor.core.Inject;
import net.hasor.core.Singleton;
import net.hasor.registry.RsfCenterRegister;
import net.hasor.registry.RsfCenterResult;
import net.hasor.registry.domain.client.ConsumerPublishInfo;
import net.hasor.registry.domain.client.ProviderPublishInfo;
import net.hasor.registry.domain.client.PublishInfo;
import net.hasor.registry.domain.server.ConsumerInfo;
import net.hasor.registry.domain.server.ProviderInfo;
import net.hasor.registry.domain.server.ServiceInfo;
import net.hasor.registry.server.domain.ErrorCode;
import net.hasor.registry.server.domain.LogUtils;
import net.hasor.registry.server.domain.Result;
import net.hasor.registry.server.domain.RsfCenterResultDO;
import net.hasor.registry.server.manager.ServiceManager;
import net.hasor.registry.trace.TraceUtil;
import net.hasor.rsf.InterAddress;
import net.hasor.rsf.RsfRequest;
import net.hasor.rsf.domain.RsfServiceType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.List;
/**
* 客户端注册中心接口{@link RsfCenterRegister}实现类,负责接收来自客户端的请求调用。
* (这个类做的最多的是输入输出校验)
* @version : 2015年6月8日
* @author 赵永春(zyc@hasor.net)
*/
@Singleton
public class RsfCenterRegisterProvider implements RsfCenterRegister {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Inject
private RsfRequest rsfRequest;
@Inject
private ServiceManager serviceManager;
//
private ServiceInfo getServiceInfo(PublishInfo info) {
ServiceInfo serviceInfo = new ServiceInfo();
serviceInfo.setBindID(info.getBindID());
serviceInfo.setBindGroup(info.getBindGroup());
serviceInfo.setBindName(info.getBindName());
serviceInfo.setBindVersion(info.getBindVersion());
return serviceInfo;
}
private RsfCenterResult<String> errorCenterResult(RsfCenterResult<?> result) {
RsfCenterResultDO<String> centerResult = new RsfCenterResultDO<String>();
centerResult.setSuccess(result.isSuccess());
centerResult.setMessageID(result.getMessageID());
centerResult.setErrorCode(result.getErrorCode());
centerResult.setErrorMessage(result.getErrorMessage());
return centerResult;
}
//
/**发布服务*/
@Override
public RsfCenterResult<String> registerProvider(ProviderPublishInfo info) {
//
ProviderInfo providerInfo = new ProviderInfo();
providerInfo.setClientTimeout(info.getClientTimeout());
providerInfo.setQueueMaxSize(info.getQueueMaxSize());
providerInfo.setSerializeType(info.getSerializeType());
providerInfo.setSharedThreadPool(info.isSharedThreadPool());
providerInfo.setRsfAddress(Arrays.asList(info.getTargetList().split(",")));
ServiceInfo serviceInfo = getServiceInfo(info);
return this.register(serviceInfo, providerInfo, RsfServiceType.Provider);
}
/**订阅服务*/
@Override
public RsfCenterResult<String> registerConsumer(ConsumerPublishInfo info) {
ConsumerInfo consumerInfo = new ConsumerInfo();
consumerInfo.setClientTimeout(info.getClientTimeout());
consumerInfo.setMaximumRequestSize(info.getClientMaximumRequest());
consumerInfo.setMessage(info.getMessage());
consumerInfo.setSerializeType(info.getSerializeType());
consumerInfo.setRsfAddress(info.getTargetList());
ServiceInfo serviceInfo = getServiceInfo(info);
return this.register(serviceInfo, consumerInfo, RsfServiceType.Consumer);
}
//
private RsfCenterResult<String> register(ServiceInfo serviceInfo, Object info, RsfServiceType type) {
//
RsfCenterResultDO<String> centerResult = new RsfCenterResultDO<String>();
centerResult.setMessageID(this.rsfRequest.getRequestID());
InterAddress remoteRsfAddress = this.rsfRequest.getRemoteAddress();
try {
// .发布服务,并获取结果
Result<String> result = null;
if (RsfServiceType.Provider == type && info instanceof ProviderInfo) {
result = this.serviceManager.publishService(serviceInfo, (ProviderInfo) info);
} else if (RsfServiceType.Consumer == type && info instanceof ConsumerInfo) {
result = this.serviceManager.publishConsumer(serviceInfo, (ConsumerInfo) info);
} else {
centerResult.setErrorCode(ErrorCode.EmptyResult.getCodeType());
centerResult.setErrorMessage("registerType mast in Provider or Consumer.");
logger.error(LogUtils.create("ERROR_100_00001")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceInfo.getBindID())//
.addLog("registerType", type)//
.toJson());
return centerResult;
}
// .判断异常
if (!result.isSuccess()) {
centerResult.setSuccess(false);
ErrorCode errorInfo = result.getErrorInfo();
centerResult.setErrorCode(errorInfo.getCodeType());
centerResult.setErrorMessage(errorInfo.getMessage());
logger.error(LogUtils.create("ERROR_100_00002")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceInfo.getBindID())//
.addLog("registerType", type)//
.toJson());
} else {
centerResult.setSuccess(true);
centerResult.setErrorCode(ErrorCode.OK.getCodeType());
centerResult.setResult(result.getResult());
}
} catch (Throwable e) {
centerResult.setSuccess(false);
centerResult.setErrorCode(ErrorCode.Exception.getCodeType());
centerResult.setErrorMessage(e.getMessage());
logger.error(LogUtils.create("ERROR_100_00003")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceInfo.getBindID())//
.addLog("registerType", type)//
.addLog("error", e.getMessage())//
.toJson(), e);
}
return centerResult;
}
/**服务下线*/
@Override
public RsfCenterResult<Boolean> unRegister(String registerID, String serviceID) {
RsfCenterResultDO<Boolean> centerResult = new RsfCenterResultDO<Boolean>();
centerResult.setMessageID(this.rsfRequest.getRequestID());
InterAddress remoteRsfAddress = this.rsfRequest.getRemoteAddress();
try {
// .判断异常
Result<Boolean> result = this.serviceManager.removeRegister(registerID, serviceID);
if (!result.isSuccess()) {
centerResult.setSuccess(false);
ErrorCode errorInfo = result.getErrorInfo();
centerResult.setErrorCode(errorInfo.getCodeType());
centerResult.setErrorMessage(errorInfo.getMessage());
logger.error(LogUtils.create("ERROR_100_00101")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceID)//
.toJson());
} else {
centerResult.setSuccess(true);
centerResult.setErrorCode(ErrorCode.OK.getCodeType());
centerResult.setResult(result.getResult());
}
} catch (Throwable e) {
centerResult.setSuccess(false);
centerResult.setErrorCode(ErrorCode.Exception.getCodeType());
centerResult.setErrorMessage(e.getMessage());
logger.error(LogUtils.create("ERROR_100_00102")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceID)//
.addLog("error", e.getMessage())//
.toJson(), e);
}
return centerResult;
}
//
@Override
public RsfCenterResult<Boolean> serviceBeat(String registerID, String serviceID) {
RsfCenterResultDO<Boolean> centerResult = new RsfCenterResultDO<Boolean>();
centerResult.setMessageID(this.rsfRequest.getRequestID());
InterAddress remoteRsfAddress = this.rsfRequest.getRemoteAddress();
try {
// .判断异常
Result<Boolean> result = this.serviceManager.serviceBeat(registerID, serviceID);
if (!result.isSuccess()) {
centerResult.setSuccess(false);
ErrorCode errorInfo = result.getErrorInfo();
centerResult.setErrorCode(errorInfo.getCodeType());
centerResult.setErrorMessage(errorInfo.getMessage());
logger.error(LogUtils.create("ERROR_100_00201")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceID)//
.toJson());
} else {
centerResult.setSuccess(true);
centerResult.setErrorCode(ErrorCode.OK.getCodeType());
centerResult.setResult(result.getResult());
}
} catch (Throwable e) {
centerResult.setSuccess(false);
centerResult.setErrorCode(ErrorCode.Exception.getCodeType());
centerResult.setErrorMessage(e.getMessage());
logger.error(LogUtils.create("ERROR_100_00202")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceID)//
.addLog("error", e.getMessage())//
.toJson(), e);
}
return centerResult;
}
@Override
public RsfCenterResult<List<String>> pullProviders(String registerID, String serviceID, String protocol) {
RsfCenterResultDO<List<String>> centerResult = new RsfCenterResultDO<List<String>>();
centerResult.setMessageID(this.rsfRequest.getRequestID());
InterAddress remoteRsfAddress = this.rsfRequest.getRemoteAddress();
try {
// .判断异常
Result<List<String>> result = this.serviceManager.queryProviders(registerID, serviceID, protocol);
if (!result.isSuccess()) {
centerResult.setSuccess(false);
ErrorCode errorInfo = result.getErrorInfo();
centerResult.setErrorCode(errorInfo.getCodeType());
centerResult.setErrorMessage(errorInfo.getMessage());
logger.error(LogUtils.create("ERROR_100_00301")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceID)//
.toJson());
} else {
centerResult.setSuccess(true);
centerResult.setErrorCode(ErrorCode.OK.getCodeType());
centerResult.setResult(result.getResult());
}
} catch (Throwable e) {
centerResult.setSuccess(false);
centerResult.setErrorCode(ErrorCode.Exception.getCodeType());
centerResult.setErrorMessage(e.getMessage());
logger.error(LogUtils.create("ERROR_100_00302")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceID)//
.addLog("error", e.getMessage())//
.toJson(), e);
}
return centerResult;
}
@Override
public RsfCenterResult<Boolean> requestPushProviders(String registerID, String serviceID, String protocol, String callBackRsfAddress) {
RsfCenterResultDO<Boolean> centerResult = new RsfCenterResultDO<Boolean>();
centerResult.setMessageID(this.rsfRequest.getRequestID());
InterAddress remoteRsfAddress = this.rsfRequest.getRemoteAddress();
try {
// .判断异常
InterAddress callBack = new InterAddress(callBackRsfAddress);
Result<Boolean> result = this.serviceManager.requestProviders(callBack, registerID, serviceID, protocol);
if (!result.isSuccess()) {
centerResult.setSuccess(false);
ErrorCode errorInfo = result.getErrorInfo();
centerResult.setErrorCode(errorInfo.getCodeType());
centerResult.setErrorMessage(errorInfo.getMessage());
logger.error(LogUtils.create("ERROR_100_00401")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceID)//
.toJson());
} else {
centerResult.setSuccess(true);
centerResult.setErrorCode(ErrorCode.OK.getCodeType());
centerResult.setResult(result.getResult());
}
} catch (Throwable e) {
centerResult.setSuccess(false);
centerResult.setErrorCode(ErrorCode.Exception.getCodeType());
centerResult.setErrorMessage(e.getMessage());
logger.error(LogUtils.create("ERROR_100_00402")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("errorCode", centerResult.getErrorCode())//
.addLog("remoteAddress", remoteRsfAddress.toHostSchema())//
.addLog("serviceID", serviceID)//
.addLog("error", e.getMessage())//
.toJson(), e);
}
return centerResult;
}
}