Add naming support gRPC for register and deregister instance (#3343)

This commit is contained in:
杨翊 SionYang 2020-07-15 20:22:07 +08:00 committed by GitHub
parent 139b211e21
commit d00c133c3e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 450 additions and 62 deletions

View File

@ -16,15 +16,18 @@
package com.alibaba.nacos.api.naming.remote;
import com.alibaba.nacos.api.remote.request.RequestTypeConstants;
/**
* retain all naming module request type constants.
* Retain all naming module request type constants.
*
* @author liuzunfei
* @version $Id: NamingRequestTypeConstants.java, v 0.1 2020年07月13日 9:12 PM liuzunfei Exp $
* @author xiweng.yy
*/
public class NamingRequestTypeConstants extends RequestTypeConstants {
public class NamingRemoteConstants {
public static final String REGISTER_INSTANCE = "registerInstance";
public static final String DE_REGISTER_INSTANCE = "deregisterInstance";
public static final String SUBSCRIBE_SERVICE = "subscribeService";
public static final String SERVICE_INSTANCE_CHANGE = "SERVICE_INSTANCE_CHANGE";
}

View File

@ -0,0 +1,68 @@
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* 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 com.alibaba.nacos.api.naming.remote.request;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.api.naming.utils.NamingUtils;
/**
* Nacos instances request.
*
* @author xiweng.yy
*/
public class InstanceRequest extends NamingCommonRequest {
private String type;
private Instance instance;
public InstanceRequest() {
}
public InstanceRequest(String namespace, String type, Instance instance) {
this(namespace, instance.getServiceName(), NamingUtils.getGroupName(instance.getServiceName()), type, instance);
}
public InstanceRequest(String namespace, String serviceName, String type, Instance instance) {
super(namespace, serviceName, null);
this.type = type;
this.instance = instance;
}
public InstanceRequest(String namespace, String serviceName, String groupName, String type, Instance instance) {
super(namespace, serviceName, groupName);
this.type = type;
this.instance = instance;
}
public void setType(String type) {
this.type = type;
}
@Override
public String getType() {
return this.type;
}
public void setInstance(Instance instance) {
this.instance = instance;
}
public Instance getInstance() {
return instance;
}
}

View File

@ -0,0 +1,71 @@
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* 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 com.alibaba.nacos.api.naming.remote.request;
import com.alibaba.nacos.api.remote.request.Request;
/**
* Uniform remote request of naming module.
*
* @author liuzunfei
*/
public abstract class NamingCommonRequest extends Request {
private String namespace;
private String serviceName;
private String groupName;
public NamingCommonRequest() {
}
public NamingCommonRequest(String namespace, String serviceName, String groupName) {
this.namespace = namespace;
this.serviceName = serviceName;
this.groupName = groupName;
}
@Override
public String getModule() {
return "naming";
}
public String getNamespace() {
return namespace;
}
public void setNamespace(String namespace) {
this.namespace = namespace;
}
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1999-2020 Alibaba Group Holding Ltd.
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -14,20 +14,26 @@
* limitations under the License.
*/
package com.alibaba.nacos.api.naming.remote;
package com.alibaba.nacos.api.naming.remote.response;
import com.alibaba.nacos.api.remote.request.Request;
import com.alibaba.nacos.api.remote.response.Response;
/**
* uniform remote request of naming module
* Instance response.
*
* @author liuzunfei
* @version $Id: NamingCommonRequest.java, v 0.1 2020年07月14日 7:26 PM liuzunfei Exp $
* @author xiweng.yy
*/
public abstract class NamingCommonRequest extends Request {
public class InstanceResponse extends Response {
@Override
public String getModule() {
return "naming";
public InstanceResponse() {
}
public InstanceResponse(int resultCode, String message, String type) {
this(resultCode, 0, message, type);
}
public InstanceResponse(int resultCode, int errorCode, String message, String type) {
super(type, resultCode, message);
setErrorCode(errorCode);
}
}

View File

@ -20,7 +20,8 @@ import com.alibaba.nacos.api.config.remote.response.ConfigChangeListenResponse;
import com.alibaba.nacos.api.config.remote.response.ConfigChangeNotifyResponse;
import com.alibaba.nacos.api.config.remote.response.ConfigQueryResponse;
import com.alibaba.nacos.api.config.remote.response.ConfigResponseTypeConstants;
import com.alibaba.nacos.api.naming.remote.NamingRequestTypeConstants;
import com.alibaba.nacos.api.naming.remote.NamingRemoteConstants;
import com.alibaba.nacos.api.naming.remote.response.InstanceResponse;
import com.alibaba.nacos.api.remote.response.ConnectResetResponse;
import com.alibaba.nacos.api.remote.response.HeartBeatResponse;
import com.alibaba.nacos.api.remote.response.ResponseTypeConstants;
@ -51,10 +52,12 @@ public class ResponseRegistry {
//naming response registry
//REGISTRY_RESPONSES.put(NamingRequestTypeConstants.SERVICE_INSTANCE_CHANGE, ServiceI.class);
REGISTRY_RESPONSES.put(NamingRemoteConstants.REGISTER_INSTANCE, InstanceResponse.class);
REGISTRY_RESPONSES.put(NamingRemoteConstants.DE_REGISTER_INSTANCE, InstanceResponse.class);
}
public static Class getClassByType(String type) {
return REGISTRY_RESPONSES.get(type);
}
}
}

View File

@ -18,8 +18,8 @@ package com.alibaba.nacos.api.remote.request;
/**
* Request.
*
* @author liuzunfei
* @version $Id: Request.java, v 0.1 2020年07月13日 3:46 PM liuzunfei Exp $
*/
public abstract class Request {

View File

@ -1,5 +1,17 @@
/**
* Alipay.com Inc. Copyright (c) 2004-2020 All Rights Reserved.
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* 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 com.alibaba.nacos.client.config.remote;

View File

@ -0,0 +1,98 @@
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* 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 com.alibaba.nacos.client.naming.net;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.api.naming.remote.NamingRemoteConstants;
import com.alibaba.nacos.api.naming.remote.request.InstanceRequest;
import com.alibaba.nacos.api.remote.response.Response;
import com.alibaba.nacos.client.remote.RpcClient;
import com.alibaba.nacos.client.remote.RpcClientFactory;
import com.alibaba.nacos.client.remote.ServerListFactory;
import static com.alibaba.nacos.client.utils.LogUtils.NAMING_LOGGER;
/**
* Naming grpc client proxy.
*
* @author xiweng.yy
*/
public class NamingGrpcClientProxy {
private final String namespaceId;
private RpcClient rpcClient;
public NamingGrpcClientProxy(String namespaceId) {
this.namespaceId = namespaceId;
rpcClient = RpcClientFactory.getClient("naming");
}
public void start() throws NacosException {
rpcClient.init(new ServerListFactory() {
@Override
public String genNextServer() {
return "localhost:8848";
}
@Override
public String getCurrentServer() {
return "localhost:8848";
}
});
rpcClient.start();
}
/**
* register a instance to service with specified instance properties.
*
* @param serviceName name of service
* @param groupName group of service
* @param instance instance to register
* @throws NacosException nacos exception
*/
public void registerService(String serviceName, String groupName, Instance instance) throws NacosException {
NAMING_LOGGER.info("[REGISTER-SERVICE] {} registering service {} with instance {}", namespaceId, serviceName,
instance);
InstanceRequest request = new InstanceRequest(namespaceId, serviceName, groupName,
NamingRemoteConstants.REGISTER_INSTANCE, instance);
Response response = rpcClient.request(request);
if (200 != response.getResultCode()) {
throw new NacosException(response.getErrorCode(), response.getMessage());
}
}
/**
* deregister instance from a service.
*
* @param serviceName name of service
* @param instance instance
* @throws NacosException nacos exception
*/
public void deregisterService(String serviceName, Instance instance) throws NacosException {
NAMING_LOGGER
.info("[DEREGISTER-SERVICE] {} deregistering service {} with instance: {}", namespaceId, serviceName,
instance);
InstanceRequest request = new InstanceRequest(namespaceId, serviceName,
NamingRemoteConstants.DE_REGISTER_INSTANCE, instance);
Response response = rpcClient.request(request);
if (200 != response.getResultCode()) {
throw new NacosException(response.getErrorCode(), response.getMessage());
}
}
}

View File

@ -1,6 +1,17 @@
/**
* Alipay.com Inc.
* Copyright (c) 2004-2020 All Rights Reserved.
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* 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 com.alibaba.nacos.config.server.remote;

View File

@ -1,6 +1,17 @@
/**
* Alipay.com Inc.
* Copyright (c) 2004-2020 All Rights Reserved.
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* 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 com.alibaba.nacos.config.server.remote;

View File

@ -13,54 +13,57 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.nacos.core.remote;
import java.util.List;
import javax.annotation.PostConstruct;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.remote.response.Response;
import com.alibaba.nacos.api.remote.request.Request;
import com.alibaba.nacos.api.remote.request.RequestMeta;
import com.alibaba.nacos.api.remote.response.Response;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.PostConstruct;
import java.util.List;
/**
* Nacos based request handler.
*
* @author liuzunfei
* @version $Id: RequestHandler.java, v 0.1 2020年07月13日 8:22 PM liuzunfei Exp $
* @author xiweng.yy
*/
public abstract class RequestHandler<T> {
public abstract class RequestHandler<T extends Request> {
@Autowired
private RequestHandlerRegistry requestHandlerRegistry;
@PostConstruct
public void init(){
public void init() {
requestHandlerRegistry.registryHandler(this);
}
/**
* Parse request body to specified {@link Request}.
*
* @param bodyString
* @param <T>
* @return
* @param bodyString body string
* @return request
*/
abstract public <T extends Request> T parseBodyString(String bodyString);
public abstract T parseBodyString(String bodyString);
/**
* handler request
* @param request
* @return
* @throws NacosException
* Handler request.
*
* @param request request
* @param meta request meta data
* @return response
* @throws NacosException nacos exception when handle request has problem.
*/
abstract public Response handle(Request request, RequestMeta meta) throws NacosException;
public abstract Response handle(Request request, RequestMeta meta) throws NacosException;
/**
* retrun the request type that this handler can handler
* @return
* Return the request type that this handler can handler.
*
* @return request types this handler responsible.
*/
abstract public List<String> getRequestTypes();
public abstract List<String> getRequestTypes();
}

View File

@ -0,0 +1,104 @@
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* 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 com.alibaba.nacos.naming.remote;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.remote.request.InstanceRequest;
import com.alibaba.nacos.api.naming.remote.NamingRemoteConstants;
import com.alibaba.nacos.api.naming.remote.response.InstanceResponse;
import com.alibaba.nacos.api.remote.request.Request;
import com.alibaba.nacos.api.remote.request.RequestMeta;
import com.alibaba.nacos.api.remote.response.Response;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.common.utils.StringUtils;
import com.alibaba.nacos.core.remote.RequestHandler;
import com.alibaba.nacos.naming.core.Instance;
import com.alibaba.nacos.naming.core.ServiceManager;
import com.alibaba.nacos.naming.misc.Loggers;
import com.alibaba.nacos.naming.misc.UtilsAndCommons;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* Instance request handler.
*
* @author xiweng.yy
*/
@Component
public class InstanceRequestHandler extends RequestHandler<InstanceRequest> {
@Autowired
private ServiceManager serviceManager;
@Override
public InstanceRequest parseBodyString(String bodyString) {
return JacksonUtils.toObj(bodyString, InstanceRequest.class);
}
@Override
public Response handle(Request request, RequestMeta meta) throws NacosException {
InstanceRequest instanceRequest = (InstanceRequest) request;
String namespace = instanceRequest.getNamespace();
String serviceName = instanceRequest.getServiceName();
switch (instanceRequest.getType()) {
case NamingRemoteConstants.REGISTER_INSTANCE:
if (!serviceManager.containService(namespace, serviceName)) {
serviceManager.createEmptyService(namespace, serviceName, false);
}
Instance instance = parseInstance(instanceRequest.getInstance());
instance.setServiceName(serviceName);
instance.setInstanceId(instance.generateInstanceId());
instance.setLastBeat(System.currentTimeMillis());
// Register instance by connection, do not need keep alive by beat.
instance.setMarked(true);
instance.validate();
serviceManager.addInstance(namespace, serviceName, instance.isEphemeral(), instance);
break;
case NamingRemoteConstants.DE_REGISTER_INSTANCE:
if (!serviceManager.containService(namespace, serviceName)) {
Loggers.SRV_LOG.warn("remove instance from non-exist service: {}", serviceName);
return new InstanceResponse(200, "success", request.getType());
}
instance = parseInstance(instanceRequest.getInstance());
serviceManager.removeInstance(namespace, serviceName, instance.isEphemeral(), instance);
break;
default:
throw new NacosException(NacosException.INVALID_PARAM, String.format("Unsupported request type %s", instanceRequest.getType()));
}
return new InstanceResponse(200, "success", request.getType());
}
private Instance parseInstance(com.alibaba.nacos.api.naming.pojo.Instance instance) {
Instance result = new Instance(instance.getIp(), instance.getPort());
result.setClusterName(StringUtils.isBlank(instance.getClusterName()) ? UtilsAndCommons.DEFAULT_CLUSTER_NAME
: instance.getClusterName());
result.setEnabled(instance.isEnabled());
result.setEphemeral(instance.isEphemeral());
result.setWeight(instance.getWeight());
result.setMetadata(instance.getMetadata());
return result;
}
@Override
public List<String> getRequestTypes() {
return Lists.newArrayList(NamingRemoteConstants.REGISTER_INSTANCE,
NamingRemoteConstants.DE_REGISTER_INSTANCE);
}
}

View File

@ -17,7 +17,7 @@
package com.alibaba.nacos.naming.remote;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.remote.NamingRequestTypeConstants;
import com.alibaba.nacos.api.naming.remote.NamingRemoteConstants;
import com.alibaba.nacos.api.remote.request.Request;
import com.alibaba.nacos.api.remote.request.RequestMeta;
import com.alibaba.nacos.api.remote.response.Response;
@ -30,19 +30,17 @@ import org.springframework.stereotype.Component;
import java.util.List;
/**
* handler to handle service instance change listen request.
* Handler to handle subscribe service.
*
* @author liuzunfei
* @version $Id: ServiceInstanceChangeListenRequestHandler.java, v 0.1 2020年07月14日 7:55 PM liuzunfei Exp $
* @author xiweng.yy
*/
@Component
public class ServiceInstanceChangeListenRequestHandler extends RequestHandler {
public class SubscribeServiceRequestHandler extends RequestHandler {
@Autowired
AsyncListenContext asyncListenContext;
private static final String LISTEN_CONTEXT_TYPE = "CONFIG";
@Override
public Request parseBodyString(String bodyString) {
return null;
@ -55,6 +53,6 @@ public class ServiceInstanceChangeListenRequestHandler extends RequestHandler {
@Override
public List<String> getRequestTypes() {
return Lists.newArrayList(NamingRequestTypeConstants.SERVICE_INSTANCE_CHANGE);
return Lists.newArrayList(NamingRemoteConstants.SUBSCRIBE_SERVICE);
}
}